Celo Stablecoins
This skill covers working with stablecoins on the Celo blockchain, including Mento stablecoins and other major stablecoins.
When to Use
- Reading stablecoin balances
- Transferring stablecoins
- Building payment applications
- Working with regional currencies
- Integrating USDC or USDT on Celo
Stablecoin Categories
Mento Stablecoins
Mento Protocol provides decentralized stablecoins pegged to various fiat currencies:
| Symbol | Currency | Mainnet Address |
|---|
| USDm | US Dollar | 0x765de816845861e75a25fca122bb6898b8b1282a |
| EURm | Euro | 0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73 |
| BRLm | Brazilian Real | 0xe8537a3d056da446677b9e9d6c5db704eaab4787 |
| XOFm | West African CFA Franc | 0x73F93dcc49cB8A239e2032663e9475dd5ef29A08 |
| KESm | Kenyan Shilling | 0x456a3D042C0DbD3db53D5489e98dFb038553B0d0 |
| PHPm | Philippine Peso | 0x105d4A9306D2E55a71d2Eb95B81553AE1dC20d7B |
| COPm | Colombian Peso | 0x8a567e2ae79ca692bd748ab832081c45de4041ea |
| GBPm | British Pound | 0xCCF663b1fF11028f0b19058d0f7B674004a40746 |
| CADm | Canadian Dollar | 0xff4Ab19391af240c311c54200a492233052B6325 |
| AUDm | Australian Dollar | 0x7175504C455076F15c04A2F90a8e352281F492F9 |
| ZARm | South African Rand | 0x4c35853A3B4e647fD266f4de678dCc8fEC410BF6 |
| GHSm | Ghanaian Cedi | 0xfAeA5F3404bbA20D3cc2f8C4B0A888F55a3c7313 |
| NGNm | Nigerian Naira | 0xE2702Bd97ee33c88c8f6f92DA3B733608aa76F71 |
| JPYm | Japanese Yen | 0xc45eCF20f3CD864B32D9794d6f76814aE8892e20 |
| CHFm | Swiss Franc | 0xb55a79F398E759E43C95b979163f30eC87Ee131D |
Centralized Stablecoins
| Symbol | Issuer | Mainnet Address | Decimals |
|---|
| USDC | Circle | 0xcebA9300f2b948710d2653dD7B07f33A8B32118C | 6 |
| USDT | Tether | 0x48065fbbe25f71c9282ddf5e1cd6d6a887483d5e | 6 |
Other Stablecoins
| Symbol | Issuer | Currency | Mainnet Address |
|---|
| vEUR | VNX | Euro | 0x9346f43c1588b6df1d52bdd6bf846064f92d9cba |
| vGBP | VNX | British Pound | 0x7ae4265ecfc1f31bc0e112dfcfe3d78e01f4bb7f |
| vCHF | VNX | Swiss Franc | 0xc5ebea9984c485ec5d58ca5a2d376620d93af871 |
| USDM | Mountain Protocol | US Dollar (yield-bearing) | 0x59D9356E565Ab3A36dD77763Fc0d87fEaf85508C |
| USDA | Angle | US Dollar (yield-bearing) | 0x0000206329b97DB379d5E1Bf586BbDB969C63274 |
| EURA | Angle | Euro (yield-bearing) | 0xC16B81Af351BA9e64C1a069E3Ab18c244A1E3049 |
| USDGLO | Glo Foundation | US Dollar (impact-driven) | 0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 |
| BRLA | BRLA Digital | Brazilian Real | 0xfecb3f7c54e2caae9dc6ac9060a822d47e053760 |
| COPM | Minteo | Colombian Peso | 0xC92E8Fc2947E32F2B574CCA9F2F12097A71d5606 |
| G$ | GoodDollar | UBI Token | 0x62b8b11039fcfe5ab0c56e502b1c372a3d2a9c7a |
Testnet Addresses (Celo Sepolia)
| Symbol | Testnet Address |
|---|
| USDm | 0xdE9e4C3ce781b4bA68120d6261cbad65ce0aB00b |
| EURm | 0xA99dC247d6b7B2E3ab48a1fEE101b83cD6aCd82a |
| BRLm | 0x2294298942fdc79417DE9E0D740A4957E0e7783a |
| XOFm | 0x5505b70207aE3B826c1A7607F19F3Bf73444A082 |
| KESm | 0xC7e4635651E3e3Af82b61d3E23c159438daE3BbF |
| PHPm | 0x0352976d940a2C3FBa0C3623198947Ee1d17869E |
| COPm | 0x5F8d55c3627d2dc0a2B4afa798f877242F382F67 |
| GBPm | 0x85F5181Abdbf0e1814Fc4358582Ae07b8eBA3aF3 |
| CADm | 0xF151c9a13b78C84f93f50B8b3bC689fedc134F60 |
| AUDm | 0x5873Faeb42F3563dcD77F0fbbdA818E6d6DA3139 |
| ZARm | 0x10CCfB235b0E1Ed394bACE4560C3ed016697687e |
| GHSm | 0x5e94B8C872bD47BC4255E60ECBF44D5E66e7401C |
| NGNm | 0x3d5ae86F34E2a82771496D140daFAEf3789dF888 |
| JPYm | 0x85Bee67D435A39f7467a8a9DE34a5B73D25Df426 |
| CHFm | 0x284E9b7B623eAE866914b7FA0eB720C2Bb3C2980 |
| USDT | 0xd077A400968890Eacc75cdc901F0356c943e4fDb |
Reading Balances
Using viem
import { createPublicClient, http, formatUnits } from "viem";
import { celo } from "viem/chains";
const publicClient = createPublicClient({
chain: celo,
transport: http("https://forno.celo.org"),
});
const ERC20_ABI = [
{
name: "balanceOf",
type: "function",
stateMutability: "view",
inputs: [{ name: "account", type: "address" }],
outputs: [{ type: "uint256" }],
},
{
name: "decimals",
type: "function",
stateMutability: "view",
inputs: [],
outputs: [{ type: "uint8" }],
},
] as const;
// USDm (18 decimals)
const USDm = "0x765de816845861e75a25fca122bb6898b8b1282a";
const balance = await publicClient.readContract({
address: USDm,
abi: ERC20_ABI,
functionName: "balanceOf",
args: ["0xYourAddress"],
});
console.log("USDm Balance:", formatUnits(balance, 18));
// USDC (6 decimals)
const USDC = "0xcebA9300f2b948710d2653dD7B07f33A8B32118C";
const usdcBalance = await publicClient.readContract({
address: USDC,
abi: ERC20_ABI,
functionName: "balanceOf",
args: ["0xYourAddress"],
});
console.log("USDC Balance:", formatUnits(usdcBalance, 6));
Transferring Stablecoins
Using viem
import { createWalletClient, http, parseUnits } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { celo } from "viem/chains";
const account = privateKeyToAccount("0xYourPrivateKey");
const walletClient = createWalletClient({
account,
chain: celo,
transport: http("https://forno.celo.org"),
});
const ERC20_ABI = [
{
name: "transfer",
type: "function",
stateMutability: "nonpayable",
inputs: [
{ name: "to", type: "address" },
{ name: "amount", type: "uint256" },
],
outputs: [{ type: "bool" }],
},
] as const;
const USDm = "0x765de816845861e75a25fca122bb6898b8b1282a";
// Transfer 10 USDm
const hash = await walletClient.writeContract({
address: USDm,
abi: ERC20_ABI,
functionName: "transfer",
args: ["0xRecipientAddress", parseUnits("10", 18)],
});
console.log("Transaction hash:", hash);
Transfer USDC (6 decimals)
const USDC = "0xcebA9300f2b948710d2653dD7B07f33A8B32118C";
// Transfer 10 USDC (note: 6 decimals)
const hash = await walletClient.writeContract({
address: USDC,
abi: ERC20_ABI,
functionName: "transfer",
args: ["0xRecipientAddress", parseUnits("10", 6)],
});
Using cast (Foundry)
# Check USDm balance
cast call 0x765de816845861e75a25fca122bb6898b8b1282a \
"balanceOf(address)(uint256)" \
0xYourAddress \
--rpc-url https://forno.celo.org
# Transfer USDm
cast send 0x765de816845861e75a25fca122bb6898b8b1282a \
"transfer(address,uint256)" \
0xRecipientAddress \
10000000000000000000 \
--rpc-url https://forno.celo.org \
--private-key $PRIVATE_KEY
Decimal Handling
| Token Type | Decimals | 1 Token in Wei |
|---|
| Mento (USDm, EURm, etc.) | 18 | 1000000000000000000 |
| USDC | 6 | 1000000 |
| USDT | 6 | 1000000 |
Always check the decimals of a token before formatting or parsing amounts.
Getting Test Tokens
- Get CELO from faucet: https://faucet.celo.org
- Swap CELO for stablecoins on Mento: https://app.mento.org
Additional Resources