Skip to content

Commit e805bad

Browse files
authored
fix: replacement fee error parsing (#73)
1 parent 9c00913 commit e805bad

2 files changed

Lines changed: 45 additions & 20 deletions

File tree

‎crates/common/src/types.rs‎

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6364
impl 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)]
122125
mod 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";

‎crates/proposer/src/manager.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,10 @@ impl ProposerManager {
506506
gas_fee_cap = Some(2 * queued);
507507
continue;
508508
}
509+
FailReason::UnderpricedUnknown => {
510+
warn!(err_str, "Underpriced tx, without details");
511+
continue;
512+
}
509513
}
510514
} else {
511515
err_str

0 commit comments

Comments
 (0)