@@ -58,70 +58,81 @@ pub enum FailReason {
5858 UnderpricedTipCap { sent : u128 , queued : u128 } ,
5959 UnderpricedBlobFeeCap { sent : u128 , queued : u128 } ,
6060 UnderpricedGasFeeCap { sent : u128 , queued : u128 } ,
61+ UnderpricedUnknown ,
6162}
6263
6364impl FailReason {
6465 pub fn try_extract ( input : & str ) -> Option < Self > {
6566 let lower = input. to_lowercase ( ) ;
6667
67- if !lower. contains ( "replacement transaction underpriced" ) {
68+ let is_underpriced = lower. contains ( "replacement transaction underpriced" ) ;
69+ if !is_underpriced {
6870 return None ;
6971 }
7072
7173 if let Some ( after) = lower. split ( "new tx gas tip cap " ) . nth ( 1 ) {
72- let parts: Vec < & str > = after. split ( " <= " ) . collect ( ) ;
74+ let parts: Vec < & str > = after. split ( " <" ) . collect ( ) ;
7375 if parts. len ( ) != 2 {
7476 return None ;
7577 }
7678
77- let sent = parts[ 0 ] . trim ( ) . parse :: < u128 > ( ) . ok ( ) ?;
78-
79- let queued_str = parts[ 1 ] . split_whitespace ( ) . next ( ) ?;
80- let queued = queued_str. parse :: < u128 > ( ) . ok ( ) ?;
79+ let sent = extract_first_u128 ( parts[ 0 ] ) ?;
80+ let queued = extract_first_u128 ( parts[ 1 ] ) ?;
8181
8282 return Some ( FailReason :: UnderpricedTipCap { sent, queued } ) ;
8383 }
8484
8585 if let Some ( after) = lower. split ( "new tx blob gas fee cap " ) . nth ( 1 ) {
86- let parts: Vec < & str > = after. split ( " <= " ) . collect ( ) ;
86+ let parts: Vec < & str > = after. split ( " <" ) . collect ( ) ;
8787 if parts. len ( ) != 2 {
8888 return None ;
8989 }
9090
91- let sent = parts[ 0 ] . trim ( ) . parse :: < u128 > ( ) . ok ( ) ?;
92-
93- let queued_str = parts[ 1 ] . split_whitespace ( ) . next ( ) ?;
94- let queued = queued_str. parse :: < u128 > ( ) . ok ( ) ?;
91+ let sent = extract_first_u128 ( parts[ 0 ] ) ?;
92+ let queued = extract_first_u128 ( parts[ 1 ] ) ?;
9593
9694 return Some ( FailReason :: UnderpricedBlobFeeCap { sent, queued } ) ;
9795 }
9896
9997 if let Some ( after) = lower. split ( "new tx gas fee cap " ) . nth ( 1 ) {
100- let parts: Vec < & str > = if after. contains ( " <= " ) {
101- after. split ( " <= " ) . collect ( )
102- } else {
103- after. split ( " < " ) . collect ( )
104- } ;
98+ let parts: Vec < & str > = after. split ( " <" ) . collect ( ) ;
10599 if parts. len ( ) != 2 {
106100 return None ;
107101 }
108102
109- let sent = parts[ 0 ] . trim ( ) . parse :: < u128 > ( ) . ok ( ) ?;
110-
111- let queued_str = parts[ 1 ] . split_whitespace ( ) . next ( ) ?;
112- let queued = queued_str. parse :: < u128 > ( ) . ok ( ) ?;
103+ let sent = extract_first_u128 ( parts[ 0 ] ) ?;
104+ let queued = extract_first_u128 ( parts[ 1 ] ) ?;
113105
114106 return Some ( FailReason :: UnderpricedGasFeeCap { sent, queued } ) ;
115107 }
116108
109+ if is_underpriced {
110+ return Some ( FailReason :: UnderpricedUnknown ) ;
111+ }
112+
117113 None
118114 }
119115}
120116
117+ fn extract_first_u128 ( s : & str ) -> Option < u128 > {
118+ let start = s. find ( |c : char | c. is_ascii_digit ( ) ) ?;
119+ let remainder = & s[ start..] ;
120+ let end = remainder. find ( |c : char | !c. is_ascii_digit ( ) ) . unwrap_or ( remainder. len ( ) ) ;
121+ remainder[ ..end] . parse :: < u128 > ( ) . ok ( )
122+ }
123+
121124#[ cfg( test) ]
122125mod tests {
123126 use super :: * ;
124127
128+ #[ test]
129+ fn test_extract_first_u128 ( ) {
130+ assert_eq ! ( extract_first_u128( "abc 12/2" ) , Some ( 12 ) ) ;
131+ assert_eq ! ( extract_first_u128( "12" ) , Some ( 12 ) ) ;
132+ assert_eq ! ( extract_first_u128( "<= 12" ) , Some ( 12 ) ) ;
133+ assert_eq ! ( extract_first_u128( "12 3" ) , Some ( 12 ) ) ;
134+ }
135+
125136 #[ test]
126137 fn test_extract_fail_reason ( ) {
127138 let input = "server returned an error response: error code -32000: replacement transaction underpriced: new tx gas tip cap 120000000 <= 530716904 queued" ;
@@ -136,6 +147,16 @@ mod tests {
136147 assert_eq ! ( FailReason :: UnderpricedBlobFeeCap { sent: 1 , queued: 2 } , result) ;
137148 }
138149
150+ #[ test]
151+ fn test_extract_fail_reason_blob_fee_cap_new ( ) {
152+ let input = "server returned an error response: error code -32000: replacement transaction underpriced: new tx blob gas fee cap 1706792664 < 1321739451 queued + 100% replacement penalty" ;
153+ let result = FailReason :: try_extract ( input) . unwrap ( ) ;
154+ assert_eq ! (
155+ FailReason :: UnderpricedBlobFeeCap { sent: 1706792664 , queued: 1321739451 } ,
156+ result
157+ ) ;
158+ }
159+
139160 #[ test]
140161 fn test_extract_fail_reason_blob_fee_cap_2 ( ) {
141162 let input = "server returned an error response: error code -32000: replacement transaction underpriced: new tx gas fee cap 2101629 < 1400047 queued + 100% replacement penalty" ;
0 commit comments