Skip to main content

Robinhood Chain Data

Bitquery provides Robinhood Chain data dumps in Parquet format, designed for large-scale analytics, historical backfills, and data lake integrations. These datasets can be hosted directly in your own cloud storage (for example, AWS S3) and queried using engines like Snowflake, BigQuery, Athena, Spark, etc.

Robinhood Chain is an EVM network (chain ID 4663), so these exports use the same schema as Bitquery's other EVM chains — Ethereum, BSC, Base, Polygon. A query or loader written against ethereum/ runs unchanged against robinhood/.

What makes the chain distinctive is not the schema but what trades on it: tokenized equities and RWAsNVDA, SPY, SLV — settle in the same dex_trades table as ordinary ERC-20s and memecoins, quoted against USDG rather than USDC.

Available Robinhood Topics

TopicGrainWhat it holds
dex_tradesone row per DEX tradeBuy and sell side with token metadata, USD amounts, pool and protocol
transfersone row per value movementNative and ERC-20 transfers, with USD value and currency metadata
balancesone row per address per currencyBalance snapshot with first and last change time, and update count
eventsone row per decoded logEvent logs with decoded arguments, topics, and the emitting call context
callsone row per contract callInternal and top-level calls with decoded arguments, returns, and state changes

Sample Robinhood Cloud Dataset

You can explore schemas and validate your tooling using the public Robinhood sample datasets:

GitHub reference (schemas & examples)
https://github.com/bitquery/blockchain-cloud-data-dump-sample/tree/main/robinhood

Example Parquet file (public S3)

https://bitquery-blockchain-dataset.s3.us-east-1.amazonaws.com/robinhood/<topic>/<block_range>.parquet

Sample Parquet downloads (public S3)

All five samples cover the same 50 blocks, 5660000056600049:

TopicRecordsFile size
calls7,885543 KB
events2,211283 KB
transfers1,37466 KB
balances85832 KB
dex_trades277100 KB

Robinhood Dataset Directory Structure

bitquery-blockchain-dataset/
└── robinhood/
├── balances/
│ ├── <start_block>_<end_block>.parquet
│ └── ...
├── calls/
│ ├── <start_block>_<end_block>.parquet
│ └── ...
├── dex_trades/
│ ├── <start_block>_<end_block>.parquet
│ └── ...
├── events/
│ ├── <start_block>_<end_block>.parquet
│ └── ...
└── transfers/
├── <start_block>_<end_block>.parquet
└── ...

Block Range Naming Convention

Each Parquet file name follows this format:

<start_block>_<end_block>.parquet

Files hold 50 blocks each, matching the other EVM chains — but Robinhood Chain produces roughly 10 blocks per second, so a 50-block file is about 5 seconds of activity, not the ten minutes the same range covers on Ethereum. The sample range spans 05:54:47 to 05:54:52 UTC.

Size a backfill by time, not by file count: one hour of Robinhood Chain is roughly 720 files per topic.

Common Columns

Most topics share the same block and transaction context, which makes joining across topics straightforward:

ColumnTypeDescription
Block_Numberuint64Block height
Block_DatedateDate partition of the block
Block_TimedatetimeBlock timestamp (UTC)
Transaction_HashstringTransaction hash — the join key across topics
Transaction_Indexuint64Position of the transaction within the block
TransactionStatus_Successstring"true" / "false" — a string, not a boolean
Fee_SenderFeestringFee paid by the sender, as a decimal string

Nested structures are flattened with _, so Trade { Buy { Currency { Symbol } } } becomes Trade_Buy_Currency_Symbol.

Correctness Notes

Five things will silently produce wrong numbers if you treat these files casually.

1. Amounts Are Decimal Strings

Transfer_Amount, Trade_Buy_Amount, Trade_Sell_Amount, Balance_Amount, and Fee_SenderFee are strings, preserving full token precision. Their *InUSD companions are floats.

from decimal import Decimal
df["amount"] = df.Transfer_Amount.map(Decimal) # not .astype(float)

An 18-decimal token amount does not survive a float64 round trip. Use the string column for token quantities and the InUSD column for value.

2. Booleans Are Strings

TransactionStatus_Success, Transfer_Currency_Native, Transfer_Currency_Fungible, Call_Reverted, and Call_Success hold "true" / "false" as text. WHERE Call_Success will not do what you expect — compare to the string:

WHERE TransactionStatus_Success = 'true'

3. Native ETH Is Not a token Transfer

Robinhood Chain's native asset is ETH, carried with Transfer_Currency_SmartContract = '0x' and Transfer_Currency_Native = 'true'. It does not appear under Transfer_Type = 'token'. In the sample's 1,374 transfers:

