cherry_evm_schema/
lib.rs

1use std::sync::Arc;
2
3use arrow::array::builder;
4use arrow::datatypes::{DataType, Field, Fields, Schema};
5use arrow::record_batch::RecordBatch;
6
7pub fn blocks_schema() -> Schema {
8    Schema::new(vec![
9        Field::new("number", DataType::UInt64, true),
10        Field::new("hash", DataType::Binary, true),
11        Field::new("parent_hash", DataType::Binary, true),
12        Field::new("nonce", DataType::Binary, true),
13        Field::new("sha3_uncles", DataType::Binary, true),
14        Field::new("logs_bloom", DataType::Binary, true),
15        Field::new("transactions_root", DataType::Binary, true),
16        Field::new("state_root", DataType::Binary, true),
17        Field::new("receipts_root", DataType::Binary, true),
18        Field::new("miner", DataType::Binary, true),
19        Field::new("difficulty", DataType::Decimal256(76, 0), true),
20        Field::new("total_difficulty", DataType::Decimal256(76, 0), true),
21        Field::new("extra_data", DataType::Binary, true),
22        Field::new("size", DataType::Decimal256(76, 0), true),
23        Field::new("gas_limit", DataType::Decimal256(76, 0), true),
24        Field::new("gas_used", DataType::Decimal256(76, 0), true),
25        Field::new("timestamp", DataType::Decimal256(76, 0), true),
26        Field::new(
27            "uncles",
28            DataType::List(Arc::new(Field::new("item", DataType::Binary, true))),
29            true,
30        ),
31        Field::new("base_fee_per_gas", DataType::Decimal256(76, 0), true),
32        Field::new("blob_gas_used", DataType::Decimal256(76, 0), true),
33        Field::new("excess_blob_gas", DataType::Decimal256(76, 0), true),
34        Field::new("parent_beacon_block_root", DataType::Binary, true),
35        Field::new("withdrawals_root", DataType::Binary, true),
36        Field::new(
37            "withdrawals",
38            DataType::List(Arc::new(Field::new("item", withdrawal_dt(), true))),
39            true,
40        ),
41        Field::new("l1_block_number", DataType::UInt64, true),
42        Field::new("send_count", DataType::Decimal256(76, 0), true),
43        Field::new("send_root", DataType::Binary, true),
44        Field::new("mix_hash", DataType::Binary, true),
45    ])
46}
47
48fn withdrawal_dt() -> DataType {
49    DataType::Struct(Fields::from(vec![
50        Arc::new(Field::new("index", DataType::UInt64, true)),
51        Arc::new(Field::new("validator_index", DataType::UInt64, true)),
52        Arc::new(Field::new("address", DataType::Binary, true)),
53        Arc::new(Field::new("amount", DataType::Decimal256(76, 0), true)),
54    ]))
55}
56
57pub fn transactions_schema() -> Schema {
58    Schema::new(vec![
59        Field::new("block_hash", DataType::Binary, true),
60        Field::new("block_number", DataType::UInt64, true),
61        Field::new("from", DataType::Binary, true),
62        Field::new("gas", DataType::Decimal256(76, 0), true),
63        Field::new("gas_price", DataType::Decimal256(76, 0), true),
64        Field::new("hash", DataType::Binary, true),
65        Field::new("input", DataType::Binary, true),
66        Field::new("nonce", DataType::Decimal256(76, 0), true),
67        Field::new("to", DataType::Binary, true),
68        Field::new("transaction_index", DataType::UInt64, true),
69        Field::new("value", DataType::Decimal256(76, 0), true),
70        Field::new("v", DataType::UInt8, true),
71        // keep these binary even though they are uint256 because they don't fit in i256 in
72        // practice
73        Field::new("r", DataType::Binary, true),
74        Field::new("s", DataType::Binary, true),
75        Field::new(
76            "max_priority_fee_per_gas",
77            DataType::Decimal256(76, 0),
78            true,
79        ),
80        Field::new("max_fee_per_gas", DataType::Decimal256(76, 0), true),
81        Field::new("chain_id", DataType::Decimal256(76, 0), true),
82        Field::new("cumulative_gas_used", DataType::Decimal256(76, 0), true),
83        Field::new("effective_gas_price", DataType::Decimal256(76, 0), true),
84        Field::new("gas_used", DataType::Decimal256(76, 0), true),
85        Field::new("contract_address", DataType::Binary, true),
86        Field::new("logs_bloom", DataType::Binary, true),
87        Field::new("type", DataType::UInt8, true),
88        Field::new("root", DataType::Binary, true),
89        Field::new("status", DataType::UInt8, true),
90        Field::new("sighash", DataType::Binary, true),
91        Field::new("y_parity", DataType::Boolean, true),
92        Field::new(
93            "access_list",
94            DataType::List(Arc::new(Field::new("item", access_list_elem_dt(), true))),
95            true,
96        ),
97        Field::new("l1_fee", DataType::Decimal256(76, 0), true),
98        Field::new("l1_gas_price", DataType::Decimal256(76, 0), true),
99        Field::new("l1_gas_used", DataType::Decimal256(76, 0), true),
100        Field::new("l1_fee_scalar", DataType::Decimal256(76, 0), true),
101        Field::new("gas_used_for_l1", DataType::Decimal256(76, 0), true),
102        Field::new("max_fee_per_blob_gas", DataType::Decimal256(76, 0), true),
103        Field::new(
104            "blob_versioned_hashes",
105            DataType::List(Arc::new(Field::new("item", DataType::Binary, true))),
106            true,
107        ),
108        Field::new("deposit_nonce", DataType::Decimal256(76, 0), true),
109        Field::new("blob_gas_price", DataType::Decimal256(76, 0), true),
110        Field::new("deposit_receipt_version", DataType::Decimal256(76, 0), true),
111        Field::new("blob_gas_used", DataType::Decimal256(76, 0), true),
112        Field::new("l1_base_fee_scalar", DataType::Decimal256(76, 0), true),
113        Field::new("l1_blob_base_fee", DataType::Decimal256(76, 0), true),
114        Field::new("l1_blob_base_fee_scalar", DataType::Decimal256(76, 0), true),
115        Field::new("l1_block_number", DataType::UInt64, true),
116        Field::new("mint", DataType::Decimal256(76, 0), true),
117        Field::new("source_hash", DataType::Binary, true),
118    ])
119}
120
121fn access_list_elem_dt() -> DataType {
122    DataType::Struct(Fields::from(vec![
123        Arc::new(Field::new("address", DataType::Binary, true)),
124        Arc::new(Field::new(
125            "storage_keys",
126            DataType::List(Arc::new(Field::new("item", DataType::Binary, true))),
127            true,
128        )),
129    ]))
130}
131
132pub fn logs_schema() -> Schema {
133    Schema::new(vec![
134        Field::new("removed", DataType::Boolean, true),
135        Field::new("log_index", DataType::UInt64, true),
136        Field::new("transaction_index", DataType::UInt64, true),
137        Field::new("transaction_hash", DataType::Binary, true),
138        Field::new("block_hash", DataType::Binary, true),
139        Field::new("block_number", DataType::UInt64, true),
140        Field::new("address", DataType::Binary, true),
141        Field::new("data", DataType::Binary, true),
142        Field::new("topic0", DataType::Binary, true),
143        Field::new("topic1", DataType::Binary, true),
144        Field::new("topic2", DataType::Binary, true),
145        Field::new("topic3", DataType::Binary, true),
146    ])
147}
148
149pub fn traces_schema() -> Schema {
150    Schema::new(vec![
151        Field::new("from", DataType::Binary, true),
152        Field::new("to", DataType::Binary, true),
153        Field::new("call_type", DataType::Utf8, true),
154        Field::new("gas", DataType::Decimal256(76, 0), true),
155        Field::new("input", DataType::Binary, true),
156        Field::new("init", DataType::Binary, true),
157        Field::new("value", DataType::Decimal256(76, 0), true),
158        Field::new("author", DataType::Binary, true),
159        Field::new("reward_type", DataType::Utf8, true),
160        Field::new("block_hash", DataType::Binary, true),
161        Field::new("block_number", DataType::UInt64, true),
162        Field::new("address", DataType::Binary, true),
163        Field::new("code", DataType::Binary, true),
164        Field::new("gas_used", DataType::Decimal256(76, 0), true),
165        Field::new("output", DataType::Binary, true),
166        Field::new("subtraces", DataType::UInt64, true),
167        Field::new(
168            "trace_address",
169            DataType::List(Arc::new(Field::new("item", DataType::UInt64, true))),
170            true,
171        ),
172        Field::new("transaction_hash", DataType::Binary, true),
173        Field::new("transaction_position", DataType::UInt64, true),
174        Field::new("type", DataType::Utf8, true),
175        Field::new("error", DataType::Utf8, true),
176        Field::new("sighash", DataType::Binary, true),
177        Field::new("action_address", DataType::Binary, true),
178        Field::new("balance", DataType::Decimal256(76, 0), true),
179        Field::new("refund_address", DataType::Binary, true),
180    ])
181}
182
183#[derive(Default)]
184pub struct BlocksBuilder {
185    pub number: builder::UInt64Builder,
186    pub hash: builder::BinaryBuilder,
187    pub parent_hash: builder::BinaryBuilder,
188    pub nonce: builder::BinaryBuilder,
189    pub sha3_uncles: builder::BinaryBuilder,
190    pub logs_bloom: builder::BinaryBuilder,
191    pub transactions_root: builder::BinaryBuilder,
192    pub state_root: builder::BinaryBuilder,
193    pub receipts_root: builder::BinaryBuilder,
194    pub miner: builder::BinaryBuilder,
195    pub difficulty: builder::Decimal256Builder,
196    pub total_difficulty: builder::Decimal256Builder,
197    pub extra_data: builder::BinaryBuilder,
198    pub size: builder::Decimal256Builder,
199    pub gas_limit: builder::Decimal256Builder,
200    pub gas_used: builder::Decimal256Builder,
201    pub timestamp: builder::Decimal256Builder,
202    pub uncles: builder::ListBuilder<builder::BinaryBuilder>,
203    pub base_fee_per_gas: builder::Decimal256Builder,
204    pub blob_gas_used: builder::Decimal256Builder,
205    pub excess_blob_gas: builder::Decimal256Builder,
206    pub parent_beacon_block_root: builder::BinaryBuilder,
207    pub withdrawals_root: builder::BinaryBuilder,
208    pub withdrawals: WithdrawalsBuilder,
209    pub l1_block_number: builder::UInt64Builder,
210    pub send_count: builder::Decimal256Builder,
211    pub send_root: builder::BinaryBuilder,
212    pub mix_hash: builder::BinaryBuilder,
213}
214
215pub struct WithdrawalsBuilder(pub builder::ListBuilder<builder::StructBuilder>);
216
217impl Default for WithdrawalsBuilder {
218    fn default() -> Self {
219        Self(builder::ListBuilder::new(builder::StructBuilder::new(
220            match withdrawal_dt() {
221                DataType::Struct(fields) => fields,
222                _ => unreachable!(),
223            },
224            vec![
225                Box::new(builder::UInt64Builder::default()),
226                Box::new(builder::UInt64Builder::default()),
227                Box::new(builder::BinaryBuilder::default()),
228                Box::new(
229                    builder::Decimal256Builder::default()
230                        .with_precision_and_scale(76, 0)
231                        .unwrap(),
232                ),
233            ],
234        )))
235    }
236}
237
238impl BlocksBuilder {
239    pub fn finish(mut self) -> RecordBatch {
240        RecordBatch::try_new(
241            Arc::new(blocks_schema()),
242            vec![
243                Arc::new(self.number.finish()),
244                Arc::new(self.hash.finish()),
245                Arc::new(self.parent_hash.finish()),
246                Arc::new(self.nonce.finish()),
247                Arc::new(self.sha3_uncles.finish()),
248                Arc::new(self.logs_bloom.finish()),
249                Arc::new(self.transactions_root.finish()),
250                Arc::new(self.state_root.finish()),
251                Arc::new(self.receipts_root.finish()),
252                Arc::new(self.miner.finish()),
253                Arc::new(
254                    self.difficulty
255                        .with_precision_and_scale(76, 0)
256                        .unwrap()
257                        .finish(),
258                ),
259                Arc::new(
260                    self.total_difficulty
261                        .with_precision_and_scale(76, 0)
262                        .unwrap()
263                        .finish(),
264                ),
265                Arc::new(self.extra_data.finish()),
266                Arc::new(self.size.with_precision_and_scale(76, 0).unwrap().finish()),
267                Arc::new(
268                    self.gas_limit
269                        .with_precision_and_scale(76, 0)
270                        .unwrap()
271                        .finish(),
272                ),
273                Arc::new(
274                    self.gas_used
275                        .with_precision_and_scale(76, 0)
276                        .unwrap()
277                        .finish(),
278                ),
279                Arc::new(
280                    self.timestamp
281                        .with_precision_and_scale(76, 0)
282                        .unwrap()
283                        .finish(),
284                ),
285                Arc::new(self.uncles.finish()),
286                Arc::new(
287                    self.base_fee_per_gas
288                        .with_precision_and_scale(76, 0)
289                        .unwrap()
290                        .finish(),
291                ),
292                Arc::new(
293                    self.blob_gas_used
294                        .with_precision_and_scale(76, 0)
295                        .unwrap()
296                        .finish(),
297                ),
298                Arc::new(
299                    self.excess_blob_gas
300                        .with_precision_and_scale(76, 0)
301                        .unwrap()
302                        .finish(),
303                ),
304                Arc::new(self.parent_beacon_block_root.finish()),
305                Arc::new(self.withdrawals_root.finish()),
306                Arc::new(self.withdrawals.0.finish()),
307                Arc::new(self.l1_block_number.finish()),
308                Arc::new(
309                    self.send_count
310                        .with_precision_and_scale(76, 0)
311                        .unwrap()
312                        .finish(),
313                ),
314                Arc::new(self.send_root.finish()),
315                Arc::new(self.mix_hash.finish()),
316            ],
317        )
318        .unwrap()
319    }
320}
321
322#[derive(Default)]
323pub struct TransactionsBuilder {
324    pub block_hash: builder::BinaryBuilder,
325    pub block_number: builder::UInt64Builder,
326    pub from: builder::BinaryBuilder,
327    pub gas: builder::Decimal256Builder,
328    pub gas_price: builder::Decimal256Builder,
329    pub hash: builder::BinaryBuilder,
330    pub input: builder::BinaryBuilder,
331    pub nonce: builder::Decimal256Builder,
332    pub to: builder::BinaryBuilder,
333    pub transaction_index: builder::UInt64Builder,
334    pub value: builder::Decimal256Builder,
335    pub v: builder::UInt8Builder,
336    pub r: builder::BinaryBuilder,
337    pub s: builder::BinaryBuilder,
338    pub max_priority_fee_per_gas: builder::Decimal256Builder,
339    pub max_fee_per_gas: builder::Decimal256Builder,
340    pub chain_id: builder::Decimal256Builder,
341    pub cumulative_gas_used: builder::Decimal256Builder,
342    pub effective_gas_price: builder::Decimal256Builder,
343    pub gas_used: builder::Decimal256Builder,
344    pub contract_address: builder::BinaryBuilder,
345    pub logs_bloom: builder::BinaryBuilder,
346    pub type_: builder::UInt8Builder,
347    pub root: builder::BinaryBuilder,
348    pub status: builder::UInt8Builder,
349    pub sighash: builder::BinaryBuilder,
350    pub y_parity: builder::BooleanBuilder,
351    pub access_list: AccessListBuilder,
352    pub l1_fee: builder::Decimal256Builder,
353    pub l1_gas_price: builder::Decimal256Builder,
354    pub l1_gas_used: builder::Decimal256Builder,
355    pub l1_fee_scalar: builder::Decimal256Builder,
356    pub gas_used_for_l1: builder::Decimal256Builder,
357    pub max_fee_per_blob_gas: builder::Decimal256Builder,
358    pub blob_versioned_hashes: builder::ListBuilder<builder::BinaryBuilder>,
359    pub deposit_nonce: builder::Decimal256Builder,
360    pub blob_gas_price: builder::Decimal256Builder,
361    pub deposit_receipt_version: builder::Decimal256Builder,
362    pub blob_gas_used: builder::Decimal256Builder,
363    pub l1_base_fee_scalar: builder::Decimal256Builder,
364    pub l1_blob_base_fee: builder::Decimal256Builder,
365    pub l1_blob_base_fee_scalar: builder::Decimal256Builder,
366    pub l1_block_number: builder::UInt64Builder,
367    pub mint: builder::Decimal256Builder,
368    pub source_hash: builder::BinaryBuilder,
369}
370
371pub struct AccessListBuilder(pub builder::ListBuilder<builder::StructBuilder>);
372
373impl Default for AccessListBuilder {
374    fn default() -> Self {
375        Self(builder::ListBuilder::new(builder::StructBuilder::new(
376            match access_list_elem_dt() {
377                DataType::Struct(fields) => fields,
378                _ => unreachable!(),
379            },
380            vec![
381                Box::new(builder::BinaryBuilder::default()),
382                Box::new(builder::ListBuilder::new(builder::BinaryBuilder::default())),
383            ],
384        )))
385    }
386}
387
388impl TransactionsBuilder {
389    pub fn finish(mut self) -> RecordBatch {
390        RecordBatch::try_new(
391            Arc::new(transactions_schema()),
392            vec![
393                Arc::new(self.block_hash.finish()),
394                Arc::new(self.block_number.finish()),
395                Arc::new(self.from.finish()),
396                Arc::new(self.gas.with_precision_and_scale(76, 0).unwrap().finish()),
397                Arc::new(
398                    self.gas_price
399                        .with_precision_and_scale(76, 0)
400                        .unwrap()
401                        .finish(),
402                ),
403                Arc::new(self.hash.finish()),
404                Arc::new(self.input.finish()),
405                Arc::new(self.nonce.with_precision_and_scale(76, 0).unwrap().finish()),
406                Arc::new(self.to.finish()),
407                Arc::new(self.transaction_index.finish()),
408                Arc::new(self.value.with_precision_and_scale(76, 0).unwrap().finish()),
409                Arc::new(self.v.finish()),
410                Arc::new(self.r.finish()),
411                Arc::new(self.s.finish()),
412                Arc::new(
413                    self.max_priority_fee_per_gas
414                        .with_precision_and_scale(76, 0)
415                        .unwrap()
416                        .finish(),
417                ),
418                Arc::new(
419                    self.max_fee_per_gas
420                        .with_precision_and_scale(76, 0)
421                        .unwrap()
422                        .finish(),
423                ),
424                Arc::new(
425                    self.chain_id
426                        .with_precision_and_scale(76, 0)
427                        .unwrap()
428                        .finish(),
429                ),
430                Arc::new(
431                    self.cumulative_gas_used
432                        .with_precision_and_scale(76, 0)
433                        .unwrap()
434                        .finish(),
435                ),
436                Arc::new(
437                    self.effective_gas_price
438                        .with_precision_and_scale(76, 0)
439                        .unwrap()
440                        .finish(),
441                ),
442                Arc::new(
443                    self.gas_used
444                        .with_precision_and_scale(76, 0)
445                        .unwrap()
446                        .finish(),
447                ),
448                Arc::new(self.contract_address.finish()),
449                Arc::new(self.logs_bloom.finish()),
450                Arc::new(self.type_.finish()),
451                Arc::new(self.root.finish()),
452                Arc::new(self.status.finish()),
453                Arc::new(self.sighash.finish()),
454                Arc::new(self.y_parity.finish()),
455                Arc::new(self.access_list.0.finish()),
456                Arc::new(
457                    self.l1_fee
458                        .with_precision_and_scale(76, 0)
459                        .unwrap()
460                        .finish(),
461                ),
462                Arc::new(
463                    self.l1_gas_price
464                        .with_precision_and_scale(76, 0)
465                        .unwrap()
466                        .finish(),
467                ),
468                Arc::new(
469                    self.l1_gas_used
470                        .with_precision_and_scale(76, 0)
471                        .unwrap()
472                        .finish(),
473                ),
474                Arc::new(
475                    self.l1_fee_scalar
476                        .with_precision_and_scale(76, 0)
477                        .unwrap()
478                        .finish(),
479                ),
480                Arc::new(
481                    self.gas_used_for_l1
482                        .with_precision_and_scale(76, 0)
483                        .unwrap()
484                        .finish(),
485                ),
486                Arc::new(
487                    self.max_fee_per_blob_gas
488                        .with_precision_and_scale(76, 0)
489                        .unwrap()
490                        .finish(),
491                ),
492                Arc::new(self.blob_versioned_hashes.finish()),
493                Arc::new(
494                    self.deposit_nonce
495                        .with_precision_and_scale(76, 0)
496                        .unwrap()
497                        .finish(),
498                ),
499                Arc::new(
500                    self.blob_gas_price
501                        .with_precision_and_scale(76, 0)
502                        .unwrap()
503                        .finish(),
504                ),
505                Arc::new(
506                    self.deposit_receipt_version
507                        .with_precision_and_scale(76, 0)
508                        .unwrap()
509                        .finish(),
510                ),
511                Arc::new(
512                    self.blob_gas_used
513                        .with_precision_and_scale(76, 0)
514                        .unwrap()
515                        .finish(),
516                ),
517                Arc::new(
518                    self.l1_base_fee_scalar
519                        .with_precision_and_scale(76, 0)
520                        .unwrap()
521                        .finish(),
522                ),
523                Arc::new(
524                    self.l1_blob_base_fee
525                        .with_precision_and_scale(76, 0)
526                        .unwrap()
527                        .finish(),
528                ),
529                Arc::new(
530                    self.l1_blob_base_fee_scalar
531                        .with_precision_and_scale(76, 0)
532                        .unwrap()
533                        .finish(),
534                ),
535                Arc::new(self.l1_block_number.finish()),
536                Arc::new(self.mint.with_precision_and_scale(76, 0).unwrap().finish()),
537                Arc::new(self.source_hash.finish()),
538            ],
539        )
540        .unwrap()
541    }
542}
543
544#[derive(Default)]
545pub struct LogsBuilder {
546    pub removed: builder::BooleanBuilder,
547    pub log_index: builder::UInt64Builder,
548    pub transaction_index: builder::UInt64Builder,
549    pub transaction_hash: builder::BinaryBuilder,
550    pub block_hash: builder::BinaryBuilder,
551    pub block_number: builder::UInt64Builder,
552    pub address: builder::BinaryBuilder,
553    pub data: builder::BinaryBuilder,
554    pub topic0: builder::BinaryBuilder,
555    pub topic1: builder::BinaryBuilder,
556    pub topic2: builder::BinaryBuilder,
557    pub topic3: builder::BinaryBuilder,
558}
559
560impl LogsBuilder {
561    pub fn finish(mut self) -> RecordBatch {
562        RecordBatch::try_new(
563            Arc::new(logs_schema()),
564            vec![
565                Arc::new(self.removed.finish()),
566                Arc::new(self.log_index.finish()),
567                Arc::new(self.transaction_index.finish()),
568                Arc::new(self.transaction_hash.finish()),
569                Arc::new(self.block_hash.finish()),
570                Arc::new(self.block_number.finish()),
571                Arc::new(self.address.finish()),
572                Arc::new(self.data.finish()),
573                Arc::new(self.topic0.finish()),
574                Arc::new(self.topic1.finish()),
575                Arc::new(self.topic2.finish()),
576                Arc::new(self.topic3.finish()),
577            ],
578        )
579        .unwrap()
580    }
581}
582
583#[derive(Default)]
584pub struct TracesBuilder {
585    pub from: builder::BinaryBuilder,
586    pub to: builder::BinaryBuilder,
587    pub call_type: builder::StringBuilder,
588    pub gas: builder::Decimal256Builder,
589    pub input: builder::BinaryBuilder,
590    pub init: builder::BinaryBuilder,
591    pub value: builder::Decimal256Builder,
592    pub author: builder::BinaryBuilder,
593    pub reward_type: builder::StringBuilder,
594    pub block_hash: builder::BinaryBuilder,
595    pub block_number: builder::UInt64Builder,
596    pub address: builder::BinaryBuilder,
597    pub code: builder::BinaryBuilder,
598    pub gas_used: builder::Decimal256Builder,
599    pub output: builder::BinaryBuilder,
600    pub subtraces: builder::UInt64Builder,
601    pub trace_address: builder::ListBuilder<builder::UInt64Builder>,
602    pub transaction_hash: builder::BinaryBuilder,
603    pub transaction_position: builder::UInt64Builder,
604    pub type_: builder::StringBuilder,
605    pub error: builder::StringBuilder,
606    pub sighash: builder::BinaryBuilder,
607    pub action_address: builder::BinaryBuilder,
608    pub balance: builder::Decimal256Builder,
609    pub refund_address: builder::BinaryBuilder,
610}
611
612impl TracesBuilder {
613    pub fn finish(mut self) -> RecordBatch {
614        RecordBatch::try_new(
615            Arc::new(traces_schema()),
616            vec![
617                Arc::new(self.from.finish()),
618                Arc::new(self.to.finish()),
619                Arc::new(self.call_type.finish()),
620                Arc::new(self.gas.with_precision_and_scale(76, 0).unwrap().finish()),
621                Arc::new(self.input.finish()),
622                Arc::new(self.init.finish()),
623                Arc::new(self.value.with_precision_and_scale(76, 0).unwrap().finish()),
624                Arc::new(self.author.finish()),
625                Arc::new(self.reward_type.finish()),
626                Arc::new(self.block_hash.finish()),
627                Arc::new(self.block_number.finish()),
628                Arc::new(self.address.finish()),
629                Arc::new(self.code.finish()),
630                Arc::new(
631                    self.gas_used
632                        .with_precision_and_scale(76, 0)
633                        .unwrap()
634                        .finish(),
635                ),
636                Arc::new(self.output.finish()),
637                Arc::new(self.subtraces.finish()),
638                Arc::new(self.trace_address.finish()),
639                Arc::new(self.transaction_hash.finish()),
640                Arc::new(self.transaction_position.finish()),
641                Arc::new(self.type_.finish()),
642                Arc::new(self.error.finish()),
643                Arc::new(self.sighash.finish()),
644                Arc::new(self.action_address.finish()),
645                Arc::new(
646                    self.balance
647                        .with_precision_and_scale(76, 0)
648                        .unwrap()
649                        .finish(),
650                ),
651                Arc::new(self.refund_address.finish()),
652            ],
653        )
654        .unwrap()
655    }
656}
657
658#[cfg(test)]
659mod tests {
660    use super::*;
661
662    #[test]
663    fn smoke() {
664        BlocksBuilder::default().finish();
665        TransactionsBuilder::default().finish();
666        LogsBuilder::default().finish();
667        TracesBuilder::default().finish();
668    }
669}