IGMTokenManager
The IGMTokenManager interface may be used by external parties to buy and sell Global Markets tokens using attestations. The general flow for each side is:
Buying GM Tokens
-
User gets a signed quote (off‑chain)
- The attestation service prepares a
Quote
whose 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
- GMTokenManager must have a sufficient allowance of USDon or USDC (other ERC-20s may be added in the future) before the call
- Allowance ≥ price × quantity
Note 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 USDC to USDon with zero slippage by specifying it as the deposit token below. We will have more details on our PSM (Peg Stability Module) contract coming soon.
-
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
userID
matches the one received in the quote - Ensures the
attestationId
has not been used and thatblock.timestamp ≤ expiration
- Confirms side ==
BUY
- Ensure the value of the transaction is greater than
minimumDepositUSD
but does not exceed per-user and per-token rate limits
Settle the tokens
- If the
depositToken
specified is not USDon, first swapdepositTokenAmount
for USDon - Burns price × quantity of USDon (either after receiving from
msg.sender
or swapping) - Mints quantity of GM tokens to
msg.sender
- Refund USDon to the user if any is leftover
Post‑process the quote
- Marks
attestationId
as consumed to prevent replay
Return the tokens received
receivedGmTokenAmount
equals quantity
Selling GM Tokens
-
User gets a signed quote (off‑chain)
- Attestation service issues a
Quote
whose 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 ==
SELL
instead and that the transaction value is greater thanminimumRedemptiUSDon
Settle the tokens
- 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 >=
minimumReceiveAmount
being received) - All tokens received are transferred to the caller
Post‑process the quote
- Marks
attestationId
as used
Return the tokens received
receivedUSDonAmount
equals price × quantity
- Same as subscribe, but checks that side ==
Functions
mintWithAttestation
Called by users to mint GM tokens with a quote attestation using USDon
If the deposit token is not USDon and the depositTokenAmount is not enough to swap for USDon
worth 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
.
function mintWithAttestation(
Quote calldata quote,
bytes memory signature,
address depositToken,
uint256 depositTokenAmount
) public override whenMintingNotPaused(quote.asset) returns (uint256);
Parameters
Name | Type | Description |
---|---|---|
quote | Quote | The quote to mint GM tokens with |
signature | bytes | The signature of the quote attestation |
depositToken | address | The token the user would like to deposit in return for GM Tokens. If not USDon, this will be reliant on the ability to swap for USDon in the USDonManager |
depositTokenAmount | uint256 | The amount of depositToken the user wishes to spend to purchase USDon atomically in the transaction |
Returns
Name | Type | Description |
---|---|---|
<none> | uint256 | The amount of GM tokens minted to the user |
redeemWithAttestation
Called by users to redeem GM tokens for USDon
function redeemWithAttestation(
Quote calldata quote,
bytes memory signature,
address receiveToken,
uint256 minimumReceiveAmount
) public override whenRedeemNotPaused(quote.asset) returns (uint256);
Parameters
Name | Type | Description |
---|---|---|
quote | Quote | The quote to redeem GM tokens with |
signature | bytes | The signature of the quote attestation |
receiveToken | address | The token the user would like to receive. If it is not USDon, transaction success will depend on liquidity in USDonManager |
minimumReceiveAmount | uint256 | The minimum amount of tokens the user would like to receive - ONLY applicable if the user requests a non-USDon otoken |
Returns
Name | Type | Description |
---|---|---|
<none> | uint256 | The amount of USDon minted |
Structs
Quote
Quote struct that is signed by the attestation signer
struct Quote {
uint256 chainId;
uint256 attestationId;
bytes32 userId;
address asset;
uint256 price;
uint256 quantity;
uint256 expiration;
QuoteSide side;
bytes32 additionalData;
}
Properties
Name | Type | Description |
---|---|---|
chainId | uint256 | The chain ID of the quote is intended for |
attestationId | uint256 | The ID of the quote |
userId | bytes32 | The user ID the quote is intended for |
asset | address | The address of the GM token being bought or sold |
price | uint256 | The price of the GM token in USD with 18 decimals |
quantity | uint256 | The quantity of GM tokens being bought or sold |
expiration | uint256 | The expiration of the quote in seconds since the epoch |
side | QuoteSide | The direction of the quote (BUY or SELL) |
additionalData | bytes32 | Any additional data that is needed for the quote |
Enums
QuoteSide
Enum for the side of the quote
enum QuoteSide {
BUY,
SELL
}