dYdX Report
History
dYdX history combines several sources because the indexer, chain node, governance API, and BigQuery expose different slices of account state. The report should keep these buckets separate instead of treating every event as a generic wallet transfer.
Buckets
- Fills: perpetual futures trades
- Funding: perpetual funding payments
- Subaccount Transfers: deposits to subaccounts, withdrawals from subaccounts, and subaccount-to-subaccount transfers.
- Chain Fees: on-chain transaction fees from Comet
txevents. - Staking: delegate, undelegate, unbond completion, and reward-withdrawal activity.
- Trading Rewards: regular DYDX reward distributions.
- Community Treasury Distributions: governance-executed
MsgSendFromModuleToAccountmessages. - Megavault: deposits and withdrawals between subaccounts and the Megavault.
- IBC Wallet Transfers: wallet-level USDC movements between dYdX and external chains.
- Wallet Transfers: unmatched wallet-level transfer events after semantic sources are excluded.
Source Options
| Bucket | Indexer | Node | Node Cost | BigQuery | BigQuery Cost |
|---|---|---|---|---|---|
| Fills | 7.0s |
n/a | n/a | n/a | n/a |
| Subaccount transfers | 5.4s |
deposit_to_subaccount.*, withdraw_from_subaccount.*, create_transfer.* by address |
~3s |
dydx_deposit, dydx_withdrawal, dydx_transfer by address |
1.8s, $0.001 |
| Funding | n/a | settled_funding.subaccount='<address>' |
5.8s |
dydx_settled_funding by subaccount |
2.4s, $0.03 |
| Chain fees | n/a | tx.fee_payer='<address>' |
1.1s |
n/a | n/a |
| Staking | n/a | tx.fee_payer='<address>', delegate.delegator='<address>', unbond.delegator='<address>' |
0.4s to 1.1s |
dydx_delegate, dydx_undelegate, dydx_message_events by sender/delegator |
1.9s, $0.0003 |
| Trading rewards | n/a | n/a | n/a | dydx_reward_distribution by recipient |
2.0s, $0.08 |
| Community treasury distributions | n/a | governance proposal REST; block_results at derived heights |
0.6s to 1.2s per proposal |
dydx_block_events by recipient and treasury sender |
broad scan, $1.1 |
| Megavault | n/a | tx.fee_payer='<address>' or message.sender='<address>' AND message.action='<megavault action>' |
<1.4s |
dydx_message_events by Megavault event type and address |
1.4s, $0.6 |
| IBC wallet transfers | n/a | outbound via tx.fee_payer='<address>'; inbound via fungible_token_packet.receiver='<address>' |
~3s |
dydx_message_events filtered to IBC transfer events |
1.7s, $0.7 |
| Wallet transfers | n/a | n/a | n/a | unmatched dydx_message_events transfer events by wallet address |
~6s, cost depends on scan cache |
Defaults
Prefer the cheapest semantic source per bucket:
- Use indexer fills and transfers for trading and subaccount movement.
- Use archive node
settled_funding.subaccountfor funding. - Use archive node
tx.fee_payerfor chain fees and signed wallet activity. - Use BigQuery
dydx_reward_distributionfor trading rewards. - Use governance REST plus archive confirmation for community treasury distributions.
- Use archive node
message.sender + message.actionfor Megavault. - Keep IBC wallet transfers configurable because archive discovery is slow and BigQuery is faster but paid.
- Use BigQuery unmatched wallet transfers to capture residual module credits that are not represented by the higher-level sources.
Avoid broad raw event scans as defaults. dydx_block_events can contain duplicate
raw ingestion rows, and generic transfer-like events overlap with fees, deposits,
withdrawals, coin_spent, and coin_received.
When archive-node sources overlap, fetch each discovery query once and route transactions by event type. Deduplicate records by the stable transaction hash plus event index, not by the source query that found the transaction.