diff --git a/crates/anvil/core/src/types.rs b/crates/anvil/core/src/types.rs index e15c648b0532..34d6627498b8 100644 --- a/crates/anvil/core/src/types.rs +++ b/crates/anvil/core/src/types.rs @@ -1,3 +1,5 @@ +use std::collections::BTreeMap; + use ethers_core::types::{TxHash, H256, U256, U64}; use revm::primitives::SpecId; @@ -217,6 +219,7 @@ pub struct AnvilMetadata { pub latest_block_number: u64, pub latest_block_hash: H256, pub forked_network: Option, + pub snapshots: BTreeMap, } /// Information about the forked network. diff --git a/crates/anvil/src/eth/api.rs b/crates/anvil/src/eth/api.rs index 4480e2b6ee11..b4093937e86e 100644 --- a/crates/anvil/src/eth/api.rs +++ b/crates/anvil/src/eth/api.rs @@ -1708,18 +1708,20 @@ impl EthApi { pub async fn anvil_metadata(&self) -> Result { node_info!("anvil_metadata"); let fork_config = self.backend.get_fork(); + let snapshots = self.backend.list_snapshots(); Ok(AnvilMetadata { client_version: CLIENT_VERSION, - chain_id: self.backend.chain_id().try_into().unwrap_or(u64::MAX), + chain_id: self.backend.chain_id(), latest_block_hash: self.backend.best_hash(), latest_block_number: self.backend.best_number().as_u64(), instance_id: *self.instance_id.read(), forked_network: fork_config.map(|cfg| ForkedNetwork { - chain_id: cfg.chain_id().into(), - fork_block_number: cfg.block_number().into(), + chain_id: cfg.chain_id(), + fork_block_number: cfg.block_number(), fork_block_hash: cfg.block_hash(), }), + snapshots, }) } diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index 0907c0ffdfe9..edd35972f963 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -77,7 +77,7 @@ use futures::channel::mpsc::{unbounded, UnboundedSender}; use hash_db::HashDB; use parking_lot::{Mutex, RwLock}; use std::{ - collections::HashMap, + collections::{BTreeMap, HashMap}, io::{Read, Write}, ops::Deref, sync::Arc, @@ -676,6 +676,10 @@ impl Backend { Ok(self.db.write().await.revert(id)) } + pub fn list_snapshots(&self) -> BTreeMap { + self.active_snapshots.lock().clone().into_iter().collect() + } + /// Get the current state. pub async fn serialized_state(&self) -> Result { let state = self.db.read().await.dump_state()?; diff --git a/crates/anvil/tests/it/anvil_api.rs b/crates/anvil/tests/it/anvil_api.rs index 2f5466885789..6591dd25d3d2 100644 --- a/crates/anvil/tests/it/anvil_api.rs +++ b/crates/anvil/tests/it/anvil_api.rs @@ -473,6 +473,7 @@ async fn can_get_metadata() { client_version: CLIENT_VERSION, instance_id: api.instance_id(), forked_network: None, + snapshots: Default::default(), }; assert_eq!(metadata, expected_metadata); @@ -501,6 +502,7 @@ async fn can_get_metadata_on_fork() { fork_block_number: block_number, fork_block_hash: block.hash.unwrap(), }), + snapshots: Default::default(), }; assert_eq!(metadata, expected_metadata);