Hi HN, I'm one of the builders of Robinscan.
Robinhood launched their own L2 (chain ID 4663, Arbitrum Orbit stack) and we built a dedicated block explorer for it. Not a Blockscout fork or wrapper. We own the full stack: node, indexer, explorer. All in Rust.
The node: robin-reth is our own Reth implementation customized for arbitrum. It exposes a bulk binary log stream (custom protocol, not JSON) that lets the price oracle scan the entire chain's DEX events in one pass instead of paginating eth_getLogs thousands of times. The node, the indexer and the explorer are released together , so no version mismatch possible.
The indexer: robin-rpc-source fetches blocks via standard JSON-RPC in batch and validates every field: transaction count matches receipt count, parent hashes chain correctly, every log belongs to its transaction and block. If anything doesn't match, the entire range is rejected. Most indexers trust the RPC; we own the RPC and still validate.
robin-index is the reverse index: It's 32 independently sharded LSM stores, each owning a disjoint slice of the keyspace. Keys store sort fields inverted so iteration is newest-first by default. A bulk builder uses external sorting with bounded memory for fresh index construction. The write path decodes ERC-20, ERC-721 and ERC-1155 (including batch transfers) and maintains holder balances incrementally. Some erc20 emit Transfer events without actually moving state. Four of this chain's fifty largest do exactly that, so we reconcile against on-chain balanceOf calls.
robin-indexer is the follower binary. Two-phase checkpoint commit: begin() writes pending state to disk, blocks are applied, commit() moves pending to committed. On crash, re-fetch and re-apply, verifying parent hash continuity. Staged publish writes to a .building sibling and renames atomically. robin-gateway (the explorer) maintains a sliding window of ~6M blocks locally with zstd compression (~7.5x on block bodies). It has a tx_hash→block_number index, a callTracer cache for internal transactions and a full-history per-address internal-transaction index. Serves a Blockscout-compatible API, forwards uncovered requests upstream.
robin-gecko is the price oracle. It builds a graph from swap events where each pool is an edge carrying price, depth and trailing volume. Prices are solved via BFS from a numeraire, with depth and volume floors. OHLCV candles at three resolutions. The price graph is two hash maps in memory, rebuilt from the log stream on boot. The bulk stream from our node is what makes that rebuild fast. robin-librarian resolves 4-byte selectors to method names. The interesting part is static bytecode analysis: walks EVM bytecode, extracts dispatched selectors by anchoring on the PUSH4+EQ+JUMPI pattern, recovers argument types, detects proxy patterns (EIP-1167/1967/1822). Also finds contracts with similar bytecode (Jaccard ≥0.9 on selector surface + shingle similarity) and borrows their ABIs. A curated table covers standard signatures. Rule: a guess never shadows a fact.
Will be open-sourcing the full stack at Robinscan's GitHub.
Happy to go deeper on any part of it and always open to connecting with teams, integrations, or partnerships across the ecosystem.
cdav•9m ago
The node: robin-reth is our own Reth implementation customized for arbitrum. It exposes a bulk binary log stream (custom protocol, not JSON) that lets the price oracle scan the entire chain's DEX events in one pass instead of paginating eth_getLogs thousands of times. The node, the indexer and the explorer are released together , so no version mismatch possible.
The indexer: robin-rpc-source fetches blocks via standard JSON-RPC in batch and validates every field: transaction count matches receipt count, parent hashes chain correctly, every log belongs to its transaction and block. If anything doesn't match, the entire range is rejected. Most indexers trust the RPC; we own the RPC and still validate.
robin-index is the reverse index: It's 32 independently sharded LSM stores, each owning a disjoint slice of the keyspace. Keys store sort fields inverted so iteration is newest-first by default. A bulk builder uses external sorting with bounded memory for fresh index construction. The write path decodes ERC-20, ERC-721 and ERC-1155 (including batch transfers) and maintains holder balances incrementally. Some erc20 emit Transfer events without actually moving state. Four of this chain's fifty largest do exactly that, so we reconcile against on-chain balanceOf calls.
robin-indexer is the follower binary. Two-phase checkpoint commit: begin() writes pending state to disk, blocks are applied, commit() moves pending to committed. On crash, re-fetch and re-apply, verifying parent hash continuity. Staged publish writes to a .building sibling and renames atomically. robin-gateway (the explorer) maintains a sliding window of ~6M blocks locally with zstd compression (~7.5x on block bodies). It has a tx_hash→block_number index, a callTracer cache for internal transactions and a full-history per-address internal-transaction index. Serves a Blockscout-compatible API, forwards uncovered requests upstream.
robin-gecko is the price oracle. It builds a graph from swap events where each pool is an edge carrying price, depth and trailing volume. Prices are solved via BFS from a numeraire, with depth and volume floors. OHLCV candles at three resolutions. The price graph is two hash maps in memory, rebuilt from the log stream on boot. The bulk stream from our node is what makes that rebuild fast. robin-librarian resolves 4-byte selectors to method names. The interesting part is static bytecode analysis: walks EVM bytecode, extracts dispatched selectors by anchoring on the PUSH4+EQ+JUMPI pattern, recovers argument types, detects proxy patterns (EIP-1167/1967/1822). Also finds contracts with similar bytecode (Jaccard ≥0.9 on selector surface + shingle similarity) and borrows their ABIs. A curated table covers standard signatures. Rule: a guess never shadows a fact.
Will be open-sourcing the full stack at Robinscan's GitHub. Happy to go deeper on any part of it and always open to connecting with teams, integrations, or partnerships across the ecosystem.