diff --git a/Cargo.lock b/Cargo.lock index 07277bf37..87a610fd4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1198,6 +1198,7 @@ dependencies = [ "op-alloy-rpc-types", "parking_lot", "rand 0.8.5", + "regex", "revm", "serde", "serde_json", diff --git a/crates/anvil/Cargo.toml b/crates/anvil/Cargo.toml index b3389d2ec..d2f7ec576 100644 --- a/crates/anvil/Cargo.toml +++ b/crates/anvil/Cargo.toml @@ -120,6 +120,7 @@ alloy-transport-ws.workspace = true alloy-json-rpc.workspace = true alloy-pubsub.workspace = true foundry-test-utils.workspace = true +regex = { workspace = true, default-features = false } similar-asserts.workspace = true tokio = { workspace = true, features = ["full"] } diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index 26787cca6..f73e59a23 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -544,6 +544,26 @@ impl Backend { *self.fork.write() = Some(fork); *self.env.write() = env; } else { + // Set cache path on correct block + { + let maybe_fork_url = { self.node_config.read().await.eth_rpc_url.clone() }; + if let Some(fork_url) = maybe_fork_url { + // Set the fork block number + let mut node_config = self.node_config.write().await; + node_config.fork_choice = Some(ForkChoice::Block(fork_block_number)); + + let mut env = self.env.read().clone(); + let (forked_db, client_fork_config) = node_config + .setup_fork_db_config(fork_url, &mut env, &self.fees) + .await?; + + *self.db.write().await = Box::new(forked_db); + let fork = ClientFork::new(client_fork_config, Arc::clone(&self.db)); + *self.fork.write() = Some(fork); + *self.env.write() = env; + } + } + let gas_limit = self.node_config.read().await.fork_gas_limit(&fork_block); let mut env = self.env.write(); diff --git a/crates/anvil/tests/it/fork.rs b/crates/anvil/tests/it/fork.rs index 8e7736b0d..5786d331b 100644 --- a/crates/anvil/tests/it/fork.rs +++ b/crates/anvil/tests/it/fork.rs @@ -1473,6 +1473,42 @@ async fn test_reset_dev_account_nonce() { assert!(receipt.status()); } +#[tokio::test(flavor = "multi_thread")] +async fn test_reset_updates_cache_path_when_rpc_url_not_provided() { + let config: NodeConfig = fork_config(); + + let (mut api, _handle) = spawn(config).await; + let info = api.anvil_node_info().await.unwrap(); + let number = info.fork_config.fork_block_number.unwrap(); + assert_eq!(number, BLOCK_NUMBER); + + async fn get_block_from_cache_path(api: &mut EthApi) -> u64 { + let db = api.backend.get_db().read().await; + let cache_debug = format!("{:?}", db.maybe_inner().unwrap().cache()); + let re = regex::Regex::new(r#"JsonBlockCacheDB \{ cache_path: Some\("([^"]+)"\)"#).unwrap(); + let m = re + .captures_iter(&cache_debug) + .next() + .expect("must have JsonBlockCacheDB match") + .get(1) + .expect("must have matching path") + .as_str(); + m.strip_suffix("/storage.json").unwrap().split("/").last().unwrap().parse::().unwrap() + } + + assert_eq!(BLOCK_NUMBER, get_block_from_cache_path(&mut api).await); + + // Reset to older block without specifying a new rpc url + api.anvil_reset(Some(Forking { + json_rpc_url: None, + block_number: Some(BLOCK_NUMBER - 1_000_000), + })) + .await + .unwrap(); + + assert_eq!(BLOCK_NUMBER - 1_000_000, get_block_from_cache_path(&mut api).await); +} + #[tokio::test(flavor = "multi_thread")] async fn test_fork_get_account() { let (_api, handle) = spawn(fork_config()).await; diff --git a/crates/zksync/core/src/vm/farcall.rs b/crates/zksync/core/src/vm/farcall.rs index d19c977fb..5cfd93139 100644 --- a/crates/zksync/core/src/vm/farcall.rs +++ b/crates/zksync/core/src/vm/farcall.rs @@ -173,7 +173,7 @@ impl FarCallHandler { PrimitiveValue { value: return_fat_ptr.to_u256(), is_pointer: false }; // Just rewriting `code_page` is very error-prone, since the same memory page would be - // re-used for decommitments. We'll use a different approach: + // reused for decommitments. We'll use a different approach: // - Set `previous_code_word` to the value that we want // - Set `previous_code_memory_page` to the current code page + `previous_super_pc` to 0 // (as it corresponds