Two markets in one venue
Every price in the venue is the asset’s live accrued price, the same one the Market
uses (EVM:
Market.currentPriceScaled(token); see
yield and accrual).
Create
create(cashIn, minStockOut): the maker pays cNGN and receives existing vault stock at
the live price. Nothing is minted. A creation fee and a protocol fee come off cashIn;
the rest buys stock. Creation is capped per firm per day (reset at 00:00 UTC); a create
that would cross the cap reverts with DailyCapExceeded (no partial fills).
Redeem
A redemption returns stock to the vault in exchange for cNGN. The stock moves to the vault at request, and the price and fees are locked then.1
Request
requestRedeem(amount, minPayout, deadline). Reverts with SlippageExceeded if the
locked payout is under minPayout, and DeadlineExpired past deadline (0 is not
allowed). A maker can have one redemption outstanding at a time
(AlreadyQueued); the slot frees when that redemption is resolved.2
Paid now, or queued
On Base, the request pays at once when the queue is empty and the vault’s available
cash covers it. Otherwise it joins a strict first-in-first-out queue. On Solana,
requests always queue; clients send
request_redeem and claim_redeem together
when the pair would succeed.3
Claim
claimRedeem(id) pays the redemption at the head of the queue (NotAtQueueHead
otherwise) from the vault’s available cash (InsufficientFloat if short). Before
the auto-return window anyone may claim; after it, only the maker.4
Resolve, after the force-resolve window
claimRedeem now reverts with UseResolve. Anyone may call resolveRedeem(id)
(TooEarlyToResolve before the window). The vault’s cash decides the outcome: the
maker is paid at the locked price if it can be covered, otherwise the stock is
returned. If the price has risen since the request, the stock returned is capped at
amount × lockedPrice ÷ livePrice, so a delayed redemption is never worth more than
the payout it replaced. There is no compensation for waiting.5
Withdraw what is owed
resolveRedeem only records the outcome. withdrawOwed(maker) delivers it
(or withdrawOwedStock / withdrawOwedCash separately). Anyone may call it; it always
pays the maker.Secondary trading
A maker quotes a spread around the live price, not a price:setQuote(bidSpreadBps, askSpreadBps, validUntil): each spread must be within the venue’s maximum (QuoteTooWide), andvalidUntilwithin its validity cap (ValidityTooLong).- Investors trade with a named maker:
buyFrom(maker, amount, maxCost)andsellTo(maker, amount, minPayout). Trades against an expired quote revert withQuoteExpired. Both legs move directly between investor and maker. - A maker’s depth on each side is the smaller of its balance and its allowance to the venue, so the maker controls depth through its token approvals.
Makers trade through the venue
An approved maker cannot sell on the Market: the Market reverts withMakersMustUseTheVenue (Solana: rwa_market error 6025) and the maker redeems through
the venue instead. This keeps maker flow out of the retail book. The restriction lifts if
the maker is stood down.
Parameters
Each venue’s parameters are set by GetEquity’s multisig and can be read on chain. The pilot values intended for mainnet:
On the testnets the windows are much shorter (300 s and 900 s) so the full redemption
lifecycle can be exercised in minutes.
Errors
Solana’s
rwa_venue program uses the same names (error codes 6000–6023 in its
IDL).
Next
Become a market maker
Approval, setup and every maker call on both chains.
Venue addresses
Base Sepolia venues by asset; Solana venue derivation.
