@@ -1361,7 +1361,16 @@ async fn derive_block_and_transactions(
1361
1361
provider : & Arc < RetryProvider > ,
1362
1362
) -> eyre:: Result < ( BlockNumber , Option < Vec < PoolTransaction > > ) > {
1363
1363
match fork_choice {
1364
- ForkChoice :: Block ( block_number) => Ok ( ( block_number. to_owned ( ) , None ) ) ,
1364
+ ForkChoice :: Block ( block_number) => {
1365
+ let block_number = * block_number;
1366
+ if block_number >= 0 {
1367
+ return Ok ( ( block_number as u64 , None ) )
1368
+ }
1369
+ // subtract from latest block number
1370
+ let latest = provider. get_block_number ( ) . await ?;
1371
+
1372
+ Ok ( ( block_number. saturating_add ( latest as i128 ) as u64 , None ) )
1373
+ }
1365
1374
ForkChoice :: Transaction ( transaction_hash) => {
1366
1375
// Determine the block that this transaction was mined in
1367
1376
let transaction = provider
@@ -1400,15 +1409,17 @@ async fn derive_block_and_transactions(
1400
1409
/// Fork delimiter used to specify which block or transaction to fork from
1401
1410
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
1402
1411
pub enum ForkChoice {
1403
- /// Block number to fork from
1404
- Block ( BlockNumber ) ,
1412
+ /// Block number to fork from.
1413
+ ///
1414
+ /// f a negative the the given value is subtracted from the `latest` block number.
1415
+ Block ( i128 ) ,
1405
1416
/// Transaction hash to fork from
1406
1417
Transaction ( TxHash ) ,
1407
1418
}
1408
1419
1409
1420
impl ForkChoice {
1410
1421
/// Returns the block number to fork from
1411
- pub fn block_number ( & self ) -> Option < BlockNumber > {
1422
+ pub fn block_number ( & self ) -> Option < i128 > {
1412
1423
match self {
1413
1424
Self :: Block ( block_number) => Some ( * block_number) ,
1414
1425
Self :: Transaction ( _) => None ,
@@ -1434,7 +1445,7 @@ impl From<TxHash> for ForkChoice {
1434
1445
/// Convert a decimal block number into a ForkChoice
1435
1446
impl From < u64 > for ForkChoice {
1436
1447
fn from ( block : u64 ) -> Self {
1437
- Self :: Block ( block)
1448
+ Self :: Block ( block as i128 )
1438
1449
}
1439
1450
}
1440
1451
0 commit comments