@@ -5,6 +5,7 @@ use ethrex_common::types::requests::{compute_requests_hash, EncodedRequests};
5
5
use ethrex_common:: types:: { Block , BlockBody , BlockHash , BlockNumber , Fork } ;
6
6
use ethrex_common:: { H256 , U256 } ;
7
7
use ethrex_p2p:: sync:: SyncMode ;
8
+ use ethrex_rlp:: error:: RLPDecodeError ;
8
9
use serde_json:: Value ;
9
10
use tracing:: { error, info, warn} ;
10
11
@@ -34,7 +35,14 @@ impl RpcHandler for NewPayloadV1Request {
34
35
35
36
async fn handle ( & self , context : RpcApiContext ) -> Result < Value , RpcErr > {
36
37
validate_execution_payload_v1 ( & self . payload ) ?;
37
- let block = get_block_from_payload ( & self . payload , None , None ) ?;
38
+ let block = match get_block_from_payload ( & self . payload , None , None ) {
39
+ Ok ( block) => block,
40
+ Err ( err) => {
41
+ return Ok ( serde_json:: to_value ( PayloadStatus :: invalid_with_err (
42
+ & err. to_string ( ) ,
43
+ ) ) ?)
44
+ }
45
+ } ;
38
46
let payload_status = handle_new_payload_v1_v2 ( & self . payload , block, context) . await ?;
39
47
serde_json:: to_value ( payload_status) . map_err ( |error| RpcErr :: Internal ( error. to_string ( ) ) )
40
48
}
@@ -59,8 +67,14 @@ impl RpcHandler for NewPayloadV2Request {
59
67
// Behave as a v1
60
68
validate_execution_payload_v1 ( & self . payload ) ?;
61
69
}
62
-
63
- let block = get_block_from_payload ( & self . payload , None , None ) ?;
70
+ let block = match get_block_from_payload ( & self . payload , None , None ) {
71
+ Ok ( block) => block,
72
+ Err ( err) => {
73
+ return Ok ( serde_json:: to_value ( PayloadStatus :: invalid_with_err (
74
+ & err. to_string ( ) ,
75
+ ) ) ?)
76
+ }
77
+ } ;
64
78
let payload_status = handle_new_payload_v1_v2 ( & self . payload , block, context) . await ?;
65
79
serde_json:: to_value ( payload_status) . map_err ( |error| RpcErr :: Internal ( error. to_string ( ) ) )
66
80
}
@@ -105,8 +119,18 @@ impl RpcHandler for NewPayloadV3Request {
105
119
}
106
120
107
121
async fn handle ( & self , context : RpcApiContext ) -> Result < Value , RpcErr > {
108
- let block =
109
- get_block_from_payload ( & self . payload , Some ( self . parent_beacon_block_root ) , None ) ?;
122
+ let block = match get_block_from_payload (
123
+ & self . payload ,
124
+ Some ( self . parent_beacon_block_root ) ,
125
+ None ,
126
+ ) {
127
+ Ok ( block) => block,
128
+ Err ( err) => {
129
+ return Ok ( serde_json:: to_value ( PayloadStatus :: invalid_with_err (
130
+ & err. to_string ( ) ,
131
+ ) ) ?)
132
+ }
133
+ } ;
110
134
validate_fork ( & block, Fork :: Cancun , & context) ?;
111
135
validate_execution_payload_v3 ( & self . payload ) ?;
112
136
let payload_status = handle_new_payload_v3 (
@@ -205,11 +229,18 @@ impl RpcHandler for NewPayloadV4Request {
205
229
validate_execution_requests ( & self . execution_requests ) ?;
206
230
207
231
let requests_hash = compute_requests_hash ( & self . execution_requests ) ;
208
- let block = get_block_from_payload (
232
+ let block = match get_block_from_payload (
209
233
& self . payload ,
210
234
Some ( self . parent_beacon_block_root ) ,
211
235
Some ( requests_hash) ,
212
- ) ?;
236
+ ) {
237
+ Ok ( block) => block,
238
+ Err ( err) => {
239
+ return Ok ( serde_json:: to_value ( PayloadStatus :: invalid_with_err (
240
+ & err. to_string ( ) ,
241
+ ) ) ?)
242
+ }
243
+ } ;
213
244
214
245
let chain_config = context. storage . get_chain_config ( ) ?;
215
246
@@ -645,14 +676,13 @@ fn get_block_from_payload(
645
676
payload : & ExecutionPayload ,
646
677
parent_beacon_block_root : Option < H256 > ,
647
678
requests_hash : Option < H256 > ,
648
- ) -> Result < Block , RpcErr > {
679
+ ) -> Result < Block , RLPDecodeError > {
649
680
let block_hash = payload. block_hash ;
650
681
info ! ( "Received new payload with block hash: {block_hash:#x}" ) ;
651
682
652
683
payload
653
684
. clone ( )
654
685
. into_block ( parent_beacon_block_root, requests_hash)
655
- . map_err ( |error| RpcErr :: Internal ( error. to_string ( ) ) )
656
686
}
657
687
658
688
fn validate_block_hash ( payload : & ExecutionPayload , block : & Block ) -> Result < ( ) , RpcErr > {
0 commit comments