diff --git a/crates/provider/src/ext/anvil.rs b/crates/provider/src/ext/anvil.rs index 8668c2cf0d7..ea293068e3d 100644 --- a/crates/provider/src/ext/anvil.rs +++ b/crates/provider/src/ext/anvil.rs @@ -141,6 +141,9 @@ pub trait AnvilApi<N: Network>: Send + Sync { /// Reorg the chain async fn anvil_reorg(&self, options: ReorgOptions) -> TransportResult<()>; + /// Rollback the chain + async fn anvil_rollback(&self, depth: Option<u64>) -> TransportResult<()>; + /// Execute a transaction regardless of signature status. async fn eth_send_unsigned_transaction( &self, @@ -310,6 +313,10 @@ where self.client().request("anvil_reorg", options).await } + async fn anvil_rollback(&self, depth: Option<u64>) -> TransportResult<()> { + self.client().request("anvil_rollback", (depth,)).await + } + async fn eth_send_unsigned_transaction( &self, request: N::TransactionRequest, @@ -972,6 +979,31 @@ mod tests { assert_ne!(reorged_block.header.hash, new_block.header.hash); } + #[tokio::test] + #[ignore] + async fn test_anvil_rollback() { + let provider = ProviderBuilder::new().on_anvil(); + + // Mine two blocks + provider.anvil_mine(Some(2), None).await.unwrap(); + + let target_height = provider + .get_block_by_number(1.into(), BlockTransactionsKind::Hashes) + .await + .unwrap() + .unwrap(); + + provider.anvil_rollback(Some(1)).await.unwrap(); + + let new_head = provider + .get_block_by_number(BlockNumberOrTag::Latest, BlockTransactionsKind::Hashes) + .await + .unwrap() + .unwrap(); + + assert_eq!(target_height, new_head); + } + #[tokio::test] async fn test_eth_send_unsigned_transaction() { let provider = ProviderBuilder::new().on_anvil();