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 4663

Not deployed on Robinhood Chain yet. The addresses below are placeholders; run npm run dev:fork for a live local deployment.

ContractAddress
LaunchFactory0x0000000000000000000000000000000000000000
PolypairRouter0x0000000000000000000000000000000000000000
MirrorMarket0x0000000000000000000000000000000000000000
CoinTreasury0x0000000000000000000000000000000000000000
SideStaking0x0000000000000000000000000000000000000000
DefaultMarketRegistry0x0000000000000000000000000000000000000000
LaunchLocker0x0000000000000000000000000000000000000000
USDG0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168

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) → MarketQuestion, end date, sides, relay status, proposer, challenger, coins using it.
ticket(uint256,uint8) → addressERC-20 ticket for one side (6 decimals).
pool(uint256,uint8) → addressThat side's USDG/ticket mirror pool.
probability(uint256,uint8) → uint25630-minute TWAP, 1e6-scaled. Reverts TwapUnavailable before the window fills.
payout(uint256,uint8) → uint256Final payout per ticket, 1e6-scaled. Zero until finalized.
split / merge / redeemUSDG ⇄ a full set of tickets; redeem after finalization.
propose / challenge / finalize / arbitrate / voidMarketThe 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) → CoinInfoPhase, 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) → CycleResultOutcome, 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 / sellForUsdgUSDG ⇄ ticket ⇄ coin, with slippage and a deadline.
quoteBuyWithUsdg / quoteSellForUsdgPreview, including how many tickets the trade routes through.

ICoinTreasury & ISideStaking

Fees, compounding, insurance, creator vesting, staking and the next-market vote.

info(address) → TreasuryInfoLiquidity 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 / claimBack a side, withdraw after settlement, claim rewards in USDG.
vote / leadingVote / setCreatorChoiceChoose 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.

EventFamily
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 / MarketVoidedPolypair relay
Staked / Unstaked / RewardsClaimed / VotedPolypair staking
FeeSplit / Compounded / CreatorClaimedPolypair 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) — when BondingCurve.readyToGraduate() is true.
  • compound(coin) — when CoinTreasury.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) then repair(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/api

Every deployment writes its addresses to deployments/<chainId>.json; that file is the only source the frontend reads.