Skip to main content

Overview

USDY is Ondo’s yield-bearing token that provides investors a steady return over time. The token price started at $1.00 in July 2023 and has increased over time at a variable monthly rate. For a product-level introduction, see USDY Basics. The USDY_InstantManager contract is the on-chain entry point used by the Ondo web app to instantly mint and redeem USDY. You can call it directly from your own contracts or EOA to:
  • Convert USDC into USDY via subscribe (selector 0x22d4a175)
  • Convert USDY back into USDC via redeem (selector 0xd8780161)
Addresses for USDY, USDY_InstantManager, and the USDY redemption price oracle are listed in Smart Contracts → Addresses.
The Ethereum USDC address used in the examples below is 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48.
USDY on Tempo is a TIP-20 token with 6 decimals, not 18. When you integrate with the USDY_InstantManager on Tempo, express USDY amounts in 6 decimals (e.g. 1000000 for 1 USDY).
On Tempo, use OUSD (0x20c0000000000000000000006a37DA5C996874BE) as the deposit and redemption token. OUSD is a TIP-20 token with 6 decimals.

Prerequisites

Before calling subscribe or redeem, the address that interacts with the contract must be registered in the OndoIDRegistry. You can whitelist your address at app.ondo.finance/account/wallets. If you run into issues, reach out to support@ondo.finance.
Transactions from an address that is not registered in the OndoIDRegistry will revert with UserNotRegistered. Contract wallets and smart-contract integrations must whitelist the exact calling address.

ERC20 approvals

The USDY_InstantManager pulls tokens from your wallet via transferFrom, so you must approve it to spend the token you are sending before calling subscribe or redeem:
  • Before subscribe: approve the manager to spend your deposit token (e.g. USDC) for at least depositAmount.
  • Before redeem: approve the manager to spend your USDY for at least rwaAmount.
Each approval is a separate transaction — typically IERC20(token).approve(usdyInstantManager, amount). If you skip this step, the subscribe/redeem call will revert with an ERC20 allowance error such as ERC20: insufficient allowance.

Subscribing: USDC to USDY

Function signature

Parameters

  • depositToken: the token being deposited (typically USDC)
  • depositAmount: the amount of depositToken to deposit, in the token’s native decimals (e.g. 1000000 for 1 USDC)
  • minimumRwaReceived: slippage protection, denominated in USDY’s decimals (18 on most chains, 6 on Tempo). Because you are minting directly with Ondo, there is no front-running or order-size slippage, so 0 is safe.

Example

Redeeming: USDY to USDC

Function signature

Parameters

  • rwaAmount: the amount of USDY to redeem, in USDY’s decimals (e.g. 1000000000000000000 for 1 USDY on most chains, or 1000000 on Tempo)
  • receivingToken: the stablecoin to receive (USDC on Ethereum, USDT on BNB Chain, OUSD on Tempo). Passing a token that isn’t accepted on that chain reverts with TokenNotAccepted.
  • minimumTokenReceived: the minimum amount of receivingToken to accept, in its native decimals. The payout is priced from oracle values, not a market, so it’s predictable. Quote it by simulating the call (for example with eth_call), then set this slightly below the quote. Passing 0 disables the check.

Example

USDY price oracle

The USDY price is published on-chain by the ContinuousPriceOracle contract, which integrators and the USDY_InstantManager read through the USDYOracleWrapper (see /addresses). The oracle stores a price and a yearly rate, and calculates the current price every time it is read, so the price grows continuously instead of once a day. The rate stays in force until Ondo changes it. The USDY_InstantManager consults this oracle on every subscription and redemption to convert between USD value and USDY amounts. All prices are denominated in USD with 18 decimals.

Get the current price

  • getPrice(): returns the current USDY price, in USD with 18 decimals.
  • getPriceData(): convenience wrapper that also returns the current block timestamp.
Neither function reverts, including when the oracle is frozen. A frozen oracle keeps returning a price, but the price stops growing.

Converting between USD and USDY

The oracle price represents how many USD one USDY is worth.
On Tempo, USDY has 6 decimals, so replace 1e18 with 1e6 (10 ** usdy.decimals()) in the formulas above. The oracle price and all USD values, including contract minimums, rate limits, and event fields, stay at 18 decimals.

Reference

Decimal handling

  • USDC: 6 decimals (1 USDC = 1,000,000 units)
  • USDY: 18 decimals (1 USDY = 1018 units) on most chains; 6 decimals (1 USDY = 1,000,000 units) on Tempo
  • Oracle prices: 18 decimals

Rate limits and minimums

The manager contract enforces per-user and global rate limits, as well as a configured minimum USD value per subscription and redemption. Very small or unusually large transactions may revert.

Common errors

Best practices

  1. Ensure the calling address is whitelisted in the OndoIDRegistry before attempting any transaction.
  2. Check the contract’s pause status (subscribePaused / redeemPaused) before attempting transactions.
  3. Approve the USDY_InstantManager for the exact amount being deposited or redeemed.
  4. Implement proper error handling for all possible revert conditions.

Resources