hypersync_schema/
lib.rs

1//! # HyperSync Schema
2//!
3//! Apache Arrow schemas for the HyperSync protocol.
4
5use arrow::datatypes::{DataType, Field, Schema, SchemaRef};
6
7fn hash_dt() -> DataType {
8    DataType::Binary
9}
10
11fn addr_dt() -> DataType {
12    DataType::Binary
13}
14
15fn quantity_dt() -> DataType {
16    DataType::Binary
17}
18
19const NULLABLE: bool = true;
20
21pub fn block_header() -> SchemaRef {
22    Schema::new(vec![
23        Field::new("number", DataType::UInt64, !NULLABLE),
24        Field::new("hash", hash_dt(), !NULLABLE),
25        Field::new("parent_hash", hash_dt(), !NULLABLE),
26        Field::new("nonce", DataType::Binary, NULLABLE),
27        Field::new("sha3_uncles", hash_dt(), !NULLABLE),
28        Field::new("logs_bloom", DataType::Binary, !NULLABLE),
29        Field::new("transactions_root", hash_dt(), !NULLABLE),
30        Field::new("state_root", hash_dt(), !NULLABLE),
31        Field::new("receipts_root", hash_dt(), !NULLABLE),
32        Field::new("miner", addr_dt(), !NULLABLE),
33        Field::new("difficulty", quantity_dt(), NULLABLE),
34        Field::new("total_difficulty", quantity_dt(), NULLABLE),
35        Field::new("extra_data", DataType::Binary, !NULLABLE),
36        Field::new("size", quantity_dt(), !NULLABLE),
37        Field::new("gas_limit", quantity_dt(), !NULLABLE),
38        Field::new("gas_used", quantity_dt(), !NULLABLE),
39        Field::new("timestamp", quantity_dt(), !NULLABLE),
40        Field::new("uncles", DataType::Binary, NULLABLE),
41        Field::new("base_fee_per_gas", quantity_dt(), NULLABLE),
42        Field::new("blob_gas_used", quantity_dt(), NULLABLE),
43        Field::new("excess_blob_gas", quantity_dt(), NULLABLE),
44        Field::new("parent_beacon_block_root", hash_dt(), NULLABLE),
45        Field::new("withdrawals_root", hash_dt(), NULLABLE),
46        Field::new("withdrawals", DataType::Binary, NULLABLE),
47        Field::new("l1_block_number", DataType::UInt64, NULLABLE),
48        Field::new("send_count", quantity_dt(), NULLABLE),
49        Field::new("send_root", hash_dt(), NULLABLE),
50        Field::new("mix_hash", hash_dt(), NULLABLE),
51    ])
52    .into()
53}
54
55pub fn transaction() -> SchemaRef {
56    Schema::new(vec![
57        Field::new("block_hash", hash_dt(), !NULLABLE),
58        Field::new("block_number", DataType::UInt64, !NULLABLE),
59        Field::new("from", addr_dt(), NULLABLE),
60        Field::new("gas", quantity_dt(), !NULLABLE),
61        Field::new("gas_price", quantity_dt(), NULLABLE),
62        Field::new("hash", hash_dt(), !NULLABLE),
63        Field::new("input", DataType::Binary, !NULLABLE),
64        Field::new("nonce", quantity_dt(), !NULLABLE),
65        Field::new("to", addr_dt(), NULLABLE),
66        Field::new("transaction_index", DataType::UInt64, !NULLABLE),
67        Field::new("value", quantity_dt(), !NULLABLE),
68        Field::new("v", quantity_dt(), NULLABLE),
69        Field::new("r", quantity_dt(), NULLABLE),
70        Field::new("s", quantity_dt(), NULLABLE),
71        Field::new("max_priority_fee_per_gas", quantity_dt(), NULLABLE),
72        Field::new("max_fee_per_gas", quantity_dt(), NULLABLE),
73        Field::new("chain_id", quantity_dt(), NULLABLE),
74        Field::new("cumulative_gas_used", quantity_dt(), !NULLABLE),
75        Field::new("effective_gas_price", quantity_dt(), !NULLABLE),
76        Field::new("gas_used", quantity_dt(), !NULLABLE),
77        Field::new("contract_address", addr_dt(), NULLABLE),
78        Field::new("logs_bloom", DataType::Binary, !NULLABLE),
79        Field::new("type", DataType::UInt8, NULLABLE),
80        Field::new("root", hash_dt(), NULLABLE),
81        Field::new("status", DataType::UInt8, NULLABLE),
82        Field::new("sighash", DataType::Binary, NULLABLE),
83        Field::new("y_parity", quantity_dt(), NULLABLE),
84        Field::new("access_list", DataType::Binary, NULLABLE),
85        Field::new("authorization_list", DataType::Binary, NULLABLE),
86        Field::new("l1_fee", quantity_dt(), NULLABLE),
87        Field::new("l1_gas_price", quantity_dt(), NULLABLE),
88        Field::new("l1_gas_used", quantity_dt(), NULLABLE),
89        Field::new("l1_fee_scalar", quantity_dt(), NULLABLE),
90        Field::new("gas_used_for_l1", quantity_dt(), NULLABLE),
91        Field::new("max_fee_per_blob_gas", quantity_dt(), NULLABLE),
92        Field::new("blob_versioned_hashes", DataType::Binary, NULLABLE),
93        Field::new("deposit_nonce", quantity_dt(), NULLABLE),
94        Field::new("blob_gas_price", quantity_dt(), NULLABLE),
95        Field::new("deposit_receipt_version", quantity_dt(), NULLABLE),
96        Field::new("blob_gas_used", quantity_dt(), NULLABLE),
97        Field::new("l1_base_fee_scalar", quantity_dt(), NULLABLE),
98        Field::new("l1_blob_base_fee", quantity_dt(), NULLABLE),
99        Field::new("l1_blob_base_fee_scalar", quantity_dt(), NULLABLE),
100        Field::new("l1_block_number", quantity_dt(), NULLABLE),
101        Field::new("mint", quantity_dt(), NULLABLE),
102        Field::new("source_hash", hash_dt(), NULLABLE),
103    ])
104    .into()
105}
106
107pub fn log() -> SchemaRef {
108    Schema::new(vec![
109        Field::new("removed", DataType::Boolean, NULLABLE),
110        Field::new("log_index", DataType::UInt64, !NULLABLE),
111        Field::new("transaction_index", DataType::UInt64, !NULLABLE),
112        Field::new("transaction_hash", hash_dt(), !NULLABLE),
113        Field::new("block_hash", hash_dt(), !NULLABLE),
114        Field::new("block_number", DataType::UInt64, !NULLABLE),
115        Field::new("address", addr_dt(), !NULLABLE),
116        Field::new("data", DataType::Binary, !NULLABLE),
117        Field::new("topic0", DataType::Binary, NULLABLE),
118        Field::new("topic1", DataType::Binary, NULLABLE),
119        Field::new("topic2", DataType::Binary, NULLABLE),
120        Field::new("topic3", DataType::Binary, NULLABLE),
121    ])
122    .into()
123}
124
125pub fn trace() -> SchemaRef {
126    Schema::new(vec![
127        Field::new("from", addr_dt(), NULLABLE),
128        Field::new("to", addr_dt(), NULLABLE),
129        Field::new("call_type", DataType::Utf8, NULLABLE),
130        Field::new("gas", quantity_dt(), NULLABLE),
131        Field::new("input", DataType::Binary, NULLABLE),
132        Field::new("init", DataType::Binary, NULLABLE),
133        Field::new("value", quantity_dt(), NULLABLE),
134        Field::new("author", addr_dt(), NULLABLE),
135        Field::new("reward_type", DataType::Utf8, NULLABLE),
136        Field::new("block_hash", DataType::Binary, !NULLABLE),
137        Field::new("block_number", DataType::UInt64, !NULLABLE),
138        Field::new("address", addr_dt(), NULLABLE),
139        Field::new("code", DataType::Binary, NULLABLE),
140        Field::new("gas_used", quantity_dt(), NULLABLE),
141        Field::new("output", DataType::Binary, NULLABLE),
142        Field::new("subtraces", DataType::UInt64, NULLABLE),
143        Field::new("trace_address", DataType::Binary, NULLABLE),
144        Field::new("transaction_hash", DataType::Binary, NULLABLE),
145        Field::new("transaction_position", DataType::UInt64, NULLABLE),
146        Field::new("type", DataType::Utf8, NULLABLE),
147        Field::new("error", DataType::Utf8, NULLABLE),
148        Field::new("sighash", DataType::Binary, NULLABLE),
149        Field::new("action_address", addr_dt(), NULLABLE),
150        Field::new("balance", quantity_dt(), NULLABLE),
151        Field::new("refund_address", addr_dt(), NULLABLE),
152    ])
153    .into()
154}
155
156#[cfg(test)]
157mod tests {
158    use super::*;
159
160    #[test]
161    fn smoke_test_schema_constructors() {
162        block_header();
163        transaction();
164        log();
165        trace();
166    }
167}