From 7918094d8a232770ebf660d6ebafb55c039ee3dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Wed, 26 Feb 2025 16:18:05 -0300 Subject: [PATCH 1/5] first approach * Now fetching from block 0 * deposits are working --- crates/l2/contracts/deployer.rs | 64 ++++++++++++++++++++++++++++++++ crates/l2/proposer/l1_watcher.rs | 8 +++- test_data/private_keys_l1.txt | 21 +++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 test_data/private_keys_l1.txt diff --git a/crates/l2/contracts/deployer.rs b/crates/l2/contracts/deployer.rs index a4be03df2..5e3e36c47 100644 --- a/crates/l2/contracts/deployer.rs +++ b/crates/l2/contracts/deployer.rs @@ -1,9 +1,12 @@ use bytes::Bytes; use colored::Colorize; use ethereum_types::{Address, H160, H256}; +use ethrex_common::U256; use ethrex_l2::utils::config::errors; use ethrex_l2::utils::config::{read_env_as_lines, read_env_file, write_env}; +use ethrex_l2::utils::test_data_io::read_genesis_file; use ethrex_l2_sdk::calldata::{encode_calldata, Value}; +use ethrex_l2_sdk::get_address_from_secret_key; use ethrex_rpc::clients::eth::{ errors::{CalldataEncodeError, EthClientError}, eth_sender::Overrides, @@ -12,6 +15,7 @@ use ethrex_rpc::clients::eth::{ use keccak_hash::keccak; use secp256k1::SecretKey; use spinoff::{spinner, spinners, Color, Spinner}; +use std::fs; use std::{ path::{Path, PathBuf}, process::Command, @@ -86,6 +90,8 @@ async fn main() -> Result<(), DeployError> { setup_result.sp1_deploy_verifier_on_l1, ) .await?; + dbg!("============================"); + make_deposits(bridge_address, &setup_result.eth_client).await; let sp1_contract_verifier_address = sp1_verifier_address.unwrap_or(setup_result.sp1_contract_verifier_address); @@ -598,6 +604,64 @@ async fn wait_for_transaction_receipt( Ok(()) } +async fn make_deposits(bridge: Address, eth_client: &EthClient) { + let genesis = read_genesis_file("../../test_data/genesis-l1.json"); + // dbg!(&genesis.alloc); + let Ok(pks) = fs::read_to_string("../../test_data/private_keys_l1.txt") else { + return; + }; + let private_keys: Vec = pks + .lines() + .filter(|line| !line.trim().is_empty()) + .map(|line| line.trim().to_string()) + .collect(); + + for pk in private_keys.iter() { + let pk_str = pk.strip_prefix("0x").unwrap_or(pk); + let Ok(pk_h256) = pk_str.parse::() else { + return; + }; + let pk_bytes = pk_h256.as_bytes(); + let Ok(secret_key) = SecretKey::from_slice(pk_bytes) else { + return; + }; + let Ok(address) = get_address_from_secret_key(&secret_key) else { + return; + }; + let values = vec![Value::Address(address)]; + let Ok(calldata) = encode_calldata("deposit(address)", &values) else { + return; + }; + let Some(acc) = genesis.alloc.get(&address) else { + continue; + }; + let a = acc + .balance + .saturating_sub(U256::from_str("100000000000000000").unwrap_or(U256::zero())); + let overrides = Overrides { + value: Some(a), + from: Some(address), + ..Overrides::default() + }; + + let Ok(build) = dbg!( + eth_client + // .call(bridge, Bytes::from(calldata), overrides) + .build_eip1559_transaction(bridge, address, Bytes::from(calldata), overrides, 1) + .await + ) else { + continue; + }; + let Ok(_) = dbg!( + eth_client + .send_eip1559_transaction(&build, &secret_key) + .await + ) else { + continue; + }; + } +} + #[allow(clippy::unwrap_used)] #[allow(clippy::expect_used)] #[allow(clippy::panic)] diff --git a/crates/l2/proposer/l1_watcher.rs b/crates/l2/proposer/l1_watcher.rs index b2c1cdfe1..7637a429f 100644 --- a/crates/l2/proposer/l1_watcher.rs +++ b/crates/l2/proposer/l1_watcher.rs @@ -16,8 +16,10 @@ use tokio::time::sleep; use tracing::{debug, error, info, warn}; pub async fn start_l1_watcher(store: Store) -> Result<(), ConfigError> { + dbg!("Starting L1 Watcher"); let eth_config = EthConfig::from_env()?; let watcher_config = L1WatcherConfig::from_env()?; + dbg!(watcher_config.bridge_address); let mut l1_watcher = L1Watcher::new_from_config(watcher_config, eth_config).await?; l1_watcher.run(&store).await; Ok(()) @@ -40,7 +42,7 @@ impl L1Watcher { ) -> Result { let eth_client = EthClient::new(ð_config.rpc_url); let l2_client = EthClient::new("http://localhost:1729"); - let last_block_fetched = + let last_block_fetched: U256 = EthClient::get_last_fetched_l1_block(ð_client, watcher_config.bridge_address) .await? .into(); @@ -49,7 +51,7 @@ impl L1Watcher { l2_client, address: watcher_config.bridge_address, max_block_step: watcher_config.max_block_step, - last_block_fetched, + last_block_fetched: U256::zero(), // last_block_fetched, l2_proposer_pk: watcher_config.l2_proposer_private_key, check_interval: Duration::from_millis(watcher_config.check_interval_ms), }) @@ -69,6 +71,7 @@ impl L1Watcher { loop { sleep(self.check_interval).await; + dbg!("Loop L1 Watcher", &self.address); let logs = self.get_logs().await?; // We may not have a deposit nor a withdrawal, that means no events -> no logs. @@ -76,6 +79,7 @@ impl L1Watcher { continue; } + dbg!("HAY LOGS", &logs); let pending_deposit_logs = self.get_pending_deposit_logs().await?; let _deposit_txs = self .process_logs(logs, &pending_deposit_logs, store) diff --git a/test_data/private_keys_l1.txt b/test_data/private_keys_l1.txt new file mode 100644 index 000000000..9a1763ac8 --- /dev/null +++ b/test_data/private_keys_l1.txt @@ -0,0 +1,21 @@ +0xbcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 +0x39725efee3fb28614de3bacaffe4cc4bd8c436257e2c8bb887c4b5c4be45e76d +0x53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 +0xab63b23eb7941c1251757e24b3d2350d2bc05c3c388d06f8fe6feafefb1e8c70 +0x5d2344259f42259f82d2c140aa66102ba89b57b4883ee441a8b312622bd42491 +0x27515f805127bebad2fb9b183508bdacb8c763da16f54e0678b16e8f28ef3fff +0x7ff1a4c1d57e5e784d327c4c7651e952350bc271f156afb3d00d20f5ef924856 +0x3a91003acaf4c21b3953d94fa4a6db694fa69e5242b2e37be05dd82761058899 +0xbb1d0f125b4fb2bb173c318cdead45468474ca71474e2247776b2b4c0fa2d3f5 +0x850643a0224065ecce3882673c21f56bcf6eef86274cc21cadff15930b59fc8c +0x94eb3102993b41ec55c241060f47daa0f6372e2e3ad7e91612ae36c364042e44 +0xdaf15504c22a352648a71ef2926334fe040ac1d5005019e09f6c979808024dc7 +0xeaba42282ad33c8ef2524f07277c03a776d98ae19f581990ce75becb7cfa1c23 +0x3fd98b5187bf6526734efaa644ffbb4e3670d66f5d0268ce0323ec09124bff61 +0x5288e2f440c7f0cb61a9be8afdeb4295f786383f96f5e35eb0c94ef103996b64 +0xf296c7802555da2a5a662be70e078cbd38b44f96f8615ae529da41122ce8db05 +0xbf3beef3bd999ba9f2451e06936f0423cd62b815c9233dd3bc90f7e02a1e8673 +0x6ecadc396415970e91293726c3f5775225440ea0844ae5616135fd10d66b5954 +0xa492823c3e193d6c595f37a18e3c06650cf4c74558cc818b16130b293716106f +0xc5114526e042343c6d1899cad05e1c00ba588314de9b96929914ee0df18d46b2 +0x04b9f63ecf84210c5366c66d68fa1f5da1fa4f634fad6dfc86178e4d79ff9e59 From 4e9a2796ad558589c6f954f906e456930d631054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Wed, 26 Feb 2025 17:56:31 -0300 Subject: [PATCH 2/5] make deposit after initialize * it implies that no hardcoding of the starting block of the watcher * use last block observed from the contract --- crates/l2/contracts/deployer.rs | 23 +++++++++-------------- crates/l2/proposer/l1_watcher.rs | 5 +---- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/crates/l2/contracts/deployer.rs b/crates/l2/contracts/deployer.rs index 5e3e36c47..cf7f54a11 100644 --- a/crates/l2/contracts/deployer.rs +++ b/crates/l2/contracts/deployer.rs @@ -90,8 +90,6 @@ async fn main() -> Result<(), DeployError> { setup_result.sp1_deploy_verifier_on_l1, ) .await?; - dbg!("============================"); - make_deposits(bridge_address, &setup_result.eth_client).await; let sp1_contract_verifier_address = sp1_verifier_address.unwrap_or(setup_result.sp1_contract_verifier_address); @@ -108,6 +106,7 @@ async fn main() -> Result<(), DeployError> { &setup_result.eth_client, ) .await?; + make_deposits(bridge_address, &setup_result.eth_client).await; let env_lines = read_env_as_lines().map_err(DeployError::EnvFileError)?; @@ -606,7 +605,6 @@ async fn wait_for_transaction_receipt( async fn make_deposits(bridge: Address, eth_client: &EthClient) { let genesis = read_genesis_file("../../test_data/genesis-l1.json"); - // dbg!(&genesis.alloc); let Ok(pks) = fs::read_to_string("../../test_data/private_keys_l1.txt") else { return; }; @@ -644,19 +642,16 @@ async fn make_deposits(bridge: Address, eth_client: &EthClient) { ..Overrides::default() }; - let Ok(build) = dbg!( - eth_client - // .call(bridge, Bytes::from(calldata), overrides) - .build_eip1559_transaction(bridge, address, Bytes::from(calldata), overrides, 1) - .await - ) else { + let Ok(build) = eth_client + .build_eip1559_transaction(bridge, address, Bytes::from(calldata), overrides, 1) + .await + else { continue; }; - let Ok(_) = dbg!( - eth_client - .send_eip1559_transaction(&build, &secret_key) - .await - ) else { + let Ok(_) = eth_client + .send_eip1559_transaction(&build, &secret_key) + .await + else { continue; }; } diff --git a/crates/l2/proposer/l1_watcher.rs b/crates/l2/proposer/l1_watcher.rs index 7637a429f..3160c7435 100644 --- a/crates/l2/proposer/l1_watcher.rs +++ b/crates/l2/proposer/l1_watcher.rs @@ -16,10 +16,8 @@ use tokio::time::sleep; use tracing::{debug, error, info, warn}; pub async fn start_l1_watcher(store: Store) -> Result<(), ConfigError> { - dbg!("Starting L1 Watcher"); let eth_config = EthConfig::from_env()?; let watcher_config = L1WatcherConfig::from_env()?; - dbg!(watcher_config.bridge_address); let mut l1_watcher = L1Watcher::new_from_config(watcher_config, eth_config).await?; l1_watcher.run(&store).await; Ok(()) @@ -51,7 +49,7 @@ impl L1Watcher { l2_client, address: watcher_config.bridge_address, max_block_step: watcher_config.max_block_step, - last_block_fetched: U256::zero(), // last_block_fetched, + last_block_fetched, l2_proposer_pk: watcher_config.l2_proposer_private_key, check_interval: Duration::from_millis(watcher_config.check_interval_ms), }) @@ -71,7 +69,6 @@ impl L1Watcher { loop { sleep(self.check_interval).await; - dbg!("Loop L1 Watcher", &self.address); let logs = self.get_logs().await?; // We may not have a deposit nor a withdrawal, that means no events -> no logs. From 5c2f4b2ac5b4dc58249b46482db380a145545a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Wed, 26 Feb 2025 18:40:10 -0300 Subject: [PATCH 3/5] advances * divide by 2 the current deposit * missing the L2 and L1 same addresses and keys --- crates/l2/contracts/deployer.rs | 39 ++++++++++++++++++++++++++------ crates/l2/proposer/l1_watcher.rs | 2 +- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/crates/l2/contracts/deployer.rs b/crates/l2/contracts/deployer.rs index cf7f54a11..d3b540b78 100644 --- a/crates/l2/contracts/deployer.rs +++ b/crates/l2/contracts/deployer.rs @@ -631,13 +631,15 @@ async fn make_deposits(bridge: Address, eth_client: &EthClient) { return; }; let Some(acc) = genesis.alloc.get(&address) else { + dbg!("No hay address en genesis ⏭️", address); continue; }; - let a = acc + let value_to_deposit = acc .balance - .saturating_sub(U256::from_str("100000000000000000").unwrap_or(U256::zero())); + .checked_div(U256::from_str("2").unwrap_or(U256::zero())) + .unwrap_or(U256::zero()); let overrides = Overrides { - value: Some(a), + value: Some(value_to_deposit), from: Some(address), ..Overrides::default() }; @@ -648,12 +650,35 @@ async fn make_deposits(bridge: Address, eth_client: &EthClient) { else { continue; }; - let Ok(_) = eth_client + + // let gas_estimate = eth_client.estimate_gas(build.clone().into()).await; + // dbg!("==========================="); + // dbg!(gas_estimate); + // dbg!("==========================="); + + match eth_client .send_eip1559_transaction(&build, &secret_key) .await - else { - continue; - }; + { + Ok(_) => { + dbg!("Se completó deposit", address, value_to_deposit); + } + Err(e) => { + dbg!("Falló el deposit 🚩", address, value_to_deposit); + dbg!(e); + continue; + } + } + // let Ok(_) = dbg!( + // eth_client + // .send_eip1559_transaction(&build, &secret_key) + // .await + // ) else { + // dbg!("==========================="); + // dbg!("Failed to send transaction"); + // dbg!("==========================="); + // continue; + // }; } } diff --git a/crates/l2/proposer/l1_watcher.rs b/crates/l2/proposer/l1_watcher.rs index 3160c7435..9a00a9718 100644 --- a/crates/l2/proposer/l1_watcher.rs +++ b/crates/l2/proposer/l1_watcher.rs @@ -76,7 +76,7 @@ impl L1Watcher { continue; } - dbg!("HAY LOGS", &logs); + // dbg!("HAY LOGS", &logs); let pending_deposit_logs = self.get_pending_deposit_logs().await?; let _deposit_txs = self .process_logs(logs, &pending_deposit_logs, store) From 29f9a0447bf7c8fed97391472a47e0e6ef8e1bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 27 Feb 2025 18:56:51 -0300 Subject: [PATCH 4/5] fix --- Cargo.lock | 1 - crates/common/trie/verify_range.rs | 2 +- crates/l2/contracts/deployer.rs | 24 +++++------------------- crates/l2/proposer/l1_watcher.rs | 2 -- 4 files changed, 6 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3137822e..2196adf7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2919,7 +2919,6 @@ dependencies = [ name = "ethrex-vm" version = "0.1.0" dependencies = [ - "alloy-rpc-types-eth", "bincode", "bytes", "cfg-if", diff --git a/crates/common/trie/verify_range.rs b/crates/common/trie/verify_range.rs index 836535433..6cf72126b 100644 --- a/crates/common/trie/verify_range.rs +++ b/crates/common/trie/verify_range.rs @@ -331,7 +331,7 @@ fn remove_internal_references_inner( } // If both paths are greater or lesser than the node's prefix then the range is empty (Ordering::Greater, Ordering::Greater) | (Ordering::Less, Ordering::Less) => { - return Err(TrieError::Verify("empty range".to_string())) + return Err(TrieError::Verify("empty range".to_string())); } // None of the paths fit the prefix, remove the entire subtrie (left, right) if left.is_ne() && right.is_ne() => { diff --git a/crates/l2/contracts/deployer.rs b/crates/l2/contracts/deployer.rs index d3b540b78..733ab3764 100644 --- a/crates/l2/contracts/deployer.rs +++ b/crates/l2/contracts/deployer.rs @@ -617,18 +617,18 @@ async fn make_deposits(bridge: Address, eth_client: &EthClient) { for pk in private_keys.iter() { let pk_str = pk.strip_prefix("0x").unwrap_or(pk); let Ok(pk_h256) = pk_str.parse::() else { - return; + continue; }; let pk_bytes = pk_h256.as_bytes(); let Ok(secret_key) = SecretKey::from_slice(pk_bytes) else { - return; + continue; }; let Ok(address) = get_address_from_secret_key(&secret_key) else { - return; + continue; }; let values = vec![Value::Address(address)]; let Ok(calldata) = encode_calldata("deposit(address)", &values) else { - return; + continue; }; let Some(acc) = genesis.alloc.get(&address) else { dbg!("No hay address en genesis ⏭️", address); @@ -641,6 +641,7 @@ async fn make_deposits(bridge: Address, eth_client: &EthClient) { let overrides = Overrides { value: Some(value_to_deposit), from: Some(address), + gas_limit: Some(21000 * 5), ..Overrides::default() }; @@ -651,11 +652,6 @@ async fn make_deposits(bridge: Address, eth_client: &EthClient) { continue; }; - // let gas_estimate = eth_client.estimate_gas(build.clone().into()).await; - // dbg!("==========================="); - // dbg!(gas_estimate); - // dbg!("==========================="); - match eth_client .send_eip1559_transaction(&build, &secret_key) .await @@ -669,16 +665,6 @@ async fn make_deposits(bridge: Address, eth_client: &EthClient) { continue; } } - // let Ok(_) = dbg!( - // eth_client - // .send_eip1559_transaction(&build, &secret_key) - // .await - // ) else { - // dbg!("==========================="); - // dbg!("Failed to send transaction"); - // dbg!("==========================="); - // continue; - // }; } } diff --git a/crates/l2/proposer/l1_watcher.rs b/crates/l2/proposer/l1_watcher.rs index 9a00a9718..f4bf83b5a 100644 --- a/crates/l2/proposer/l1_watcher.rs +++ b/crates/l2/proposer/l1_watcher.rs @@ -75,8 +75,6 @@ impl L1Watcher { if logs.is_empty() { continue; } - - // dbg!("HAY LOGS", &logs); let pending_deposit_logs = self.get_pending_deposit_logs().await?; let _deposit_txs = self .process_logs(logs, &pending_deposit_logs, store) From 1a5baa81249bea113dc35610af0508dd715b8532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Paradelo?= Date: Thu, 27 Feb 2025 19:06:37 -0300 Subject: [PATCH 5/5] remove semi colon --- crates/common/trie/verify_range.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/common/trie/verify_range.rs b/crates/common/trie/verify_range.rs index 6cf72126b..836535433 100644 --- a/crates/common/trie/verify_range.rs +++ b/crates/common/trie/verify_range.rs @@ -331,7 +331,7 @@ fn remove_internal_references_inner( } // If both paths are greater or lesser than the node's prefix then the range is empty (Ordering::Greater, Ordering::Greater) | (Ordering::Less, Ordering::Less) => { - return Err(TrieError::Verify("empty range".to_string())); + return Err(TrieError::Verify("empty range".to_string())) } // None of the paths fit the prefix, remove the entire subtrie (left, right) if left.is_ne() && right.is_ne() => {