|
1 | 1 | //! Loads and formats Scroll block RPC response.
|
2 | 2 |
|
3 |
| -use crate::{ScrollEthApi, ScrollEthApiError}; |
| 3 | +use crate::{RpcBlockHeaderMut, ScrollEthApi, ScrollEthApiError}; |
4 | 4 |
|
5 |
| -use reth_rpc_convert::RpcConvert; |
| 5 | +use alloy_consensus::BlockHeader; |
| 6 | +use alloy_eips::BlockId; |
| 7 | +use reth_provider::HeaderProvider; |
| 8 | +use reth_rpc_convert::{RpcConvert, RpcTypes}; |
6 | 9 | use reth_rpc_eth_api::{
|
7 | 10 | helpers::{EthBlocks, LoadBlock},
|
8 |
| - RpcNodeCore, |
| 11 | + EthApiTypes, FromEthApiError, FullEthApiTypes, RpcBlock, RpcNodeCore, |
9 | 12 | };
|
10 | 13 | use reth_rpc_eth_types::error::FromEvmError;
|
11 | 14 |
|
|
14 | 17 | N: RpcNodeCore,
|
15 | 18 | ScrollEthApiError: FromEvmError<N::Evm>,
|
16 | 19 | Rpc: RpcConvert<Primitives = N::Primitives, Error = ScrollEthApiError>,
|
| 20 | + <<Self as EthApiTypes>::NetworkTypes as RpcTypes>::Header: RpcBlockHeaderMut, |
17 | 21 | {
|
| 22 | + async fn rpc_block( |
| 23 | + &self, |
| 24 | + block_id: BlockId, |
| 25 | + full: bool, |
| 26 | + ) -> Result<Option<RpcBlock<Self::NetworkTypes>>, Self::Error> |
| 27 | + where |
| 28 | + Self: FullEthApiTypes, |
| 29 | + { |
| 30 | + let Some(block) = self.recovered_block(block_id).await? else { return Ok(None) }; |
| 31 | + |
| 32 | + let td = self |
| 33 | + .provider() |
| 34 | + .header_td_by_number(block.number()) |
| 35 | + .map_err(Self::Error::from_eth_err)?; |
| 36 | + |
| 37 | + let mut block = block.clone_into_rpc_block( |
| 38 | + full.into(), |
| 39 | + |tx, tx_info| self.tx_resp_builder().fill(tx, tx_info), |
| 40 | + |header, size| self.tx_resp_builder().convert_header(header, size), |
| 41 | + )?; |
| 42 | + |
| 43 | + *block.header.total_difficulty_mut() = td; |
| 44 | + |
| 45 | + Ok(Some(block)) |
| 46 | + } |
18 | 47 | }
|
19 | 48 |
|
20 | 49 | impl<N, Rpc> LoadBlock for ScrollEthApi<N, Rpc>
|
|
0 commit comments