Skip to content
Protocol / Contracts and addresses

Contracts and addresses

The onchain pieces (V2 clearing, vault, router and venue adapters), what each one does, and where they are deployed on Robinhood Chain.

Network

ChainRobinhood Chain, chain id 4663
RPChttps://rpc.mainnet.chain.robinhood.com
Explorerrobinhoodchain.blockscout.com
Gas tokenETH

Addresses

Current deployment (current, V2): clears Robinhood Stock Tokens and Pons V2 launch curves through one router. Deployed from block 72,249,552. The four NoFomo contracts are source-verified on Sourcify with an exact match.

ContractAddress
BlockClearingV20x7494D1Ed18FbA9B9c90aa4eE41F3eAf794E44D61 (opens Blockscout in a new tab)Sourcify (exact match)Price guard 300 bps, grace 15 min, fee 10 bps
MandateVaultV20xD503e111Fa36F31CfD2d68683f13AbeBF8741d8D (opens Blockscout in a new tab)Sourcify (exact match)
VenueRouter0x71EA6e782F40791af295860277a8b44564CDe4EB (opens Blockscout in a new tab)Sourcify (exact match)The venue both contracts pin. No admin.
StockV3Adapter0x0e44C0863e0B5CA2903e6E2E78248f172913a9E2 (opens Blockscout in a new tab)Sourcify (exact match)33 stock routes; ownership renounced, so the route table is frozen
PonsV2CurveAdapter0xDbC9E63CD52045563c86792e71173692286b71bA (opens Blockscout in a new tab)Reused by the router for Pons markets

Legacy deployment (legacy): the first mainnet deployment, against Pons V3 pools. It is kept for history (the first real mainnet clears happened here) and is read-only in the product. Deployed at block 34,664,366.

ContractAddress
BlockClearing0xE45C74ABa9f4A7aaE42Ef1de4d86cf22b83e2855 (opens Blockscout in a new tab)
MandateVault0x20663C6b6eDa64d95aa275A6993E26f7E75Eb991 (opens Blockscout in a new tab)
PonsV3Adapter0x371af95db6dDE4F320A1390089a8F61d2FA02E9b (opens Blockscout in a new tab)

Retired v1 contracts

The first Pons V2 curve deployment is retired: a critical issue was found in our internal review (finding F-01 on Security). It never held user funds (no clusters, no mandates, no ETH). NoFomo no longer indexes it or builds transactions for it. Deployed at block 35,811,920. Do not send anything to these addresses.

ContractAddress
BlockClearing (v1)0x4e372df38dabA638fcfb19B18c792E30a0C42d7A (opens Blockscout in a new tab)Retired
MandateVault (v1)0x8ec27184f76db7bE1Ec9b2A9781152d6417b6400 (opens Blockscout in a new tab)Retired

Third-party contracts the adapters read from. They are not NoFomo's and are listed for verification only.

ContractAddress
WETH0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 (opens Blockscout in a new tab)
USDG0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 (opens Blockscout in a new tab)Quote asset of most stock pools (6 decimals)
USDG/WETH 0.01% pool0x52e65B17fB6E5BA00Ed806f37Afcd2DaA50271Ca (opens Blockscout in a new tab)The hop every USDG stock route uses
V3 pool factory0x1f7d7550B1b028f7571E69A784071F0205FD2EfA (opens Blockscout in a new tab)Factory of every stock pool the adapter routes to
Stock Token registry0xe10b6f6B275de231345c20D14Ab812db62151b00 (opens Blockscout in a new tab)Robinhood's beacon: upgrades, pause, account blocklist
Pons V2 factory0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e (opens Blockscout in a new tab)Records each launch; the router verifies curves against it
Pons V3 factory0xA5aAb3F0c6EeadF30Ef1D3Eb997108E976351feB (opens Blockscout in a new tab)Legacy venue

How the pieces fit

Wallets and agents

join, leave, clear, claim

Allocators and originators

arm, top up, revoke, execute

BlockClearingV2

clusters: escrow, prorate, one guarded buy, claims

MandateVaultV2

armed ETH under limits and scope, one buy per execution

VenueRouter

no admin: dispatches by the market's own code or the Pons factory record

StockV3Adapter

exact V3 quotes, capacity, issuer pause checks

PonsV2CurveAdapter

reads reserves and fees live off each curve

Stock token pools

Robinhood Stock Token / WETH or USDG (via USDG/WETH)

Pons V2 launch curve

native ETH bonding curve

FigureTwo entry points, one venue: the router. Neither contract talks to an exchange directly.

BlockClearingV2

Clusters. openBlock(market, window, ceilingBps) creates one (window 10 s to 1 h, ceiling 10 to 2,000 bps), fixes the payout token and records a reference quote (what 0.001 ETH buys right now, fees included); it can join in the same call. join(id) escrows ETH (minimum 0.000001 ETH) and keeps the best quote seen; leave(id) refunds it before close.

