> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ondo.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Smart Contract Reference

> Smart contract interface for buying and selling Global Markets tokens with attestations.

# 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**

1. User gets a signed quote (off‑chain)
   * The attestation service prepares a `Quote` whose side is `BUY`, 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

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

3. 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 that  `block.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 swap `depositTokenAmount` 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**

1. User gets a signed quote (off‑chain)
   * Attestation service issues a `Quote` whose side is `SELL`, signs it, and returns quote and signature
   * Price still uses 18‑decimal USD format
   * Quantity is the GM amount the user will sell

2. User pre‑authorizes GM tokens
   * GMTokenManager must have allowance ≥ quantity of the specific GM token (asset) described in the quote

3. 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 than  `minimumRedemptiUSDon`

   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

## 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 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`.*

```solidity theme={null}
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.

```solidity theme={null}
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

```solidity theme={null}
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

```solidity theme={null}
enum QuoteSide {
    BUY,
    SELL
}
```

# Contract addresses

Contract addresses are available at the following page: [GM smart contract addresses](/addresses#ondo-global-markets).
