Contracts
The complete contract reference: what each contract is for, in one line, and where to find it.
Stage 1 is live. The 56 contracts it deployed on Robinhood Chain mainnet (4663) — the only
supported network — carry real addresses below, every one of them verified. A row marked stage 2
is not deployed: it has no address, and anything on chain answering to that name is not this
protocol.
INVEST total supply is zero. The anchor pool is pinned but holds no liquidity, there are no sell walls, no bond market and no fee flywheel, and the posted self-service lane ships closed. Read Deployment status before reading any other page here as a description of today.
Explorer: https://robinhoodchain.blockscout.com/address/<address>. All 56 are verified on Sourcify
(exact match), which Blockscout ingests, so each reads as verified there.
Tokens
| Contract | What it does | Address |
|---|---|---|
InvestToken | INVEST, the native token. 9 decimals. Minted only by the Treasury. A plain ERC-20 — no transfer hook, no exemptions; every transfer moves exactly what was sent. | 0xE1D5a81E74354c44D3610578c90b6542C2DA240a |
Shares | SHARES, staked INVEST. 9 decimals, rebasing — balances grow each epoch. | 0x44001dD7Abf94A934A6609f646b43ACdfd4A4FDc |
GInvest | gINVEST, the non-rebasing governance wrapper. 18 decimals, timestamp voting clock, the only voting token. | 0xf8B6629E19e3eb54E58082bF0Aed027E0D274b69 |
Core
| Contract | What it does | Address |
|---|---|---|
Treasury | Holds every reserve, marks them in USD through vetted feeds, and is the sole minter of INVEST. | 0x155516c796f11d703d4b2C360BC10Ace8013c6F8 |
Staking | Stakes INVEST into SHARES or gINVEST, runs the epoch rebase, and manages warm-up positions. | 0x68a000bC77bBd1652451995ac71F528aBA8Faa41 |
Distributor | Mints the per-epoch emission to staking, capped at excess reserves. | 0x3b2Aa7f0Fc8976fF2E6c1903964423a9ef583801 |
BondDepository | Runs the bond markets: sells INVEST for reserve assets at a decaying, floored price, with payouts vesting as gINVEST notes. It has no price-above-market check, and at genesis the floor binds well above spot. | 0x850C1A0a8909EBE9A950864B151f8D63cca6027Bno market exists — stage 2 creates the first |
PolicyGuard | The bounded operator path for opening bond markets. Enforces the capacity caps and the price floor. | 0xB96c82607Bdc419DBA3aB1bdBF4f97eB9fFA9ecF |
RedemptionModule | The redemption backstop: a pro-rata, oracle-independent claim on raw reserve tokens. Its role is frozen and governance cannot revoke it. The anchor pool share is counted in the backing it divides but is structurally barred from the payout, by immutable address, so a basket that names it is refused by name rather than failing obscurely. It has three such slots and uses one: a sell wall needs none, because it is not a reserve at all and a basket naming one is refused for that reason instead. | 0x36A0732BC2aa70A34a4d99df233237984D4Ff481 |
ICAuthority | The role registry every other contract reads to answer "who is governor, guardian, policy, vault". | 0x7cf95e0815E89b695945aF2120933Fd96E1BFd63the deployer still holds governor and guardian |
Governance
| Contract | What it does | Address |
|---|---|---|
ICGovernor | The Boardroom: proposals, gINVEST voting and quorum, on a timestamp clock. | 0x34904663621Ad9A298fa63B9f8393f0Ac30b5dcF |
TimelockController | Queues and executes passed proposals — and is the Treasury's governor, calling every privileged function directly. | 0xc3bC0fb48D2812F89896F5455fF48DF9a50a38FFnot yet the Treasury's governor |
Launch and the fee flywheel
| Contract | What it does | Address |
|---|---|---|
PolVault | The anchor. The protocol's only two-sided position: one full-range position in one pinned, hookless Uniswap V4 pool — 5.00% fee, tick spacing 32,767 — wrapped as a non-transferable share the Treasury holds 100% of. One instance, INVEST/USDG, designed to hold 60% of the supply against the whole seed at an opening price of seed ÷ the anchor's INVEST. It pins and initialises its pool on deployment — the instance below was pinned at $0.138889 per INVEST, the earlier $5,000 sizing, before the seed was resized to $10,000 (see Deployment status) — is seeded once, at stage 2 — which has not run, so it holds nothing — and lets anyone sweep the accrued fee to the collector. It is never bought into on the open market; it is grown, by decree, through PolMigrator. | 0xC6922da56539703cbEDB30e29e040fE820265613pool pinned, zero liquidity, not seeded |
PolLadder ×4 | The sell walls. One one-sided INVEST position per pool, in a pinned hookless Uniswap V4 pool at 5.00% and tick spacing 2,048, quoted in RCAT / WYFI / HIMS / DJT and holding 10% of the supply each. It takes no quote leg, so it costs nothing to seed, and it has no share, no price feed and no Treasury registration — a wall is not a reserve. Its inventory is offered from a wall price three times the launch price upward. realise() is the permissionless call that hands a filled wall's stock to the Treasury by plain transfer and re-mints the remainder at a higher wall; it is the only route a wall's sale has to backing, and the wall can only move up. | stage 2 — not deployed |
PolMigrator | The one contract allowed to add to the anchor position, and only by Boardroom decree. Two lanes, both spending reserves the Treasury already holds: unwind a Treasury-held Uniswap V2 INVEST/USDG LP into the V4 position, or pair Treasury USDG with INVEST minted at the pool's live price behind a price floor the proposal names. Leftover quote returns to the Treasury, leftover INVEST is burned, and the share lands in the Treasury in the same transaction. Holds no funds between transactions. No wall has one, or can: there is no share to mint pro-rata and no quote leg to pair. Its minting lane also passes the excess-reserves gate, which is closed at launch. | stage 2 — not deployed |
TaxCollector | The pool-fee collector, and the registry of the pools it collects from. One permissionless call cranks all five positions. Receives fees in six currencies: it sells the INVEST from every pool for USDG under a median-price floor — into the anchor pool only, and a wall is refused by name because it holds no cash — splits everything it holds between the team and the treasury (the treasury's half going to the FeeAllocator desk), and forwards the four stock fees to the Treasury in kind, never sold and never minted against, less the same decaying team share. | stage 2 — not deployed |
PairOracle ×5 | The sampled-median price oracle over one protocol-owned pool: sixteen observations, thirty minutes apart, a valid window of 30 minutes to 4 hours. Fail-closed — no valid window, no price. It answers in that pool's own quote, not in dollars; the anchor's is the one anything outside the fee loop reads. A wall's is dormant, not broken, while its pool is out of range — which is every wall, at launch. | stage 2 — not deployed |
FeeAllocator | The accumulation desk. The treasury's share of every pool-fee distribution lands here and is split, by weight, across the destinations governance has approved — with a floor under reserve accumulation that only a vote can move. Governance approves each destination and sets the floor; the operator sets the weights inside it; the split itself is permissionless and holds no seat. Registered with the Treasury as a trusted holder, so stablecoin in flight still counts as backing, capped. | stage 2 — not deployed |
ReserveAccumulator | Turns the accumulation share of the pool fees into a governed basket of reserves, and runs bounded reserve rotations. | stage 2 — not deployed |
V4SwapExecutor | The Uniswap V4 swap engine the accumulator uses. Holds no funds, no policy and no permissions of its own. | stage 2 — not deployed |
ReserveLister | The narrowly scoped delegate that lets an operator activate assets governance has already vetted. | 0x9D177A770F7BeB6e1DBa73Bfc9231af00B443390 |
PostedSelfServiceLane | Turns "may this asset be listed?" from a vote per asset into a policy governance approves once. It admits an asset only when the asset proves, on-chain, that it is one of Robinhood's own factory-issued stock tokens; it deploys the price feed itself, from fixed code, with governance's timelock as its only administrator; and it hands the lister a record built entirely from the policy. Ships switched off, and closing it again is one governance action. | 0xcF31925d351abD254A4d9Ef06Db1087fF464c868seated but closed — no policy armed |
PostedRefReader | The lane's view-only sidecar: it derives the pool a listing reference names rather than accepting a pool address, so a would-be lister can never point a reference at a contract they wrote. Holds no funds and no permissions. | 0xe831d3B7C154dE22d58C2502311Ccb91cc6E63b1 |
V4PositionVault | The Treasury's Uniswap V4 liquidity desk: a bounded, governor-policed position in one pinned hookless pool, funded from reserves and held as a non-transferable share that is valued but never paid out. Refuses a deposit whenever its pricing has drifted from what governance approved, and keeps every exit open regardless. Installed after genesis, one per pool. | stage 2 — not deployed |
V4PositionValuer | The vault's view-only arithmetic sidecar, deployed by the vault itself: oracle reads, deposit sizing and the oracle-implied valuation. Holds no funds and no permissions. | stage 2 — not deployed |
Price feed adapters
Each of these presents an ordinary oracle interface to the Treasury, so the Treasury itself never changes to accommodate a new kind of asset.
| Contract | What it does | Address |
|---|---|---|
LastPriceFeed | Wraps an oracle feed so a bounded publication gap — a closed equity market — does not make the asset unpriceable. | 35 deployed — one per oracle-fed reserve row; addresses below |
UniV2TwapFeed | A guarded on-chain TWAP for assets with real liquidity but no oracle feed. | stage 2 — not deployed |
PostedPriceFeed | A manually posted mark for assets with neither an oracle nor a usable pool, bounded per post and per day. | 5 deployed and live — RCAT, WYFI, HIMS, DJT, AMC, each on a 24-hour heartbeat; addresses below |
RateComposedFeed | Composes an exchange-rate feed with the underlying's USD feed, for wrapped staking assets. | stage 2 — not deployed |
UniV2FairLpFeed | A manipulation-resistant mark for INVEST-paired LP tokens. | stage 2 — not deployed |
PolPositionFeed | The conservative mark for the anchor share: min(vQuote, sqrt(vINVEST@$1 · vQuote)), with the INVEST leg pinned at the $1.00 backing target and never read at market. One instance, because there is one share. Its quote is USDG, and one whole share is one whole quote token, so it marks at exactly $1.00 at launch. The sell walls have no share and no feed at all. | stage 2 — not deployed |
PairOracleFeed | Presents the anchor pool's median price as an INVEST/USD reference. Used only as the bond price band reference, never as a reserve feed — and never built over a stock-quoted pool, which would let a price the protocol publishes decide how cheaply bonds mint INVEST. | stage 2 — not deployed |
V4PositionFeed | Marks a V4 position vault share at the oracle-implied price of its positions — principal only, never fees, never spot — carrying each leg's own price band and pause flag, and never reading the Treasury. One per vault. | stage 2 — not deployed |
Deployed price feeds
Stage 1 deployed 40 feed contracts: the five manually posted marks, and one LastPriceFeed
wrapper for each oracle-fed stock and ETF row. All 40 are verified. A feed is only a price;
none of them holds an asset, and the Treasury's balance of every asset below is zero.
The five posted marks
These are the only part of the protocol doing anything today. Each posts a mark on a 24-hour heartbeat, so its reserve row stays fresh. A posted price carries the deepest discount in the protocol and the tightest posting budget — a limit per post, a limit per rolling day, and a hard sanity band — because it is a number somebody types rather than a number an oracle publishes.
RCAT, WYFI, HIMS and DJT are the assets the four sell walls are quoted in — none of which exists yet. AMC is the one name the treasury is listed to buy. All five are registered and enabled reserve rows holding nothing.
The 35 oracle wrappers
One LastPriceFeed per oracle-fed equity and ETF row. The wrapper is the address the Treasury
reads; the underlying is the Chainlink aggregator it wraps. They are not interchangeable —
pointing the Treasury at the underlying would drop the staleness allowance that lets a closed
equity market still be priced.
The remaining 8 registered rows — USDG, WETH, WBTC, cbBTC, USDC, USDT, LINK, wstETH — are read straight from their Chainlink feeds and need no wrapper, because those feeds do not stop publishing when an exchange closes. Their addresses are in Robinhood Chain facts.
Treasury games
| Contract | What it does | Address |
|---|---|---|
GameHouse | The bankroll vault games play against: escrows wagers, locks worst-case payouts, settles rounds. | stage 2 — not deployed |
CoreGameHouseFactory | Deploys and recognises the single canonical house for this treasury. | stage 2 — not deployed |
CoinFlip | A coin flip paying true odds on the rake-net stake. | stage 2 — not deployed |
DiceRoll | A variable-probability roll paying true odds on the rake-net stake. | stage 2 — not deployed |
PrizeDraw | A pooled ticket draw. Escrows its own pot; draws no bankroll. | stage 2 — not deployed |
Jackpot | A pooled ETH round paid out in a randomly chosen tokenized stock. Escrows its own pot; draws no bankroll. | stage 2 — not deployed |
LockLottery | The loss-less daily draw. Lock gINVEST for a week or more — a longer lock earns a higher multiplier — and each day five distinct addresses win a share of the pot, with chance proportional to locked weight. There is no house, no wager and no edge: the prizes are funded by the FeeAllocator out of the protocol's own fee revenue, and no code path sends a locked deposit anywhere but back to the address that locked it. Added after genesis; played in a separate games app. | stage 2 — not deployed |
Chain constants — Robinhood Chain mainnet 4663
These already exist on-chain. They are not Investors Center contracts; the protocol is built against them.
| Address | |
|---|---|
| USDG — the anchor pool's quote asset and the genesis reserve | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| RCAT — a sell wall's quote asset | 0xFDE6b5d9BB419B10C23268c74e369AbFF39C0460 |
| WYFI — a sell wall's quote asset | 0x9e7ABD3C9139D14E4c86DcE0e455AAB7A0C2FB3E |
| HIMS — a sell wall's quote asset | 0xCceE82fE024c36fA15E1005edE3E9e4787e23D09 |
| DJT — a sell wall's quote asset | 0x1D11f0496982706C5e14A514D4E79F2e6BdE4516 |
| WETH | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 |
| Uniswap V2 factory | 0x8bcEaA40B9AcdfAedF85AdF4FF01F5Ad6517937f |
| Uniswap V2 router | 0x89e5DB8B5aA49aA85AC63f691524311AEB649eba |
| Uniswap V3 factory | 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA |
| Uniswap V4 PoolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 |
These are looked up on the same explorer as everything else:
https://robinhoodchain.blockscout.com/address/<address>.
Pre-existing shared game infrastructure
Robinhood Chain already carries a shared game plugin registry and a game-house beacon that predate Investors Center:
| Contract | Address |
|---|---|
| Game plugin registry | 0x83fDE29C9c38b1300e64C5DBA5E0e465031B109a |
| Game house implementation | 0x8fe7C3E52f15b3cAd28ADB40B7b9384C23d03047 |
| Game house beacon | 0x7727E6c60896893E23e575ECa5e8e88dCb82eA3B |
Any game house or plugin instance already deployed on 4663 is bound to a different treasury and
cannot serve this one. The Investors Center lane needs its own house and its own game instances,
built against the Investors Center Treasury. Do not treat an address found on-chain as belonging to
this protocol unless it is published on this page.
Reserve assets and price feeds
Stage 1 registered and enabled 48 reserve rows: 43 against oracle feeds, plus five posted rows — the four sell-wall stocks and AMC — against manually posted prices. Every one of them holds nothing; a registered row is a place to count an asset, not the asset. The canonical token and feed addresses for every tokenized stock, ETF and bridged crypto asset on the chain are catalogued in Robinhood Chain facts. How an asset gets there is Reserves and listing.