Execution model: Ask → Inspect → Preview → Sign
- Ask. Quotes, pool reads, portfolio inspection and planning work without a wallet. Noan Agent answers through typed tools over the same server modules the pages use.
- Inspect. Every figure carries its source, observation time and, where it applies, the block number and a coverage statement. Missing data is shown as unavailable, never filled in.
- Preview. The application builds the transaction (never the model), decodes the calldata again and compares it with what you reviewed, checks the target against the allow-list below, reads the allowance (exact-amount approvals by default; an unlimited approval is an explicit, disclosed option), simulates the call from your account and sets an explicit gas limit. Prepared transactions expire and are discarded when the wallet, network, amount, route or quote validity changes.
- Sign. Your wallet shows the same target and calldata. A signature request is not success: the UI shows confirmed only after the receipt is read, distinguishes reverted, rejected, replaced and unknown outcomes, and records the hash the moment the wallet returns it.
Data and freshness
- Chain reads go through a same-origin JSON-RPC relay (read methods only) to the public RPC with fallbacks, in bounded Multicall3 waves pinned to one block. Transactions are never relayed; the wallet broadcasts them through the public RPC it was given.
- Prices. Chainlink feeds first (ETH, USDG, cbBTC, LINK, USDe and the “Robinhood SYM / USD” Stock Token feeds, which update 24/5 and are labelled with their age), DefiLlama market prices otherwise. Nothing is valued at zero; totals with an unpriced asset are marked partial.
- Pools. Discovered on chain for verified pairs across four fee tiers (Uniswap v3 factory.getPool; Uniswap v4 StateView over hookless keys). v3 reserves are the token balances held by the pool contract; v4 reserves come from the official ReservesLens. 24 h volume is GeckoTerminal’s figure where indexed, budgeted to four origin requests per refresh.
- Portfolio. Registry balances in one aggregate, extra tokens from the explorer index (flagged unverified), Uniswap v3 positions by enumeration with fees from a collect simulation, Uniswap v4 positions from the explorer NFT index with ownership re-checked on chain. Realised P&L is not computed: there is no acquisition history.
- Tokenized equities. Identity comes from the issuer registry and an on-chain check (every official Stock Token is a beacon proxy whose beacon slot holds the issuer registry). The Chainlink feed is the reference price of one token (multiplier applied); on-chain pool prices can drift while the reference market is closed.
Capability report (live)
Capabilities reflect runtime checks of connectivity and expected contract behaviour, not the presence of configuration. The table below is read live from this deployment.
| Capability | Depends on | Wallet |
|---|---|---|
| Read balances Native balance and ERC-20 balances of the verified registry, plus indexed holdings from the explorer. | network-rpc | no |
| Read pools Discover Uniswap v3 and v4 pools for verified pairs and read their state, reserves and positions. | network-rpc · uniswap-v3 · any of: uniswap-v4 | no |
| Quote swaps Exact-input quotes from the KyberSwap aggregator and the Uniswap v3 QuoterV2. | network-rpc · any of: kyberswap, uniswap-v3 | no |
| Execute swaps Build, validate, simulate and submit swaps through the pinned routers; the wallet signs. | network-rpc · any of: kyberswap, uniswap-v3 | yes |
| Add / remove liquidity Uniswap v3 positions through the NonfungiblePositionManager. | network-rpc · uniswap-v3 | yes |
| Create pools Create and initialise a Uniswap v3 pool for a verified pair and enabled fee tier. | network-rpc · uniswap-v3 | yes |
| Mint / redeem baskets On-chain basket tokens. Planning and sequential execution work without this. | basket-contract | yes |
| Reference prices Chainlink feeds first, DefiLlama as market cross-check; nothing is valued without a dated source. | network-rpc · any of: chainlink, defillama | no |
| Portfolio history Transaction history and indexed inventory from the explorer API. | explorer | no |
| Agent tools Deterministic tools (network status, balances, pools, quotes, allocation math) that run without a model. | network-rpc | no |
| Noan Agent chat Natural-language assistance that explains tool output. Needs the server-side model key. | anthropic | no |
Integration manifest
Every external dependency with its chain, address or URL, version, verification source, supported operations and status. Verified 2026-10-24 UTC. A contract not listed here cannot be called, approved or linked by the app.
Robinhood Chain JSON-RPC operationalchain 4663
- publicRpc: https://rpc.mainnet.chain.robinhood.com
- publicnode: https://robinhood-rpc.publicnode.com
- drpc: https://robinhood.drpc.org
- operational Read chain state (balances, calls, receipts, logs)
- operational Same-origin read relay for browsers behind blocked DNS — Read methods only; transactions are broadcast by the wallet itself.
Sources: https://docs.robinhood.com/chain/connecting/ (chain id 4663, public endpoints, Alchemy recommended for production) · eth_chainId → 0x1237 on both public endpoints (2026-10-24 UTC)
Blockscout explorer + API operationalchain 4663
- site: https://robinhoodchain.blockscout.com
- api: https://robinhoodchain.blockscout.com/api/v2
- operational Indexed ERC-20 balances of an address — Key-free, cold addresses take up to 45 s; a 5xx is reported as unavailable.
- operational Indexed ERC-721 holdings (used to find Uniswap v4 position tokens)
- operational Transaction history (paged, newest first)
- operational Verified explorer links
Sources: Explorer host listed in docs.robinhood.com/chain/connecting · /api/v2/addresses/{a}/tokens, /nft, /transactions and /smart-contracts/{a} answered JSON on 2026-10-24 UTC
Multicall3 operationalchain 4663
| Contract | Address | ABI / version | Verification |
|---|---|---|---|
| multicall3 | 0xcA11bde05977b3631167028862bE2a173976CA11 | Multicall3 (canonical deployment) | eth_getCode → 3,808 bytes at the canonical address (2026-10-24 UTC); aggregate3 answers |
- operational Batched reads (aggregate3) in bounded waves
Sources: https://www.multicall3.com (canonical address on every chain) · eth_getCode on chain 4663
Wrapped Ether (WETH9) operationalchain 4663
| Contract | Address | ABI / version | Verification |
|---|---|---|---|
| weth9 | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 | aeWETH (Arbitrum-style WETH9 behind a TransparentUpgradeableProxy), solc 0.8.16 · vendored ABI weth9-impl.json | Sourcify exact_match (proxy): https://sourcify.dev/server/v2/contract/4663/0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73; implementation 0xc6b81b429797e0f555440b70cd99e032d7ae947e Sourcify match (aeWETH); SwapRouter02.WETH9() and NonfungiblePositionManager.WETH9() return this address |
- operational Wrap ETH (deposit)
- operational Unwrap WETH (withdraw)
Sources: https://developers.uniswap.org/deployments.json (v1.0.0, generated 2026-10-16; records filtered by chainId 4663, tier labs-supported, status active) (WETH9 is read from the router/position manager, not listed directly) · symbol() WETH, decimals() 18 on chain
Uniswap v3 (official Labs deployment) operationalchain 4663
| Contract | Address | ABI / version | Verification |
|---|---|---|---|
| factory | 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA | UniswapV3Factory, solc 0.7.6 · vendored ABI v3-factory.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x1f7d7550B1b028f7571E69A784071F0205FD2EfA |
| quoterV2 | 0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7 | QuoterV2, solc 0.7.6 · vendored ABI quoter-v2.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7; factory() returns the factory above |
| swapRouter02 | 0xCaf681a66D020601342297493863E78C959E5cb2 | SwapRouter02, solc 0.7.6 · vendored ABI swap-router02.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0xCaf681a66D020601342297493863E78C959E5cb2; factory() and WETH9() wired to the contracts above |
| positionManager | 0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3 | NonfungiblePositionManager, solc 0.7.6 · vendored ABI nfpm.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3; factory() and WETH9() wired; totalSupply 927,338 positions on 2026-10-24 |
- operational Pool discovery and state (getPool, slot0, liquidity, token balances)
- operational Exact-input quotes (QuoterV2, single and two-hop)
- operational Swap execution through SwapRouter02 (exactInputSingle / exactInput, ETH wrapped or unwrapped by the router) — Calldata is built by the app and decoded again before the wallet is asked.
- operational Position inventory and uncollected fees (NFPM positions + collect simulation)
- operational Add liquidity (NFPM mint / increaseLiquidity)
- operational Remove liquidity and collect (NFPM decreaseLiquidity + collect in one multicall)
- operational Create and initialise a pool (NFPM createAndInitializePoolIfNecessary) for a verified pair and fee tier — Only fee tiers enabled on the factory; the app checks feeAmountTickSpacing.
Sources: https://developers.uniswap.org/deployments.json (v1.0.0, generated 2026-10-16; records filtered by chainId 4663, tier labs-supported, status active) · Blockscout /api/v2/smart-contracts: SwapRouter02, QuoterV2, NonfungiblePositionManager verified (2026-10-24 UTC) · On-chain wiring reads (factory(), WETH9()) on 2026-10-24 UTC · WETH/USDG pools exist at the 0.01 %, 0.05 %, 0.3 % and 1 % tiers (factory.getPool)
Uniswap v4 (official Labs deployment) operationalchain 4663
| Contract | Address | ABI / version | Verification |
|---|---|---|---|
| poolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 | PoolManager, solc 0.8.26 · vendored ABI v4-pool-manager.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x8366a39CC670B4001A1121B8F6A443A643e40951 |
| stateView | 0xF3334192D15450CdD385c8B70e03f9A6bD9E673b | StateView (v4-periphery), solc 0.8.26 · vendored ABI state-view.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0xF3334192D15450CdD385c8B70e03f9A6bD9E673b |
| reservesLens | 0x0000001b173C3bbF3984D417d8614E3eed34865B | ReservesLens (v4-periphery src/lens), solc 0.8.26 · vendored ABI reserves-lens.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x0000001b173C3bbF3984D417d8614E3eed34865B |
| quoter | 0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94 | V4Quoter, solc 0.8.26 · vendored ABI v4-quoter.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94 |
| positionManager | 0x58daec3116aae6D93017bAAea7749052E8a04fA7 | PositionManager, solc 0.8.26 · vendored ABI v4-position-manager.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x58daec3116aae6D93017bAAea7749052E8a04fA7; poolManager() and permit2() wired |
| universalRouter | 0x204FAca1764B154221e35c0d20aBb3c525710498 | UniversalRouter v2.1.2, solc 0.8.26 · vendored ABI universal-router.json | Sourcify match: https://sourcify.dev/server/v2/contract/4663/0x204FAca1764B154221e35c0d20aBb3c525710498 |
| permit2 | 0x000000000022D473030F116dDEE9F6B43aC78BA3 | Permit2 (canonical) | https://developers.uniswap.org/deployments.json (v1.0.0, generated 2026-10-16; records filtered by chainId 4663, tier labs-supported, status active); eth_getCode 9,152 bytes |
- operational Pool state (StateView slot0 + liquidity) and core reserves (ReservesLens.getPoolTVL)
- read-only Exact-input single-pool quotes (V4Quoter) — Shown for comparison; execution through the Universal Router is not integrated in this build.
- operational Position inventory (explorer NFT index + PositionManager reads)
- unavailable Swap execution (Universal Router v2.1.2 + Permit2) — Not integrated: the router build on this chain uses a newer command layout that has not been verified end to end here.
- unavailable Add / remove liquidity (PositionManager.modifyLiquidities) — Not integrated: v4 liquidity actions need Permit2 batch encoding that is not implemented in this build.
Sources: https://developers.uniswap.org/deployments.json (v1.0.0, generated 2026-10-16; records filtered by chainId 4663, tier labs-supported, status active) · StateView.getSlot0 answered for ETH/USDG (0.01 %, 0.05 %, 0.3 %) and WETH/USDG pools on 2026-10-24 UTC
Blockers: Universal Router / PositionManager action encoding not implemented and not fork-tested → v4 execution disabled, reads enabled.
KyberSwap Aggregator operationalchain 4663
| Contract | Address | ABI / version | Verification |
|---|---|---|---|
| router | 0x6131B5fae19EA4f9D964eAc0408E4408b66337b5 | MetaAggregationRouterV2, solc 0.8.17 (deploy block 5,127,616) · vendored ABI kyber-router.json | Sourcify exact_match: https://sourcify.dev/server/v2/contract/4663/0x6131B5fae19EA4f9D964eAc0408E4408b66337b5; Blockscout fully verified; enforces returnAmount ≥ minReturnAmount in swap and swapSimpleMode |
- routes: https://aggregator-api.kyberswap.com/robinhood/api/v1/routes
- build: https://aggregator-api.kyberswap.com/robinhood/api/v1/route/build
- operational Aggregated route quotes (split routing across DEXes)
- operational Swap execution through the pinned router — Built calldata is decoded and checked (tokens, amount, recipient, minimum, no fee lines, no permit, no forbidden flags) before signing.
Sources: KyberSwap docs list "Robinhood Chain (ChainID: 4663) → robinhood" · GET /routes answered for ETH→USDG and USDG→NVDA on 2026-10-24 UTC and named the router above · Sourcify exact match of the router
Chainlink Data Feeds operationalchain 4663
| Contract | Address | ABI / version | Verification |
|---|---|---|---|
| ethUsd | 0x78F3556b67E17Df817D51Ef5a990cDaF09E8d3A9 | EACAggregatorProxy (AggregatorV3Interface), 8 decimals, 24 h heartbeat · vendored ABI chainlink-proxy.json | Sourcify exact_match: https://sourcify.dev/server/v2/contract/4663/0x78F3556b67E17Df817D51Ef5a990cDaF09E8d3A9; latestRoundData answered 2382.04 at 02:10 UTC 2026-10-24 |
| usdgUsd | 0x61B7e5650328764B076A108EFF5fa7282a1B9aD2 | EACAggregatorProxy, 8 decimals · vendored ABI chainlink-proxy.json | reference-data-directory feeds-robinhood-mainnet.json; latestRoundData 0.99996502 |
- directory: https://reference-data-directory.vercel.app/feeds-robinhood-mainnet.json
- operational Reference USD prices (ETH, USDG, cbBTC, LINK, USDe, Stock Tokens) — Stock feeds update 24/5: weekend readings are hours old and are labelled with their age.
Sources: https://docs.robinhood.com/chain/oracles-and-price-feeds/ · Chainlink reference-data directory: 58 feeds for Robinhood mainnet (ETH, USDG, USDC, USDT, cbBTC, LINK, USDe, wstETH, weETH and ~35 "Robinhood <SYM> / USD" stock feeds) read 2026-10-24 UTC
Blockers: No L2 sequencer-uptime feed exists for this chain (Chainlink lists none).
DefiLlama coins API operationalchain 4663
- prices: https://coins.llama.fi/prices/current/{keys}
- operational Market USD prices by chain:address (fallback and cross-check for Chainlink)
Sources: coins.llama.fi answered robinhood:0x5fc5…d168 (USDG), robinhood:0x0Bd7…AD73 (WETH), robinhood:0xd060…9EEC (NVDA) and coingecko:ethereum on 2026-10-24 UTC
Robinhood Stock Token registry operationalchain 4663
| Contract | Address | ABI / version | Verification |
|---|---|---|---|
| accessControlsRegistry | 0xe10b6f6B275de231345c20D14Ab812db62151b00 | Issuer AccessControlsRegistry (also the beacon of every Stock Token proxy) | Beacon slot of NVDA 0xd060…9EEC and CRM 0xd95B…6D44 holds this address; implementation() → 0xb35490d6…5ae2 (2026-10-24 UTC) |
- assets: https://api.robinhood.com/rhj/assets
- operational Tokenized equity list with multipliers and status
- operational On-chain identity check (beacon slot = issuer registry) against copycat tokens
Sources: https://docs.robinhood.com/chain/stock-tokens/ (Stock Token APIs) · GET /rhj/assets → 195 assets with contractAddress, currentMultiplier, status, isin (2026-10-24 UTC)
GeckoTerminal pool stats operationalchain 4663
- pool: https://api.geckoterminal.com/api/v2/networks/robinhood/pools/{address}
- operational 24 h volume and indexed reserves for Uniswap v3 pools (budgeted, ≤4 requests per refresh) — Key-free with a strict burst limit; a refusal keeps the previous read and is shown as stale.
Sources: Answered for the USDG/WETH 0.01 % v3 pool with reserve_in_usd and volume_usd.h24 on 2026-10-24 UTC
Weighted pools (2–8 assets) unavailablechain 4663
- unavailable Weighted pool discovery
- unavailable Join / exit weighted pools
- unavailable Create weighted pools
Sources: Balancer deployments registry (github.com/balancer/balancer-deployments, addresses/) lists no Robinhood Chain network as of 2026-10-24 UTC
Blockers: No verified weighted-pool AMM (Balancer-style) is deployed on chain 4663. NoanFi does not deploy its own AMM.
Tokenized basket contract unavailablechain 4663
- unavailable Mint basket tokens
- unavailable Redeem basket tokens
- operational Allocation planning and sequential execution through swaps — Plans are local; execution is a sequence of ordinary swaps, never atomic.
Sources: No verified basket / index token contract with asset accounting is integrated.
Blockers: Requires a verified basket contract address + ABI (BASKET_CONTRACT_ADDRESS) and an adapter for its accounting model.
Noan Agent model (Anthropic) config-dependentchain n/a
- messages: https://api.anthropic.com/v1/messages (server-side only)
- operational Deterministic agent tools (always available)
- config-dependent Natural-language assistance with tool use — Needs ANTHROPIC_API_KEY; without it the agent page runs tools directly and says the model is not configured.
Sources: Configured through ANTHROPIC_API_KEY on the server; default model claude-opus-5-5
Transaction allow-list
- 0x6131B5fae19EA4f9D964eAc0408E4408b66337b5 — KyberSwap MetaAggregationRouterV2 (router)
- 0xCaf681a66D020601342297493863E78C959E5cb2 — Uniswap v3 SwapRouter02 (router)
- 0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3 — Uniswap v3 NonfungiblePositionManager (position-manager)
- 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 — WETH9 (weth)
- ERC-20
approvecalls are accepted only when the spender is one of the targets above and the token is the one being spent.
Verified base tokens
- ETH native — Network gas token (docs.robinhood.com/chain/connecting)
- WETH 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 — SwapRouter02.WETH9() + NonfungiblePositionManager.WETH9() on chain 4663
- USDG 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 — Blockscout admin-verified token + Chainlink USDG/USD feed
- cbBTC 0xCEC185eB182c47d1bA1EFc84e6959e18cd620Be4 — Blockscout admin-verified token + Chainlink CBBTC/USD feed
- LINK 0x492641F648a4986844848E0beFE66D14817bCE34 — Blockscout admin-verified token + Chainlink LINK/USD feed
- USDe 0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34 — Blockscout admin-verified token + Chainlink USDE/USD feed
- Stock Tokens: live from the issuer registry (195 assets on 2026-10-24) with the beacon identity check.
Security model
- Server-side input validation (zod) on every route; request sizes bounded; per-visitor rate limits; wallet-specific responses are never cached by shared caches.
- Allow-listed targets and spenders; calldata decoded and compared field by field before signing; forbidden aggregator flags, fee lines and embedded permits refused.
- Quote expiry enforced on the server (re-quote at build time) and in the browser (countdown); prepared actions invalidated on any relevant change; duplicate submission blocked per action.
- Explicit gas limits (max of quote and fresh estimate × 1.3 with venue floors); gas reserved when the native maximum is used; insufficient-balance and allowance states handled before the wallet is asked.
- External links only to known https hosts; token metadata sanitised and look-alikes flagged; the model receives tool results as data with an explicit notice and never chooses spenders, writes calldata or executes requests.
- Secrets stay server-side and out of logs. NoanFi is not audited. It makes no audit claim and copies none.
Setup and deployment
Requirements: Node ≥ 22.12 and pnpm 9. Install with pnpm install, run pnpm dev (port 26700), verify with pnpm verify (typecheck, lint, tests, production build). pnpm verify:integrations re-checks every manifest address against the chain and Sourcify. For execution tests, pnpm chain:fork starts an Anvil fork of mainnet on port 9500 and NEXT_PUBLIC_NETWORK=local points the app at it.
| Variable | Meaning |
|---|---|
| NEXT_PUBLIC_NETWORK | robinhood (default) · robinhood-testnet · local (Anvil fork of mainnet for execution tests) |
| NEXT_PUBLIC_SITE_URL | Public origin of the deployment (metadata, canonical redirects). |
| RPC_UPSTREAM_URL | Optional server-side RPC. When set it is used alone (a fork or a paid provider never falls back to public mainnet). |
| UPSTREAM_DOH | Set to 1 on development machines whose DNS resolver hijacks *.robinhood.com; hosts are then resolved over DNS-over-HTTPS with TLS still verified. |
| ANTHROPIC_API_KEY / ANTHROPIC_MODEL | Server-only. Enables Noan Agent chat (default model claude-opus-5-5). Without it the deterministic tools still run. |
| KYBER_CLIENT_ID | Integrator id sent to the KyberSwap API (default noanfi). |
| GECKOTERMINAL_ENABLED / DEFILLAMA_ENABLED | Set to 0 to disable the optional providers. |
Deployment: any Node host or Vercel (pnpm ship deploys to production with the Vercel CLI). Set the server variables there; never commit .env.local.
Limits and non-goals
- No weighted multi-asset pools: no verified Balancer-style AMM exists on chain 4663, and NoanFi does not deploy its own AMM.
- No basket token mint/redeem: no verified basket contract is integrated. The planner and sequential execution work without it.
- Uniswap v4: reads and quotes only. Swaps through the Universal Router and liquidity through the v4 PositionManager are not integrated in this build.
- Testnet (46630): balances only; no verified execution venue, quoter or price feed exists there.
- Pool discovery covers verified candidate pairs; any Uniswap v3 factory pool can still be opened by address.
- Not an offer or advice. The software is provided as is; review every transaction before you sign.
Live state: integration status.