Documentation

How NoanFi works

NoanFi is an agent-assisted multi-asset DeFi application for Robinhood Chain (chain id 4663): swaps, liquidity discovery and management, portfolio inspection, allocation planning and an assistant that reads verified data and prepares transactions for your wallet to approve.

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.

Running live checks…
CapabilityDepends onWallet
Read balances
Native balance and ERC-20 balances of the verified registry, plus indexed holdings from the explorer.
network-rpcno
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-v4no
Quote swaps
Exact-input quotes from the KyberSwap aggregator and the Uniswap v3 QuoterV2.
network-rpc · any of: kyberswap, uniswap-v3no
Execute swaps
Build, validate, simulate and submit swaps through the pinned routers; the wallet signs.
network-rpc · any of: kyberswap, uniswap-v3yes
Add / remove liquidity
Uniswap v3 positions through the NonfungiblePositionManager.
network-rpc · uniswap-v3yes
Create pools
Create and initialise a Uniswap v3 pool for a verified pair and enabled fee tier.
network-rpc · uniswap-v3yes
Mint / redeem baskets
On-chain basket tokens. Planning and sequential execution work without this.
basket-contractyes
Reference prices
Chainlink feeds first, DefiLlama as market cross-check; nothing is valued without a dated source.
network-rpc · any of: chainlink, defillamano
Portfolio history
Transaction history and indexed inventory from the explorer API.
explorerno
Agent tools
Deterministic tools (network status, balances, pools, quotes, allocation math) that run without a model.
network-rpcno
Noan Agent chat
Natural-language assistance that explains tool output. Needs the server-side model key.
anthropicno

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

ContractAddressABI / versionVerification
multicall30xcA11bde05977b3631167028862bE2a173976CA11Multicall3 (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

ContractAddressABI / versionVerification
weth90x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73aeWETH (Arbitrum-style WETH9 behind a TransparentUpgradeableProxy), solc 0.8.16 · vendored ABI weth9-impl.jsonSourcify 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

ContractAddressABI / versionVerification
factory0x1f7d7550B1b028f7571E69A784071F0205FD2EfAUniswapV3Factory, solc 0.7.6 · vendored ABI v3-factory.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0x1f7d7550B1b028f7571E69A784071F0205FD2EfA
quoterV20x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7QuoterV2, solc 0.7.6 · vendored ABI quoter-v2.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7; factory() returns the factory above
swapRouter020xCaf681a66D020601342297493863E78C959E5cb2SwapRouter02, solc 0.7.6 · vendored ABI swap-router02.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0xCaf681a66D020601342297493863E78C959E5cb2; factory() and WETH9() wired to the contracts above
positionManager0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3NonfungiblePositionManager, solc 0.7.6 · vendored ABI nfpm.jsonSourcify 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

ContractAddressABI / versionVerification
poolManager0x8366a39CC670B4001A1121B8F6A443A643e40951PoolManager, solc 0.8.26 · vendored ABI v4-pool-manager.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0x8366a39CC670B4001A1121B8F6A443A643e40951
stateView0xF3334192D15450CdD385c8B70e03f9A6bD9E673bStateView (v4-periphery), solc 0.8.26 · vendored ABI state-view.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0xF3334192D15450CdD385c8B70e03f9A6bD9E673b
reservesLens0x0000001b173C3bbF3984D417d8614E3eed34865BReservesLens (v4-periphery src/lens), solc 0.8.26 · vendored ABI reserves-lens.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0x0000001b173C3bbF3984D417d8614E3eed34865B
quoter0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94V4Quoter, solc 0.8.26 · vendored ABI v4-quoter.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94
positionManager0x58daec3116aae6D93017bAAea7749052E8a04fA7PositionManager, solc 0.8.26 · vendored ABI v4-position-manager.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0x58daec3116aae6D93017bAAea7749052E8a04fA7; poolManager() and permit2() wired
universalRouter0x204FAca1764B154221e35c0d20aBb3c525710498UniversalRouter v2.1.2, solc 0.8.26 · vendored ABI universal-router.jsonSourcify match: https://sourcify.dev/server/v2/contract/4663/0x204FAca1764B154221e35c0d20aBb3c525710498
permit20x000000000022D473030F116dDEE9F6B43aC78BA3Permit2 (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

ContractAddressABI / versionVerification
router0x6131B5fae19EA4f9D964eAc0408E4408b66337b5MetaAggregationRouterV2, solc 0.8.17 (deploy block 5,127,616) · vendored ABI kyber-router.jsonSourcify 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

ContractAddressABI / versionVerification
ethUsd0x78F3556b67E17Df817D51Ef5a990cDaF09E8d3A9EACAggregatorProxy (AggregatorV3Interface), 8 decimals, 24 h heartbeat · vendored ABI chainlink-proxy.jsonSourcify exact_match: https://sourcify.dev/server/v2/contract/4663/0x78F3556b67E17Df817D51Ef5a990cDaF09E8d3A9; latestRoundData answered 2382.04 at 02:10 UTC 2026-10-24
usdgUsd0x61B7e5650328764B076A108EFF5fa7282a1B9aD2EACAggregatorProxy, 8 decimals · vendored ABI chainlink-proxy.jsonreference-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

ContractAddressABI / versionVerification
accessControlsRegistry0xe10b6f6B275de231345c20D14Ab812db62151b00Issuer 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 approve calls 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.

VariableMeaning
NEXT_PUBLIC_NETWORKrobinhood (default) · robinhood-testnet · local (Anvil fork of mainnet for execution tests)
NEXT_PUBLIC_SITE_URLPublic origin of the deployment (metadata, canonical redirects).
RPC_UPSTREAM_URLOptional server-side RPC. When set it is used alone (a fork or a paid provider never falls back to public mainnet).
UPSTREAM_DOHSet 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_MODELServer-only. Enables Noan Agent chat (default model claude-opus-5-5). Without it the deterministic tools still run.
KYBER_CLIENT_IDIntegrator id sent to the KyberSwap API (default noanfi).
GECKOTERMINAL_ENABLED / DEFILLAMA_ENABLEDSet 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.