Documentation

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.

Backing
1:1 USDG

Every cUSD is backed by USDG held in the vault.

Accrual
Every second

Balances grow continuously with no transaction needed.

Exit
Redeem anytime

Burn cUSD, get USDG back from reserves.

Quick start

  1. Add Robinhood Chain to your wallet (chain ID 4663) and fund it with gas.
  2. Hold some USDG — the stablecoin cUSD is minted against.
  3. Open the dashboard and connect your wallet.
  4. Approve USDG for the vault, then mint. You receive cUSD 1:1.
  5. Hold it. Your balance starts growing immediately.
See how it works

Minting cUSD

Minting is a two-transaction flow because ERC-20 requires an allowance before the vault can move your tokens.

  1. Approve — you grant the vault permission to spend your USDG.
  2. 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 / 1e27

The 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 USDG

Redemption 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

NamecUSD Yield Dollar
SymbolcUSD
Decimals18
StandardERC-20, share-based rebasing
Balanceshares × index / 1e27
BackingUSDG held in the CUSDSwap vault
Yieldvariable; can be positive or negative
Mint / burnrestricted to the CUSDSwap vault
ChainRobinhood Chain (4663)

Contracts

Two contracts run the protocol. The token holds balances; the vault holds backing and controls mint/burn.

cUSD token0x44E47ffDd8d1bFf40fDAf14cCF4642EFE84F5907
CUSDSwap vault0x8482568b0852D3C5A3AEBd0D42118D4F9aa1a2c7
USDG (backing)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168

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 loss

To 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.