your keys. your funds. our code, in the open.
NoFomo never holds your keys or your money. Here is what the contracts can and can't do, where they live, how far they've been reviewed, and how to report a problem.
Non-custodial model
Contracts hold escrow
ETH you commit sits in BlockClearing (clusters) or MandateVault (mandates) under their published code. Tokens and refunds go back only to the wallets that put the ETH in.
Servers hold no keys
The API and the remote MCP server read the chain and build unsigned transactions (PreparedTx: chain, to, data, value, description). They cannot sign, move funds or change a transaction after you see it.
You sign everything
Your wallet, or your agent's own key through the local nofomo-mcp signer, signs and sends every transaction. Check the target address against the list below before signing.
Because the service is non-custodial, you never depend on us to get your money back. You can leave an open cluster, clear a closed one, claim after clearing and revoke a mandate by calling the contracts directly, for example from the “Write contract” tab on Blockscout, even if this website is offline.
Contract addresses
Robinhood Chain mainnet, chain ID 4663. These are the only contracts NoFomo deploys. Anything else claiming to be us is not.
Current deployment (V2)
LiveSecurity-fixed clearing and mandate vault behind a venue router that serves Robinhood Stock Tokens and Pons V2 launch curves. New clusters and mandates use these contracts. All four NoFomo contracts are source-verified on Sourcify with an exact match: the published source compiles to exactly the deployed bytecode.
BlockClearingV2
Clusters: escrow, clear, claim
MandateVaultV2
Mandates: arm, execute, revoke
VenueRouter
Dispatches stocks and Pons curves; no admin
StockV3Adapter
Stock quotes and buys; ownership renounced
Pons V2 curve adapter
Pons quotes and buys (reused from v1)
Legacy deployment
Read-only historyThe first mainnet deployment, on Pons V3 pools. It holds the first real mainnet clears and remains readable; the app no longer opens clusters here.
BlockClearing
Clusters: escrow, clear, claim
MandateVault
Mandates: arm, execute, revoke
Venue adapter
Quotes and buys on Pons V3 pools
Retired v1 deployment
RetiredRetired: a critical issue was found in our internal review (F-01 below). It never held user funds: no clusters, no mandates, no ETH. The app, the API and the MCP server no longer read or write it. Do not send anything to these addresses.
BlockClearing (v1)
Retired
MandateVault (v1)
Retired
Review status
UnauditedThe contracts have had an internal review, carried out by our own engineers and tooling (with AI assistance): a line-by-line read of every contract, proofs of concept as Foundry tests (offline and on a fork of Robinhood Chain mainnet against the deployed bytecode), fuzzing of the safety properties and a Slither pass. No independent third-party audit has been completed. We will publish the auditor, scope and full report here when one is.
The review found a critical issue and three high-severity issues in the first Pons-curve contracts (v1). They had no activity and held no funds, so they were retired rather than patched, and the fixes ship in the V2 contracts listed above. The main findings:
| ID | Severity | Issue | Status |
|---|---|---|---|
| F-01 | Critical | v1 clearing accepted any curve-shaped contract as a market and re-read the payout token at claim time, so a fake market could claim other blocks' unclaimed tokens. | v1 retired. Fixed in V2: the router verifies every Pons curve against the Pons factory, the payout token is fixed at open, fills are measured by balance. |
| F-02 | High | v1 vault accepted duplicate mandate ids in one execution, letting an originator exceed per-execution and daily caps. | v1 retired. Fixed in V2: ids must be strictly increasing. |
| F-03 | High | v1 clear bought with no minimum output and sized capacity from manipulable state, so an atomic push-crank-unwind could extract value. | v1 retired. Fixed in V2: price guard against the best quote seen while open; out-of-guard fills revert and refund after 15 minutes. |
| F-04 | High | v1 mandates let the originator pick any market, including one it controls. | v1 retired. V2: unknown markets rejected; mandates can be bound to one market and capped by a max spot price. |
| F-05 | Medium | Legacy Pons V3 adapter treated concentrated liquidity as full range. | Legacy history only; not used by V2. |
| F-06 | Medium | v1 pushed fees inside clear, so a reverting fee recipient could block clearing. | Fixed in V2: fees accrue and are pulled with withdrawFees. |
| F-07 | Medium | v1 treated any venue failure as unfillable, so an under-gassed crank could void a block. | Fixed in V2: failures revert (retryable) until the grace period; out-of-gas always reverts. |
| F-09 | Medium | A paused stock token or a blocked wallet would also have withheld the ETH refund at claim. | Fixed in V2: tokens are parked for claimTokens, the refund is always paid. |
| F-17 | Medium (external) | Robinhood Stock Tokens are upgradeable, pausable, have an account blocklist and an admin burn. The issuer can freeze, block or burn tokens the clearing holds pending claims. | External trust assumption; cannot be fixed in code. Disclosed in the app; claims can be pushed right after clear (claimFor). |
| F-19 | Low | The price guard admits fills up to the ceiling plus 3% worse than the best quote seen, so that slack is still extractable. | Accepted trade-off (guard fixed at 300 bps at deployment). |
The review also covers lower-severity and informational items (chain-time deadlines, rounding dust, gas cost of stock clears, ERC-20 edge cases). Until an independent audit, treat the contracts as experimental and only commit amounts you can afford to lose.
Admin powers and known limitations
No admin powers
- BlockClearingV2 and MandateVaultV2 have no owner, no admin role, no pause switch and no upgrade proxy.
- The venue (the VenueRouter), the fee recipient and the price guard (300 bps) are set in the constructor and are immutable. The fee is a constant 10 bps; fees accrue in the contract and are sent to the fee recipient (the deployer’s address) when anyone calls
withdrawFees. - The VenueRouter 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 it, and anything else is rejected. Nobody can re-point a market.
- The StockV3Adapter’s ownership has been renounced, so its table of stock routes (which pool each stock trades in) is frozen.
- Nobody, including us, can move escrowed ETH, change a deployed contract’s rules or freeze it. The flip side: a bug cannot be patched in place and funds cannot be rescued by an administrator. Fixes ship as new deployments, and the legacy deployment stays readable.
Known limitations
- Ceiling plus a price guard. Capacity comes from the venue’s price in the clearing transaction. On top, V2 fills only within the ceiling plus a 3% guard of the best quote seen while the cluster was open. A fill outside that reverts, so the clear can be retried; 15 minutes after close anyone can clear it as a full refund. The 3% slack is still room a sandwich could use.
- Stock token issuer powers. Robinhood Stock Tokens are upgradeable by their issuer, which can pause trading, block wallets (transfers to and from them fail) and burn tokens, including tokens the clearing contract holds between a clear and your claim. If your claim’s token transfer fails, your ETH refund is still paid and the tokens are held for you to retrieve later.
- Deadlines are chain time. Windows, the grace period and mandate expiry use the sequencer’s block timestamp, which can differ slightly from your clock.
- Clearing is permissionless but not automatic. After a window closes, escrow stays in the contract until someone calls
clear. We run a crank; anyone else can too. - Venue failure refunds everyone. If the venue can’t quote or can’t fill within the guard (for example a stock is paused or a Pons curve graduated), clearing is retryable until 15 minutes after close, then the cluster settles at zero and every wallet claims its full contribution back.
- Claims are pulled, or pushed by anyone. Each wallet calls
claim, or anyone can callclaimForto send a wallet its own claim. Rounding dust of a few wei per wallet stays in the contract. - Mandate executions are bounded. At most 64 mandates per execution, in strictly increasing id order. A mandate contributes nothing if it is revoked, expired, names a different originator, its ceiling is stricter than the execution’s, it is bound to another market, or spot is above its price cap. An unbound mandate without a price cap still trusts the originator’s judgment within its caps.
- Third-party code. The venues and the tokens they issue are not ours and may have their own admin powers, fees and risks.
- Local agent limits are not enforced onchain. Spend limits in the
nofomo-mcpsigner are software on your machine; mandates are the enforced limit.
The risk disclosure covers the wider risks in plain language.
Responsible disclosure
If you find a vulnerability in the contracts, the website, the API or the MCP server, please tell us privately first at [to be completed: contact email]. If the issue could put funds at risk, say so in the subject line.
What to include
- the affected component (contract address, URL or endpoint) and version or commit if known;
- a description of the issue and its impact;
- step-by-step reproduction, ideally a proof of concept against a local fork, not mainnet;
- how you would like to be credited, if at all.
Our goals
- acknowledge your report within 3 business days;
- give an initial assessment within 7 days;
- keep you updated until it is resolved, and credit you publicly if you wish.
Safe harbour
We will not pursue or support legal action against you for good-faith research that follows these rules: you avoid privacy violations, data destruction and service disruption; you test only against your own accounts, wallets and local forks; you do not exploit an issue beyond what is needed to demonstrate it and never move other people’s funds; and you give us reasonable time to fix the issue before disclosing it publicly. Social engineering, phishing, physical attacks and denial-of-service testing are out of scope.
Machine-readable contact: /.well-known/security.txt
Bug bounty
ComingA formal bug bounty programme is being prepared. Until it launches, valid reports that follow the rules above will be credited and considered for a reward once the programme exists, at our discretion.