11use alloy:: primitives:: { B256 , U256 } ;
2+ use lh_types:: ForkName ;
23use thiserror:: Error ;
34
4- use crate :: { types:: BlsPublicKeyBytes , utils :: ResponseReadError } ;
5+ use crate :: { types:: BlsPublicKeyBytes , wire :: ResponseReadError } ;
56
67#[ derive( Debug , Error ) ]
78pub enum PbsError {
@@ -28,31 +29,37 @@ pub enum PbsError {
2829
2930 #[ error( "tokio join error: {0}" ) ]
3031 TokioJoinError ( #[ from] tokio:: task:: JoinError ) ,
32+
33+ #[ error( "SSZ error: {0}" ) ]
34+ SszError ( #[ from] SszValueError ) ,
3135}
3236
3337impl PbsError {
3438 pub fn is_timeout ( & self ) -> bool {
3539 matches ! ( self , PbsError :: Reqwest ( err) if err. is_timeout( ) )
3640 }
3741
42+ /// Extract the HTTP status code from relay-originated errors.
43+ fn relay_status_code ( & self ) -> Option < u16 > {
44+ match self {
45+ PbsError :: RelayResponse { code, .. } => Some ( * code) ,
46+ PbsError :: ReadResponse ( ResponseReadError :: NonSuccess { status_code, .. } ) => {
47+ Some ( * status_code)
48+ }
49+ _ => None ,
50+ }
51+ }
52+
3853 /// Whether the error is retryable in requests to relays
3954 pub fn should_retry ( & self ) -> bool {
4055 match self {
41- PbsError :: Reqwest ( err) => {
42- // Retry on timeout or connection error
43- err. is_timeout ( ) || err. is_connect ( )
44- }
45- PbsError :: RelayResponse { code, .. } => match * code {
46- 500 ..509 => true , // Retry on server errors
47- 400 | 429 => false , // Do not retry if rate limited or bad request
48- _ => false ,
49- } ,
50- _ => false ,
56+ PbsError :: Reqwest ( err) => err. is_timeout ( ) || err. is_connect ( ) ,
57+ _ => matches ! ( self . relay_status_code( ) , Some ( 500 ..=508 ) ) ,
5158 }
5259 }
5360
5461 pub fn is_not_found ( & self ) -> bool {
55- matches ! ( & self , PbsError :: RelayResponse { code : 404 , .. } )
62+ self . relay_status_code ( ) == Some ( 404 )
5663 }
5764}
5865
@@ -107,3 +114,12 @@ pub enum ValidationError {
107114 #[ error( "unsupported fork" ) ]
108115 UnsupportedFork ,
109116}
117+
118+ #[ derive( Debug , Error , PartialEq , Eq ) ]
119+ pub enum SszValueError {
120+ #[ error( "invalid payload length: required {required} but payload was {actual}" ) ]
121+ InvalidPayloadLength { required : usize , actual : usize } ,
122+
123+ #[ error( "unsupported fork: {name}" ) ]
124+ UnsupportedFork { name : ForkName } ,
125+ }
0 commit comments