IGMTokenManager
The IGMTokenManager interface may be used by external parties to buy and sell Ondo Stocks using attestations. The general flow for each side is:
Buying GM Tokens
-
User gets a signed quote (off‑chain)
- The attestation service prepares a
Quotewhose side isBUY, signs its EIP‑712 digest, and returns the quote and signature to the user - Price is expressed in USD with 18 decimals (e.g., $12.34 →12340000000000000000)
- Quantity is the number of GM tokens the user wishes to receive
- The attestation service prepares a
-
User pre‑authorizes USDon or USDC/USDT
- GMTokenManager must have a sufficient allowance of USDon, USDC (Ethereum) or USDT (BNB Chain) before the call
- Allowance ≥ price × quantity
🚧 Notes on USDon
- USDon will be Ondo’s permissionless ERC20 stablecoin representing USD held in Ondo’s brokerage account (which buys equities/ETFs backing GM tokens). Users can convert stablecoins to USDon with zero slippage by specifying it as the deposit token below.
- We accept USDC on Ethereum, and USDT on BNB Chain.
- If you would like to convert stablecoins to USDon directly, outside of a GM token swap, reach out to us and we can provide instructions for our USDonConverter contract.
-
User calls
mintWithAttestation(quote, signature, depositToken, depositTokenAmount), which will atomically: Verify the quote- Re‑computes the EIP‑712 digest and verifies the signature against the attestation signer
- Confirm that the caller is whitelisted and their stored
userIDmatches the one received in the quote - Ensures the
attestationIdhas not been used and thatblock.timestamp ≤ expiration - Confirms side ==
BUY - Ensure the value of the transaction is greater than
minimumDepositUSDbut does not exceed per-user and per-token rate limits
- If the
depositTokenspecified is not USDon, first swapdepositTokenAmountfor USDon - Burns price × quantity of USDon (either after receiving from
msg.senderor swapping) - Mints quantity of GM tokens to
msg.sender - Refund USDon to the user if any is leftover
- Marks
attestationIdas consumed to prevent replay
receivedGmTokenAmountequals quantity
Selling GM Tokens
-
User gets a signed quote (off‑chain)
- Attestation service issues a
Quotewhose side isSELL, signs it, and returns quote and signature - Price still uses 18‑decimal USD format
- Quantity is the GM amount the user will sell
- Attestation service issues a
-
User pre‑authorizes GM tokens
- GMTokenManager must have allowance ≥ quantity of the specific GM token (asset) described in the quote
-
User calls
redeemWithAttestation(quote, signature, receiveToken, minimumReceiveAmount), which will atomically: Verify the quote- Same as subscribe, but checks that side ==
SELLinstead and that the transaction value is greater thanminimumRedemptiUSDon
- Transfers quantity of GM tokens from user to manager and burns them
- Mints out price × quantity of USDon to the GMTokenManager
- If the caller specifies a non-USDon token as the receiveToken, it will swap all the USDon received for the receiveToken (note: the call will revert if the swap doesn’t result in >=
minimumReceiveAmountbeing received) - All tokens received are transferred to the caller
- Marks
attestationIdas used
receivedUSDonAmountequals price × quantity
- Same as subscribe, but checks that side ==
Functions
mintWithAttestation
Called by users to mint GM tokens with a quote attestation using either USDon, USDC on Ethereum, or USDT on Binance Smart Chain.
If the deposit token is not USDon and the depositTokenAmount is not enough to swap for USDonworth quantity * price as specified in the quote, the transaction will fail as the
mintUSDonValue is passed in to the minimum RWA received field in subscribe.
Returns
redeemWithAttestation
Called by users to redeem GM tokens for USDon.
Returns
Structs
Quote
Quote struct that is signed by the attestation signer
Enums
QuoteSide
Enum for the side of the quote
IPortfolioTokenManager
IPortfolioTokenManager supports minting and redeeming Ondo Intelligent Portfolios (OIPs) with attestations. OIPs provide exposure to a basket of tokenized stocks and ETFs. They use PortfolioTokenManager, not the IGMTokenManager used for Ondo Stocks.
Buying Portfolio Tokens
-
User gets a signed quote off-chain
- The attestation service prepares a
BUYquote, signs its EIP-712 digest, and returns the quote and signature - Price and quantity use 18 decimals
- Quotes are only available when the full underlying basket is open for trading
- The attestation service prepares a
-
User pre-authorizes the stablecoin
PortfolioTokenManageruses USDC on Ethereum and USDT on BNB Chain, as returned bystablecoin()- The manager does not accept USDon or other deposit tokens
- The allowance must cover
ceil((quantity × price / 1e18) / 10^(18 - stablecoin decimals)) - Mint charges round up to the stablecoin’s native decimals
-
User calls
mintWithAttestation(quote, signature), which will atomically: Verify the quote- Verifies the EIP-712 signature, caller,
userId, chain ID, side, and expiration - Confirms the
attestationIdis unused - Confirms the portfolio token is registered, minting is active, and the price passes the oracle check
- Enforces minimums and rate limits
- Transfers the stablecoin charge through the token router
- Mints
quote.quantityportfolio tokens to the caller
- Marks the
attestationIdas consumed
- Returns
quote.quantity
- Verifies the EIP-712 signature, caller,
Selling Portfolio Tokens
-
User gets a signed quote off-chain
- The attestation service prepares a
SELLquote, signs its EIP-712 digest, and returns the quote and signature - Price and quantity use 18 decimals
- Quotes are only available when the full underlying basket is open for trading
- The attestation service prepares a
-
User pre-authorizes the portfolio tokens
PortfolioTokenManagermust have an allowance of at leastquote.quantityfor the portfolio token
-
User calls
redeemWithAttestation(quote, signature), which will atomically: Verify the quote- Verifies the EIP-712 signature, caller,
userId, chain ID, side, and expiration - Confirms the
attestationIdis unused - Confirms the portfolio token is registered, redemption is active, and the price passes the oracle check
- Enforces the minimum redemption value and rate limits
- Transfers
quote.quantityportfolio tokens from the caller and burns them - Pays the chain’s stablecoin through the token router
- Rounds the payment down to the stablecoin’s native decimals
- Marks the
attestationIdas consumed
- Returns the stablecoin amount paid in its native decimals
- Verifies the EIP-712 signature, caller,
Functions
mintWithAttestation
Mints portfolio tokens using a quote attestation and the chain’s configured stablecoin. The caller must approve the rounded-up stablecoin charge first.
Returns
redeemWithAttestation
Redeems portfolio tokens for the chain’s configured stablecoin.
Returns
Structs
Quote
PortfolioTokenManager uses the same Quote struct as IGMTokenManager. For OIPs, asset is the portfolio token address. price and quantity refer to the portfolio token.
Portfolio quotes use a separate EIP-712 domain with name = "OndoPortfolioTokenManager", version = "1", the chain ID, and the PortfolioTokenManager address. GM and portfolio signatures are not interchangeable. Use getDomainSeparator() to read the domain separator.
Enums
QuoteSide
The PortfolioTokenManager uses the same QuoteSide enum as the IGMTokenManager above.
Contract Addresses
Contract addresses forGMTokenManager and PortfolioTokenManager are available on the smart contract addresses page.