After close, clear(id) is a permissionless crank: it asks the venue for maxEthForImpact, computes the fill ratio, takes the 10 bps fee and makes one buy. The fill is measured by balance and must price within the ceiling plus a 3% guard of the best quote seen while the cluster was open. If it doesn't, or the venue can't quote, clear reverts and can be retried; from 15 minutes after close a clear that still can't fill settles as a full refund. A clear that runs out of gas always reverts, so nobody can void a cluster by under-supplying gas (a stock clear on a USDG route uses about 2.6M gas).

claim(id) pays a wallet its tokens and refund; anyone can push a wallet's claim with claimFor(id, wallet) (proceeds only ever go to that wallet). If the token transfer fails (a paused stock or a blocked wallet), the ETH refund is still paid and the tokens are parked in owedTokens for claimTokens(id). Views: getBlock, previewClear, entitlementOf, minTokensFor. Fees accrue and are sent to the fixed fee recipient by withdrawFees().

MandateVaultV2

Mandates. arm(params) creates a mandate from one struct: originator, per-execution and daily caps, ceiling, expiry, and two scope fields: market (the only market it may fund, or zero for any market the router accepts) and maxSpotWad (skip it when pre-trade spot is above this, or zero for no cap). topUp adds ETH, revoke returns the whole balance instantly. The originator calls execute(market, ceilingBps, ids, minTokensOut) with up to 64 mandate ids in strictly increasing order; the vault sizes each one within its limits and scope, makes one buy, and transfers tokens to every participant at the same price. Lookups: mandatesOf(allocator), mandatesFor(originator), getMandate(id).

VenueRouter

The one IVenue both contracts pin (buy, sell, quoteBuy, quoteSell, spotPrice, maxEthForImpact, underlying). It has no admin. A market is a stock if its code is the canonical Robinhood Stock Token proxy, a Pons market if the Pons factory records exactly that curve for its token, and anything else reverts unknown market. kindOf(market) returns 1 (stock), 2 (Pons) or 0. The router re-measures every fill by balance and forwards any ETH a venue hands back.

StockV3Adapter

Robinhood Stock Tokens on their Uniswap-V3-style pools. The market handle is the stock token itself and underlying is the identity, so nothing can change what a cluster pays out. Quotes replicate the pool's swap loop exactly (tick by tick), and maxEthForImpact never admits more than the ceiling, including on two-hop routes through USDG. listedCount() and listedTokens(i) enumerate the 33 routes; tradeBlocker(token) says why a stock can't trade right now (paused, corporate action pending when a multiplier change takes effect within 2 hours, or no route); sharesPerToken(token) is the ERC-8056 multiplier (shares = raw tokens x multiplier; everything onchain is in raw tokens). The owner has renounced ownership, so the route table can no longer change.

PonsV2CurveAdapter

Pons V2 bonding curves. Its market handle is the curve itself, not the token. It measures tokens received by balance difference and refuses graduated or non-ETH curves. In V2 it is only reachable through the router, which first checks the curve against the Pons factory.

Events

ContractEvents
BlockClearingV2BlockOpened, Joined, Left, QuoteObserved, Cleared, Claimed, TokensDeferred, FeesWithdrawn
MandateVaultV2Armed, MandateScope, ToppedUp, Revoked, Executed, Filled, FeesWithdrawn
VenueRouterRouted
StockV3AdapterRouteSet, RouteRemoved, AdapterBought, AdapterSold

Everything the API and the app show is derived from these events and direct contract reads. You can rebuild it from the chain alone.

What is trusted

  • No admin keys, no pause switch, no upgrade proxy on the NoFomo contracts. Fee rate, guard and limits are constants.
  • Escrow leaves the contracts only through a clearing (into the venue), a claim, a leave or a revoke.
  • The venues themselves: stock pools and Pons curves are third-party code. The adapters and the router are written to distrust them where they can (balance measurement, the price guard).
  • The stock token issuer: Robinhood Stock Tokens are upgradeable, and the issuer can pause them, block wallets and burn tokens. That is outside NoFomo's control; see the risk disclosure.
  • The fee recipient address is fixed at deployment and only ever receives the 10 bps fee.

Cookie settings

Choose what we may store on this device. You can change this at any time from the footer.

  • Strictly necessary

    Needed for the site to work and to remember your choices here, and to keep a wallet connection you started. These can't be switched off.

  • Preferences

    Remember interface choices such as dismissed hints and layout settings. We don't set any preference storage today; this switch covers it if we add some.

  • Analytics

    Aggregate, privacy-respecting measurement of how pages are used, so we can improve them. No analytics run today, and none will run unless you allow them here.

Full list of every cookie and storage key: cookie policy.