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

# Become a Market Maker

> Get approved as a market maker, set up your wallet, and create, redeem and quote through the venue on Base and Solana.

Market makers keep GetEquity's RWA tokens liquid: they create and redeem stock with each
asset's vault and quote investors a two-way price. Read
[market-making pools](/docs/onchain/market-making) first for how the venue works.

<Warning>
  **Testnets only today.** You can practise every step on **Base Sepolia** and **Solana
  devnet**. Venues are not yet deployed on mainnet.
</Warning>

## 1. Get approved

Making markets is permissioned. Approval has two layers, both recorded on chain:

| Layer | What it means | Base | Solana |
| - | - | - | - |
| Firm approval | Your wallet is an approved market maker | `VenueFactory.isApprovedMaker(maker)` | `maker_approval` PDA `["maker_approval", maker]` exists and is approved |
| Per-asset activation | You may act on this asset's venue | `venue.isActiveMaker(maker)` | maker state PDA `["maker", venue, maker]` is active |

<Steps>
  <Step title="Apply">
    Contact GetEquity to begin onboarding. We run due diligence on the firm and agree a
    market-maker agreement covering obligations (quoted spread and depth), limits and
    conduct.
  </Step>

  <Step title="Name your maker wallet">
    One wallet per chain is your maker identity: every venue call must come from it.
  </Step>

  <Step title="Approval on chain">
    GetEquity's governance multisig approves the wallet. Approval switches you on for
    **every asset that has a venue**, in one multisig transaction. An asset's sponsor
    may later stand you down on that asset alone; withdrawing firm approval stops you
    everywhere.
  </Step>
</Steps>

Check your status at any time with the views above.

## 2. Set up your wallet

* **Hold the tokens you will trade.** cNGN to create stock and to buy from investors;
  the RWA token to redeem and to sell to investors.
* **Approve the venue.** The venue moves tokens from your wallet only up to your
  allowance, and that allowance is your quoted depth.
  * Base: `approve(venue, amount)` on cNGN and on the RWA token.
  * Solana: SPL `approve_checked` on your cNGN and RWA token accounts, delegating to the
    venue PDA.
* **Have gas.** ETH on Base, SOL on Solana.

<Note>
  Once approved, your wallet **cannot sell on the Market**: the Market reverts with
  `MakersMustUseTheVenue`. Redeem through the venue instead.
</Note>

## 3. Find the venue

* **Base:** `VenueFactory.venueOf(token)` returns the asset's venue (`0x0` if it has none).
  Base Sepolia venues are listed on the
  [Base addresses](/docs/onchain/ethereum-addresses#market-making-venues) page.
* **Solana:** the venue is the PDA `["venue", mint]` under the `rwa_venue` program
  `BNySR58kNhV646LGVERkyxD4DMk7puamJ1DDpbXMHhpW`.

## 4. Trade

### Base (EVM)

```solidity theme={null}
// Primary: create stock with the vault (pay cNGN, receive the RWA token)
uint256 stockOut = venue.create(cashIn, minStockOut);

// Primary: redeem stock (one outstanding redemption per maker)
(uint256 id, bool paidNow) = venue.requestRedeem(amount, minPayout, deadline);
venue.claimRedeem(id);        // when it reaches the head of the queue
venue.resolveRedeem(id);      // after the force-resolve window
venue.withdrawOwed(maker);    // deliver what resolve recorded

// Secondary: quote investors
venue.setQuote(bidSpreadBps, askSpreadBps, validUntil);
```

Useful views: `quoteRedemption(amount, priceScaled)` (what a redemption would pay at a
price; pass `Market.currentPriceScaled(token)` for now),
`availableFloat()`, `queueLength()`, `getRedemption(id)`, `hasQueuedRedemption(maker)`,
`quoteOf(maker)`, `makerDepth(maker)`, `meetsDepthObligation(maker)`, `owedStock(maker)`,
`owedCash(maker)`.

Events: `Created`, `RedemptionRequested`, `RedemptionPaid`, `SettlementDeferred`,
`OwedWithdrawn`, `QuoteSet`, `BoughtFrom`, `SoldTo`.

### Solana

Instructions on `rwa_venue` (full accounts in the
[IDL](/docs/idl/rwa_venue.json)):

| Instruction | Args | Notes |
| - | - | - |
| `create` | `cash_in, min_stock_out` | Pay cNGN, receive stock |
| `request_redeem` | `index, amount, min_payout, deadline` | `index` must equal the venue's `redemption_count`; the redemption PDA is `["redemption", venue, index]` |
| `claim_redeem` | — | Pays the head of the queue; send it with `request_redeem` when the pair succeeds |
| `resolve_redeem` | `index` | After the force-resolve window |
| `withdraw_owed` / `_stock` / `_cash` | — | Delivers what resolve recorded, from `["owed", venue, maker]` |
| `set_quote` | `bid_spread_bps, ask_spread_bps, valid_until` | Spreads in bps, `valid_until` in unix seconds |

Other accounts you derive:

| Account | Program | Seeds |
| - | - | - |
| Venue | `rwa_venue` | `["venue", mint]` |
| Maker state | `rwa_venue` | `["maker", venue, maker]` |
| Maker approval | `rwa_venue` | `["maker_approval", maker]` |
| Venue allowance | `rwa_vault` | `["venue_allowance", mint, venue]` |

Events: `Created`, `RedemptionRequested`, `RedemptionPaid`, `OwedWithdrawn`, `QuoteSet`,
`Traded`, `RedemptionCancelled`.

## Good practice

* **Quote and protect.** Pass a real `minStockOut` / `minPayout` and a short `deadline`
  (GetEquity's own client uses 1% and 10 minutes).
* **Refresh quotes before they expire.** Investors cannot trade against an expired quote.
* **Keep allowances at the depth you mean to show.** Depth is read from your balance and
  allowance, not from a separate setting.
* **Watch the queue.** A redemption that is not at the head cannot be claimed yet; one
  outstanding past the force-resolve window is settled by `resolveRedeem`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.