0cto · Intelligence OS
How the desk works
0cto is a Robinhood Chain research and paper-trading desk that lives in one chat box. You type what you want; it calls live tools and answers. There are no departments to navigate. You connect a wallet to sign in and set your rate; the only transaction you are ever asked to sign is paying for a cage hunt. This page covers everything it does, everything it refuses to do, and where every number comes from.
What this is
A command center for Robinhood Chain. It reads the chain and the market, forms opinions, and lets you rehearse trades on a paper book. It is a research desk: it can quote a swap down to the route and price impact, but it never signs one.
It is not a wallet, not a custodian, and not an exchange. Nothing you do here moves real funds.
The one box
Everything happens in the chat at /os. Ask in plain English; the desk picks the tools, calls them against live sources, and writes a brief. A single question can fan out to several tools. Asking for a risk scan typically pulls the token dossier, liquidity, holder quality and recent flow before it answers.
You will see each tool appear as it runs, with its status, and you can expand any of them to read the raw result the model was given. Nothing is hidden behind the answer.
Two engines
The desk runs on two models, and the split is strict. It is not a routing preference, it is a boundary.
| Model | Runs |
|---|---|
| 0cto-1.2 | Everything you type into the desk: quotes, radar, risk, wallets, yield, NFTs, social, research, your paper book and your rules. |
| GLM-5.3 | The cyber cage only. Public GitHub repo hunts. Nothing else. |
The desk model is ours
0cto-1.2 is not a hosted API. It is a small model trained here, on this desk’s own tool surface — the same 37 schemas the kernel sends, in the same shape it sends them — so it was trained in the configuration it actually runs in, rather than taught to be generally clever and handed a toolbox afterwards.
On the desk’s own evaluation — 310 cases covering routing, write actions, refusals, multi-turn context, ambiguity, stale windows and failed data sources, graded against this desk’s rules rather than another model’s opinion — it scores 96.8% at temperature 0, averaged over repeated runs rather than quoted from the best one. On the narrower suite the previous hosted model was measured against, it answers 97.9% correctly to that model’s 89.3%. It weighs 2.7 GB and runs on a single GPU in the same box as the node.
Which is the point: the desk answers without renting anyone’s model by the token, and what you type stays on the machine.
Replies are always written in English, whatever language you ask in and whatever the tools return.
What to ask
These are examples, not commands. There is no syntax to learn. Anything in this shape works.
- The tape“Give me the desk this morning.”
- Quotes“Quote 1 ETH to USDG on Uniswap v4.”
- Radar“What pools just launched?”
- Risk“Scan this contract for rug and holder quality.”
- Compare“NVDA vs SPY vs HOOD.”
- Wallets“What is this wallet holding?”
- Decode“Explain this transaction hash.”
- Yield“Which v4 pools are earning real fees?”
- Positions“Are my LP ranges still earning?”
- Social“What narrative is soaking up attention?”
- Paper“Buy $500 of NVDA on paper.”
- The book“How is my paper book doing?”
- Watchlist“Add SPY to my watchlist.”
- Rules“Alert me if NVDA drops 10%.”
- DCA“Simulate $50 into ETH weekly.”
- Rebalance“Rebalance me 60/30/10.”
- The cage“Hunt this GitHub repo for bugs.”
Every tool
The desk has 37 tools: 29 that read live market and chain data, and 8 that read or change your own saved state. This list is generated from the running code, so it is never out of date.
Commander Network state and saved rules.
get_market_overview | Broad ETH/BTC/HOOD/USDG and chain snapshot: local pool prices, an off-chain reference mark, and node health. Do not use this to look up named tickers or to compare tokens. |
get_network_health | Current block, gas price, settled L1 block, and the ETH price on this chain. |
list_automationssaved state | The user's saved automation rules and their status. |
add_automationsaved state | Create a saved rule: dca, limit, trailing_stop, take_profit, whale_watch, launch_filter or rebalance. Rules are watch-only reminders. They never sign or execute. |
remember | Save a standing fact about this user so it applies to every future turn: risk posture, maximum position size, liquidity floors, tokens they hold or refuse to touch, how they want answers written. Use it whenever they state a durable preference, as in 'I never size above 2%', 'ignore anything under $1M liquidity', 'I'm long JTO'. Do not use it for one-off questions or for facts about the market, which go stale. |
forget | Drop a standing fact the desk is holding, by its id from list_memories. Use when the user says a preference no longer applies. |
list_memories | Every standing fact the desk holds about this user, with ids. The same facts are already pinned above the conversation. Read this only when the user asks what is remembered, or when you need an id to forget one. |
Trader Quotes, paper fills, sizing.
quote_swap | Live Uniswap v4 quote between two tokens or tickers, priced off the deepest pool holding both. Always report `beyondRange` when it is true. It means the size leaves the pool's active tick and the real cost is worse than the quote. Report `dynamicFee` too: a hook-controlled pool's fee is not knowable ahead of the trade and 0.30% is assumed. |
simulate_dca | Simulate a DCA plan: periods, size, estimated fill using the live pool price. |
rebalance_plan | Given target weights, propose paper-desk trades from current holdings. |
copy_trader_hints | Heuristic copy-trade hints from a wallet's recent tape (not advice). |
get_paper_booksaved state | The user's paper trading book: cash, open positions with unrealised PnL, and recent fills. Use before answering anything about their positions or performance. |
paper_buysaved state | Place a simulated BUY on the user's paper book for a USD amount. Paper only. It never touches a wallet and never signs. Confirm the token and size in your reply. |
paper_sellsaved state | Close or trim a position on the user's paper book. Give either usd or qty. Paper only. |
Scout New launches, trending, metas.
scan_anything | Universal scanner. Give it ANY Robinhood Chain string and it works out what it is, then returns everything that applies: a token contract (risk grade, price, holder concentration, pool depth), a wallet (ETH, ERC-20 holdings, LP positions, recent activity), a transaction hash (decoded calls and transfers), a Uniswap v4 pool id, a non-token contract, or a bare ticker. Note that a transaction hash and a pool id look identical, both being 32 bytes of hex, so this looks both up rather than guessing. Use it first whenever the user pastes something without saying what it is, or asks to 'scan', 'check' or 'look up' a thing you cannot already classify. Prefer it over guessing between risk_scan_token, inspect_wallet and decode_transaction. |
search_tokens | Search Robinhood Chain tokens by symbol, name, or contract address. A pasted address is always resolved against the chain, even if the desk has never seen it before. |
get_trending_tokens | Trending or most-traded Robinhood Chain tokens, ranked from Uniswap v4 swap flow. 'trending' ranks by dollar volume, 'traded' by swap count. They answer different questions. |
get_new_launches | Newly created Uniswap v4 pools, which are this chain's launch feed. A token becomes buyable the moment a pool quotes it, so a new pool is the launch. |
get_radar | Floor tape only: new pools, trending names, narrative buckets. Use when they ask for radar, launches, or what is printing. Never use this to look up tickers they already named. |
launch_token_preview | Design an ERC-20 launch on Robinhood Chain: supply, the pool that would quote it, implied cap, and a risk checklist. Design only, and nothing is deployed. |
Risk Rug, liquidity and holder checks.
token_holders | Who holds a token and how concentrated it is. `holders` and `top10Pct` come from real `balanceOf` readings for every address the index has found, and `coverage` says what share of the supply those balances account for. At 1 it is the complete holder list, below that `holders` is a floor and you must say so rather than quoting it as a total. `activeHolders` is the separate, older question of who *moved* it in a window; never present the two as the same number. |
holder_clusters | Which of a token's holders are actually the same entity. Links addresses that sent the token to each other or were first funded by the same address, excludes pools and other contracts, and re-measures concentration per entity instead of per address. Use this whenever asked who really holds a token, whether holders are genuine, or whether a top-holder number is trustworthy. Each cluster carries its evidence and a confidence. Say both. |
risk_scan_token | Risk report for a token: what its bytecode can do to a holder (mint, pause, blacklist, mutable fees), how deep the pools actually are, how concentrated the float is, and how old the venue is. On liquidity, quote `report.liquidity.poolUsd`, which is both sides of the pool and the figure an explorer shows, and use `exitUsd` (the quote side alone) when talking about getting out; say which you mean and never present them as the same number. Whenever you state a grade, give the flags underneath it. A capability flag means the function exists in the bytecode, not that it has been used. |
token_liquidity | Depth across every live pool quoting a token, with both conventions labelled: `poolUsd` (both sides) and `exitUsd` (the quote side, what a seller can actually draw on). |
Yield LSTs, lending, LPs and vaults.
lp_positions | Uniswap v4 liquidity positions held by a wallet: pair, fee tier, tick range, and whether the price is currently inside that range (an out-of-range position earns nothing). |
find_yield | Where the carry is: Uniswap v4 pools ranked by realised fee return, annualised. This chain has no liquid-staking tokens, so there is no LST premium to report and none is invented. Always quote the window (`coveredMs`) and the swap count with the APY, because a pool that had one busy hour annualises to an absurd number. |
Research Dossiers, wallets, transactions, watchlist.
wallet_pnl | Realised and unrealised PnL for a wallet, reconstructed from its Uniswap v4 swaps over a recent window. Quote realizedUsd (closed round-trips), unrealizedUsd (open positions marked to the current price) and totalUsd; a flat wallet still has a realised answer, so do not say it cannot be told when trades is above zero. Each row carries realizedQuote and the open qty. Read coveredMs for the real window and unmatched for trades that could not be priced (token-for-token); if unmatched is large, call the total a floor. |
get_token_dossier | Full token dossier: price, every live Uniswap v4 pool quoting it, in-range depth, holder concentration and the risk grade with its flags. Quote the numbers, not the labels: a grade on its own is an assertion, the flags under it are the finding. Check `coveredMs` on any volume or change figure before calling it a 24h number, because on a freshly started desk it may be minutes. |
inspect_wallet | ETH balance, ERC-20 holdings, USD value and recent transactions for a wallet. Holdings are found from transfer logs over a recent window, so a token held but not moved in that window will not appear. Say so rather than reporting the wallet as empty. |
decode_transaction | Parse a Robinhood Chain transaction hash into its method, decoded transfers, logs and gas cost. A transaction hash is 32 bytes: `0x` followed by exactly 64 hex characters. An address is half that, `0x` and 40 hex characters, and belongs to the wallet tools instead. Count before choosing: the two look alike and only the length tells them apart. |
compare_tokens | REQUIRED when the user names two or more tokens to compare (NVDA vs SPY vs HOOD, A versus B). Pass each ticker as a, b, and optional c. Returns a compact side-by-side. Do not use get_radar for this. |
get_price_chart | Price history for a token on this chain, as candles built from its deepest Uniswap v4 pool. Open, high, low and close come from the swaps themselves, so the wicks are real trades rather than a guess. Use for any question about how a price has moved. Quote the window and the pool; candles flagged without real high/low predate extreme recording and carry an open-close body only. |
get_watchlistsaved state | Tokens the user has saved to their watchlist on this device. |
add_to_watchlistsaved state | Save a token to the user's watchlist so it persists between sessions. |
remove_from_watchlistsaved state | Drop a token from the user's watchlist. |
Social Narratives and attention.
get_trending_metas | Narrative buckets on Robinhood Chain, clustered from launch names and weighted by the flow through them. |
social_pulse | Narrative pulse from the clustered launch buckets plus a token's own flow. |
Your saved state
Three things persist between sessions: your paper book, your watchlist, and your automation rules. The desk can read and change all three by conversation.
All of it is stored in your own browser under the localStorage key octo-os. There is no account and no server-side copy. Clearing site data resets the desk; a different browser is a different desk.
The paper book
Starts at $10,000 in simulated cash. Fills are priced off live Uniswap v4 quotes at the moment you ask, so the book tracks real prices, but no order is ever routed. A buy that exceeds your cash, or a sell larger than the position, is refused rather than clamped silently.
Automation rules
Rules are reminders, not executors. Adding one records the condition you care about. It cannot place an order, sign anything, or move funds, because the desk has no key with which to do so.
Safety model
- Watch-only trading. No seed phrase, no private key, and the desk never signs a trade, swap or transfer on your behalf. Connecting signs a text message, not a transaction. The single exception is paying for a cage hunt, which you initiate and approve yourself. See The cage. Any address you research is simply read.
- Paper first. Routes and quotes are live and real. Fills land on the paper book. Nothing reaches a validator.
- No invented numbers. Prices, slots, holder counts and risk verdicts come from tools. If a tool fails, the desk says so rather than guessing.
- Memecoins are entertainment-grade risk. The desk is instructed to say “avoid” plainly when a token looks hostile, not to hedge.
Access & rate
The landing page and these docs are open. The desk itself needs a sign-in, by wallet or by email. With a wallet you sign a one-time message, and the desk reads your $0CTO balance to set how fast you can ask.
The signature is over a plain text nonce and is single-use. A captured signature cannot be replayed. What it proves is that you control the wallet, nothing more.
| Tier | Holding | Prompts |
|---|---|---|
| Connected | Any connected wallet | 1 per minute |
| Holder | 10,000+ $0CTO | 2 per minute |
| Desk | 100,000+ $0CTO | 5 per minute |
| Principal | 1,000,000+ $0CTO | 10 per minute |
The rate is also per connection. Every account signed in from one address draws from a single allowance at the tier it presents, so creating more wallets or email accounts does not add prompts.
Balances are re-read periodically rather than on every prompt, so topping up takes up to a minute to raise your rate.
The cage
The one room 0cto-1.2 does not run. Security work only, on GLM-5.3, priced at 10,000 $0CTO per hunt. It lives at /os/cyber and does not share the chat.
It hunts public GitHub repositories only. Paste a remote, not a local folder. The job is discovery: read the source, find the fault, show the path that reaches it. It does not write exploits, and no model here is asked for a payload.
Paying for a hunt
There is no holding requirement. Each hunt costs 10,000 $0CTO, charged when you launch it. Your wallet signs one transfer; the desk confirms on chain that the treasury received it from your wallet before a single GLM-5.3 call is made.
A payment buys exactly one hunt. The signature is recorded when it is redeemed, so the same transfer cannot be presented twice, and payments older than thirty minutes are not accepted. Nothing is charged if you never launch. There are no refunds once a hunt starts.
How a hunt runs
- Map. A mapper builds a threat model of the repo and picks the surfaces worth attention.
- Specialists. 15 focused passes, each owning one class of bug: Access control, IDOR / BOLA, Business logic, Auth & sessions, Injection, Files, SSRF & uploads, Crypto & secrets, Solana programs, XSS & output encoding, SSRF, XXE & requests, Deserialization & prototype pollution, Hardcoded secrets & keys, Security misconfiguration, CI/CD & supply chain, API & GraphQL.
- Sweep. A residual pass for anything the specialists missed.
- Join. A chain synthesizer links findings into reachable paths, then an adversarial verifier throws out everything it cannot stand up.
That last step matters: findings that survive have been argued against. Anything the tree cannot prove is dropped rather than shipped as a maybe.
Where data comes from
| Source | Used for |
|---|---|
| Your Robinhood Chain node | Blocks, gas, balances, transaction decode, and every log the rest of this table is built from. JSON-RPC and WebSocket. |
| Uniswap v4 (on-chain) | Pools, prices, depth and quotes, read from PoolManager storage rather than an API. It is the only venue on this chain. |
| 0cto’s own indexer | Volume, buy/sell flow, price change and the launch feed, accumulated from Swap and Initialize logs while the desk runs. Historical state is pruned on this chain, so these cannot be read back on demand. The desk only knows what it has watched, and every figure carries the window it covers. |
| Transfer logs | Wallet holdings, activity and holder concentration. An EVM chain has no “list this account’s tokens” call, so these are reconstructed over a recent window. |
| Contract bytecode | Risk flags. What a token can do to a holder (mint, pause, blacklist, mutable fees) is whatever its code implements, so the runtime bytecode is scanned for those selectors. |
| Swap history | Charts and the 24h move. Every Swap the node sees is folded into five-minute buckets that keep the first, highest, lowest and last price traded, so candles carry real extremes. Nothing here comes from an outside price vendor, because a chart of a different market is not the price you could fill at. |
| GitHub | Public repository source for cage hunts only. |
Chain reads go to a dedicated node where one is configured, with redundant fallbacks behind it. Whether the desk is on a private node or a public RPC is shown on the command panel; the endpoints themselves are not published.
Routes
/ | Landing. |
/os | The desk. This is the whole product. |
/os/cyber | The cage. GLM-5.3, token-gated. |
/os/settings | Risk posture, slippage default, memory. |
/docs | This page. |
Earlier builds shipped a page per desk: radar, paper, yield and the rest. Those routes still resolve, but they are no longer part of the product surface; the chat covers all of it.