Transfer_TypeRowsWhat it is
token962ERC-20 movements
call405Native ETH moved by an internal call
transaction7Native ETH moved by the transaction itself

All 412 native rows are call or transaction. Filtering to Transfer_Type = 'token' silently drops every ETH movement on the chain.

Filter currencies on the contract address, never the symbol — symbols are not unique.

4. The Quote Asset Is USDG, Not USDC

Robinhood Chain settles in USDG (Global Dollar, 0x5fc5360d0400a0fd4f2af552add042d716f1d168, 6 decimals), not USDC. It is the most common leg in the sample — 150 of 554 trade sides — followed by WETH (93) and native ETH (38).

A pricing or volume query ported from Ethereum that hardcodes the USDC address returns zero rows here.

5. Tokenized Equities Share the ERC-20 Schema

NVDA, SPY, and SLV are ordinary ERC-20 contracts with 18 decimals, indistinguishable from a memecoin by schema alone. 54 of the sample's 277 trades have an equity leg — a fifth of all trading.

SymbolContractDecimals
NVDA0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec18
SPY0x117cc2133c37b721f49de2a7a74833232b3b4c0c18
SLV0x411efb0e7f985935daec3d4c3ebaea0d0ad7d89f18

Maintain a contract allowlist if you need to separate RWA flow from crypto-native flow. Symbol matching is not safe: anyone can deploy a token called NVDA.

DEX Landscape

Trades in the sample spread across six protocols, including Pons, which is native to Robinhood Chain:

Trade_Dex_ProtocolNameFamilyTrades
uniswap_v4Uniswap109
uniswap_v3Uniswap106
pons_v2Pons49
uniswap_v2Uniswap7
pancakeswap_infinityPancakeSwapInfinity5
aerodrome_v1Aerodrome1

Group on Trade_Dex_ProtocolFamily for venue-level aggregates and Trade_Dex_ProtocolName to separate versions.

Topic Schemas

Columns listed in Common Columns are omitted below.

dex_trades

One row per DEX trade. 277 rows in the sample, across 159 transactions.

ColumnTypeDescription
Trade_Buy_Amount, Trade_Sell_AmountstringAmounts, as decimal strings
Trade_Buy_AmountInUSD, Trade_Sell_AmountInUSDfloat64USD value of each side
Trade_Buy_Buyer, Trade_Buy_SellerstringCounterparties on the buy side
Trade_Sell_Buyer, Trade_Sell_SellerstringCounterparties on the sell side
Trade_Buy_Price, Trade_Buy_PriceInUSDfloat64Execution price, in the paired token and in USD
Trade_*_Currency_*mixedSymbol, Name, SmartContract, Decimals, ProtocolName, Fungible, HasURI per side
Trade_Dex_SmartContractstringRouter or pool manager contract
Trade_Dex_ProtocolName, _ProtocolFamily, _ProtocolVersionstringVenue identification
Trade_Dex_Pair_*mixedPair token metadata, where the protocol exposes one
Trade_FeesstringJSON array of [Amount, AmountInUSD, [Currency…], Payer, Recipient]
Trade_Indexuint32Trade position within the transaction
Trade_PriceAsymmetryfloat64Price divergence between the two legs
Trade_SenderstringAddress that initiated the swap

transfers

One row per value movement, native and ERC-20. 1,374 rows in the sample, across 200 transactions.

ColumnTypeDescription
Transfer_AmountstringAmount, as a decimal string
Transfer_AmountInUSDfloat64USD value
Transfer_Sender, Transfer_ReceiverstringCounterparties
Transfer_Typestringtoken, call, or transaction — see note 3 above
Transfer_Currency_SmartContractstringToken contract; 0x for native ETH
Transfer_Currency_Nativestring"true" for native ETH
Transfer_Currency_Symbol, _Name, _Decimals, _ProtocolNamemixedToken metadata
Transfer_Currency_Fungiblestring"false" marks NFTs
Transfer_IdstringToken id for non-fungible transfers
Transfer_Indexuint32Position within the transaction
Transfer_URIstringToken URI, for NFTs

balances

Balance snapshot — levels, not deltas. 858 rows covering 427 distinct addresses in the sample.

ColumnTypeDescription
Balance_AddressstringAccount holding the balance
Balance_AmountstringBalance level, as a decimal string
Balance_FirstChangeTime, _LastChangeTimedatetimeFirst and last change in the covered range
Balance_UpdateCountuint64Number of balance changes in the range
Balance_RowCountuint64Always 1 — a per-row marker
Currency_Name, _Symbol, _SmartContract, _ProtocolNamestringCurrency metadata

