Docs
Addresses, the frozen interface, the events an indexer should watch, and how to run the keeper.
Status
One statement of where this is, kept in one place so no page has to repeat it.
- Polypair contracts
Not deployed on Robinhood Chain
Written, tested and frozen behind IPolypair, but the remediation from the internal review has to land before anything holds real money. Coin pages, portfolios and the resolution relay stay dark until then.
- The token
Live on Pons
A token launched on the Pons launchpad on Robinhood Chain. Its price, curve, locked liquidity and trades are read directly from the Pons contracts and its Uniswap v4 pool.
- Markets
Read-only from Polygon
Live Polymarket conditions, discovered from the conditional tokens and the UMA adapter. Mirroring one onto Robinhood Chain, so a coin can be paired to it, ships with the contracts.
- Prices on markets
Deliberately absent
Polymarket matches orders in an off-chain order book, so a live probability has no on-chain source. It is not shown rather than approximated.
Everything this site displays is read from a chain in your browser at the moment you load the page. Where a read is unavailable, the figure is left out rather than filled in.
Contracts
Robinhood Chain · chain 4663Not deployed on Robinhood Chain yet. The addresses below are placeholders; run npm run dev:fork for a live local deployment.
| Contract | Address |
|---|---|
| LaunchFactory | 0x0000000000000000000000000000000000000000 |
| PolypairRouter | 0x0000000000000000000000000000000000000000 |
| MirrorMarket | 0x0000000000000000000000000000000000000000 |
| CoinTreasury | 0x0000000000000000000000000000000000000000 |
| SideStaking | 0x0000000000000000000000000000000000000000 |
| DefaultMarketRegistry | 0x0000000000000000000000000000000000000000 |
| LaunchLocker | 0x0000000000000000000000000000000000000000 |
| USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
Read from deployments/<chainId>.json, written by the deploy script. The app never hardcodes an address.
Interface
The public surface is frozen in src/interfaces/IPolypair.sol (polypair-interface-1.0.0). Units: USDG and tickets carry 6 decimals, coins 18, probabilities and payouts are 1e6-scaled, shares are basis points.
IMirrorMarket
Mirror markets, their tickets and the bonded resolution relay.
| getMarket(uint256) → Market | Question, end date, sides, relay status, proposer, challenger, coins using it. |
| ticket(uint256,uint8) → address | ERC-20 ticket for one side (6 decimals). |
| pool(uint256,uint8) → address | That side's USDG/ticket mirror pool. |
| probability(uint256,uint8) → uint256 | 30-minute TWAP, 1e6-scaled. Reverts TwapUnavailable before the window fills. |
| payout(uint256,uint8) → uint256 | Final payout per ticket, 1e6-scaled. Zero until finalized. |
| split / merge / redeem | USDG ⇄ a full set of tickets; redeem after finalization. |
| propose / challenge / finalize / arbitrate / voidMarket | The relay. Bonds are 100 USDG; the window is 24 hours. |
ILaunchFactory
Launching, graduating, settling and re-pairing coins.
| launch(LaunchParams,address) → (coin, curve) | Runs the pre-flight checks and deploys the coin and its curve. |
| getCoin(address) → CoinInfo | Phase, cycle, market, side, ticket, curve, pool, graduation threshold, timestamps. |
| previewThreshold(uint256,uint8) → (tickets, price) | The threshold the next launch would get, in tickets and at what price. |
| graduate(address) | Permissionless once the curve is full. |
| settle(address) | Permissionless once the market is finalized or voided. |
| repair(address) | Permissionless after settlement; rolls the coin onto the next market. |
| cycleResult(address,uint32) → CycleResult | Outcome, pot and insurance paid for a past cycle. |
IPolypairRouter
USDG zaps — the only entry point the UI uses for trading.
| launchAndBuyWithUsdg(...) | Launch and take the opening bag in one transaction. |
| buyWithUsdg / sellForUsdg | USDG ⇄ ticket ⇄ coin, with slippage and a deadline. |
| quoteBuyWithUsdg / quoteSellForUsdg | Preview, including how many tickets the trade routes through. |
ICoinTreasury & ISideStaking
Fees, compounding, insurance, creator vesting, staking and the next-market vote.
| info(address) → TreasuryInfo | Liquidity slice, pot, insurance, burn reserve, creator accrual, compound threshold. |
| compound(address) | Permissionless once the liquidity slice clears the threshold. |
| claimCreator(address) | Creator's vested share. |
| stake / unstake / claim | Back a side, withdraw after settlement, claim rewards in USDG. |
| vote / leadingVote / setCreatorChoice | Choose the market the coin rolls onto next. |
Events
The launch and curve events keep the signatures indexers already handle, so existing tooling can read Polypair launches without changes.
| Event | Family |
|---|---|
| TokenLaunched(token, curve, deployer, pairToken, launchConfigId, graduationThreshold) | Pons-compatible |
| CurveBuy(buyer, recipient, quoteIn, tokensOut, fee, tax) | Pons-compatible |
| CurveSell(seller, recipient, tokensIn, quoteOut, fee, tax) | Pons-compatible |
| SnipeTaxCharged(recipient, amount) | Pons-compatible |
| CurveCompleted(recipient, quoteOut, tokenOut) | Pons-compatible |
| LaunchSwept(token, quoteOut, tokenOut) | Pons-compatible |
| PoolGraduated(token, positionId, tokenAmount, pairTokenAmount) | Pons-compatible |
| GraduationTokensPermanentlyLocked(token, amount) | Pons-compatible |
| CycleStarted(coin, cycle, marketId, side, ticket, phase) | Polypair |
| CycleSettled(coin, cycle, marketId, side, won, voided, potUsd, insuranceUsd) | Polypair |
| Repaired(coin, cycle, marketId, side, phase, usdgRecovered) | Polypair |
| ResolutionProposed / ResolutionChallenged / ResolutionFinalized / MarketVoided | Polypair relay |
| Staked / Unstaked / RewardsClaimed / Voted | Polypair staking |
| FeeSplit / Compounded / CreatorClaimed | Polypair treasury |
Running a keeper
Nothing in Polypair needs a privileged operator. A keeper just calls the permissionless functions when their preconditions hold, and anyone can run one — or press the same buttons in the app.
graduate(coin)— whenBondingCurve.readyToGraduate()is true.compound(coin)— whenCoinTreasury.compoundable(coin)is true.propose(marketId, payouts, evidence)— after the end date, once the real outcome is known. Costs a 100 USDG bond, returned on finalization.finalize(marketId)— 24 hours after an unchallenged proposal.settle(coin)thenrepair(coin)— once the market is finalized or voided.
All of them revert with a named error when their preconditions do not hold, so a keeper can simply attempt them on a timer and ignore the reverts.
Building and verifying
The protocol is a Foundry project. From the repository root:
forge build
forge test # full lifecycle suite
npm run dev:fork # anvil + deploy + seeded demo data
npm run abis # regenerate the frontend ABIs from out/To verify a deployment on the explorer:
forge verify-contract <address> src/LaunchFactory.sol:LaunchFactory \
--chain-id 4663 --verifier blockscout \
--verifier-url https://robinhoodchain.blockscout.com/apiEvery deployment writes its addresses to deployments/<chainId>.json; that file is the only source the frontend reads.