Docs
Everything about cUSD — the yield stablecoin on Robinhood Chain. How to mint it, how yield accrues, how to redeem, and how to integrate with the contracts.
Overview
cUSD is a yield-bearing dollar token on Robinhood Chain. You deposit USDG and receive cUSD 1:1. From the moment it lands in your wallet, your cUSD balance grows every second — no staking, no lock-up, no claim step.
Yield comes from creator fees earned by the cUSD token. Those fees are funnelled into the protocol treasury, and the treasury pays them out to everyone holding cUSD. Because it tracks real performance, the rate is variable and can be negative if the treasury takes a loss.
Every cUSD is backed by USDG held in the vault.
Balances grow continuously with no transaction needed.
Burn cUSD, get USDG back from reserves.
Quick start
- Add Robinhood Chain to your wallet (chain ID 4663) and fund it with gas.
- Hold some USDG — the stablecoin cUSD is minted against.
- Open the dashboard and connect your wallet.
- Approve USDG for the vault, then mint. You receive cUSD 1:1.
- Hold it. Your balance starts growing immediately.
Minting cUSD
Minting is a two-transaction flow because ERC-20 requires an allowance before the vault can move your tokens.
- Approve — you grant the vault permission to spend your USDG.
- Mint — the vault pulls the USDG, holds it as backing, and mints you an equal dollar amount of cUSD.
USDG has 6 decimals and cUSD has 18. The vault normalizes this, so 1 USDG always mints exactly 1 cUSD.
// Approve, then mint
USDG.approve(SWAP_ADDRESS, amount) // amount in 6-decimal units
CUSDSwap.mint(USDG_ADDRESS, amount) // returns cUSD minted (18 decimals)How yield accrues
cUSD is a share-based rebasing token. Internally you own a fixed number of shares. Your displayed balance is:
balance = shares × index / 1e27The index starts at 1 and grows continuously from the configured APY using the block timestamp. That is why your balance ticks up every second with no transaction — the index is computed live on read.
On top of that stream, the treasury reconciles against real reserves. Anyone can call settle():
- Reserves above outstanding cUSD → the surplus is distributed and every balance rebases up.
- Reserves below outstanding cUSD → the shortfall is reported and every balance rebases down.
Your share count never changes when this happens — only the index does, so the effect is perfectly pro-rata across all holders.
Redeeming
Redeeming burns your cUSD and returns USDG from the vault's reserves. You receive the current value of your cUSD, so if the treasury has grown you get back more USDG than you minted with.
CUSDSwap.redeem(USDG_ADDRESS, usdyAmount) // burns cUSD, sends USDGRedemption requires the vault to actually hold enough USDG. If reserves are short, the transaction reverts with InsufficientReserves.
Paying with cUSD
cUSD is a normal ERC-20, so you can send it to anyone with a plain transfer. Transfers move shares under the hood, which means the recipient keeps earning yield automatically — there is no staking or registration step for them.
cUSD.transfer(recipient, amount)Token mechanics
Contracts
Two contracts run the protocol. The token holds balances; the vault holds backing and controls mint/burn.
Integrating
The functions most integrations need. All amounts are raw integers (cUSD 18 decimals, USDG 6).
// --- cUSD token ---
balanceOf(address) → uint256 // live, includes accrual
sharesOf(address) → uint256 // fixed share count
currentIndex() → uint256 // RAY (1e27) precision
ratePerYear() → int256 // signed APY, RAY precision
totalSupply() → uint256
transfer(address to, uint256 amount) → bool
// --- CUSDSwap vault ---
mint(address stable, uint256 amount) → uint256 usdyOut
redeem(address stable, uint256 usdyAmount) → uint256 stableOut
previewMint(address stable, uint256 amount) → uint256
treasuryValue() → uint256 // normalized reserves
cusdSupply() → uint256 // outstanding cUSD
pnl() → int256 // reserves − supply
settle() → int256 // distribute profit / report lossTo display a live-ticking balance without spamming RPC calls, read sharesOf, currentIndex and ratePerYear once, then project the index forward client-side using the same linear formula the contract uses.
Risks
- Yield is not guaranteed. The rate is variable. If the treasury underperforms, balances can rebase down and you can end up with less than you deposited.
- Redemption depends on reserves. You can only redeem as much USDG as the vault holds.
- The contracts are not audited. They are deliberately simple, but they have not had a third-party security review.
- Admin keys exist. The owner can set the target APY, register stablecoins, and move reserves to a strategy.
- Smart contract risk. Bugs or exploits can cause loss of funds. Only deposit what you can afford to lose.