How It Works
SellPolia is a set of on-chain contracts plus an off-chain indexer that watches them. The contracts hold funds and emit events; the indexer turns those events into a queue, matches buyers to sellers, and drives deliveries and payouts.
The lifecycle at a glance
SELLER SELLPOLIA BUYER
------ --------- -----
deposit SETH ─────────▶ SethVault (Sepolia)
emits SethReceived
│
indexer creates a
FIFO queue order
pays via
PaymentCollector ◀── buy() / buyWithToken()
emits SethPurchased (payment chain)
│
indexer matches the buy
against the queue (FIFO),
then the reserve backstop
│
├─ delivers SETH to buyer ──────────▶ SETH on Sepolia
│ (vault.sendSeth on Sepolia)
│
└─ seller accrues USD-owed
│
daily Payout batch on Base
│
paid in ETH ◀───────────── Payout (Base)The three contracts
- SethVault (Sepolia) — receives seller deposits (each becomes a queue order), holds the house reserve separately, and delivers sold SETH to buyers.
- PaymentCollector (payment chains) — takes buyer payments in native coin or stablecoins, prices them on-chain via Chainlink, and emits the purchase event.
- Payout (Base) — pays sellers in ETH, converting the USD they’re owed to ETH at the Chainlink ETH/USD price at payout time.
Two matching sources
Every buy is filled from two sources, in this order:
- The live seller queue — open seller orders, oldest first (FIFO).
- The SellPolia reserve — an owner-funded backstop inside the vault. When the queue can’t cover a buy, the remainder is filled from the reserve so buys never fail for lack of inventory.
Reserve liquidity is funded through a separate contract path
(fundReserve()), so it never becomes a seller queue order and never
competes with real sellers for payouts.
Read the details in Selling & the Queue and Buying & Fills.
Last updated on