System architecture
A browser-built transaction, a read-only quote service and a public chain.
Implemented architecture
01The data path
The browser sends symbols, a decimal input and slippage to the quote route. The server validates input, selects a reference block, verifies configured contracts and examines direct pools. It returns structured observations, not arbitrary transaction bytes.
The browser parses the response, localizes timing without extending lifetime and builds payloads from local ABIs. Preparation and explicit review precede any wallet send. That final lane is currently paused.
- 01Browser inputs
- 02POST /api/quote
- 03RPC: factory → pool → QuoterV2
- 04Schema + local payload checks
- 05Preparation + review [paused]
- 06Wallet → receipt [paused]
02Trust boundaries
Server and browser rely on RPC correctness and availability. Code presence, metadata, pool identity and factory/WETH bindings reject configuration errors but do not prove audited bytecode or defeat a malicious RPC.
Viem encodes calls and transports RPC requests; Wagmi manages wallet state. The active integration uses an injected connector. No WalletConnect/Reown project, embedded signing service or remote custody service is configured. Optional wallet SDKs still exist in the dependency graph and need maintenance.
No private key is collected. An approval is an onchain permission; previous allowances can persist independently of this origin.
03Network and token registry
Native ETH uses a zero-address sentinel in application metadata, never an ERC-20 contract. Market routing normalizes ETH to WETH, then settles native input or output through the router.
| Item | Configured value |
|---|---|
| Chain / native currency | 4663 / ETH |
| RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | https://robinhoodchain.blockscout.com |
| ETH | native sentinel 0x0000000000000000000000000000000000000000 · 18 decimals |
| WETH | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 · 18 decimals |
| USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 · 6 decimals |
| V3 factory | 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA |
| QuoterV2 | 0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7 |
| Active SwapRouter02 | 0xCaf681a66D020601342297493863E78C959E5cb2 |
| Universal Router: not executed | 0x204FAca1764B154221e35c0d20aBb3c525710498 |
04Caching and clock domains
Quotes share in-flight work and cache for three seconds from request start, at most 100 entries with oldest eviction. Failed entries are removed. Contract configuration verification caches for sixty seconds and clears on failure. HTTP responses use Cache-Control: no-store; this is separate from the internal cache.
Browser requests debounce by 400 ms. Query stale time is five seconds, garbage collection sixty seconds and visible-page refetch twenty seconds. Refresh pauses during review or wallet work; no automatic query retry is configured. Browser and server wall clocks are not assumed synchronized.
05Deployment boundary
Next.js serves the interface, static documentation and two API routes on the existing Vercel project. There is no persistent backend database or deployed background worker.
Activity history is browser localStorage, capped at 100 entries per origin/device. It is not a canonical account index. Server RPC_URL may customize transport; credentials must not be shipped to browser configuration.