diff --git a/.github/workflows/pr-main_l2.yaml b/.github/workflows/pr-main_l2.yaml index d19cc4ae47..227578202c 100644 --- a/.github/workflows/pr-main_l2.yaml +++ b/.github/workflows/pr-main_l2.yaml @@ -326,9 +326,6 @@ jobs: - name: Run test run: | - if [ "${{ matrix.based }}" = true ]; then - export INTEGRATION_TEST_SKIP_BASE_FEE_VAULT_CHECK=true - fi sudo chmod -R a+rw crates/l2 cd crates/l2 RUST_LOG=info,ethrex_prover_lib=debug make init-prover-exec & @@ -560,7 +557,6 @@ jobs: tail -n 100 -f /tmp/ethrex.log & tail -n 100 -f /tmp/prover.log & export $(shell cat .env | xargs); \ - INTEGRATION_TEST_SKIP_BASE_FEE_VAULT_CHECK=true \ PROPOSER_COINBASE_ADDRESS=0x0007a881CD95B1484fca47615B64803dad620C8d \ cargo test l2 --release -- --nocapture --test-threads=1 diff --git a/crates/l2/networking/rpc/clients.rs b/crates/l2/networking/rpc/clients.rs index 170e7b91ac..386fd58b4a 100644 --- a/crates/l2/networking/rpc/clients.rs +++ b/crates/l2/networking/rpc/clients.rs @@ -4,6 +4,7 @@ use ethrex_common::H256; use ethrex_common::U256; use ethrex_l2_common::l1_messages::L1MessageProof; use ethrex_rpc::clients::eth::errors::GetL1BlobBaseFeeRequestError; +use ethrex_rpc::clients::eth::errors::GetL1FeeVaultAddressError; use ethrex_rpc::clients::eth::errors::GetOperatorFeeError; use ethrex_rpc::clients::eth::errors::GetOperatorFeeVaultAddressError; use ethrex_rpc::types::block_identifier::BlockIdentifier; @@ -57,7 +58,7 @@ pub async fn get_batch_by_number( pub async fn get_base_fee_vault_address( client: &EthClient, block: BlockIdentifier, -) -> Result { +) -> Result, EthClientError> { let params = Some(vec![block.into()]); let request = RpcRequest::new("ethrex_getBaseFeeVaultAddress", params); @@ -74,7 +75,7 @@ pub async fn get_base_fee_vault_address( pub async fn get_operator_fee_vault_address( client: &EthClient, block: BlockIdentifier, -) -> Result { +) -> Result, EthClientError> { let params = Some(vec![block.into()]); let request = RpcRequest::new("ethrex_getOperatorFeeVaultAddress", params); @@ -105,6 +106,23 @@ pub async fn get_operator_fee( } } +pub async fn get_l1_fee_vault_address( + client: &EthClient, + block: BlockIdentifier, +) -> Result, EthClientError> { + let params = Some(vec![block.into()]); + let request = RpcRequest::new("ethrex_getL1FeeVaultAddress", params); + + match client.send_request(request).await? { + RpcResponse::Success(result) => serde_json::from_value(result.result) + .map_err(GetL1FeeVaultAddressError::SerdeJSONError) + .map_err(EthClientError::from), + RpcResponse::Error(error_response) => { + Err(GetL1FeeVaultAddressError::RPCError(error_response.error.message).into()) + } + } +} + pub async fn get_l1_blob_base_fee_per_gas( client: &EthClient, block_number: u64, diff --git a/crates/l2/networking/rpc/l2/fees.rs b/crates/l2/networking/rpc/l2/fees.rs index bc61f51ccb..14af0df981 100644 --- a/crates/l2/networking/rpc/l2/fees.rs +++ b/crates/l2/networking/rpc/l2/fees.rs @@ -1,3 +1,4 @@ +use ethrex_rpc::types::block_identifier::BlockIdentifier; use serde_json::Value; use tracing::debug; @@ -7,7 +8,7 @@ use crate::{ }; pub struct GetBaseFeeVaultAddress { - pub block_number: u64, + pub block: BlockIdentifier, } impl RpcHandler for GetBaseFeeVaultAddress { @@ -16,34 +17,26 @@ impl RpcHandler for GetBaseFeeVaultAddress { "No params provided".to_owned(), ))?; if params.len() != 1 { - return Err(ethrex_rpc::RpcErr::BadParams( - "Expected 1 params".to_owned(), - ))?; + return Err(ethrex_rpc::RpcErr::BadParams("Expected 1 param".to_owned()))?; }; - // Parse BlockNumber - let hex_str = serde_json::from_value::(params[0].clone()) - .map_err(|e| ethrex_rpc::RpcErr::BadParams(e.to_string()))?; - - // Check that the BlockNumber is 0x prefixed - let hex_str = hex_str - .strip_prefix("0x") - .ok_or(ethrex_rpc::RpcErr::BadHexFormat(0))?; + let block = BlockIdentifier::parse(params[0].clone(), 0)?; - // Parse hex string - let block_number = - u64::from_str_radix(hex_str, 16).map_err(|_| ethrex_rpc::RpcErr::BadHexFormat(0))?; - - Ok(GetBaseFeeVaultAddress { block_number }) + Ok(GetBaseFeeVaultAddress { block }) } async fn handle(&self, context: RpcApiContext) -> Result { - debug!( - "Requested BaseFeeVault with block number: {}", - self.block_number - ); + debug!("Requested BaseFeeVault with block number: {}", self.block); + let block_number = match self + .block + .resolve_block_number(&context.l1_ctx.storage) + .await? + { + Some(block_number) => block_number, + _ => return Ok(Value::Null), + }; let base_fee_vault_address = context .rollup_store - .get_fee_config_by_block(self.block_number) + .get_fee_config_by_block(block_number) .await? .and_then(|fc| fc.base_fee_vault); @@ -60,7 +53,7 @@ impl RpcHandler for GetBaseFeeVaultAddress { } pub struct GetOperatorFeeVaultAddress { - pub block_number: u64, + pub block: BlockIdentifier, } impl RpcHandler for GetOperatorFeeVaultAddress { @@ -69,34 +62,30 @@ impl RpcHandler for GetOperatorFeeVaultAddress { "No params provided".to_owned(), ))?; if params.len() != 1 { - return Err(ethrex_rpc::RpcErr::BadParams( - "Expected 1 params".to_owned(), - ))?; + return Err(ethrex_rpc::RpcErr::BadParams("Expected 1 param".to_owned()))?; }; // Parse BlockNumber - let hex_str = serde_json::from_value::(params[0].clone()) - .map_err(|e| ethrex_rpc::RpcErr::BadParams(e.to_string()))?; + let block = BlockIdentifier::parse(params[0].clone(), 0)?; - // Check that the BlockNumber is 0x prefixed - let hex_str = hex_str - .strip_prefix("0x") - .ok_or(ethrex_rpc::RpcErr::BadHexFormat(0))?; - - // Parse hex string - let block_number = - u64::from_str_radix(hex_str, 16).map_err(|_| ethrex_rpc::RpcErr::BadHexFormat(0))?; - - Ok(GetOperatorFeeVaultAddress { block_number }) + Ok(GetOperatorFeeVaultAddress { block }) } async fn handle(&self, context: RpcApiContext) -> Result { debug!( "Requested OperatorFeeVault with block number: {}", - self.block_number + self.block ); + let block_number = match self + .block + .resolve_block_number(&context.l1_ctx.storage) + .await? + { + Some(block_number) => block_number, + _ => return Ok(Value::Null), + }; let operator_fee_config = context .rollup_store - .get_fee_config_by_block(self.block_number) + .get_fee_config_by_block(block_number) .await? .and_then(|fc| fc.operator_fee_config); @@ -113,7 +102,7 @@ impl RpcHandler for GetOperatorFeeVaultAddress { } pub struct GetOperatorFee { - pub block_number: u64, + pub block: BlockIdentifier, } impl RpcHandler for GetOperatorFee { @@ -122,34 +111,26 @@ impl RpcHandler for GetOperatorFee { "No params provided".to_owned(), ))?; if params.len() != 1 { - return Err(ethrex_rpc::RpcErr::BadParams( - "Expected 1 params".to_owned(), - ))?; + return Err(ethrex_rpc::RpcErr::BadParams("Expected 1 param".to_owned()))?; }; - // Parse BlockNumber - let hex_str = serde_json::from_value::(params[0].clone()) - .map_err(|e| ethrex_rpc::RpcErr::BadParams(e.to_string()))?; - - // Check that the BlockNumber is 0x prefixed - let hex_str = hex_str - .strip_prefix("0x") - .ok_or(ethrex_rpc::RpcErr::BadHexFormat(0))?; + let block = BlockIdentifier::parse(params[0].clone(), 0)?; - // Parse hex string - let block_number = - u64::from_str_radix(hex_str, 16).map_err(|_| ethrex_rpc::RpcErr::BadHexFormat(0))?; - - Ok(GetOperatorFee { block_number }) + Ok(GetOperatorFee { block }) } async fn handle(&self, context: RpcApiContext) -> Result { - debug!( - "Requested OperatorFee with block number: {}", - self.block_number - ); + debug!("Requested OperatorFee with block number: {}", self.block); + let block_number = match self + .block + .resolve_block_number(&context.l1_ctx.storage) + .await? + { + Some(block_number) => block_number, + _ => return Ok(Value::Null), + }; let operator_fee_per_gas = context .rollup_store - .get_fee_config_by_block(self.block_number) + .get_fee_config_by_block(block_number) .await? .and_then(|fc| fc.operator_fee_config) .map(|config| config.operator_fee_per_gas) @@ -160,8 +141,53 @@ impl RpcHandler for GetOperatorFee { } } +pub struct GetL1FeeVaultAddress { + pub block: BlockIdentifier, +} + +impl RpcHandler for GetL1FeeVaultAddress { + fn parse(params: &Option>) -> Result { + let params = params.as_ref().ok_or(ethrex_rpc::RpcErr::BadParams( + "No params provided".to_owned(), + ))?; + if params.len() != 1 { + return Err(ethrex_rpc::RpcErr::BadParams("Expected 1 param".to_owned()))?; + }; + let block = BlockIdentifier::parse(params[0].clone(), 0)?; + + Ok(GetL1FeeVaultAddress { block }) + } + + async fn handle(&self, context: RpcApiContext) -> Result { + debug!("Requested L1FeeVault with block number: {}", self.block); + let block_number = match self + .block + .resolve_block_number(&context.l1_ctx.storage) + .await? + { + Some(block_number) => block_number, + _ => return Ok(Value::Null), + }; + let l1_fee_config = context + .rollup_store + .get_fee_config_by_block(block_number) + .await? + .and_then(|fc| fc.l1_fee_config); + + Ok( + serde_json::to_value(l1_fee_config.map(|config| format!("{:#x}", config.l1_fee_vault))) + .map_err(|e| { + ethrex_rpc::RpcErr::Internal(format!( + "Failed to serialize l1 fee vault address: {}", + e + )) + })?, + ) + } +} + pub struct GetL1BlobBaseFeeRequest { - pub block_number: u64, + pub block: BlockIdentifier, } impl RpcHandler for GetL1BlobBaseFeeRequest { @@ -170,32 +196,27 @@ impl RpcHandler for GetL1BlobBaseFeeRequest { "No params provided".to_owned(), ))?; if params.len() != 1 { - return Err(ethrex_rpc::RpcErr::BadParams( - "Expected 1 params".to_owned(), - ))?; + return Err(ethrex_rpc::RpcErr::BadParams("Expected 1 param".to_owned()))?; }; - // Parse BlockNumber - let hex_str = serde_json::from_value::(params[0].clone()) - .map_err(|e| ethrex_rpc::RpcErr::BadParams(e.to_string()))?; - - // Check that the BlockNumber is 0x prefixed - let hex_str = hex_str - .strip_prefix("0x") - .ok_or(ethrex_rpc::RpcErr::BadHexFormat(0))?; + let block = BlockIdentifier::parse(params[0].clone(), 0)?; - // Parse hex string - let block_number = - u64::from_str_radix(hex_str, 16).map_err(|_| ethrex_rpc::RpcErr::BadHexFormat(0))?; - - Ok(GetL1BlobBaseFeeRequest { block_number }) + Ok(GetL1BlobBaseFeeRequest { block }) } async fn handle(&self, context: RpcApiContext) -> Result { - debug!("Requested L1BlobBaseFee for block {}", self.block_number); + debug!("Requested L1BlobBaseFee for block {}", self.block); + let block_number = match self + .block + .resolve_block_number(&context.l1_ctx.storage) + .await? + { + Some(block_number) => block_number, + _ => return Ok(Value::Null), + }; let l1_blob_base_fee = context .rollup_store - .get_fee_config_by_block(self.block_number) + .get_fee_config_by_block(block_number) .await? .and_then(|fc| fc.l1_fee_config) .map(|cfg| cfg.l1_fee_per_blob_gas) diff --git a/crates/l2/networking/rpc/rpc.rs b/crates/l2/networking/rpc/rpc.rs index 2e0f895f39..013f6f442f 100644 --- a/crates/l2/networking/rpc/rpc.rs +++ b/crates/l2/networking/rpc/rpc.rs @@ -1,7 +1,8 @@ use crate::l2::batch::{BatchNumberRequest, GetBatchByBatchNumberRequest}; use crate::l2::execution_witness::handle_execution_witness; use crate::l2::fees::{ - GetBaseFeeVaultAddress, GetL1BlobBaseFeeRequest, GetOperatorFee, GetOperatorFeeVaultAddress, + GetBaseFeeVaultAddress, GetL1BlobBaseFeeRequest, GetL1FeeVaultAddress, GetOperatorFee, + GetOperatorFeeVaultAddress, }; use crate::l2::l1_message::GetL1MessageProof; use crate::utils::{RpcErr, RpcNamespace, resolve_namespace}; @@ -232,6 +233,7 @@ pub async fn map_l2_requests(req: &RpcRequest, context: RpcApiContext) -> Result "ethrex_getBaseFeeVaultAddress" => GetBaseFeeVaultAddress::call(req, context).await, "ethrex_getOperatorFeeVaultAddress" => GetOperatorFeeVaultAddress::call(req, context).await, "ethrex_getOperatorFee" => GetOperatorFee::call(req, context).await, + "ethrex_getL1FeeVaultAddress" => GetL1FeeVaultAddress::call(req, context).await, "ethrex_getL1BlobBaseFee" => GetL1BlobBaseFeeRequest::call(req, context).await, unknown_ethrex_l2_method => { Err(ethrex_rpc::RpcErr::MethodNotFound(unknown_ethrex_l2_method.to_owned()).into()) diff --git a/crates/l2/tests/tests.rs b/crates/l2/tests/tests.rs index 05cf9e7a17..2e0f2e786a 100644 --- a/crates/l2/tests/tests.rs +++ b/crates/l2/tests/tests.rs @@ -14,8 +14,10 @@ use ethrex_l2_common::calldata::Value; use ethrex_l2_common::l1_messages::L1MessageProof; use ethrex_l2_common::state_diff::SIMPLE_TX_STATE_DIFF_SIZE; use ethrex_l2_common::utils::get_address_from_secret_key; -use ethrex_l2_rpc::clients::get_l1_blob_base_fee_per_gas; -use ethrex_l2_rpc::clients::get_operator_fee; +use ethrex_l2_rpc::clients::{ + get_base_fee_vault_address, get_l1_blob_base_fee_per_gas, get_l1_fee_vault_address, + get_operator_fee, get_operator_fee_vault_address, +}; use ethrex_l2_rpc::signer::{LocalSigner, Signer}; use ethrex_l2_sdk::{ COMMON_BRIDGE_L2_ADDRESS, bridge_address, calldata::encode_calldata, claim_erc20withdraw, @@ -63,9 +65,6 @@ use tokio::task::JoinSet; /// Contract addresses: /// ETHREX_WATCHER_BRIDGE_ADDRESS: The address of the l1 bridge contract /// INTEGRATION_TEST_PROPOSER_COINBASE_ADDRESS: The address of the l2 coinbase -/// INTEGRATION_TEST_PROPOSER_BASE_FEE_VAULT_ADDRESS: The address of the l2 base_fee_vault -/// INTEGRATION_TEST_PROPOSER_OPERATOR_FEE_VAULT_ADDRESS: The address of the l2 operator_fee_vault -/// INTEGRATION_TEST_PROPOSER_L1_FEE_VAULT_ADDRESS: The address of the l2 l1_fee_vault /// /// Test parameters: /// @@ -95,27 +94,6 @@ const DEFAULT_ON_CHAIN_PROPOSER_ADDRESS: Address = H160([ 0xda, 0x47, 0xc3, 0x54, ]); -// 0x000c0d6b7c4516a5b274c51ea331a9410fe69127 -// pk: 0xe9ea73e0ca433882aa9d4e2311ecc4e17286121e6bd8e600e5d25d4243b2baa3 -const DEFAULT_PROPOSER_BASE_FEE_VAULT_ADDRESS: Address = H160([ - 0x00, 0x0c, 0x0d, 0x6b, 0x7c, 0x45, 0x16, 0xa5, 0xb2, 0x74, 0xc5, 0x1e, 0xa3, 0x31, 0xa9, 0x41, - 0x0f, 0xe6, 0x91, 0x27, -]); - -// 0xd5d2a85751b6F158e5b9B8cD509206A865672362 -// pk: 0xb164d28d5a03910da40f9fe17ea4b8b76e89f45961cd75cfe6877381e35e3eb4 -const DEFAULT_OPERATOR_FEE_VAULT_ADDRESS: Address = H160([ - 0xd5, 0xd2, 0xa8, 0x57, 0x51, 0xb6, 0xf1, 0x58, 0xe5, 0xb9, 0xb8, 0xcd, 0x50, 0x92, 0x06, 0xa8, - 0x65, 0x67, 0x23, 0x62, -]); - -// 0x45681AE1768a8936FB87aB11453B4755e322ceec -// pk: 0x3a7b2002e24304d2dfa39e37a10b44585d10395d1c18f127dfa7b90232cfc5e4 -const DEFAULT_L1_FEE_VAULT_ADDRESS: Address = H160([ - 0x45, 0x68, 0x1a, 0xe1, 0x76, 0x8a, 0x89, 0x36, 0xfb, 0x87, 0xab, 0x11, 0x45, 0x3b, 0x47, 0x55, - 0xe3, 0x22, 0xce, 0xec, -]); - const DEFAULT_RICH_KEYS_FILE_PATH: &str = "../../fixtures/keys/private_keys_l1.txt"; const DEFAULT_TEST_KEYS_FILE_PATH: &str = "../../fixtures/keys/private_keys_tests.txt"; @@ -146,15 +124,17 @@ async fn l2_integration_test() -> Result<(), Box> { let coinbase_balance_before_tests = l2_client .get_balance(coinbase(), BlockIdentifier::Tag(BlockTag::Latest)) .await?; - let base_fee_vault_balance_before_tests = l2_client - .get_balance(base_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; - let operator_fee_vault_balance_before_tests = l2_client - .get_balance(operator_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; - let l1_fee_vault_balance_before_tests = l2_client - .get_balance(l1_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + + let base_fee_vault = base_fee_vault(&l2_client).await; + let base_fee_vault_balance_before_tests = + get_fee_vault_balance(&l2_client, base_fee_vault).await; + + let operator_fee_vault = operator_fee_vault(&l2_client).await; + let operator_fee_vault_balance_before_tests = + get_fee_vault_balance(&l2_client, operator_fee_vault).await; + + let l1_fee_vault = l1_fee_vault(&l2_client).await; + let l1_fee_vault_balance_before_tests = get_fee_vault_balance(&l2_client, l1_fee_vault).await; let mut set = JoinSet::new(); @@ -245,17 +225,13 @@ async fn l2_integration_test() -> Result<(), Box> { .get_balance(coinbase(), BlockIdentifier::Tag(BlockTag::Latest)) .await?; - let base_fee_vault_balance_after_tests = l2_client - .get_balance(base_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let base_fee_vault_balance_after_tests = + get_fee_vault_balance(&l2_client, base_fee_vault).await; - let operator_fee_vault_balance_after_tests = l2_client - .get_balance(operator_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let operator_fee_vault_balance_after_tests = + get_fee_vault_balance(&l2_client, operator_fee_vault).await; - let l1_fee_vault_balance_after_tests = l2_client - .get_balance(l1_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let l1_fee_vault_balance_after_tests = get_fee_vault_balance(&l2_client, l1_fee_vault).await; println!("Checking coinbase, base and operator fee vault balances"); @@ -265,7 +241,7 @@ async fn l2_integration_test() -> Result<(), Box> { "Coinbase is not correct after tests" ); - if std::env::var("INTEGRATION_TEST_SKIP_BASE_FEE_VAULT_CHECK").is_err() { + if base_fee_vault.is_some() { assert_eq!( base_fee_vault_balance_after_tests, base_fee_vault_balance_before_tests + acc_base_fees, @@ -1155,13 +1131,13 @@ async fn test_deposit( .get_balance(coinbase(), BlockIdentifier::Tag(BlockTag::Latest)) .await?; - let base_fee_vault_balance_before_deposit = l2_client - .get_balance(base_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let base_fee_vault = base_fee_vault(l2_client).await; + let base_fee_vault_balance_before_deposit = + get_fee_vault_balance(l2_client, base_fee_vault).await; - let operator_vault_balance_before_deposit = l2_client - .get_balance(operator_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let operator_fee_vault = operator_fee_vault(l2_client).await; + let operator_fee_vault_balance_before_deposit = + get_fee_vault_balance(l2_client, operator_fee_vault).await; println!("test_deposit: Depositing funds from L1 to L2"); @@ -1283,13 +1259,11 @@ async fn test_deposit( .get_balance(coinbase(), BlockIdentifier::Tag(BlockTag::Latest)) .await?; - let base_fee_vault_balance_after_deposit = l2_client - .get_balance(base_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let base_fee_vault_balance_after_deposit = + get_fee_vault_balance(l2_client, base_fee_vault).await; - let operator_fee_vault_balance_after_deposit = l2_client - .get_balance(operator_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let operator_fee_vault_balance_after_deposit = + get_fee_vault_balance(l2_client, operator_fee_vault).await; assert_eq!( coinbase_balance_after_deposit, coinbase_balance_before_deposit, @@ -1302,7 +1276,7 @@ async fn test_deposit( ); assert_eq!( - operator_fee_vault_balance_after_deposit, operator_vault_balance_before_deposit, + operator_fee_vault_balance_after_deposit, operator_fee_vault_balance_before_deposit, "Operator vault balance should not change after deposit" ); @@ -1666,17 +1640,17 @@ async fn test_n_withdraws( .get_balance(coinbase(), BlockIdentifier::Tag(BlockTag::Latest)) .await?; - let base_fee_vault_balance_before_withdrawal = l2_client - .get_balance(base_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let base_fee_vault = base_fee_vault(l2_client).await; + let base_fee_vault_balance_before_withdrawal = + get_fee_vault_balance(l2_client, base_fee_vault).await; - let operator_fee_vault_balance_before_withdrawal = l2_client - .get_balance(operator_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let operator_fee_vault = operator_fee_vault(l2_client).await; + let operator_fee_vault_balance_before_withdrawal = + get_fee_vault_balance(l2_client, operator_fee_vault).await; - let l1_fee_vault_balance_before_withdrawal = l2_client - .get_balance(l1_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let l1_fee_vault = l1_fee_vault(l2_client).await; + let l1_fee_vault_balance_before_withdrawal = + get_fee_vault_balance(l2_client, l1_fee_vault).await; println!("test_n_withdraws: Withdrawing funds from L2 to L1"); @@ -1754,17 +1728,14 @@ async fn test_n_withdraws( .get_balance(coinbase(), BlockIdentifier::Tag(BlockTag::Latest)) .await?; - let base_fee_vault_balance_after_withdrawal = l2_client - .get_balance(base_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let base_fee_vault_balance_after_withdrawal = + get_fee_vault_balance(l2_client, base_fee_vault).await; - let operator_fee_vault_balance_after_withdrawal = l2_client - .get_balance(operator_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let operator_fee_vault_balance_after_withdrawal = + get_fee_vault_balance(l2_client, operator_fee_vault).await; - let l1_fee_vault_balance_after_withdrawal = l2_client - .get_balance(l1_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let l1_fee_vault_balance_after_withdrawal = + get_fee_vault_balance(l2_client, l1_fee_vault).await; assert_eq!( coinbase_balance_after_withdrawal, @@ -1772,7 +1743,7 @@ async fn test_n_withdraws( "Coinbase balance didn't increase as expected after withdrawal" ); - if std::env::var("INTEGRATION_TEST_SKIP_BASE_FEE_VAULT_CHECK").is_err() { + if base_fee_vault.is_some() { assert_eq!( base_fee_vault_balance_after_withdrawal, base_fee_vault_balance_before_withdrawal + total_withdraw_fees_l2.base_fees, @@ -1907,21 +1878,18 @@ async fn test_total_balance_l2( println!("Coinbase balance: {coinbase_balance}"); - let base_fee_vault_balance = l2_client - .get_balance(base_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let base_fee_vault = base_fee_vault(l2_client).await; + let base_fee_vault_balance = get_fee_vault_balance(l2_client, base_fee_vault).await; println!("Base fee vault balance: {base_fee_vault_balance}"); - let operator_fee_vault_balance = l2_client - .get_balance(operator_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let operator_fee_vault = operator_fee_vault(l2_client).await; + let operator_fee_vault_balance = get_fee_vault_balance(l2_client, operator_fee_vault).await; println!("Operator fee vault balance: {operator_fee_vault_balance}"); - let l1_fee_vault_balance = l2_client - .get_balance(l1_fee_vault(), BlockIdentifier::Tag(BlockTag::Latest)) - .await?; + let l1_fee_vault = l1_fee_vault(l2_client).await; + let l1_fee_vault_balance = get_fee_vault_balance(l2_client, l1_fee_vault).await; println!("L1 fee vault balance: {l1_fee_vault_balance}"); @@ -1947,7 +1915,7 @@ async fn test_total_balance_l2( println!("Bridge has locked: {bridge_native_locked}"); - if std::env::var("INTEGRATION_TEST_SKIP_BASE_FEE_VAULT_CHECK").is_err() { + if base_fee_vault.is_some() { assert!( total_balance_on_l2 == bridge_native_locked, "Total balance on L2 ({total_balance_on_l2}) differs from bridge native locked ({bridge_native_locked})" @@ -2281,22 +2249,32 @@ fn coinbase() -> Address { .unwrap_or(DEFAULT_PROPOSER_COINBASE_ADDRESS) } -fn base_fee_vault() -> Address { - std::env::var("INTEGRATION_TEST_PROPOSER_BASE_FEE_VAULT_ADDRESS") - .map(|address| address.parse().expect("Invalid proposer coinbase address")) - .unwrap_or(DEFAULT_PROPOSER_BASE_FEE_VAULT_ADDRESS) +async fn base_fee_vault(l2_client: &EthClient) -> Option
{ + get_base_fee_vault_address(l2_client, BlockIdentifier::Tag(BlockTag::Latest)) + .await + .unwrap() } -fn operator_fee_vault() -> Address { - std::env::var("INTEGRATION_TEST_PROPOSER_OPERATOR_FEE_VAULT_ADDRESS") - .map(|address| address.parse().expect("Invalid proposer coinbase address")) - .unwrap_or(DEFAULT_OPERATOR_FEE_VAULT_ADDRESS) +async fn operator_fee_vault(l2_client: &EthClient) -> Option
{ + get_operator_fee_vault_address(l2_client, BlockIdentifier::Tag(BlockTag::Latest)) + .await + .unwrap() } -fn l1_fee_vault() -> Address { - std::env::var("INTEGRATION_TEST_PROPOSER_L1_FEE_VAULT_ADDRESS") - .map(|address| address.parse().expect("Invalid proposer coinbase address")) - .unwrap_or(DEFAULT_L1_FEE_VAULT_ADDRESS) +async fn l1_fee_vault(l2_client: &EthClient) -> Option
{ + get_l1_fee_vault_address(l2_client, BlockIdentifier::Tag(BlockTag::Latest)) + .await + .unwrap() +} + +async fn get_fee_vault_balance(l2_client: &EthClient, vault_address: Option
) -> U256 { + let Some(addr) = vault_address else { + return U256::zero(); + }; + l2_client + .get_balance(addr, BlockIdentifier::Tag(BlockTag::Latest)) + .await + .unwrap() } async fn wait_for_l2_deposit_receipt( diff --git a/crates/networking/rpc/clients/eth/errors.rs b/crates/networking/rpc/clients/eth/errors.rs index f734817671..98b2d5feba 100644 --- a/crates/networking/rpc/clients/eth/errors.rs +++ b/crates/networking/rpc/clients/eth/errors.rs @@ -79,6 +79,8 @@ pub enum EthClientError { GetOperatorFeeVaultAddressError(#[from] GetOperatorFeeVaultAddressError), #[error("ethrex_getOperatorFee request error: {0}")] GetOperatorFeeError(#[from] GetOperatorFeeError), + #[error("ethrex_getL1FeeVaultAddress request error: {0}")] + GetL1FeeVaultAddressError(#[from] GetL1FeeVaultAddressError), #[error("ethrex_getL1BlobBaseFee request error: {0}")] GetL1BlobBaseFeeError(#[from] GetL1BlobBaseFeeRequestError), } @@ -355,6 +357,14 @@ pub enum GetOperatorFeeError { RPCError(String), } +#[derive(Debug, thiserror::Error)] +pub enum GetL1FeeVaultAddressError { + #[error("{0}")] + SerdeJSONError(#[from] serde_json::Error), + #[error("{0}")] + RPCError(String), +} + #[derive(Debug, thiserror::Error)] pub enum GetL1BlobBaseFeeRequestError { #[error("{0}")] diff --git a/crates/networking/rpc/engine/payload.rs b/crates/networking/rpc/engine/payload.rs index a99ef9b9cc..c037ecd7fe 100644 --- a/crates/networking/rpc/engine/payload.rs +++ b/crates/networking/rpc/engine/payload.rs @@ -489,7 +489,7 @@ fn parse_execution_payload(params: &Option>) -> Result