Only accounts whose balance changed in the range appear. Native ETH is 284 of the sample's 858 rows, ERC-20s 570, and ERC-721s 4.

events

One row per decoded log. 2,211 rows across 34 distinct event signatures in the sample.

ColumnTypeDescription
ArgumentsstringJSON array of [Index, Name, Path, Type, Value]
Log_Signature_Name, _Signature, _SignatureHashstringDecoded event signature — Transfer (964), Swap (229), Approval (194)
Log_SmartContractstringContract that emitted the log
Log_Index, Log_Pcuint32, uint64Log position and program counter
LogHeader_Address, _Data, _IndexmixedRaw log address, data, and index
Topics_Hashlist<string>Topic hashes, without the 0x prefix
Call_*mixedThe call that emitted the log — From, To, Gas, Signature_Name, Value
ChainIduint644663 on every row

384 of the sample's rows have an empty Log_Signature_Name — logs whose ABI Bitquery has not resolved. Their LogHeader_Data and Topics_Hash are still present, so you can decode them yourself.

calls

One row per contract call, internal calls included. 7,885 rows in the sample.

ColumnTypeDescription
Call_From, Call_TostringCaller and callee
Call_Value, Call_ValueInUSDstring, float64Native value attached to the call
Call_Signature_Name, _Signature, _SignatureHashstringDecoded function — balanceOf (2,136), transfer (995), transferFrom (394)
Call_Input, Call_OutputstringRaw calldata and return data
Arguments, ReturnsstringJSON arrays of [Index, Name, Path, Type, Value]
StateChangesstringJSON array of [Address, ChangeAfterCallIndex, Location, Value]
Call_Gas, _GasUseduint64Gas supplied and consumed
Call_Depth, _Index, _CallPathmixedPosition in the call tree
Call_InternalCalls, _LogCountuint32Children and logs produced
Call_Success, _Reverted, _ErrorstringOutcome — strings, not booleans
Call_Opcode_Name, _Codestring, uint32Call opcode, e.g. CALL, STATICCALL, DELEGATECALL
Call_Create, _SelfDestruct, _DelegatedstringContract creation, destruction, and delegation flags

Read-only calls dominate: balanceOf alone is 27% of the sample. Filter on Call_Signature_Name before aggregating, or you will measure RPC-style reads rather than economic activity.

Joining Topics

Every topic carries Transaction_Hash, so it is the natural join key. To attach trades to the events that produced them:

SELECT
t.Trade_Dex_ProtocolName,
t.Trade_Buy_Currency_Symbol,
t.Trade_Buy_AmountInUSD,
e.Log_Signature_Name
FROM robinhood_dex_trades t
JOIN robinhood_events e
ON t.Transaction_Hash = e.Transaction_Hash
WHERE t.TransactionStatus_Success = 'true'
AND e.Log_Signature_Name = 'Swap'

One transaction fans out to many rows in calls, events, and transfers, so joining two of them on Transaction_Hash alone produces a cross product. Aggregate one side first, or add Block_Number and the per-row index columns to the join.

Reading Files in Python

import pandas as pd
from decimal import Decimal

BASE = "https://bitquery-blockchain-dataset.s3.us-east-1.amazonaws.com/robinhood/"
RANGE = "56600000_56600049"

trades = pd.read_parquet(f"{BASE}dex_trades/{RANGE}.parquet")
transfers = pd.read_parquet(f"{BASE}transfers/{RANGE}.parquet")

# venue mix
print(trades.Trade_Dex_ProtocolName.value_counts())

# tokenized equity flow, by contract not symbol
EQUITIES = {
"0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec", # NVDA
"0x117cc2133c37b721f49de2a7a74833232b3b4c0c", # SPY
"0x411efb0e7f985935daec3d4c3ebaea0d0ad7d89f", # SLV
}
eq = trades[
trades.Trade_Buy_Currency_SmartContract.isin(EQUITIES)
| trades.Trade_Sell_Currency_SmartContract.isin(EQUITIES)
]
print(f"equity-leg trades: {len(eq)} of {len(trades)}")

# native ETH is NOT Transfer_Type == 'token'
native = transfers[transfers.Transfer_Currency_Native == "true"]
print("native ETH moved:", sum(native.Transfer_Amount.map(Decimal)))
print("types carrying it:", native.Transfer_Type.unique())

Real-Time vs Batch Data Access

Cloud data dumps are optimized for batch analytics and historical workloads.

If you require low-latency or streaming Robinhood Chain data, Bitquery also provides:

Build with Bitquery

Ready to run this in production?

Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.