From c60a3482ee09b3e371163e62f49e83bc6d6f4548 Mon Sep 17 00:00:00 2001 From: koloz193 Date: Tue, 15 Oct 2024 08:18:03 -0400 Subject: [PATCH] feat(contracts)!: integrate protocol defense changes (#2737) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What ❔ The work done in the protocol defense project introduced a number of changes, namely custom errors in our solidity contracts. We need to update the server code to handle these new errors. ## Why ❔ ## Checklist - [ ] PR title corresponds to the body of PR (we generate changelog entries from PRs). - [ ] Tests for the changes have been added / updated. - [ ] Documentation comments have been added / updated. - [ ] Code has been formatted via `zk fmt` and `zk lint`. --------- Signed-off-by: Danil Co-authored-by: Danil Co-authored-by: Stanislav Breadless --- .github/workflows/build-core-template.yml | 2 +- .../new-build-contract-verifier-template.yml | 11 +- .github/workflows/new-build-core-template.yml | 13 +- contracts | 2 +- .../system-constants-generator/src/utils.rs | 13 +- core/lib/basic_types/src/protocol_version.rs | 7 +- core/lib/contracts/src/lib.rs | 133 ++-- .../versions/vm_fast/tests/l1_tx_execution.rs | 7 +- .../versions/vm_fast/tests/nonce_holder.rs | 11 +- .../src/versions/vm_fast/tests/rollbacks.rs | 47 +- .../tests/tester/transaction_test_info.rs | 77 +-- .../src/versions/vm_fast/tests/utils.rs | 5 +- .../vm_latest/tests/l1_tx_execution.rs | 7 +- .../src/versions/vm_latest/tests/migration.rs | 51 -- .../src/versions/vm_latest/tests/mod.rs | 1 - .../versions/vm_latest/tests/nonce_holder.rs | 11 +- .../src/versions/vm_latest/tests/rollbacks.rs | 47 +- .../tests/tester/transaction_test_info.rs | 72 +-- .../src/versions/vm_latest/tests/utils.rs | 5 +- core/lib/vm_executor/src/oneshot/contracts.rs | 9 +- .../api_server/src/execution_sandbox/tests.rs | 5 +- core/node/api_server/src/testonly.rs | 2 +- core/node/consensus/src/registry/abi.rs | 3 +- .../ts-integration/tests/base-token.test.ts | 2 +- .../ts-integration/tests/contracts.test.ts | 2 +- .../tests/ts-integration/tests/system.test.ts | 2 +- core/tests/upgrade-test/tests/upgrade.test.ts | 4 +- core/tests/upgrade-test/tests/utils.ts | 4 +- docker/contract-verifier/Dockerfile | 3 +- docker/external-node/Dockerfile | 9 +- docker/server-v2/Dockerfile | 9 +- etc/env/base/chain.toml | 4 +- etc/env/base/contracts.toml | 8 +- etc/env/file_based/genesis.yaml | 13 +- etc/lint-config/ignore.yaml | 3 +- .../fee_estimate.yul/fee_estimate.yul.zbin | Bin 0 -> 75168 bytes .../gas_test.yul/gas_test.yul.zbin | Bin 0 -> 71264 bytes .../playground_batch.yul.zbin | Bin 0 -> 75360 bytes .../proved_batch.yul/proved_batch.yul.zbin | Bin 0 -> 71776 bytes .../1728066632-protocol-defense/common.json | 5 + .../stage/crypto.json | 6 + .../stage/facetCuts.json | 198 ++++++ .../stage/facets.json | 18 + .../stage/l2Upgrade.json | 394 ++++++++++++ .../stage/transactions.json | 253 ++++++++ etc/utils/src/index.ts | 1 + yarn.lock | 582 +++++++++++++++--- zkstack_cli/crates/common/src/contracts.rs | 42 ++ zkstack_cli/crates/common/src/lib.rs | 1 + .../crates/common/src/prerequisites.rs | 84 ++- .../src/commands/chain/deploy_l2_contracts.rs | 11 +- .../src/commands/dev/commands/contracts.rs | 57 +- .../src/commands/dev/commands/genesis.rs | 26 + .../zkstack/src/commands/dev/commands/mod.rs | 1 + .../src/commands/dev/commands/test/build.rs | 2 +- .../commands/dev/commands/test/integration.rs | 2 +- .../zkstack/src/commands/dev/messages.rs | 6 +- .../crates/zkstack/src/commands/dev/mod.rs | 10 +- .../zkstack/src/commands/ecosystem/init.rs | 5 +- 59 files changed, 1856 insertions(+), 452 deletions(-) delete mode 100644 core/lib/multivm/src/versions/vm_latest/tests/migration.rs create mode 100644 etc/multivm_bootloaders/vm_protocol_defense/fee_estimate.yul/fee_estimate.yul.zbin create mode 100644 etc/multivm_bootloaders/vm_protocol_defense/gas_test.yul/gas_test.yul.zbin create mode 100644 etc/multivm_bootloaders/vm_protocol_defense/playground_batch.yul/playground_batch.yul.zbin create mode 100644 etc/multivm_bootloaders/vm_protocol_defense/proved_batch.yul/proved_batch.yul.zbin create mode 100644 etc/upgrades/1728066632-protocol-defense/common.json create mode 100644 etc/upgrades/1728066632-protocol-defense/stage/crypto.json create mode 100644 etc/upgrades/1728066632-protocol-defense/stage/facetCuts.json create mode 100644 etc/upgrades/1728066632-protocol-defense/stage/facets.json create mode 100644 etc/upgrades/1728066632-protocol-defense/stage/l2Upgrade.json create mode 100644 etc/upgrades/1728066632-protocol-defense/stage/transactions.json create mode 100644 zkstack_cli/crates/common/src/contracts.rs create mode 100644 zkstack_cli/crates/zkstack/src/commands/dev/commands/genesis.rs diff --git a/.github/workflows/build-core-template.yml b/.github/workflows/build-core-template.yml index 33053b6a4000..18b444a99ed3 100644 --- a/.github/workflows/build-core-template.yml +++ b/.github/workflows/build-core-template.yml @@ -128,7 +128,7 @@ jobs: ci_run git config --global --add safe.directory /usr/src/zksync/contracts ci_run ./bin/zk || true ci_run run_retried curl -LO https://storage.googleapis.com/matterlabs-setup-keys-us/setup-keys/setup_2\^26.key - + - name: Install zkstack run: | ci_run ./zkstack_cli/zkstackup/install -g --path ./zkstack_cli/zkstackup/zkstackup || true diff --git a/.github/workflows/new-build-contract-verifier-template.yml b/.github/workflows/new-build-contract-verifier-template.yml index 3fc83cc62eb7..b5286782fad7 100644 --- a/.github/workflows/new-build-contract-verifier-template.yml +++ b/.github/workflows/new-build-contract-verifier-template.yml @@ -103,8 +103,13 @@ jobs: crate: sqlx-cli tag: 0.8.1 - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@8f1998e9878d786675189ef566a2e4bf24869773 # v1.2.0 + - name: Install foundry-zksync + run: | + mkdir ./foundry-zksync + curl -LO https://github.com/matter-labs/foundry-zksync/releases/download/nightly-15bec2f861b3b4c71e58f85e2b2c9dd722585aa8/foundry_nightly_linux_amd64.tar.gz + tar zxf foundry_nightly_linux_amd64.tar.gz -C ./foundry-zksync + chmod +x ./foundry-zksync/forge ./foundry-zksync/cast + echo "$PWD/foundry-zksync" >> $GITHUB_PATH - name: Pre-download compilers shell: bash @@ -131,7 +136,7 @@ jobs: docker compose up -d postgres - name: Install zkstack - run: | + run: | ./zkstack_cli/zkstackup/install --path ./zkstack_cli/zkstackup/zkstackup zkstackup --local || true diff --git a/.github/workflows/new-build-core-template.yml b/.github/workflows/new-build-core-template.yml index 392acbc9f8f1..e8a41a7e0646 100644 --- a/.github/workflows/new-build-core-template.yml +++ b/.github/workflows/new-build-core-template.yml @@ -108,8 +108,13 @@ jobs: crate: sqlx-cli tag: 0.8.1 - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@8f1998e9878d786675189ef566a2e4bf24869773 # v1.2.0 + - name: Install foundry-zksync + run: | + mkdir ./foundry-zksync + curl -LO https://github.com/matter-labs/foundry-zksync/releases/download/nightly-15bec2f861b3b4c71e58f85e2b2c9dd722585aa8/foundry_nightly_linux_amd64.tar.gz + tar zxf foundry_nightly_linux_amd64.tar.gz -C ./foundry-zksync + chmod +x ./foundry-zksync/forge ./foundry-zksync/cast + echo "$PWD/foundry-zksync" >> $GITHUB_PATH - name: Pre-download compilers shell: bash @@ -136,10 +141,10 @@ jobs: docker compose up -d postgres - name: Install zkstack - run: | + run: | ./zkstack_cli/zkstackup/install --path ./zkstack_cli/zkstackup/zkstackup zkstackup --local || true - + - name: build contracts shell: bash run: | diff --git a/contracts b/contracts index aafee035db89..84d5e3716f64 160000 --- a/contracts +++ b/contracts @@ -1 +1 @@ -Subproject commit aafee035db892689df3f7afe4b89fd6467a39313 +Subproject commit 84d5e3716f645909e8144c7d50af9dd6dd9ded62 diff --git a/core/bin/system-constants-generator/src/utils.rs b/core/bin/system-constants-generator/src/utils.rs index 8d36f7344676..ce7182a3aa4a 100644 --- a/core/bin/system-constants-generator/src/utils.rs +++ b/core/bin/system-constants-generator/src/utils.rs @@ -3,7 +3,7 @@ use std::{cell::RefCell, rc::Rc}; use once_cell::sync::Lazy; use zksync_contracts::{ load_sys_contract, read_bootloader_code, read_bytecode_from_path, read_sys_contract_bytecode, - BaseSystemContracts, ContractLanguage, SystemContractCode, + read_zbin_bytecode, BaseSystemContracts, ContractLanguage, SystemContractCode, }; use zksync_multivm::{ interface::{ @@ -171,9 +171,16 @@ pub(super) fn get_l1_txs(number_of_txs: usize) -> (Vec, Vec Vec { - read_bytecode_from_path(format!( + if let Some(contract) = read_bytecode_from_path(format!( "contracts/system-contracts/zkout/{test}.yul/contracts-preprocessed/bootloader/{test}.yul.json", - )) + )){ + contract + } else { + read_zbin_bytecode(format!( + "contracts/system-contracts/bootloader/tests/artifacts/{}.yul.zbin", + test + )) + } } fn default_l1_batch() -> L1BatchEnv { diff --git a/core/lib/basic_types/src/protocol_version.rs b/core/lib/basic_types/src/protocol_version.rs index 640a92c00da0..e01586cdad7d 100644 --- a/core/lib/basic_types/src/protocol_version.rs +++ b/core/lib/basic_types/src/protocol_version.rs @@ -68,15 +68,16 @@ pub enum ProtocolVersionId { Version23, Version24, Version25, + Version26, } impl ProtocolVersionId { pub const fn latest() -> Self { - Self::Version24 + Self::Version25 } pub const fn next() -> Self { - Self::Version25 + Self::Version26 } pub fn try_from_packed_semver(packed_semver: U256) -> Result { @@ -120,6 +121,7 @@ impl ProtocolVersionId { ProtocolVersionId::Version23 => VmVersion::Vm1_5_0SmallBootloaderMemory, ProtocolVersionId::Version24 => VmVersion::Vm1_5_0IncreasedBootloaderMemory, ProtocolVersionId::Version25 => VmVersion::Vm1_5_0IncreasedBootloaderMemory, + ProtocolVersionId::Version26 => VmVersion::Vm1_5_0IncreasedBootloaderMemory, } } @@ -275,6 +277,7 @@ impl From for VmVersion { ProtocolVersionId::Version23 => VmVersion::Vm1_5_0SmallBootloaderMemory, ProtocolVersionId::Version24 => VmVersion::Vm1_5_0IncreasedBootloaderMemory, ProtocolVersionId::Version25 => VmVersion::Vm1_5_0IncreasedBootloaderMemory, + ProtocolVersionId::Version26 => VmVersion::Vm1_5_0IncreasedBootloaderMemory, } } } diff --git a/core/lib/contracts/src/lib.rs b/core/lib/contracts/src/lib.rs index 7e133f8dee31..a9e7324d5af6 100644 --- a/core/lib/contracts/src/lib.rs +++ b/core/lib/contracts/src/lib.rs @@ -69,20 +69,21 @@ fn home_path() -> PathBuf { Workspace::locate().core() } -fn read_file_to_json_value(path: impl AsRef + std::fmt::Debug) -> serde_json::Value { +fn read_file_to_json_value(path: impl AsRef + std::fmt::Debug) -> Option { let zksync_home = home_path(); let path = Path::new(&zksync_home).join(path); - let file = - File::open(&path).unwrap_or_else(|e| panic!("Failed to open file {:?}: {}", path, e)); - serde_json::from_reader(BufReader::new(file)) - .unwrap_or_else(|e| panic!("Failed to parse file {:?}: {}", path, e)) + let file = File::open(&path).ok()?; + Some( + serde_json::from_reader(BufReader::new(file)) + .unwrap_or_else(|e| panic!("Failed to parse file {:?}: {}", path, e)), + ) } fn load_contract_if_present + std::fmt::Debug>(path: P) -> Option { let zksync_home = home_path(); let path = Path::new(&zksync_home).join(path); path.exists().then(|| { - serde_json::from_value(read_file_to_json_value(&path)["abi"].take()) + serde_json::from_value(read_file_to_json_value(&path).unwrap()["abi"].take()) .unwrap_or_else(|e| panic!("Failed to parse contract abi from file {:?}: {}", path, e)) }) } @@ -114,17 +115,26 @@ pub fn load_contract + std::fmt::Debug>(path: P) -> Contract { } pub fn load_sys_contract(contract_name: &str) -> Contract { - load_contract(format!( + if let Some(contract) = load_contract_if_present(format!( "contracts/system-contracts/artifacts-zk/contracts-preprocessed/{0}.sol/{0}.json", contract_name - )) + )) { + contract + } else { + load_contract(format!( + "contracts/system-contracts/zkout/{0}.sol/{0}.json", + contract_name + )) + } } -pub fn read_contract_abi(path: impl AsRef + std::fmt::Debug) -> String { - read_file_to_json_value(path)["abi"] - .as_str() - .expect("Failed to parse abi") - .to_string() +pub fn read_contract_abi(path: impl AsRef + std::fmt::Debug) -> Option { + Some( + read_file_to_json_value(path)?["abi"] + .as_str() + .expect("Failed to parse abi") + .to_string(), + ) } pub fn bridgehub_contract() -> Contract { @@ -200,7 +210,7 @@ pub fn l1_messenger_contract() -> Contract { /// Reads bytecode from the path RELATIVE to the Cargo workspace location. pub fn read_bytecode(relative_path: impl AsRef + std::fmt::Debug) -> Vec { - read_bytecode_from_path(relative_path) + read_bytecode_from_path(relative_path).expect("Exists") } pub fn eth_contract() -> Contract { @@ -212,17 +222,25 @@ pub fn known_codes_contract() -> Contract { } /// Reads bytecode from a given path. -pub fn read_bytecode_from_path(artifact_path: impl AsRef + std::fmt::Debug) -> Vec { - let artifact = read_file_to_json_value(&artifact_path); - - let bytecode = artifact["bytecode"] - .as_str() - .unwrap_or_else(|| panic!("Bytecode not found in {:?}", artifact_path)) - .strip_prefix("0x") - .unwrap_or_else(|| panic!("Bytecode in {:?} is not hex", artifact_path)); +pub fn read_bytecode_from_path( + artifact_path: impl AsRef + std::fmt::Debug, +) -> Option> { + let artifact = read_file_to_json_value(&artifact_path)?; + + let bytecode = if let Some(bytecode) = artifact["bytecode"].as_str() { + bytecode + .strip_prefix("0x") + .unwrap_or_else(|| panic!("Bytecode in {:?} is not hex", artifact_path)) + } else { + artifact["bytecode"]["object"] + .as_str() + .unwrap_or_else(|| panic!("Bytecode not found in {:?}", artifact_path)) + }; - hex::decode(bytecode) - .unwrap_or_else(|err| panic!("Can't decode bytecode in {:?}: {}", artifact_path, err)) + Some( + hex::decode(bytecode) + .unwrap_or_else(|err| panic!("Can't decode bytecode in {:?}: {}", artifact_path, err)), + ) } pub fn read_sys_contract_bytecode(directory: &str, name: &str, lang: ContractLanguage) -> Vec { @@ -230,7 +248,7 @@ pub fn read_sys_contract_bytecode(directory: &str, name: &str, lang: ContractLan } static DEFAULT_SYSTEM_CONTRACTS_REPO: Lazy = - Lazy::new(SystemContractsRepo::from_env); + Lazy::new(SystemContractsRepo::default); /// Structure representing a system contract repository - that allows /// fetching contracts that are located there. @@ -240,14 +258,16 @@ pub struct SystemContractsRepo { pub root: PathBuf, } -impl SystemContractsRepo { +impl Default for SystemContractsRepo { /// Returns the default system contracts repository with directory based on the Cargo workspace location. - pub fn from_env() -> Self { + fn default() -> Self { SystemContractsRepo { root: home_path().join("contracts/system-contracts"), } } +} +impl SystemContractsRepo { pub fn read_sys_contract_bytecode( &self, directory: &str, @@ -255,23 +275,48 @@ impl SystemContractsRepo { lang: ContractLanguage, ) -> Vec { match lang { - ContractLanguage::Sol => read_bytecode_from_path(self.root.join(format!( - "artifacts-zk/contracts-preprocessed/{0}{1}.sol/{1}.json", - directory, name - ))), + ContractLanguage::Sol => { + if let Some(contracts) = read_bytecode_from_path( + self.root + .join(format!("zkout/{0}{1}.sol/{1}.json", directory, name)), + ) { + contracts + } else { + read_bytecode_from_path(self.root.join(format!( + "artifacts-zk/contracts-preprocessed/{0}{1}.sol/{1}.json", + directory, name + ))) + .expect("One of the outputs should exists") + } + } ContractLanguage::Yul => { - let artifacts_path = self - .root - .join(format!("contracts-preprocessed/{}artifacts/", directory)); - read_yul_bytecode_by_path(artifacts_path, name) + if let Some(contract) = read_bytecode_from_path(self.root.join(format!( + "zkout/{name}.yul/contracts-preprocessed/{directory}/{name}.yul.json", + ))) { + contract + } else { + read_zbin_bytecode_from_path(self.root.join(format!( + "contracts-preprocessed/{0}artifacts/{1}.yul.zbin", + directory, name + ))) + } } } } } pub fn read_bootloader_code(bootloader_type: &str) -> Vec { - let artifacts_path = "contracts/system-contracts/bootloader/build/artifacts/"; - read_yul_bytecode(artifacts_path, bootloader_type) + if let Some(contract) = + read_bytecode_from_path(home_path().join("contracts/system-contracts").join(format!( + "zkout/{bootloader_type}.yul/contracts-preprocessed/bootloader/{bootloader_type}.yul.json", + ))) + { + return contract; + }; + read_zbin_bytecode(format!( + "contracts/system-contracts/bootloader/build/artifacts/{}.yul.zbin", + bootloader_type + )) } fn read_proved_batch_bootloader_bytecode() -> Vec { @@ -463,6 +508,13 @@ impl BaseSystemContracts { BaseSystemContracts::load_with_bootloader(bootloader_bytecode) } + pub fn playground_post_protocol_defense() -> Self { + let bootloader_bytecode = read_zbin_bytecode( + "etc/multivm_bootloaders/vm_protocol_defense/playground_batch.yul/playground_batch.yul.zbin", + ); + BaseSystemContracts::load_with_bootloader(bootloader_bytecode) + } + pub fn estimate_gas_pre_virtual_blocks() -> Self { let bootloader_bytecode = read_zbin_bytecode( "etc/multivm_bootloaders/vm_1_3_2/fee_estimate.yul/fee_estimate.yul.zbin", @@ -526,6 +578,13 @@ impl BaseSystemContracts { BaseSystemContracts::load_with_bootloader(bootloader_bytecode) } + pub fn estimate_gas_post_protocol_defense() -> Self { + let bootloader_bytecode = read_zbin_bytecode( + "etc/multivm_bootloaders/vm_protocol_defense/fee_estimate.yul/fee_estimate.yul.zbin", + ); + BaseSystemContracts::load_with_bootloader(bootloader_bytecode) + } + pub fn hashes(&self) -> BaseSystemContractsHashes { BaseSystemContractsHashes { bootloader: self.bootloader.hash, diff --git a/core/lib/multivm/src/versions/vm_fast/tests/l1_tx_execution.rs b/core/lib/multivm/src/versions/vm_fast/tests/l1_tx_execution.rs index 1abb1e39e19b..5897ec5f2662 100644 --- a/core/lib/multivm/src/versions/vm_fast/tests/l1_tx_execution.rs +++ b/core/lib/multivm/src/versions/vm_fast/tests/l1_tx_execution.rs @@ -117,9 +117,8 @@ fn test_l1_tx_execution() { let res = vm.vm.execute(VmExecutionMode::OneTx); let storage_logs = res.logs.storage_logs; let res = StorageWritesDeduplicator::apply_on_empty_state(&storage_logs); - // We changed one slot inside contract. However, the rewrite of the `basePubdataSpent` didn't happen, since it was the same - // as the start of the previous tx. Thus we have `+1` slot for the changed counter and `-1` slot for base pubdata spent - assert_eq!(res.initial_storage_writes, basic_initial_writes); + // We changed one slot inside contract. + assert_eq!(res.initial_storage_writes - basic_initial_writes, 1); // No repeated writes let repeated_writes = res.repeated_storage_writes; @@ -146,7 +145,7 @@ fn test_l1_tx_execution() { assert!(result.result.is_failed(), "The transaction should fail"); let res = StorageWritesDeduplicator::apply_on_empty_state(&result.logs.storage_logs); - assert_eq!(res.initial_storage_writes, basic_initial_writes); + assert_eq!(res.initial_storage_writes, basic_initial_writes + 1); assert_eq!(res.repeated_storage_writes, 1); } diff --git a/core/lib/multivm/src/versions/vm_fast/tests/nonce_holder.rs b/core/lib/multivm/src/versions/vm_fast/tests/nonce_holder.rs index f72e95da9f87..6d1e0f016e9e 100644 --- a/core/lib/multivm/src/versions/vm_fast/tests/nonce_holder.rs +++ b/core/lib/multivm/src/versions/vm_fast/tests/nonce_holder.rs @@ -37,6 +37,7 @@ impl From for u8 { #[test] fn test_nonce_holder() { let mut account = Account::random(); + let hex_addr = hex::encode(account.address.to_fixed_bytes()); let mut vm = VmTesterBuilder::new() .with_empty_in_memory_storage() @@ -92,7 +93,7 @@ fn test_nonce_holder() { run_nonce_test( 1u32, NonceHolderTestMode::SetValueUnderNonce, - Some("Previous nonce has not been used".to_string()), + Some("Error function_selector = 0x13595475, data = 0x13595475".to_string()), "Allowed to set value under non sequential value", ); @@ -133,7 +134,7 @@ fn test_nonce_holder() { run_nonce_test( 10u32, NonceHolderTestMode::IncreaseMinNonceBy5, - Some("Reusing the same nonce twice".to_string()), + Some(format!("Error function_selector = 0xe90aded4, data = 0xe90aded4000000000000000000000000{hex_addr}000000000000000000000000000000000000000000000000000000000000000a")), "Allowed to reuse nonce below the minimal one", ); @@ -149,7 +150,7 @@ fn test_nonce_holder() { run_nonce_test( 13u32, NonceHolderTestMode::IncreaseMinNonceBy5, - Some("Reusing the same nonce twice".to_string()), + Some(format!("Error function_selector = 0xe90aded4, data = 0xe90aded4000000000000000000000000{hex_addr}000000000000000000000000000000000000000000000000000000000000000d")), "Allowed to reuse the same nonce twice", ); @@ -165,7 +166,7 @@ fn test_nonce_holder() { run_nonce_test( 16u32, NonceHolderTestMode::IncreaseMinNonceTooMuch, - Some("The value for incrementing the nonce is too high".to_string()), + Some("Error function_selector = 0x45ac24a6, data = 0x45ac24a600000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000040000000000000000000000".to_string()), "Allowed for incrementing min nonce too much", ); @@ -173,7 +174,7 @@ fn test_nonce_holder() { run_nonce_test( 16u32, NonceHolderTestMode::LeaveNonceUnused, - Some("The nonce was not set as used".to_string()), + Some(format!("Error function_selector = 0x1f2f8478, data = 0x1f2f8478000000000000000000000000{hex_addr}0000000000000000000000000000000000000000000000000000000000000010")), "Allowed to leave nonce as unused", ); } diff --git a/core/lib/multivm/src/versions/vm_fast/tests/rollbacks.rs b/core/lib/multivm/src/versions/vm_fast/tests/rollbacks.rs index cff72d8ec5aa..1ac14e01f8ba 100644 --- a/core/lib/multivm/src/versions/vm_fast/tests/rollbacks.rs +++ b/core/lib/multivm/src/versions/vm_fast/tests/rollbacks.rs @@ -1,7 +1,7 @@ use assert_matches::assert_matches; use ethabi::Token; use zksync_contracts::{get_loadnext_contract, test_contracts::LoadnextContractExecutionParams}; -use zksync_types::{Address, Execute, U256}; +use zksync_types::{Address, Execute, Nonce, U256}; use zksync_vm_interface::VmInterfaceExt; use crate::{ @@ -41,22 +41,40 @@ fn test_vm_rollbacks() { TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::WrongMagicValue.into()), TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::WrongSignature.into()), // The correct nonce is 0, this tx will fail - TransactionTestInfo::new_rejected(tx_2.clone(), TxModifier::WrongNonce.into()), + TransactionTestInfo::new_rejected( + tx_2.clone(), + TxModifier::WrongNonce(tx_2.nonce().unwrap(), Nonce(0)).into(), + ), // This tx will succeed TransactionTestInfo::new_processed(tx_0.clone(), false), // The correct nonce is 1, this tx will fail - TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + tx_0.clone(), + TxModifier::NonceReused(tx_0.initiator_account(), tx_0.nonce().unwrap()).into(), + ), // The correct nonce is 1, this tx will fail - TransactionTestInfo::new_rejected(tx_2.clone(), TxModifier::WrongNonce.into()), + TransactionTestInfo::new_rejected( + tx_2.clone(), + TxModifier::WrongNonce(tx_2.nonce().unwrap(), Nonce(1)).into(), + ), // This tx will succeed TransactionTestInfo::new_processed(tx_1, false), // The correct nonce is 2, this tx will fail - TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + tx_0.clone(), + TxModifier::NonceReused(tx_0.initiator_account(), tx_0.nonce().unwrap()).into(), + ), // This tx will succeed TransactionTestInfo::new_processed(tx_2.clone(), false), // This tx will fail - TransactionTestInfo::new_rejected(tx_2, TxModifier::NonceReused.into()), - TransactionTestInfo::new_rejected(tx_0, TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + tx_2.clone(), + TxModifier::NonceReused(tx_2.initiator_account(), tx_2.nonce().unwrap()).into(), + ), + TransactionTestInfo::new_rejected( + tx_0.clone(), + TxModifier::NonceReused(tx_0.initiator_account(), tx_0.nonce().unwrap()).into(), + ), ]); pretty_assertions::assert_eq!(result_without_rollbacks, result_with_rollbacks); @@ -134,12 +152,23 @@ fn test_vm_loadnext_rollbacks() { TransactionTestInfo::new_processed(loadnext_tx_1.clone(), true), TransactionTestInfo::new_rejected( loadnext_deploy_tx.clone(), - TxModifier::NonceReused.into(), + TxModifier::NonceReused( + loadnext_deploy_tx.initiator_account(), + loadnext_deploy_tx.nonce().unwrap(), + ) + .into(), ), TransactionTestInfo::new_processed(loadnext_tx_1, false), TransactionTestInfo::new_processed(loadnext_tx_2.clone(), true), TransactionTestInfo::new_processed(loadnext_tx_2.clone(), true), - TransactionTestInfo::new_rejected(loadnext_deploy_tx, TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + loadnext_deploy_tx.clone(), + TxModifier::NonceReused( + loadnext_deploy_tx.initiator_account(), + loadnext_deploy_tx.nonce().unwrap(), + ) + .into(), + ), TransactionTestInfo::new_processed(loadnext_tx_2, false), ]); diff --git a/core/lib/multivm/src/versions/vm_fast/tests/tester/transaction_test_info.rs b/core/lib/multivm/src/versions/vm_fast/tests/tester/transaction_test_info.rs index e6506ff225b3..6b1395f66340 100644 --- a/core/lib/multivm/src/versions/vm_fast/tests/tester/transaction_test_info.rs +++ b/core/lib/multivm/src/versions/vm_fast/tests/tester/transaction_test_info.rs @@ -1,6 +1,4 @@ -use std::fmt; - -use zksync_types::{ExecuteTransactionCommon, Transaction, H160, U256}; +use zksync_types::{ExecuteTransactionCommon, Nonce, Transaction, H160, U256}; use zksync_vm2::interface::{Event, StateInterface}; use super::VmTester; @@ -18,8 +16,8 @@ pub(crate) enum TxModifier { WrongSignatureLength, WrongSignature, WrongMagicValue, - WrongNonce, - NonceReused, + WrongNonce(Nonce, Nonce), + NonceReused(H160, Nonce), } #[derive(Debug, Clone)] @@ -44,15 +42,9 @@ impl From for ExpectedError { fn from(value: TxModifier) -> Self { let revert_reason = match value { TxModifier::WrongSignatureLength => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "Signature length is incorrect".to_string(), - data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 83, 105, 103, 110, 97, 116, 117, 114, 101, 32, - 108, 101, 110, 103, 116, 104, 32, 105, 115, 32, 105, 110, 99, 111, 114, 114, 101, 99, - 116, 0, 0, 0, - ], + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector: vec![144, 240, 73, 201], + data: vec![144, 240, 73, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45], }) } TxModifier::WrongSignature => { @@ -62,38 +54,35 @@ impl From for ExpectedError { }) } TxModifier::WrongMagicValue => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "v is neither 27 nor 28".to_string(), - data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 118, 32, 105, 115, 32, 110, 101, 105, 116, 104, - 101, 114, 32, 50, 55, 32, 110, 111, 114, 32, 50, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector: vec![144, 240, 73, 201], + data: vec![144, 240, 73, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], }) } - TxModifier::WrongNonce => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "Incorrect nonce".to_string(), - data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 73, 110, 99, 111, 114, 114, 101, 99, 116, 32, 110, - 111, 110, 99, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], + TxModifier::WrongNonce(expected, actual) => { + let function_selector = vec![98, 106, 222, 48]; + let expected_nonce_bytes = expected.0.to_be_bytes().to_vec(); + let actual_nonce_bytes = actual.0.to_be_bytes().to_vec(); + // padding is 28 because an address takes up 4 bytes and we need it to fill a 32 byte field + let nonce_padding = vec![0u8; 28]; + let data = [function_selector.clone(), nonce_padding.clone(), expected_nonce_bytes, nonce_padding.clone(), actual_nonce_bytes].concat(); + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector, + data }) } - TxModifier::NonceReused => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "Reusing the same nonce twice".to_string(), - data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 82, 101, 117, 115, 105, 110, 103, 32, 116, 104, - 101, 32, 115, 97, 109, 101, 32, 110, 111, 110, 99, 101, 32, 116, 119, 105, 99, 101, 0, - 0, 0, 0, - ], + TxModifier::NonceReused(addr, nonce) => { + let function_selector = vec![233, 10, 222, 212]; + let addr = addr.as_bytes().to_vec(); + // padding is 12 because an address takes up 20 bytes and we need it to fill a 32 byte field + let addr_padding = vec![0u8; 12]; + // padding is 28 because an address takes up 4 bytes and we need it to fill a 32 byte field + let nonce_padding = vec![0u8; 28]; + let data = [function_selector.clone(), addr_padding, addr, nonce_padding, nonce.0.to_be_bytes().to_vec()].concat(); + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector, + data, }) } }; @@ -119,10 +108,10 @@ impl TransactionTestInfo { } TxModifier::WrongSignature => data.signature = vec![27u8; 65], TxModifier::WrongMagicValue => data.signature = vec![1u8; 65], - TxModifier::WrongNonce => { + TxModifier::WrongNonce(_, _) => { // Do not need to modify signature for nonce error } - TxModifier::NonceReused => { + TxModifier::NonceReused(_, _) => { // Do not need to modify signature for nonce error } } @@ -203,7 +192,7 @@ impl PartialEq for VmStateDump { } impl Vm { - fn dump_state(&self) -> VmStateDump { + fn dump_state(&self) -> VmStateDump { VmStateDump { state: self.inner.dump_state(), storage_writes: self.inner.get_storage_state().collect(), diff --git a/core/lib/multivm/src/versions/vm_fast/tests/utils.rs b/core/lib/multivm/src/versions/vm_fast/tests/utils.rs index 76ca9bc5dd38..eebd825c045f 100644 --- a/core/lib/multivm/src/versions/vm_fast/tests/utils.rs +++ b/core/lib/multivm/src/versions/vm_fast/tests/utils.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use ethabi::Contract; use once_cell::sync::Lazy; use zksync_contracts::{ - load_contract, read_bytecode, read_yul_bytecode, BaseSystemContracts, SystemContractCode, + load_contract, read_bootloader_code, read_bytecode, BaseSystemContracts, SystemContractCode, }; use zksync_types::{ utils::storage_key_for_standard_token_balance, AccountTreeId, Address, StorageKey, H160, H256, @@ -64,8 +64,7 @@ pub(crate) fn read_test_contract() -> Vec { } pub(crate) fn get_bootloader(test: &str) -> SystemContractCode { - let artifacts_path = "contracts/system-contracts/bootloader/tests/artifacts/"; - let bootloader_code = read_yul_bytecode(artifacts_path, test); + let bootloader_code = read_bootloader_code(test); let bootloader_hash = hash_bytecode(&bootloader_code); SystemContractCode { diff --git a/core/lib/multivm/src/versions/vm_latest/tests/l1_tx_execution.rs b/core/lib/multivm/src/versions/vm_latest/tests/l1_tx_execution.rs index 4bb32cdf7ae0..e0e4e8228f9f 100644 --- a/core/lib/multivm/src/versions/vm_latest/tests/l1_tx_execution.rs +++ b/core/lib/multivm/src/versions/vm_latest/tests/l1_tx_execution.rs @@ -112,9 +112,8 @@ fn test_l1_tx_execution() { let res = vm.vm.execute(VmExecutionMode::OneTx); let storage_logs = res.logs.storage_logs; let res = StorageWritesDeduplicator::apply_on_empty_state(&storage_logs); - // We changed one slot inside contract. However, the rewrite of the `basePubdataSpent` didn't happen, since it was the same - // as the start of the previous tx. Thus we have `+1` slot for the changed counter and `-1` slot for base pubdata spent - assert_eq!(res.initial_storage_writes - basic_initial_writes, 0); + // We changed one slot inside contract. + assert_eq!(res.initial_storage_writes - basic_initial_writes, 1); // No repeated writes let repeated_writes = res.repeated_storage_writes; @@ -142,7 +141,7 @@ fn test_l1_tx_execution() { let res = StorageWritesDeduplicator::apply_on_empty_state(&result.logs.storage_logs); // There are only basic initial writes - assert_eq!(res.initial_storage_writes - basic_initial_writes, 1); + assert_eq!(res.initial_storage_writes - basic_initial_writes, 2); } #[test] diff --git a/core/lib/multivm/src/versions/vm_latest/tests/migration.rs b/core/lib/multivm/src/versions/vm_latest/tests/migration.rs deleted file mode 100644 index 5b8da2551808..000000000000 --- a/core/lib/multivm/src/versions/vm_latest/tests/migration.rs +++ /dev/null @@ -1,51 +0,0 @@ -use zksync_types::{get_code_key, H256, SYSTEM_CONTEXT_ADDRESS}; - -use crate::{ - interface::{TxExecutionMode, VmExecutionMode, VmInterface, VmInterfaceExt}, - vm_latest::{ - tests::{ - tester::{get_empty_storage, DeployContractsTx, TxType, VmTesterBuilder}, - utils::read_test_contract, - }, - HistoryEnabled, - }, -}; - -/// This test checks that the new bootloader will work fine even if the previous system context contract is not -/// compatible with it, i.e. the bootloader will upgrade it before starting any transaction. -#[test] -fn test_migration_for_system_context_aa_interaction() { - let mut storage = get_empty_storage(); - // We will set the system context bytecode to zero. - storage.set_value(get_code_key(&SYSTEM_CONTEXT_ADDRESS), H256::zero()); - - // In this test, we aim to test whether a simple account interaction (without any fee logic) - // will work. The account will try to deploy a simple contract from integration tests. - let mut vm = VmTesterBuilder::new(HistoryEnabled) - .with_storage(storage) - .with_execution_mode(TxExecutionMode::VerifyExecute) - .with_random_rich_accounts(1) - .build(); - - // Now, we will just proceed with standard transaction execution. - // The bootloader should be able to update system context regardless of whether - // the upgrade transaction is there or not. - let account = &mut vm.rich_accounts[0]; - let counter = read_test_contract(); - let DeployContractsTx { tx, .. } = account.get_deploy_tx(&counter, None, TxType::L2); - - vm.vm.push_transaction(tx); - let result = vm.vm.execute(VmExecutionMode::OneTx); - assert!( - !result.result.is_failed(), - "Transaction wasn't successful {:#?}", - result.result - ); - - let batch_result = vm.vm.execute(VmExecutionMode::Batch); - assert!( - !batch_result.result.is_failed(), - "Batch transaction wasn't successful {:#?}", - batch_result.result - ); -} diff --git a/core/lib/multivm/src/versions/vm_latest/tests/mod.rs b/core/lib/multivm/src/versions/vm_latest/tests/mod.rs index 112be637fe02..fadb05cc4d19 100644 --- a/core/lib/multivm/src/versions/vm_latest/tests/mod.rs +++ b/core/lib/multivm/src/versions/vm_latest/tests/mod.rs @@ -14,7 +14,6 @@ mod get_used_contracts; mod is_write_initial; mod l1_tx_execution; mod l2_blocks; -mod migration; mod nonce_holder; mod precompiles; mod prestate_tracer; diff --git a/core/lib/multivm/src/versions/vm_latest/tests/nonce_holder.rs b/core/lib/multivm/src/versions/vm_latest/tests/nonce_holder.rs index 6be49367d39e..397790a7c957 100644 --- a/core/lib/multivm/src/versions/vm_latest/tests/nonce_holder.rs +++ b/core/lib/multivm/src/versions/vm_latest/tests/nonce_holder.rs @@ -40,6 +40,7 @@ impl From for u8 { #[test] fn test_nonce_holder() { let mut account = Account::random(); + let hex_addr = hex::encode(account.address.to_fixed_bytes()); let mut vm = VmTesterBuilder::new(HistoryEnabled) .with_empty_in_memory_storage() @@ -99,7 +100,7 @@ fn test_nonce_holder() { run_nonce_test( 1u32, NonceHolderTestMode::SetValueUnderNonce, - Some("Previous nonce has not been used".to_string()), + Some("Error function_selector = 0x13595475, data = 0x13595475".to_string()), "Allowed to set value under non sequential value", ); @@ -140,7 +141,7 @@ fn test_nonce_holder() { run_nonce_test( 10u32, NonceHolderTestMode::IncreaseMinNonceBy5, - Some("Reusing the same nonce twice".to_string()), + Some(format!("Error function_selector = 0xe90aded4, data = 0xe90aded4000000000000000000000000{hex_addr}000000000000000000000000000000000000000000000000000000000000000a")), "Allowed to reuse nonce below the minimal one", ); @@ -156,7 +157,7 @@ fn test_nonce_holder() { run_nonce_test( 13u32, NonceHolderTestMode::IncreaseMinNonceBy5, - Some("Reusing the same nonce twice".to_string()), + Some(format!("Error function_selector = 0xe90aded4, data = 0xe90aded4000000000000000000000000{hex_addr}000000000000000000000000000000000000000000000000000000000000000d")), "Allowed to reuse the same nonce twice", ); @@ -172,7 +173,7 @@ fn test_nonce_holder() { run_nonce_test( 16u32, NonceHolderTestMode::IncreaseMinNonceTooMuch, - Some("The value for incrementing the nonce is too high".to_string()), + Some("Error function_selector = 0x45ac24a6, data = 0x45ac24a600000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000040000000000000000000000".to_string()), "Allowed for incrementing min nonce too much", ); @@ -180,7 +181,7 @@ fn test_nonce_holder() { run_nonce_test( 16u32, NonceHolderTestMode::LeaveNonceUnused, - Some("The nonce was not set as used".to_string()), + Some(format!("Error function_selector = 0x1f2f8478, data = 0x1f2f8478000000000000000000000000{hex_addr}0000000000000000000000000000000000000000000000000000000000000010")), "Allowed to leave nonce as unused", ); } diff --git a/core/lib/multivm/src/versions/vm_latest/tests/rollbacks.rs b/core/lib/multivm/src/versions/vm_latest/tests/rollbacks.rs index 00a5d6494fe1..2e854cfc784d 100644 --- a/core/lib/multivm/src/versions/vm_latest/tests/rollbacks.rs +++ b/core/lib/multivm/src/versions/vm_latest/tests/rollbacks.rs @@ -1,7 +1,7 @@ use assert_matches::assert_matches; use ethabi::Token; use zksync_contracts::{get_loadnext_contract, test_contracts::LoadnextContractExecutionParams}; -use zksync_types::{get_nonce_key, Address, Execute, U256}; +use zksync_types::{get_nonce_key, Address, Execute, Nonce, U256}; use crate::{ interface::{ @@ -49,22 +49,40 @@ fn test_vm_rollbacks() { TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::WrongMagicValue.into()), TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::WrongSignature.into()), // The correct nonce is 0, this tx will fail - TransactionTestInfo::new_rejected(tx_2.clone(), TxModifier::WrongNonce.into()), + TransactionTestInfo::new_rejected( + tx_2.clone(), + TxModifier::WrongNonce(tx_2.nonce().unwrap(), Nonce(0)).into(), + ), // This tx will succeed TransactionTestInfo::new_processed(tx_0.clone(), false), // The correct nonce is 1, this tx will fail - TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + tx_0.clone(), + TxModifier::NonceReused(tx_0.initiator_account(), tx_0.nonce().unwrap()).into(), + ), // The correct nonce is 1, this tx will fail - TransactionTestInfo::new_rejected(tx_2.clone(), TxModifier::WrongNonce.into()), + TransactionTestInfo::new_rejected( + tx_2.clone(), + TxModifier::WrongNonce(tx_2.nonce().unwrap(), Nonce(1)).into(), + ), // This tx will succeed TransactionTestInfo::new_processed(tx_1, false), // The correct nonce is 2, this tx will fail - TransactionTestInfo::new_rejected(tx_0.clone(), TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + tx_0.clone(), + TxModifier::NonceReused(tx_0.initiator_account(), tx_0.nonce().unwrap()).into(), + ), // This tx will succeed TransactionTestInfo::new_processed(tx_2.clone(), false), // This tx will fail - TransactionTestInfo::new_rejected(tx_2, TxModifier::NonceReused.into()), - TransactionTestInfo::new_rejected(tx_0, TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + tx_2.clone(), + TxModifier::NonceReused(tx_2.initiator_account(), tx_2.nonce().unwrap()).into(), + ), + TransactionTestInfo::new_rejected( + tx_0.clone(), + TxModifier::NonceReused(tx_0.initiator_account(), tx_0.nonce().unwrap()).into(), + ), ]); assert_eq!(result_without_rollbacks, result_with_rollbacks); @@ -142,12 +160,23 @@ fn test_vm_loadnext_rollbacks() { TransactionTestInfo::new_processed(loadnext_tx_1.clone(), true), TransactionTestInfo::new_rejected( loadnext_deploy_tx.clone(), - TxModifier::NonceReused.into(), + TxModifier::NonceReused( + loadnext_deploy_tx.initiator_account(), + loadnext_deploy_tx.nonce().unwrap(), + ) + .into(), ), TransactionTestInfo::new_processed(loadnext_tx_1, false), TransactionTestInfo::new_processed(loadnext_tx_2.clone(), true), TransactionTestInfo::new_processed(loadnext_tx_2.clone(), true), - TransactionTestInfo::new_rejected(loadnext_deploy_tx, TxModifier::NonceReused.into()), + TransactionTestInfo::new_rejected( + loadnext_deploy_tx.clone(), + TxModifier::NonceReused( + loadnext_deploy_tx.initiator_account(), + loadnext_deploy_tx.nonce().unwrap(), + ) + .into(), + ), TransactionTestInfo::new_processed(loadnext_tx_2, false), ]); diff --git a/core/lib/multivm/src/versions/vm_latest/tests/tester/transaction_test_info.rs b/core/lib/multivm/src/versions/vm_latest/tests/tester/transaction_test_info.rs index 08667ccc625f..e2155c02b7e1 100644 --- a/core/lib/multivm/src/versions/vm_latest/tests/tester/transaction_test_info.rs +++ b/core/lib/multivm/src/versions/vm_latest/tests/tester/transaction_test_info.rs @@ -1,4 +1,4 @@ -use zksync_types::{ExecuteTransactionCommon, Transaction}; +use zksync_types::{ExecuteTransactionCommon, Nonce, Transaction, H160}; use crate::{ interface::{ @@ -14,8 +14,8 @@ pub(crate) enum TxModifier { WrongSignatureLength, WrongSignature, WrongMagicValue, - WrongNonce, - NonceReused, + WrongNonce(Nonce, Nonce), + NonceReused(H160, Nonce), } #[derive(Debug, Clone)] @@ -40,14 +40,11 @@ impl From for ExpectedError { fn from(value: TxModifier) -> Self { let revert_reason = match value { TxModifier::WrongSignatureLength => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "Signature length is incorrect".to_string(), + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector: vec![144, 240, 73, 201], data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 83, 105, 103, 110, 97, 116, 117, 114, 101, 32, - 108, 101, 110, 103, 116, 104, 32, 105, 115, 32, 105, 110, 99, 111, 114, 114, 101, 99, - 116, 0, 0, 0, + 144, 240, 73, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45 ], }) } @@ -58,38 +55,35 @@ impl From for ExpectedError { }) } TxModifier::WrongMagicValue => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "v is neither 27 nor 28".to_string(), - data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 118, 32, 105, 115, 32, 110, 101, 105, 116, 104, - 101, 114, 32, 50, 55, 32, 110, 111, 114, 32, 50, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector: vec![144, 240, 73, 201], + data: vec![144, 240, 73, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], }) } - TxModifier::WrongNonce => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "Incorrect nonce".to_string(), - data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 73, 110, 99, 111, 114, 114, 101, 99, 116, 32, 110, - 111, 110, 99, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], + TxModifier::WrongNonce(expected, actual) => { + let function_selector = vec![98, 106, 222, 48]; + let expected_nonce_bytes = expected.0.to_be_bytes().to_vec(); + let actual_nonce_bytes = actual.0.to_be_bytes().to_vec(); + // padding is 28 because an address takes up 4 bytes and we need it to fill a 32 byte field + let nonce_padding = vec![0u8; 28]; + let data = [function_selector.clone(), nonce_padding.clone(), expected_nonce_bytes, nonce_padding.clone(), actual_nonce_bytes].concat(); + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector, + data }) } - TxModifier::NonceReused => { - Halt::ValidationFailed(VmRevertReason::General { - msg: "Reusing the same nonce twice".to_string(), - data: vec![ - 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 82, 101, 117, 115, 105, 110, 103, 32, 116, 104, - 101, 32, 115, 97, 109, 101, 32, 110, 111, 110, 99, 101, 32, 116, 119, 105, 99, 101, 0, - 0, 0, 0, - ], + TxModifier::NonceReused(addr, nonce) => { + let function_selector = vec![233, 10, 222, 212]; + let addr = addr.as_bytes().to_vec(); + // padding is 12 because an address takes up 20 bytes and we need it to fill a 32 byte field + let addr_padding = vec![0u8; 12]; + // padding is 28 because an address takes up 4 bytes and we need it to fill a 32 byte field + let nonce_padding = vec![0u8; 28]; + let data = [function_selector.clone(), addr_padding, addr, nonce_padding, nonce.0.to_be_bytes().to_vec()].concat(); + Halt::ValidationFailed(VmRevertReason::Unknown { + function_selector, + data, }) } }; @@ -115,10 +109,10 @@ impl TransactionTestInfo { } TxModifier::WrongSignature => data.signature = vec![27u8; 65], TxModifier::WrongMagicValue => data.signature = vec![1u8; 65], - TxModifier::WrongNonce => { + TxModifier::WrongNonce(_, _) => { // Do not need to modify signature for nonce error } - TxModifier::NonceReused => { + TxModifier::NonceReused(_, _) => { // Do not need to modify signature for nonce error } } diff --git a/core/lib/multivm/src/versions/vm_latest/tests/utils.rs b/core/lib/multivm/src/versions/vm_latest/tests/utils.rs index 4d728962febf..34582fb9ddee 100644 --- a/core/lib/multivm/src/versions/vm_latest/tests/utils.rs +++ b/core/lib/multivm/src/versions/vm_latest/tests/utils.rs @@ -1,7 +1,7 @@ use ethabi::Contract; use once_cell::sync::Lazy; use zksync_contracts::{ - load_contract, read_bytecode, read_yul_bytecode, read_zbin_bytecode, BaseSystemContracts, + load_contract, read_bootloader_code, read_bytecode, read_zbin_bytecode, BaseSystemContracts, SystemContractCode, }; use zksync_types::{ @@ -60,8 +60,7 @@ pub(crate) fn read_test_contract() -> Vec { } pub(crate) fn get_bootloader(test: &str) -> SystemContractCode { - let artifacts_path = "contracts/system-contracts/bootloader/tests/artifacts/"; - let bootloader_code = read_yul_bytecode(artifacts_path, test); + let bootloader_code = read_bootloader_code(test); let bootloader_hash = hash_bytecode(&bootloader_code); SystemContractCode { diff --git a/core/lib/vm_executor/src/oneshot/contracts.rs b/core/lib/vm_executor/src/oneshot/contracts.rs index 0e1fb9b2762f..bc433a070b3e 100644 --- a/core/lib/vm_executor/src/oneshot/contracts.rs +++ b/core/lib/vm_executor/src/oneshot/contracts.rs @@ -22,6 +22,8 @@ pub(super) struct MultiVMBaseSystemContracts { vm_1_5_0_small_memory: BaseSystemContracts, /// Contracts to be used after the 1.5.0 upgrade vm_1_5_0_increased_memory: BaseSystemContracts, + /// Contracts to be used after the protocol defense upgrade + vm_protocol_defense: BaseSystemContracts, } impl MultiVMBaseSystemContracts { @@ -55,8 +57,9 @@ impl MultiVMBaseSystemContracts { ProtocolVersionId::Version20 => &self.post_1_4_1, ProtocolVersionId::Version21 | ProtocolVersionId::Version22 => &self.post_1_4_2, ProtocolVersionId::Version23 => &self.vm_1_5_0_small_memory, - ProtocolVersionId::Version24 | ProtocolVersionId::Version25 => { - &self.vm_1_5_0_increased_memory + ProtocolVersionId::Version24 => &self.vm_1_5_0_increased_memory, + ProtocolVersionId::Version25 | ProtocolVersionId::Version26 => { + &self.vm_protocol_defense } }; let base = base.clone(); @@ -82,6 +85,7 @@ impl MultiVMBaseSystemContracts { vm_1_5_0_small_memory: BaseSystemContracts::estimate_gas_1_5_0_small_memory(), vm_1_5_0_increased_memory: BaseSystemContracts::estimate_gas_post_1_5_0_increased_memory(), + vm_protocol_defense: BaseSystemContracts::estimate_gas_post_protocol_defense(), } } @@ -98,6 +102,7 @@ impl MultiVMBaseSystemContracts { vm_1_5_0_small_memory: BaseSystemContracts::playground_1_5_0_small_memory(), vm_1_5_0_increased_memory: BaseSystemContracts::playground_post_1_5_0_increased_memory( ), + vm_protocol_defense: BaseSystemContracts::playground_post_protocol_defense(), } } } diff --git a/core/node/api_server/src/execution_sandbox/tests.rs b/core/node/api_server/src/execution_sandbox/tests.rs index 75788d480581..e342f2d73de9 100644 --- a/core/node/api_server/src/execution_sandbox/tests.rs +++ b/core/node/api_server/src/execution_sandbox/tests.rs @@ -307,9 +307,6 @@ async fn validating_transaction(set_balance: bool) { if set_balance { assert_matches!(result, ExecutionResult::Success { .. }); } else { - assert_matches!( - result, - ExecutionResult::Halt { reason } if reason.to_string().contains("Not enough balance") - ); + assert_matches!(result, ExecutionResult::Halt { .. }); } } diff --git a/core/node/api_server/src/testonly.rs b/core/node/api_server/src/testonly.rs index 45ed802d68f5..13e5ecc08ead 100644 --- a/core/node/api_server/src/testonly.rs +++ b/core/node/api_server/src/testonly.rs @@ -60,7 +60,7 @@ const COUNTER_CONTRACT_PATH: &str = const INFINITE_LOOP_CONTRACT_PATH: &str = "etc/contracts-test-data/artifacts-zk/contracts/infinite/infinite.sol/InfiniteLoop.json"; const MULTICALL3_CONTRACT_PATH: &str = - "contracts/l2-contracts/artifacts-zk/contracts/dev-contracts/Multicall3.sol/Multicall3.json"; + "contracts/l2-contracts/zkout/Multicall3.sol/Multicall3.json"; /// Inflates the provided bytecode by appending the specified amount of NOP instructions at the end. fn inflate_bytecode(bytecode: &mut Vec, nop_count: usize) { diff --git a/core/node/consensus/src/registry/abi.rs b/core/node/consensus/src/registry/abi.rs index 55cc7f9264fb..d9e2996effe4 100644 --- a/core/node/consensus/src/registry/abi.rs +++ b/core/node/consensus/src/registry/abi.rs @@ -19,7 +19,8 @@ impl AsRef for ConsensusRegistry { } impl ConsensusRegistry { - const FILE: &'static str = "contracts/l2-contracts/artifacts-zk/contracts/ConsensusRegistry.sol/ConsensusRegistry.json"; + const FILE: &'static str = + "contracts/l2-contracts/zkout/ConsensusRegistry.sol/ConsensusRegistry.json"; /// Loads bytecode of the contract. #[cfg(test)] diff --git a/core/tests/ts-integration/tests/base-token.test.ts b/core/tests/ts-integration/tests/base-token.test.ts index 70df1dff9282..8ecc9de3ddb9 100644 --- a/core/tests/ts-integration/tests/base-token.test.ts +++ b/core/tests/ts-integration/tests/base-token.test.ts @@ -9,7 +9,7 @@ import * as zksync from 'zksync-ethers'; import * as ethers from 'ethers'; import { scaledGasPrice } from '../src/helpers'; -const SECONDS = 1000; +const SECONDS = 2000; jest.setTimeout(100 * SECONDS); describe('base ERC20 contract checks', () => { diff --git a/core/tests/ts-integration/tests/contracts.test.ts b/core/tests/ts-integration/tests/contracts.test.ts index cb1bec35b51b..b17c2b335989 100644 --- a/core/tests/ts-integration/tests/contracts.test.ts +++ b/core/tests/ts-integration/tests/contracts.test.ts @@ -16,7 +16,7 @@ import * as elliptic from 'elliptic'; import { RetryProvider } from '../src/retry-provider'; const SECONDS = 1000; -jest.setTimeout(300 * SECONDS); +jest.setTimeout(400 * SECONDS); // TODO: Leave only important ones. const contracts = { diff --git a/core/tests/ts-integration/tests/system.test.ts b/core/tests/ts-integration/tests/system.test.ts index 3c09bcb7b466..7ce2f69acd6a 100644 --- a/core/tests/ts-integration/tests/system.test.ts +++ b/core/tests/ts-integration/tests/system.test.ts @@ -373,7 +373,7 @@ describe('System behavior checks', () => { const BOOTLOADER_UTILS = new ethers.Interface( require(`${ testMaster.environment().pathToHome - }/contracts/system-contracts/artifacts-zk/contracts-preprocessed/BootloaderUtilities.sol/BootloaderUtilities.json`).abi + }/contracts/system-contracts/zkout/BootloaderUtilities.sol/BootloaderUtilities.json`).abi ); return new ethers.Contract(BOOTLOADER_UTILS_ADDRESS, BOOTLOADER_UTILS, alice); diff --git a/core/tests/upgrade-test/tests/upgrade.test.ts b/core/tests/upgrade-test/tests/upgrade.test.ts index 79a690a15802..4065480b121b 100644 --- a/core/tests/upgrade-test/tests/upgrade.test.ts +++ b/core/tests/upgrade-test/tests/upgrade.test.ts @@ -236,10 +236,10 @@ describe('Upgrade test', function () { }); step('Send l1 tx for saving new bootloader', async () => { - const path = `${pathToHome}/contracts/system-contracts/bootloader/build/artifacts/playground_batch.yul/playground_batch.yul.zbin`; + const path = `${pathToHome}/contracts/system-contracts/zkout/playground_batch.yul/contracts-preprocessed/bootloader/playground_batch.yul.json`; let bootloaderCode; if (fs.existsSync(path)) { - bootloaderCode = '0x'.concat(fs.readFileSync(path).toString()); + bootloaderCode = '0x'.concat(require(path).bytecode.object); } else { const legacyPath = `${pathToHome}/contracts/system-contracts/bootloader/build/artifacts/playground_batch.yul.zbin`; bootloaderCode = ethers.hexlify(fs.readFileSync(legacyPath)); diff --git a/core/tests/upgrade-test/tests/utils.ts b/core/tests/upgrade-test/tests/utils.ts index 9f130c1e5565..2972f8411f5f 100644 --- a/core/tests/upgrade-test/tests/utils.ts +++ b/core/tests/upgrade-test/tests/utils.ts @@ -88,10 +88,10 @@ export function initContracts(pathToHome: string, zkStack: boolean): Contracts { require(`${CONTRACTS_FOLDER}/l1-contracts/out/ChainAdmin.sol/ChainAdmin.json`).abi ), l2ForceDeployUpgraderAbi: new ethers.Interface( - require(`${CONTRACTS_FOLDER}/l2-contracts/artifacts-zk/contracts/ForceDeployUpgrader.sol/ForceDeployUpgrader.json`).abi + require(`${CONTRACTS_FOLDER}/l2-contracts/zkout/ForceDeployUpgrader.sol/ForceDeployUpgrader.json`).abi ), complexUpgraderAbi: new ethers.Interface( - require(`${CONTRACTS_FOLDER}/system-contracts/artifacts-zk/contracts-preprocessed/ComplexUpgrader.sol/ComplexUpgrader.json`).abi + require(`${CONTRACTS_FOLDER}/system-contracts/zkout/ComplexUpgrader.sol/ComplexUpgrader.json`).abi ), counterBytecode: require(`${pathToHome}/core/tests/ts-integration/artifacts-zk/contracts/counter/counter.sol/Counter.json`) diff --git a/docker/contract-verifier/Dockerfile b/docker/contract-verifier/Dockerfile index 5688db2e3f52..d87a0dea1e0d 100644 --- a/docker/contract-verifier/Dockerfile +++ b/docker/contract-verifier/Dockerfile @@ -97,8 +97,7 @@ RUN mkdir -p /etc/vyper-bin/0.4.0 \ && chmod +x /etc/vyper-bin/0.4.0/vyper COPY --from=builder /usr/src/zksync/target/release/zksync_contract_verifier /usr/bin/ -COPY contracts/system-contracts/bootloader/build/artifacts/ /contracts/system-contracts/bootloader/build/artifacts/ -COPY contracts/system-contracts/artifacts-zk /contracts/system-contracts/artifacts-zk +COPY contracts/system-contracts/zkout/ /contracts/system-contracts/zkout/ # CMD tail -f /dev/null ENTRYPOINT ["zksync_contract_verifier"] diff --git a/docker/external-node/Dockerfile b/docker/external-node/Dockerfile index 1012eecfc162..f5c558607400 100644 --- a/docker/external-node/Dockerfile +++ b/docker/external-node/Dockerfile @@ -23,14 +23,9 @@ COPY --from=builder /usr/src/zksync/target/release/zksync_external_node /usr/bin COPY --from=builder /usr/src/zksync/target/release/block_reverter /usr/bin COPY --from=builder /usr/local/cargo/bin/sqlx /usr/bin COPY --from=builder /usr/src/zksync/docker/external-node/entrypoint.sh /usr/bin -COPY contracts/system-contracts/bootloader/build/artifacts/ /contracts/system-contracts/bootloader/build/artifacts/ -COPY contracts/system-contracts/contracts-preprocessed/artifacts/ /contracts/system-contracts/contracts-preprocessed/artifacts/ -COPY contracts/system-contracts/contracts-preprocessed/precompiles/artifacts/ /contracts/system-contracts/contracts-preprocessed/precompiles/artifacts/ -COPY contracts/system-contracts/artifacts-zk /contracts/system-contracts/artifacts-zk +COPY contracts/system-contracts/zkout/ /contracts/system-contracts/zkout/ COPY contracts/l1-contracts/out/ /contracts/l1-contracts/out/ -COPY contracts/l2-contracts/artifacts-zk/ /contracts/l2-contracts/artifacts-zk/ -# TODO Remove once we use foundry inside contracts repo -COPY contracts/l1-contracts/artifacts/ /contracts/l1-contracts/artifacts/ +COPY contracts/l2-contracts/zkout/ /contracts/l2-contracts/zkout/ COPY etc/tokens/ /etc/tokens/ COPY etc/ERC20/ /etc/ERC20/ COPY etc/multivm_bootloaders/ /etc/multivm_bootloaders/ diff --git a/docker/server-v2/Dockerfile b/docker/server-v2/Dockerfile index 13a391333270..319d0cefbe34 100644 --- a/docker/server-v2/Dockerfile +++ b/docker/server-v2/Dockerfile @@ -31,14 +31,9 @@ EXPOSE 3030 COPY --from=builder /usr/src/zksync/target/release/zksync_server /usr/bin COPY --from=builder /usr/src/zksync/target/release/block_reverter /usr/bin COPY --from=builder /usr/src/zksync/target/release/merkle_tree_consistency_checker /usr/bin -COPY contracts/system-contracts/bootloader/build/artifacts/ /contracts/system-contracts/bootloader/build/artifacts/ -COPY contracts/system-contracts/contracts-preprocessed/artifacts/ /contracts/system-contracts/contracts-preprocessed/artifacts/ -COPY contracts/system-contracts/contracts-preprocessed/precompiles/artifacts/ /contracts/system-contracts/contracts-preprocessed/precompiles/artifacts/ -COPY contracts/system-contracts/artifacts-zk /contracts/system-contracts/artifacts-zk +COPY contracts/system-contracts/zkout/ /contracts/system-contracts/zkout/ COPY contracts/l1-contracts/out/ /contracts/l1-contracts/out/ -COPY contracts/l2-contracts/artifacts-zk/ /contracts/l2-contracts/artifacts-zk/ -# TODO Remove once we use foundry inside contracts repo -COPY contracts/l1-contracts/artifacts/ /contracts/l1-contracts/artifacts/ +COPY contracts/l2-contracts/zkout/ /contracts/l2-contracts/zkout/ COPY etc/tokens/ /etc/tokens/ COPY etc/ERC20/ /etc/ERC20/ COPY etc/multivm_bootloaders/ /etc/multivm_bootloaders/ diff --git a/etc/env/base/chain.toml b/etc/env/base/chain.toml index 6cfacb3c72ce..903696e3a819 100644 --- a/etc/env/base/chain.toml +++ b/etc/env/base/chain.toml @@ -90,8 +90,8 @@ fee_model_version = "V2" validation_computational_gas_limit = 300000 save_call_traces = true -bootloader_hash = "0x010008e742608b21bf7eb23c1a9d0602047e3618b464c9b59c0fba3b3d7ab66e" -default_aa_hash = "0x01000563374c277a2c1e34659a2a1e87371bb6d852ce142022d497bfb50b9e32" +bootloader_hash = "0x010008c37ecadea8b003884eb9d81fdfb7161b3b309504e5318f15da19c500d8" +default_aa_hash = "0x0100055da70d970f98ca4677a4b2fcecef5354f345cc5c6d13a78339e5fd87a9" protective_reads_persistence_enabled = false diff --git a/etc/env/base/contracts.toml b/etc/env/base/contracts.toml index daa317a8bc90..dbadbbc2c776 100644 --- a/etc/env/base/contracts.toml +++ b/etc/env/base/contracts.toml @@ -26,13 +26,13 @@ RECURSION_NODE_LEVEL_VK_HASH = "0x1186ec268d49f1905f8d9c1e9d39fc33e98c74f91d91a2 RECURSION_LEAF_LEVEL_VK_HASH = "0x101e08b00193e529145ee09823378ef51a3bc8966504064f1f6ba3f1ba863210" RECURSION_CIRCUITS_SET_VKS_HASH = "0x18c1639094f58177409186e8c48d9f577c9410901d2f1d486b3e7d6cf553ae4c" GENESIS_TX_HASH = "0xb99ebfea46cbe05a21cd80fe5597d97b204befc52a16303f579c607dc1ac2e2e" -GENESIS_ROOT = "0xabdb766b18a479a5c783a4b80e12686bc8ea3cc2d8a3050491b701d72370ebb5" -GENESIS_BATCH_COMMITMENT = "0x2d00e5f8d77afcebf58a6b82ae56ba967566fe7dfbcb6760319fb0d215d18ffd" +GENESIS_ROOT = "0x28a7e67393021f957572495f8fdadc2c477ae3f4f413ae18c16cff6ee65680e2" +GENESIS_BATCH_COMMITMENT = "0xc57085380434970021d87774b377ce1bb12f5b6064af11595e70011965747def" PRIORITY_TX_MAX_GAS_LIMIT = 72000000 DEPLOY_L2_BRIDGE_COUNTERPART_GAS_LIMIT = 10000000 GENESIS_ROLLUP_LEAF_INDEX = "54" -GENESIS_PROTOCOL_VERSION = "24" -GENESIS_PROTOCOL_SEMANTIC_VERSION = "0.24.2" +GENESIS_PROTOCOL_VERSION = "25" +GENESIS_PROTOCOL_SEMANTIC_VERSION = "0.25.0" L1_WETH_BRIDGE_IMPL_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L1_WETH_BRIDGE_PROXY_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" L1_WETH_TOKEN_ADDR = "0x5E6D086F5eC079ADFF4FB3774CDf3e8D6a34F7E9" diff --git a/etc/env/file_based/genesis.yaml b/etc/env/file_based/genesis.yaml index b7d4ffebcf98..1b154b9e9eae 100644 --- a/etc/env/file_based/genesis.yaml +++ b/etc/env/file_based/genesis.yaml @@ -1,17 +1,16 @@ -genesis_root: 0xabdb766b18a479a5c783a4b80e12686bc8ea3cc2d8a3050491b701d72370ebb5 +genesis_root: 0x9b30c35100835c0d811c9d385cc9804816dbceb4461b8fe4cbb8d0d5ecdacdec genesis_rollup_leaf_index: 54 -genesis_batch_commitment: 0x2d00e5f8d77afcebf58a6b82ae56ba967566fe7dfbcb6760319fb0d215d18ffd -genesis_protocol_semantic_version: '0.24.2' -# deprecated -genesis_protocol_version: 24 -default_aa_hash: 0x01000563374c277a2c1e34659a2a1e87371bb6d852ce142022d497bfb50b9e32 -bootloader_hash: 0x010008e742608b21bf7eb23c1a9d0602047e3618b464c9b59c0fba3b3d7ab66e +genesis_batch_commitment: 0x043d432c1b668e54ada198d683516109e45e4f7f81f216ff4c4f469117732e50 +genesis_protocol_version: 25 +default_aa_hash: 0x01000523eadd3061f8e701acda503defb7ac3734ae3371e4daf7494651d8b523 +bootloader_hash: 0x010008e15394cd83a8d463d61e00b4361afbc27c932b07a9d2100861b7d05e78 l1_chain_id: 9 l2_chain_id: 270 fee_account: '0x0000000000000000000000000000000000000001' prover: recursion_scheduler_level_vk_hash: 0x14f97b81e54b35fe673d8708cc1a19e1ea5b5e348e12d31e39824ed4f42bbca2 dummy_verifier: true +genesis_protocol_semantic_version: 0.25.0 l1_batch_commit_data_generator_mode: Rollup # Uncomment to enable EVM emulation (requires to run genesis) # evm_emulator_hash: 0x01000e53aa35d9d19fa99341c2e2901cf93b3668f01569dd5c6ca409c7696b91 diff --git a/etc/lint-config/ignore.yaml b/etc/lint-config/ignore.yaml index 3d0c4869df84..b4456a6c3fd4 100644 --- a/etc/lint-config/ignore.yaml +++ b/etc/lint-config/ignore.yaml @@ -2,7 +2,8 @@ files: [ "KeysWithPlonkVerifier.sol", "TokenInit.sol", ".tslintrc.js", - ".prettierrc.js" + ".prettierrc.js", + "era-observability/README.md" ] dirs: [ "target", diff --git a/etc/multivm_bootloaders/vm_protocol_defense/fee_estimate.yul/fee_estimate.yul.zbin b/etc/multivm_bootloaders/vm_protocol_defense/fee_estimate.yul/fee_estimate.yul.zbin new file mode 100644 index 0000000000000000000000000000000000000000..f1b46172d6db15bff4ca6894b7f0d73830430003 GIT binary patch literal 75168 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 E0X?I^w*UYD literal 0 HcmV?d00001 diff --git a/etc/multivm_bootloaders/vm_protocol_defense/gas_test.yul/gas_test.yul.zbin b/etc/multivm_bootloaders/vm_protocol_defense/gas_test.yul/gas_test.yul.zbin new file mode 100644 index 0000000000000000000000000000000000000000..34d17f1752fae7f38ab1584743ce245159ff2159 GIT binary patch literal 71264 zcmeHw34C2gdGDONog>TE;zgEZ$v(nPf?r>VZ4#)AL+-ULC!vPOv9qy7H`cYS*p_5T zcI*H}ae)vBC6pzBB*lT0K*J8Nk5ZDzO>b*JTqu=V` z{w==KNzc>kR4*0IJRSA$=cZ2({x_#bshm<9HmH9AK1ccLLY1Z`jJFFv*V0Xj>$SW^ z#_iq<(iP~r@-r8x6}aZOd`1mqE>hHDR`;tP_eyP5EqonR>*(sQ{ZtE{|CQ6?d|au?Mzq(vIJ5F%jG$TQo!*IZU5-j$%T#fAeg>QtnK#wq+|77f zczlk`TgyX2C-<+VefR!g9E&jy<-S`#e~9*L(oX`EG`ECc4`NaJo;cNZ*%FR3;<=z=@PjUSS{4NWgMg86g{O&m1{ZJMB zpqpA7sb3?0qPyCU(R2!bEI6e3ubuD`5mFBLT!BLR-Z_W(ZXxFWB=c{N8=(uh$Z1ix z0zRnWd1n;-nga%rD+nIpb3X#EfSfEmN6X0oW}EpsmC|sQqlG6le3Idds6)(;N|(C> zazc3Ct;?O@ato)G``fgXL)$k|zo*jF-U9qe3%*R6+x=*o<#Zu*2A4b4p!=0=(C~h4 z@5KTK*Ag7WF?iB~=OejwT<(>++^HOuTZVEXUn-X)e5xxqKy*$`y1Jd*5vK1On0{H5 zXpsKpTrR)L8z8-E0O7DW~a#{>SK)+b49& zy+YGzG)^bLiB4a)=+qO?>1IQx9-;%$h5F&^{;M31H>4B#2|A>FrsHyyOyn;-7QXt3 zp_A~F`=B?#eENu{*?lJ6!kF9BE}i;c@Is%x}Qw=qJtJ z0Q%9ZmVi#4Vm{Y$)rIGPC||m z(8;}D=!AYVoyzJ1O(*c*Ex_v-I=RQRKDb@e>HTp!0Zw$x!H!?@;*ZD1ev%{SMH*i^+fV&PJ9)mUTt@6c?nCL;$zM}S*0K2^g#*;V*0JTH)_lQd5`pkO}G z{>PV~SwQ!u!^Yl#&VV}ujxYQta;Wtq`&WSSc8#H{X4E&hD)$({h z;h(j{`u%0$m!@&yUyM@h>>>C)nE%v(o|oV0doxd`<=*h|>C?bVp|^T+4N&r=pZfAIXPC0&Frpqmi^U1^gGM`Pq(|XN~ z!+}ru_yJx2zpFf4S%r@;|NY`)SQD{3v((Ee*zN-9H?5abPkCbbICcIE`FLj;KHd@X z@l7bcFdps4fM2Mbp&QwOd!lq3a1!a( zg4p0B%9XQ+&A-y{6J_de)9|S>@D~c){a4VXQho*cQgzHB|IsP@fss%i4u6D?E{+=L zh0jS3y79m3_~hTXU&H?e+)MtUiGC2={eQ9NL`Hf3Z?Wg(DarG%V;&g~`x#+A=@i;8 zwEnVeK8f=(5qNUGC#-Mhld9owLHldx5r6YM<8PWH{zr-am?el1`=2HcX8d-h51?zb zAJ5~#y~&F9YaNc%P7=e%ab-&Ycs z!K=j|bxi~jUcp5yWKYG(vW;IzbR3lX2(L+vch==vEQKV^0a9(}(mljnY@%o?hX z5uC5#TSRZ6KI^TF&Ua+;6sI+QS&w6RW&G}gSqDT|LZk~Y?=8y5zh{CEJ|%qO{yX@fl3tcP ze5iMm`89;w^6(#3@Xt{%s}|u`&jyTnF>DShv$t zv7JD!t#-oo#0?q`uiGdy572{pJTq%2kZY?Qm8uJVE!W@==zI9CO<&b~=t_I;e}aEl z9?~?9W>A{>1ah;E?ZI~-E*B~=7q3I)aLs{_z>IhXeo_n8w5U(gbwi%lX(2a6*QOtf zzB;GH$y2`NoR*9_(W}UB%rGDR2>elKeY~ul6}b=L$$BM(+j`}(D)_};3hUR3|G%o> z7k_Wo_*IkUhi1oD2auOSyn}gA?vJTmP_dk!X8bVYry(uMa+1S*B9{w6+8}%nJS<<1 z@=3mQTn4?UraCAn#}ArcD5i?}+MmSywx3P&+bll~&9FXPbTZI~grE3=;|=#`=vSfj z7iIZE<}HLL&szw$_(J)hD~)#r+F8qdt;eZ)*zaA&ɤrviC*){DH$^R&@l8Kak- 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 literal 0 HcmV?d00001 diff --git a/etc/multivm_bootloaders/vm_protocol_defense/playground_batch.yul/playground_batch.yul.zbin b/etc/multivm_bootloaders/vm_protocol_defense/playground_batch.yul/playground_batch.yul.zbin new file mode 100644 index 0000000000000000000000000000000000000000..55d570779dc60bfb6b763419476749bf4287307f GIT binary patch literal 75360 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 literal 0 HcmV?d00001 diff --git a/etc/upgrades/1728066632-protocol-defense/common.json b/etc/upgrades/1728066632-protocol-defense/common.json new file mode 100644 index 000000000000..4011159e2dc6 --- /dev/null +++ b/etc/upgrades/1728066632-protocol-defense/common.json @@ -0,0 +1,5 @@ +{ + "name": "protocol-defense", + "creationTimestamp": 1728066632, + "protocolVersion": "0.25.0" +} \ No newline at end of file diff --git a/etc/upgrades/1728066632-protocol-defense/stage/crypto.json b/etc/upgrades/1728066632-protocol-defense/stage/crypto.json new file mode 100644 index 000000000000..65f8a3cc0666 --- /dev/null +++ b/etc/upgrades/1728066632-protocol-defense/stage/crypto.json @@ -0,0 +1,6 @@ +{ + "verifier": { + "address": "0x06aa7a7B07108F7C5539645e32DD5c21cBF9EB66", + "txHash": "0x1e14eaa49a225d6707016cb7525ba3839e9589c0a85307105d1036133ce6c319" + } +} \ No newline at end of file diff --git a/etc/upgrades/1728066632-protocol-defense/stage/facetCuts.json b/etc/upgrades/1728066632-protocol-defense/stage/facetCuts.json new file mode 100644 index 000000000000..7389360d64e6 --- /dev/null +++ b/etc/upgrades/1728066632-protocol-defense/stage/facetCuts.json @@ -0,0 +1,198 @@ +[ + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x0e18b681", + "0x64bf8d66", + "0xa9f6d941", + "0x27ae4c16", + "0x4dd18bf5", + "0x1cc5d103", + "0xbe6f11cf", + "0xe76db865", + "0x235d9eb5", + "0x21f603d7", + "0x4623c91d", + "0x17338945", + "0xfc57565f" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x1de72e34", + "0xea6c029c", + "0xcdffacc6", + "0x52ef6b2c", + "0xadfca15e", + "0x7a0ed627", + "0x6e9960c3", + "0x98acd7a6", + "0x086a56f8", + "0x3591c1a0", + "0x79823c9a", + "0xd86970d8", + "0xfd791f3c", + "0xe5355c75", + "0x9d1b5a81", + "0x7b30c8da", + "0xd0468156", + "0x631f4bac", + "0x0ec6b0b7", + "0x33ce93fe", + "0x06d49e5b", + "0xf5c1182c", + "0x5518c73b", + "0xdb1f0bf9", + "0xb8c2f66f", + "0xef3f0bae", + "0xfe26699e", + "0x39607382", + "0xaf6a2dcd", + "0xa1954fc5", + "0x46657fe9", + "0x18e3a941", + "0x29b98c67", + "0xbd7c5412", + "0xc3bbd2d7", + "0xe81e0ba1", + "0xfacd743b", + "0x9cd939e4", + "0x56142d7a", + "0xb22dd78e", + "0x74f4d30d" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x12f43dab", + "0x6c0960f9", + "0xb473318e", + "0x042901c7", + "0x263b7f8e", + "0xe4948f43", + "0xeb672419", + "0xc924de35" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x701f58c5", + "0x6edd4f12", + "0xc3d93e7c", + "0x6f497ac6", + "0x7f61885c", + "0xc37533bb", + "0x97c09d34", + "0x0f23da43" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x90C0A0a63d7ff47BfAA1e9F8fa554dabc986504a", + "selectors": [ + "0x0e18b681", + "0x64bf8d66", + "0xa9f6d941", + "0x27ae4c16", + "0x4dd18bf5", + "0x1cc5d103", + "0xbe6f11cf", + "0xe76db865", + "0x235d9eb5", + "0x21f603d7", + "0x4623c91d", + "0x17338945", + "0xfc57565f" + ], + "action": 0, + "isFreezable": false + }, + { + "facet": "0x81754d2E48e3e553ba6Dfd193FC72B3A0c6076d9", + "selectors": [ + "0x1de72e34", + "0xea6c029c", + "0xcdffacc6", + "0x52ef6b2c", + "0xadfca15e", + "0x7a0ed627", + "0x6e9960c3", + "0x98acd7a6", + "0x086a56f8", + "0x3591c1a0", + "0x79823c9a", + "0xd86970d8", + "0xfd791f3c", + "0xe5355c75", + "0x9d1b5a81", + "0x7b30c8da", + "0xd0468156", + "0x631f4bac", + "0x0ec6b0b7", + "0x33ce93fe", + "0x06d49e5b", + "0xf5c1182c", + "0x5518c73b", + "0xdb1f0bf9", + "0xb8c2f66f", + "0xef3f0bae", + "0xfe26699e", + "0x39607382", + "0xaf6a2dcd", + "0xa1954fc5", + "0x46657fe9", + "0x18e3a941", + "0x29b98c67", + "0xbd7c5412", + "0xc3bbd2d7", + "0xe81e0ba1", + "0xfacd743b", + "0x9cd939e4", + "0x56142d7a", + "0xb22dd78e", + "0x74f4d30d" + ], + "action": 0, + "isFreezable": false + }, + { + "facet": "0x922805Cf0C00C9A19C14603529Fb1a6f63861d80", + "selectors": [ + "0x12f43dab", + "0x6c0960f9", + "0xb473318e", + "0x042901c7", + "0x263b7f8e", + "0xe4948f43", + "0xeb672419", + "0xc924de35" + ], + "action": 0, + "isFreezable": true + }, + { + "facet": "0xBB13642F795014E0EAC2b0d52ECD5162ECb66712", + "selectors": [ + "0x701f58c5", + "0x6edd4f12", + "0xc3d93e7c", + "0x6f497ac6", + "0x7f61885c", + "0xc37533bb", + "0x97c09d34", + "0x0f23da43" + ], + "action": 0, + "isFreezable": true + } +] \ No newline at end of file diff --git a/etc/upgrades/1728066632-protocol-defense/stage/facets.json b/etc/upgrades/1728066632-protocol-defense/stage/facets.json new file mode 100644 index 000000000000..acc6456181eb --- /dev/null +++ b/etc/upgrades/1728066632-protocol-defense/stage/facets.json @@ -0,0 +1,18 @@ +{ + "ExecutorFacet": { + "address": "0xBB13642F795014E0EAC2b0d52ECD5162ECb66712", + "txHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "AdminFacet": { + "address": "0x90C0A0a63d7ff47BfAA1e9F8fa554dabc986504a", + "txHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "GettersFacet": { + "address": "0x81754d2E48e3e553ba6Dfd193FC72B3A0c6076d9", + "txHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "MailboxFacet": { + "address": "0x922805Cf0C00C9A19C14603529Fb1a6f63861d80", + "txHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + } +} \ No newline at end of file diff --git a/etc/upgrades/1728066632-protocol-defense/stage/l2Upgrade.json b/etc/upgrades/1728066632-protocol-defense/stage/l2Upgrade.json new file mode 100644 index 000000000000..4ebb6009f3f4 --- /dev/null +++ b/etc/upgrades/1728066632-protocol-defense/stage/l2Upgrade.json @@ -0,0 +1,394 @@ +{ + "systemContracts": [ + { + "name": "EmptyContract", + "bytecodeHashes": [ + "0x010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd" + ], + "address": "0x0000000000000000000000000000000000000000" + }, + { + "name": "Ecrecover", + "bytecodeHashes": [ + "0x010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b" + ], + "address": "0x0000000000000000000000000000000000000001" + }, + { + "name": "SHA256", + "bytecodeHashes": [ + "0x010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a" + ], + "address": "0x0000000000000000000000000000000000000002" + }, + { + "name": "EcAdd", + "bytecodeHashes": [ + "0x01000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b85" + ], + "address": "0x0000000000000000000000000000000000000006" + }, + { + "name": "EcMul", + "bytecodeHashes": [ + "0x010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b66" + ], + "address": "0x0000000000000000000000000000000000000007" + }, + { + "name": "EcPairing", + "bytecodeHashes": [ + "0x01000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b299" + ], + "address": "0x0000000000000000000000000000000000000008" + }, + { + "name": "EmptyContract", + "bytecodeHashes": [ + "0x010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd" + ], + "address": "0x0000000000000000000000000000000000008001" + }, + { + "name": "AccountCodeStorage", + "bytecodeHashes": [ + "0x0100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e1" + ], + "address": "0x0000000000000000000000000000000000008002" + }, + { + "name": "NonceHolder", + "bytecodeHashes": [ + "0x010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c73" + ], + "address": "0x0000000000000000000000000000000000008003" + }, + { + "name": "KnownCodesStorage", + "bytecodeHashes": [ + "0x0100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac9" + ], + "address": "0x0000000000000000000000000000000000008004" + }, + { + "name": "ImmutableSimulator", + "bytecodeHashes": [ + "0x01000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a" + ], + "address": "0x0000000000000000000000000000000000008005" + }, + { + "name": "ContractDeployer", + "bytecodeHashes": [ + "0x010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee" + ], + "address": "0x0000000000000000000000000000000000008006" + }, + { + "name": "L1Messenger", + "bytecodeHashes": [ + "0x010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e" + ], + "address": "0x0000000000000000000000000000000000008008" + }, + { + "name": "MsgValueSimulator", + "bytecodeHashes": [ + "0x0100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f" + ], + "address": "0x0000000000000000000000000000000000008009" + }, + { + "name": "L2BaseToken", + "bytecodeHashes": [ + "0x01000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4" + ], + "address": "0x000000000000000000000000000000000000800a" + }, + { + "name": "SystemContext", + "bytecodeHashes": [ + "0x010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5" + ], + "address": "0x000000000000000000000000000000000000800b" + }, + { + "name": "BootloaderUtilities", + "bytecodeHashes": [ + "0x010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce" + ], + "address": "0x000000000000000000000000000000000000800c" + }, + { + "name": "EventWriter", + "bytecodeHashes": [ + "0x010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98" + ], + "address": "0x000000000000000000000000000000000000800d" + }, + { + "name": "Compressor", + "bytecodeHashes": [ + "0x0100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576" + ], + "address": "0x000000000000000000000000000000000000800e" + }, + { + "name": "ComplexUpgrader", + "bytecodeHashes": [ + "0x0100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d" + ], + "address": "0x000000000000000000000000000000000000800f" + }, + { + "name": "Keccak256", + "bytecodeHashes": [ + "0x0100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b" + ], + "address": "0x0000000000000000000000000000000000008010" + }, + { + "name": "CodeOracle", + "bytecodeHashes": [ + "0x01000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e3" + ], + "address": "0x0000000000000000000000000000000000008012" + }, + { + "name": "P256Verify", + "bytecodeHashes": [ + "0x010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a" + ], + "address": "0x0000000000000000000000000000000000000100" + }, + { + "name": "PubdataChunkPublisher", + "bytecodeHashes": [ + "0x010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db7" + ], + "address": "0x0000000000000000000000000000000000008011" + }, + { + "name": "Create2Factory", + "bytecodeHashes": [ + "0x010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf546" + ], + "address": "0x0000000000000000000000000000000000010000" + } + ], + "defaultAA": { + "name": "DefaultAccount", + "bytecodeHashes": [ + "0x0100055dba11508480be023137563caec69debc85f826cb3a4b68246a7cabe30" + ] + }, + "bootloader": { + "name": "Bootloader", + "bytecodeHashes": [ + "0x010008c3be57ae5800e077b6c2056d9d75ad1a7b4f0ce583407961cc6fe0b678" + ] + }, + "forcedDeployments": [ + { + "bytecodeHash": "0x010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd", + "newAddress": "0x0000000000000000000000000000000000000000", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b", + "newAddress": "0x0000000000000000000000000000000000000001", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a", + "newAddress": "0x0000000000000000000000000000000000000002", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x01000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b85", + "newAddress": "0x0000000000000000000000000000000000000006", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b66", + "newAddress": "0x0000000000000000000000000000000000000007", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x01000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b299", + "newAddress": "0x0000000000000000000000000000000000000008", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd", + "newAddress": "0x0000000000000000000000000000000000008001", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x0100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e1", + "newAddress": "0x0000000000000000000000000000000000008002", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c73", + "newAddress": "0x0000000000000000000000000000000000008003", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x0100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac9", + "newAddress": "0x0000000000000000000000000000000000008004", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x01000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a", + "newAddress": "0x0000000000000000000000000000000000008005", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee", + "newAddress": "0x0000000000000000000000000000000000008006", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e", + "newAddress": "0x0000000000000000000000000000000000008008", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x0100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f", + "newAddress": "0x0000000000000000000000000000000000008009", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x01000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4", + "newAddress": "0x000000000000000000000000000000000000800a", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5", + "newAddress": "0x000000000000000000000000000000000000800b", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce", + "newAddress": "0x000000000000000000000000000000000000800c", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98", + "newAddress": "0x000000000000000000000000000000000000800d", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x0100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576", + "newAddress": "0x000000000000000000000000000000000000800e", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x0100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d", + "newAddress": "0x000000000000000000000000000000000000800f", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x0100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b", + "newAddress": "0x0000000000000000000000000000000000008010", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x01000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e3", + "newAddress": "0x0000000000000000000000000000000000008012", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a", + "newAddress": "0x0000000000000000000000000000000000000100", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db7", + "newAddress": "0x0000000000000000000000000000000000008011", + "value": 0, + "input": "0x", + "callConstructor": false + }, + { + "bytecodeHash": "0x010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf546", + "newAddress": "0x0000000000000000000000000000000000010000", + "value": 0, + "input": "0x", + "callConstructor": false + } + ], + "forcedDeploymentCalldata": "0xe9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000", + "calldata": "0xe9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000", + "tx": { + "txType": 254, + "from": "0x0000000000000000000000000000000000008007", + "to": "0x0000000000000000000000000000000000008006", + "gasLimit": 72000000, + "gasPerPubdataByteLimit": 800, + "maxFeePerGas": 0, + "maxPriorityFeePerGas": 0, + "paymaster": 0, + "nonce": 25, + "value": 0, + "reserved": [ + 0, + 0, + 0, + 0 + ], + "data": "0xe9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000", + "signature": "0x", + "factoryDeps": [], + "paymasterInput": "0x", + "reservedDynamic": "0x" + }, + "delegatedCalldata": "0xe9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000" +} \ No newline at end of file diff --git a/etc/upgrades/1728066632-protocol-defense/stage/transactions.json b/etc/upgrades/1728066632-protocol-defense/stage/transactions.json new file mode 100644 index 000000000000..fceeb9bd4079 --- /dev/null +++ b/etc/upgrades/1728066632-protocol-defense/stage/transactions.json @@ -0,0 +1,253 @@ +{ + "proposeUpgradeTx": { + "l2ProtocolUpgradeTx": { + "txType": 254, + "from": "0x0000000000000000000000000000000000008007", + "to": "0x0000000000000000000000000000000000008006", + "gasLimit": 72000000, + "gasPerPubdataByteLimit": 800, + "maxFeePerGas": 0, + "maxPriorityFeePerGas": 0, + "paymaster": 0, + "nonce": 25, + "value": 0, + "reserved": [ + 0, + 0, + 0, + 0 + ], + "data": "0xe9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000", + "signature": "0x", + "factoryDeps": [], + "paymasterInput": "0x", + "reservedDynamic": "0x" + }, + "bootloaderHash": "0x010008c3be57ae5800e077b6c2056d9d75ad1a7b4f0ce583407961cc6fe0b678", + "defaultAccountHash": "0x0100055dba11508480be023137563caec69debc85f826cb3a4b68246a7cabe30", + "verifier": "0x06aa7a7B07108F7C5539645e32DD5c21cBF9EB66", + "verifierParams": { + "recursionNodeLevelVkHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "recursionLeafLevelVkHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "recursionCircuitsSetVksHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + "l1ContractsUpgradeCalldata": "0x", + "postUpgradeCalldata": "0x", + "upgradeTimestamp": { + "type": "BigNumber", + "hex": "0x6704ae40" + }, + "factoryDeps": [], + "newProtocolVersion": 107374182400, + "newAllowList": "0x0000000000000000000000000000000000000000" + }, + "l1upgradeCalldata": "0x08284e57000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000001ac0010008c3be57ae5800e077b6c2056d9d75ad1a7b4f0ce583407961cc6fe0b6780100055dba11508480be023137563caec69debc85f826cb3a4b68246a7cabe3000000000000000000000000006aa7a7b07108f7c5539645e32dd5c21cbf9eb660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000006704ae40000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000008007000000000000000000000000000000000000000000000000000000000000800600000000000000000000000000000000000000000000000000000000044aa2000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018e0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019200000000000000000000000000000000000000000000000000000000000001624e9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "upgradeAddress": "0xc11816734C1961ed67a9e2A34d9956eF8d03AD72", + "protocolVersionSemVer": "0.25.0", + "packedProtocolVersion": 107374182400, + "upgradeTimestamp": "1728360000", + "stmUpgradeCalldata": "0x2e52285100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000001800000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c11816734c1961ed67a9e2a34d9956ef8d03ad72000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000e80000000000000000000000000000000000000000000000000000000000000144000000000000000000000000000000000000000000000000000000000000015e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d0e18b6810000000000000000000000000000000000000000000000000000000064bf8d6600000000000000000000000000000000000000000000000000000000a9f6d9410000000000000000000000000000000000000000000000000000000027ae4c16000000000000000000000000000000000000000000000000000000004dd18bf5000000000000000000000000000000000000000000000000000000001cc5d10300000000000000000000000000000000000000000000000000000000be6f11cf00000000000000000000000000000000000000000000000000000000e76db86500000000000000000000000000000000000000000000000000000000235d9eb50000000000000000000000000000000000000000000000000000000021f603d7000000000000000000000000000000000000000000000000000000004623c91d000000000000000000000000000000000000000000000000000000001733894500000000000000000000000000000000000000000000000000000000fc57565f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000291de72e3400000000000000000000000000000000000000000000000000000000ea6c029c00000000000000000000000000000000000000000000000000000000cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed627000000000000000000000000000000000000000000000000000000006e9960c30000000000000000000000000000000000000000000000000000000098acd7a600000000000000000000000000000000000000000000000000000000086a56f8000000000000000000000000000000000000000000000000000000003591c1a00000000000000000000000000000000000000000000000000000000079823c9a00000000000000000000000000000000000000000000000000000000d86970d800000000000000000000000000000000000000000000000000000000fd791f3c00000000000000000000000000000000000000000000000000000000e5355c75000000000000000000000000000000000000000000000000000000009d1b5a81000000000000000000000000000000000000000000000000000000007b30c8da00000000000000000000000000000000000000000000000000000000d046815600000000000000000000000000000000000000000000000000000000631f4bac000000000000000000000000000000000000000000000000000000000ec6b0b70000000000000000000000000000000000000000000000000000000033ce93fe0000000000000000000000000000000000000000000000000000000006d49e5b00000000000000000000000000000000000000000000000000000000f5c1182c000000000000000000000000000000000000000000000000000000005518c73b00000000000000000000000000000000000000000000000000000000db1f0bf900000000000000000000000000000000000000000000000000000000b8c2f66f00000000000000000000000000000000000000000000000000000000ef3f0bae00000000000000000000000000000000000000000000000000000000fe26699e000000000000000000000000000000000000000000000000000000003960738200000000000000000000000000000000000000000000000000000000af6a2dcd00000000000000000000000000000000000000000000000000000000a1954fc50000000000000000000000000000000000000000000000000000000046657fe90000000000000000000000000000000000000000000000000000000018e3a9410000000000000000000000000000000000000000000000000000000029b98c6700000000000000000000000000000000000000000000000000000000bd7c541200000000000000000000000000000000000000000000000000000000c3bbd2d700000000000000000000000000000000000000000000000000000000e81e0ba100000000000000000000000000000000000000000000000000000000facd743b000000000000000000000000000000000000000000000000000000009cd939e40000000000000000000000000000000000000000000000000000000056142d7a00000000000000000000000000000000000000000000000000000000b22dd78e0000000000000000000000000000000000000000000000000000000074f4d30d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000812f43dab000000000000000000000000000000000000000000000000000000006c0960f900000000000000000000000000000000000000000000000000000000b473318e00000000000000000000000000000000000000000000000000000000042901c700000000000000000000000000000000000000000000000000000000263b7f8e00000000000000000000000000000000000000000000000000000000e4948f4300000000000000000000000000000000000000000000000000000000eb67241900000000000000000000000000000000000000000000000000000000c924de350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008701f58c5000000000000000000000000000000000000000000000000000000006edd4f1200000000000000000000000000000000000000000000000000000000c3d93e7c000000000000000000000000000000000000000000000000000000006f497ac6000000000000000000000000000000000000000000000000000000007f61885c00000000000000000000000000000000000000000000000000000000c37533bb0000000000000000000000000000000000000000000000000000000097c09d34000000000000000000000000000000000000000000000000000000000f23da430000000000000000000000000000000000000000000000000000000000000000000000000000000090c0a0a63d7ff47bfaa1e9f8fa554dabc986504a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d0e18b6810000000000000000000000000000000000000000000000000000000064bf8d6600000000000000000000000000000000000000000000000000000000a9f6d9410000000000000000000000000000000000000000000000000000000027ae4c16000000000000000000000000000000000000000000000000000000004dd18bf5000000000000000000000000000000000000000000000000000000001cc5d10300000000000000000000000000000000000000000000000000000000be6f11cf00000000000000000000000000000000000000000000000000000000e76db86500000000000000000000000000000000000000000000000000000000235d9eb50000000000000000000000000000000000000000000000000000000021f603d7000000000000000000000000000000000000000000000000000000004623c91d000000000000000000000000000000000000000000000000000000001733894500000000000000000000000000000000000000000000000000000000fc57565f0000000000000000000000000000000000000000000000000000000000000000000000000000000081754d2e48e3e553ba6dfd193fc72b3a0c6076d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000291de72e3400000000000000000000000000000000000000000000000000000000ea6c029c00000000000000000000000000000000000000000000000000000000cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed627000000000000000000000000000000000000000000000000000000006e9960c30000000000000000000000000000000000000000000000000000000098acd7a600000000000000000000000000000000000000000000000000000000086a56f8000000000000000000000000000000000000000000000000000000003591c1a00000000000000000000000000000000000000000000000000000000079823c9a00000000000000000000000000000000000000000000000000000000d86970d800000000000000000000000000000000000000000000000000000000fd791f3c00000000000000000000000000000000000000000000000000000000e5355c75000000000000000000000000000000000000000000000000000000009d1b5a81000000000000000000000000000000000000000000000000000000007b30c8da00000000000000000000000000000000000000000000000000000000d046815600000000000000000000000000000000000000000000000000000000631f4bac000000000000000000000000000000000000000000000000000000000ec6b0b70000000000000000000000000000000000000000000000000000000033ce93fe0000000000000000000000000000000000000000000000000000000006d49e5b00000000000000000000000000000000000000000000000000000000f5c1182c000000000000000000000000000000000000000000000000000000005518c73b00000000000000000000000000000000000000000000000000000000db1f0bf900000000000000000000000000000000000000000000000000000000b8c2f66f00000000000000000000000000000000000000000000000000000000ef3f0bae00000000000000000000000000000000000000000000000000000000fe26699e000000000000000000000000000000000000000000000000000000003960738200000000000000000000000000000000000000000000000000000000af6a2dcd00000000000000000000000000000000000000000000000000000000a1954fc50000000000000000000000000000000000000000000000000000000046657fe90000000000000000000000000000000000000000000000000000000018e3a9410000000000000000000000000000000000000000000000000000000029b98c6700000000000000000000000000000000000000000000000000000000bd7c541200000000000000000000000000000000000000000000000000000000c3bbd2d700000000000000000000000000000000000000000000000000000000e81e0ba100000000000000000000000000000000000000000000000000000000facd743b000000000000000000000000000000000000000000000000000000009cd939e40000000000000000000000000000000000000000000000000000000056142d7a00000000000000000000000000000000000000000000000000000000b22dd78e0000000000000000000000000000000000000000000000000000000074f4d30d00000000000000000000000000000000000000000000000000000000000000000000000000000000922805cf0c00c9a19c14603529fb1a6f63861d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000812f43dab000000000000000000000000000000000000000000000000000000006c0960f900000000000000000000000000000000000000000000000000000000b473318e00000000000000000000000000000000000000000000000000000000042901c700000000000000000000000000000000000000000000000000000000263b7f8e00000000000000000000000000000000000000000000000000000000e4948f4300000000000000000000000000000000000000000000000000000000eb67241900000000000000000000000000000000000000000000000000000000c924de3500000000000000000000000000000000000000000000000000000000000000000000000000000000bb13642f795014e0eac2b0d52ecd5162ecb667120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008701f58c5000000000000000000000000000000000000000000000000000000006edd4f1200000000000000000000000000000000000000000000000000000000c3d93e7c000000000000000000000000000000000000000000000000000000006f497ac6000000000000000000000000000000000000000000000000000000007f61885c00000000000000000000000000000000000000000000000000000000c37533bb0000000000000000000000000000000000000000000000000000000097c09d34000000000000000000000000000000000000000000000000000000000f23da43000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4408284e57000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000001ac0010008c3be57ae5800e077b6c2056d9d75ad1a7b4f0ce583407961cc6fe0b6780100055dba11508480be023137563caec69debc85f826cb3a4b68246a7cabe3000000000000000000000000006aa7a7b07108f7c5539645e32dd5c21cbf9eb660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000006704ae40000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000008007000000000000000000000000000000000000000000000000000000000000800600000000000000000000000000000000000000000000000000000000044aa2000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018e0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019200000000000000000000000000000000000000000000000000000000000001624e9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "chainAdminUpgradeCalldata": "0x69340beb00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000006d6e010a2680e2e5a3b097ce411528b36d880ef60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000033c4fc57565f000000000000000000000000000000000000000000000000000000180000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c11816734c1961ed67a9e2a34d9956ef8d03ad72000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000e80000000000000000000000000000000000000000000000000000000000000144000000000000000000000000000000000000000000000000000000000000015e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d0e18b6810000000000000000000000000000000000000000000000000000000064bf8d6600000000000000000000000000000000000000000000000000000000a9f6d9410000000000000000000000000000000000000000000000000000000027ae4c16000000000000000000000000000000000000000000000000000000004dd18bf5000000000000000000000000000000000000000000000000000000001cc5d10300000000000000000000000000000000000000000000000000000000be6f11cf00000000000000000000000000000000000000000000000000000000e76db86500000000000000000000000000000000000000000000000000000000235d9eb50000000000000000000000000000000000000000000000000000000021f603d7000000000000000000000000000000000000000000000000000000004623c91d000000000000000000000000000000000000000000000000000000001733894500000000000000000000000000000000000000000000000000000000fc57565f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000291de72e3400000000000000000000000000000000000000000000000000000000ea6c029c00000000000000000000000000000000000000000000000000000000cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed627000000000000000000000000000000000000000000000000000000006e9960c30000000000000000000000000000000000000000000000000000000098acd7a600000000000000000000000000000000000000000000000000000000086a56f8000000000000000000000000000000000000000000000000000000003591c1a00000000000000000000000000000000000000000000000000000000079823c9a00000000000000000000000000000000000000000000000000000000d86970d800000000000000000000000000000000000000000000000000000000fd791f3c00000000000000000000000000000000000000000000000000000000e5355c75000000000000000000000000000000000000000000000000000000009d1b5a81000000000000000000000000000000000000000000000000000000007b30c8da00000000000000000000000000000000000000000000000000000000d046815600000000000000000000000000000000000000000000000000000000631f4bac000000000000000000000000000000000000000000000000000000000ec6b0b70000000000000000000000000000000000000000000000000000000033ce93fe0000000000000000000000000000000000000000000000000000000006d49e5b00000000000000000000000000000000000000000000000000000000f5c1182c000000000000000000000000000000000000000000000000000000005518c73b00000000000000000000000000000000000000000000000000000000db1f0bf900000000000000000000000000000000000000000000000000000000b8c2f66f00000000000000000000000000000000000000000000000000000000ef3f0bae00000000000000000000000000000000000000000000000000000000fe26699e000000000000000000000000000000000000000000000000000000003960738200000000000000000000000000000000000000000000000000000000af6a2dcd00000000000000000000000000000000000000000000000000000000a1954fc50000000000000000000000000000000000000000000000000000000046657fe90000000000000000000000000000000000000000000000000000000018e3a9410000000000000000000000000000000000000000000000000000000029b98c6700000000000000000000000000000000000000000000000000000000bd7c541200000000000000000000000000000000000000000000000000000000c3bbd2d700000000000000000000000000000000000000000000000000000000e81e0ba100000000000000000000000000000000000000000000000000000000facd743b000000000000000000000000000000000000000000000000000000009cd939e40000000000000000000000000000000000000000000000000000000056142d7a00000000000000000000000000000000000000000000000000000000b22dd78e0000000000000000000000000000000000000000000000000000000074f4d30d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000812f43dab000000000000000000000000000000000000000000000000000000006c0960f900000000000000000000000000000000000000000000000000000000b473318e00000000000000000000000000000000000000000000000000000000042901c700000000000000000000000000000000000000000000000000000000263b7f8e00000000000000000000000000000000000000000000000000000000e4948f4300000000000000000000000000000000000000000000000000000000eb67241900000000000000000000000000000000000000000000000000000000c924de350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008701f58c5000000000000000000000000000000000000000000000000000000006edd4f1200000000000000000000000000000000000000000000000000000000c3d93e7c000000000000000000000000000000000000000000000000000000006f497ac6000000000000000000000000000000000000000000000000000000007f61885c00000000000000000000000000000000000000000000000000000000c37533bb0000000000000000000000000000000000000000000000000000000097c09d34000000000000000000000000000000000000000000000000000000000f23da430000000000000000000000000000000000000000000000000000000000000000000000000000000090c0a0a63d7ff47bfaa1e9f8fa554dabc986504a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d0e18b6810000000000000000000000000000000000000000000000000000000064bf8d6600000000000000000000000000000000000000000000000000000000a9f6d9410000000000000000000000000000000000000000000000000000000027ae4c16000000000000000000000000000000000000000000000000000000004dd18bf5000000000000000000000000000000000000000000000000000000001cc5d10300000000000000000000000000000000000000000000000000000000be6f11cf00000000000000000000000000000000000000000000000000000000e76db86500000000000000000000000000000000000000000000000000000000235d9eb50000000000000000000000000000000000000000000000000000000021f603d7000000000000000000000000000000000000000000000000000000004623c91d000000000000000000000000000000000000000000000000000000001733894500000000000000000000000000000000000000000000000000000000fc57565f0000000000000000000000000000000000000000000000000000000000000000000000000000000081754d2e48e3e553ba6dfd193fc72b3a0c6076d900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000291de72e3400000000000000000000000000000000000000000000000000000000ea6c029c00000000000000000000000000000000000000000000000000000000cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed627000000000000000000000000000000000000000000000000000000006e9960c30000000000000000000000000000000000000000000000000000000098acd7a600000000000000000000000000000000000000000000000000000000086a56f8000000000000000000000000000000000000000000000000000000003591c1a00000000000000000000000000000000000000000000000000000000079823c9a00000000000000000000000000000000000000000000000000000000d86970d800000000000000000000000000000000000000000000000000000000fd791f3c00000000000000000000000000000000000000000000000000000000e5355c75000000000000000000000000000000000000000000000000000000009d1b5a81000000000000000000000000000000000000000000000000000000007b30c8da00000000000000000000000000000000000000000000000000000000d046815600000000000000000000000000000000000000000000000000000000631f4bac000000000000000000000000000000000000000000000000000000000ec6b0b70000000000000000000000000000000000000000000000000000000033ce93fe0000000000000000000000000000000000000000000000000000000006d49e5b00000000000000000000000000000000000000000000000000000000f5c1182c000000000000000000000000000000000000000000000000000000005518c73b00000000000000000000000000000000000000000000000000000000db1f0bf900000000000000000000000000000000000000000000000000000000b8c2f66f00000000000000000000000000000000000000000000000000000000ef3f0bae00000000000000000000000000000000000000000000000000000000fe26699e000000000000000000000000000000000000000000000000000000003960738200000000000000000000000000000000000000000000000000000000af6a2dcd00000000000000000000000000000000000000000000000000000000a1954fc50000000000000000000000000000000000000000000000000000000046657fe90000000000000000000000000000000000000000000000000000000018e3a9410000000000000000000000000000000000000000000000000000000029b98c6700000000000000000000000000000000000000000000000000000000bd7c541200000000000000000000000000000000000000000000000000000000c3bbd2d700000000000000000000000000000000000000000000000000000000e81e0ba100000000000000000000000000000000000000000000000000000000facd743b000000000000000000000000000000000000000000000000000000009cd939e40000000000000000000000000000000000000000000000000000000056142d7a00000000000000000000000000000000000000000000000000000000b22dd78e0000000000000000000000000000000000000000000000000000000074f4d30d00000000000000000000000000000000000000000000000000000000000000000000000000000000922805cf0c00c9a19c14603529fb1a6f63861d80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000812f43dab000000000000000000000000000000000000000000000000000000006c0960f900000000000000000000000000000000000000000000000000000000b473318e00000000000000000000000000000000000000000000000000000000042901c700000000000000000000000000000000000000000000000000000000263b7f8e00000000000000000000000000000000000000000000000000000000e4948f4300000000000000000000000000000000000000000000000000000000eb67241900000000000000000000000000000000000000000000000000000000c924de3500000000000000000000000000000000000000000000000000000000000000000000000000000000bb13642f795014e0eac2b0d52ecd5162ecb667120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000008701f58c5000000000000000000000000000000000000000000000000000000006edd4f1200000000000000000000000000000000000000000000000000000000c3d93e7c000000000000000000000000000000000000000000000000000000006f497ac6000000000000000000000000000000000000000000000000000000007f61885c00000000000000000000000000000000000000000000000000000000c37533bb0000000000000000000000000000000000000000000000000000000097c09d34000000000000000000000000000000000000000000000000000000000f23da43000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b4408284e57000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000001ac0010008c3be57ae5800e077b6c2056d9d75ad1a7b4f0ce583407961cc6fe0b6780100055dba11508480be023137563caec69debc85f826cb3a4b68246a7cabe3000000000000000000000000006aa7a7b07108f7c5539645e32dd5c21cbf9eb660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000006704ae40000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000008007000000000000000000000000000000000000000000000000000000000000800600000000000000000000000000000000000000000000000000000000044aa2000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018e0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019200000000000000000000000000000000000000000000000000000000000001624e9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "diamondCut": { + "facetCuts": [ + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x0e18b681", + "0x64bf8d66", + "0xa9f6d941", + "0x27ae4c16", + "0x4dd18bf5", + "0x1cc5d103", + "0xbe6f11cf", + "0xe76db865", + "0x235d9eb5", + "0x21f603d7", + "0x4623c91d", + "0x17338945", + "0xfc57565f" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x1de72e34", + "0xea6c029c", + "0xcdffacc6", + "0x52ef6b2c", + "0xadfca15e", + "0x7a0ed627", + "0x6e9960c3", + "0x98acd7a6", + "0x086a56f8", + "0x3591c1a0", + "0x79823c9a", + "0xd86970d8", + "0xfd791f3c", + "0xe5355c75", + "0x9d1b5a81", + "0x7b30c8da", + "0xd0468156", + "0x631f4bac", + "0x0ec6b0b7", + "0x33ce93fe", + "0x06d49e5b", + "0xf5c1182c", + "0x5518c73b", + "0xdb1f0bf9", + "0xb8c2f66f", + "0xef3f0bae", + "0xfe26699e", + "0x39607382", + "0xaf6a2dcd", + "0xa1954fc5", + "0x46657fe9", + "0x18e3a941", + "0x29b98c67", + "0xbd7c5412", + "0xc3bbd2d7", + "0xe81e0ba1", + "0xfacd743b", + "0x9cd939e4", + "0x56142d7a", + "0xb22dd78e", + "0x74f4d30d" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x12f43dab", + "0x6c0960f9", + "0xb473318e", + "0x042901c7", + "0x263b7f8e", + "0xe4948f43", + "0xeb672419", + "0xc924de35" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x0000000000000000000000000000000000000000", + "selectors": [ + "0x701f58c5", + "0x6edd4f12", + "0xc3d93e7c", + "0x6f497ac6", + "0x7f61885c", + "0xc37533bb", + "0x97c09d34", + "0x0f23da43" + ], + "action": 2, + "isFreezable": false + }, + { + "facet": "0x90C0A0a63d7ff47BfAA1e9F8fa554dabc986504a", + "selectors": [ + "0x0e18b681", + "0x64bf8d66", + "0xa9f6d941", + "0x27ae4c16", + "0x4dd18bf5", + "0x1cc5d103", + "0xbe6f11cf", + "0xe76db865", + "0x235d9eb5", + "0x21f603d7", + "0x4623c91d", + "0x17338945", + "0xfc57565f" + ], + "action": 0, + "isFreezable": false + }, + { + "facet": "0x81754d2E48e3e553ba6Dfd193FC72B3A0c6076d9", + "selectors": [ + "0x1de72e34", + "0xea6c029c", + "0xcdffacc6", + "0x52ef6b2c", + "0xadfca15e", + "0x7a0ed627", + "0x6e9960c3", + "0x98acd7a6", + "0x086a56f8", + "0x3591c1a0", + "0x79823c9a", + "0xd86970d8", + "0xfd791f3c", + "0xe5355c75", + "0x9d1b5a81", + "0x7b30c8da", + "0xd0468156", + "0x631f4bac", + "0x0ec6b0b7", + "0x33ce93fe", + "0x06d49e5b", + "0xf5c1182c", + "0x5518c73b", + "0xdb1f0bf9", + "0xb8c2f66f", + "0xef3f0bae", + "0xfe26699e", + "0x39607382", + "0xaf6a2dcd", + "0xa1954fc5", + "0x46657fe9", + "0x18e3a941", + "0x29b98c67", + "0xbd7c5412", + "0xc3bbd2d7", + "0xe81e0ba1", + "0xfacd743b", + "0x9cd939e4", + "0x56142d7a", + "0xb22dd78e", + "0x74f4d30d" + ], + "action": 0, + "isFreezable": false + }, + { + "facet": "0x922805Cf0C00C9A19C14603529Fb1a6f63861d80", + "selectors": [ + "0x12f43dab", + "0x6c0960f9", + "0xb473318e", + "0x042901c7", + "0x263b7f8e", + "0xe4948f43", + "0xeb672419", + "0xc924de35" + ], + "action": 0, + "isFreezable": true + }, + { + "facet": "0xBB13642F795014E0EAC2b0d52ECD5162ECb66712", + "selectors": [ + "0x701f58c5", + "0x6edd4f12", + "0xc3d93e7c", + "0x6f497ac6", + "0x7f61885c", + "0xc37533bb", + "0x97c09d34", + "0x0f23da43" + ], + "action": 0, + "isFreezable": true + } + ], + "initAddress": "0xc11816734C1961ed67a9e2A34d9956eF8d03AD72", + "initCalldata": "0x08284e57000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000001ac0010008c3be57ae5800e077b6c2056d9d75ad1a7b4f0ce583407961cc6fe0b6780100055dba11508480be023137563caec69debc85f826cb3a4b68246a7cabe3000000000000000000000000006aa7a7b07108f7c5539645e32dd5c21cbf9eb660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000006704ae40000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000008007000000000000000000000000000000000000000000000000000000000000800600000000000000000000000000000000000000000000000000000000044aa2000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018e0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019200000000000000000000000000000000000000000000000000000000000001624e9f18c1700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000010a00000000000000000000000000000000000000000000000000000000000001160000000000000000000000000000000000000000000000000000000000000122000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000014600000000000000000000000000000000000000000000000000000000000001520010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000113d6b03e34605f26aa1fc6fb8953561eb55bb5ea192a5a38f7de3053b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000171e4e61b14feacd43cb555bffa5f194d38117132957708dcef83ac15a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000087be6181fcb16bebb0567c58b658eec345822aec1d42d471e84f758b8500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000bd553a916fcda3726f7b6b3ccfc17887166982915ced63abc78ba43b6600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000f1b5f8dd50a00b502d2663746a49a81a01857b6ee1e1b38c9959142b29900000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000078f32964c38fbd138a0369f4723f07ac6f4919c45ef738c18bf874ccd00000000000000000000000000000000000000000000000000000000000080010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005d05a277543946914759aa4a6c403604b828f80d00b900c669c3d224e100000000000000000000000000000000000000000000000000000000000080020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000d97de8c14cd36b1ce06cd7f44a09f6093ec8eb4041629c0fc2116d0c7300000000000000000000000000000000000000000000000000000000000080030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100006f0f209c9e6d06b1327db1257b15fa7a8b9864ee5ccd12cd3f8bc40ac900000000000000000000000000000000000000000000000000000000000080040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000039785a8e0d342a49b6b6c6e156801b816434d93bee85d33f56d56b4f9a00000000000000000000000000000000000000000000000000000000000080050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010004e5d52d692822d5c54ac87de3297f39be0e4a6f72f2830ae5ac856684ee00000000000000000000000000000000000000000000000000000000000080060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010002955993e8ff8190e388e94a6bb791fbe9c6388e5011c52cb587a4ebf05e00000000000000000000000000000000000000000000000000000000000080080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100005da36075675b98f85fe90df11c1d526f6b12925da3a55a8b9c02aaac5f00000000000000000000000000000000000000000000000000000000000080090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000103174a90beadc2cffe3e81bdb7b8a576174e888809c1953175fd3015b4000000000000000000000000000000000000000000000000000000000000800a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010001a5eabf9e28288b7ab7e1db316148021347460cfb4314570956867d5af5000000000000000000000000000000000000000000000000000000000000800b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010007c7bb63f64649098bf75f4baa588db20f445b4d20b7cca972d5d8f973ce000000000000000000000000000000000000000000000000000000000000800c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000159b30cba9e2096353695b63ca5cbf566416a545a6bcb2ff2e4e672f98000000000000000000000000000000000000000000000000000000000000800d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100014fb4f05ae09288cbcf4fa7a09ca456910f6e69be5ac2c2dfc8d71d1576000000000000000000000000000000000000000000000000000000000000800e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100004da9f3aa5e4febcc53522cb7ee6949369fde25dd79e977752b82b9fd5d000000000000000000000000000000000000000000000000000000000000800f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000100000ff991d5847f1e9c10c5969d0f03b34a25411ad86d5cb3e0d9c3931e0b00000000000000000000000000000000000000000000000000000000000080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000001000023d652655672eafbb0adc385bd423a4a59f752a28f3dde16e74fa205e300000000000000000000000000000000000000000000000000000000000080120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000116595cfcc96291f95d47ede2ce630f25ccbd7428f00dc7f8135fb565a00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000470e396f376539289b7975b6866914a8a0994008a02987edac8be81db700000000000000000000000000000000000000000000000000000000000080110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000010000495bd172e90725e6bfafe73e36a288d616d4673f5347eeb819a78bf54600000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } +} \ No newline at end of file diff --git a/etc/utils/src/index.ts b/etc/utils/src/index.ts index e64439c53fcb..320f9a3a8ad7 100644 --- a/etc/utils/src/index.ts +++ b/etc/utils/src/index.ts @@ -26,6 +26,7 @@ const IGNORED_DIRS = [ 'cache-zk', // Ignore directories with OZ and forge submodules. 'contracts/l1-contracts/lib', + 'contracts/lib', 'era-observability' ]; const IGNORED_FILES = ['KeysWithPlonkVerifier.sol', 'TokenInit.sol', '.tslintrc.js', '.prettierrc.js']; diff --git a/yarn.lock b/yarn.lock index 531f49abc000..255bd901e035 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1689,12 +1689,22 @@ resolved "https://registry.yarnpkg.com/@matterlabs/eslint-config-typescript/-/eslint-config-typescript-1.1.2.tgz#a9be4e56aedf298800f247c5049fc412f8b301a7" integrity sha512-AhiWJQr+MSE3RVfgp5XwGoMK7kNSKh6a18+T7hkNJtyycP0306I6IGmuFA5ZVbcakGb+K32fQWzepSkrNCTAGg== -"@matterlabs/hardhat-zksync-chai-matchers@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-chai-matchers/-/hardhat-zksync-chai-matchers-0.1.4.tgz#105cb0ec1367c8fcd3ce7e3773f747c71fff675b" - integrity sha512-eGQWiImg51fmayoQ7smIK/T6QZkSu38PK7xjp1RIrewGzw2ZgqFWGp40jb5oomkf8yOQPk52Hu4TwE3Ntp8CtA== +"@matterlabs/hardhat-zksync-chai-matchers@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-chai-matchers/-/hardhat-zksync-chai-matchers-0.2.1.tgz#d05136d6cf9a53c30f5e7ee9bae95abb72c1000d" + integrity sha512-LXm5r53DLTQC/KXRXzSRmVp5mEJ4tsoKAKyGck2YLHQ9CBdPoC0paVjbyB2MaEuK/k8o4lZu4uaYKgWQNUXeyQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@matterlabs/hardhat-zksync-deploy" "^0.7.0" + "@matterlabs/hardhat-zksync-solc" "1.0.6" + chai "^4.3.7" + chai-as-promised "^7.1.1" + ethers "~5.7.2" + hardhat "^2.14.0" + ordinal "1.0.3" + zksync-ethers "^5.0.0" -"@matterlabs/hardhat-zksync-deploy@^0.6.1", "@matterlabs/hardhat-zksync-deploy@^0.6.5": +"@matterlabs/hardhat-zksync-deploy@^0.6.1": version "0.6.6" resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-deploy/-/hardhat-zksync-deploy-0.6.6.tgz#5c86cf7da859844167d62300528c3e6013ee0286" integrity sha512-QpkxK2wnyQCgaTVLdFATpfiySfr7073yPre9eq5LfKA8VxXWD4WZAuBMq700GL5UyfW9yyHkCdkSzaGigmZ4/Q== @@ -1703,20 +1713,38 @@ chalk "4.1.2" ts-morph "^19.0.0" +"@matterlabs/hardhat-zksync-deploy@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-deploy/-/hardhat-zksync-deploy-0.7.0.tgz#e56b73d8f8fbd0f809a779d0028418ea7d914017" + integrity sha512-PGZcuhKsVzZ2IWPt931pK2gA+HDxnCtye+7CwvoOnM6diHeO9tB1QHFX/ywR9ErOW9wpezhPYkVDx9myFrdoqQ== + dependencies: + "@matterlabs/hardhat-zksync-solc" "^1.0.5" + chalk "4.1.2" + ts-morph "^19.0.0" + "@matterlabs/hardhat-zksync-deploy@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-deploy/-/hardhat-zksync-deploy-1.5.0.tgz#40cb454fb187da4bb354f3acb48762a6657fcb36" integrity sha512-7LAgYYwoKWHeR+3CyWEvA3NKBKtt7ktcr7SX6ZPgbEYqHAdXH02vxJZGwNADtMWpyYm8h+fEQkpPIgErD4NhmA== dependencies: - "@matterlabs/hardhat-zksync-solc" "^1.2.0" - chai "^4.3.4" - chalk "^4.1.2" + "@matterlabs/hardhat-zksync-solc" "^1.0.5" + chalk "4.1.2" + ts-morph "^19.0.0" + +"@matterlabs/hardhat-zksync-deploy@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-deploy/-/hardhat-zksync-deploy-1.3.0.tgz#5c2b723318ddf6c4d3929ec225401864ff54557a" + integrity sha512-4UHOgOwIBC4JA3W8DE9GHqbAuBhCPAjtM+Oew1aiYYGkIsPUAMYsH35+4I2FzJsYyE6mD6ATmoS/HfZweQHTlQ== + dependencies: + "@matterlabs/hardhat-zksync-solc" "^1.0.4" + chai "^4.3.6" + chalk "4.1.2" fs-extra "^11.2.0" - glob "^10.4.1" + glob "^10.3.10" lodash "^4.17.21" - sinon "^18.0.0" + sinon "^17.0.1" sinon-chai "^3.7.0" - ts-morph "^22.0.0" + ts-morph "^21.0.1" "@matterlabs/hardhat-zksync-node@^0.0.1-beta.7": version "0.0.1" @@ -1728,25 +1756,26 @@ chalk "4.1.2" fs-extra "^11.1.1" -"@matterlabs/hardhat-zksync-solc@0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-solc/-/hardhat-zksync-solc-0.4.1.tgz#e8e67d947098d7bb8925f968544d34e522af5a9c" - integrity sha512-fdlGf/2yZR5ihVNc2ubea1R/nNFXRONL29Fgz5FwB3azB13rPb76fkQgcFIg9zSufHsEy6zUUT029NkxLNA9Sw== +"@matterlabs/hardhat-zksync-solc@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-solc/-/hardhat-zksync-solc-0.4.2.tgz#64121082e88c5ab22eb4e9594d120e504f6af499" + integrity sha512-6NFWPSZiOAoo7wNuhMg4ztj7mMEH+tLrx09WuCbcURrHPijj/KxYNsJD6Uw5lapKr7G8H7SQISGid1/MTXVmXQ== dependencies: "@nomiclabs/hardhat-docker" "^2.0.0" chalk "4.1.2" dockerode "^3.3.4" fs-extra "^11.1.1" + proper-lockfile "^4.1.2" semver "^7.5.1" -"@matterlabs/hardhat-zksync-solc@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-solc/-/hardhat-zksync-solc-0.4.2.tgz#64121082e88c5ab22eb4e9594d120e504f6af499" - integrity sha512-6NFWPSZiOAoo7wNuhMg4ztj7mMEH+tLrx09WuCbcURrHPijj/KxYNsJD6Uw5lapKr7G8H7SQISGid1/MTXVmXQ== +"@matterlabs/hardhat-zksync-solc@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-solc/-/hardhat-zksync-solc-1.0.6.tgz#7ef8438e6bb15244691600e2afa77aaff7dff9f0" + integrity sha512-0icYSufXba/Bbb7v2iXuZJ+IbYsiNpR4Wy6UizHnGuFw3OMHgh+saebQphuaN9yyRL2UPGZbPkQFHWBLZj5/xQ== dependencies: "@nomiclabs/hardhat-docker" "^2.0.0" chalk "4.1.2" - dockerode "^3.3.4" + dockerode "^4.0.0" fs-extra "^11.1.1" proper-lockfile "^4.1.2" semver "^7.5.1" @@ -1760,7 +1789,7 @@ chalk "4.1.2" dockerode "^3.3.4" -"@matterlabs/hardhat-zksync-solc@^1.0.5", "@matterlabs/hardhat-zksync-solc@^1.1.4": +"@matterlabs/hardhat-zksync-solc@^1.0.4", "@matterlabs/hardhat-zksync-solc@^1.0.5", "@matterlabs/hardhat-zksync-solc@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-solc/-/hardhat-zksync-solc-1.1.4.tgz#04a2fad6fb6b6944c64ad969080ee65b9af3f617" integrity sha512-4/usbogh9neewR2/v8Dn2OzqVblZMUuT/iH2MyPZgPRZYQlL4SlZtMvokU9UQjZT6iSoaKCbbdWESHDHSzfUjA== @@ -1794,10 +1823,10 @@ sinon-chai "^3.7.0" undici "^6.18.2" -"@matterlabs/hardhat-zksync-solc@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-solc/-/hardhat-zksync-solc-1.2.4.tgz#b14a1dbfe751058bf2d79eab747b87c7ca7d2361" - integrity sha512-9Nk95kxOZ9rl26trP/pXDLw5MqFAd0CD8FMTGDvA5HBGk6CL2wg4tS0gmucYz5R4qj09KUYOO4FW4rgd/atcGg== +"@matterlabs/hardhat-zksync-verify@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-0.4.0.tgz#f812c19950022fc36728f3796f6bdae5633e2fcd" + integrity sha512-GPZmAumFl3ZMPKbECX7Qw8CriwZKWd1DlCRhoG/6YYc6mFy4+MXkF1XsHLMs5r34N+GDOfbVZVMeftIlJC96Kg== dependencies: "@nomiclabs/hardhat-docker" "^2.0.2" chai "^4.3.4" @@ -1811,16 +1840,17 @@ sinon-chai "^3.7.0" undici "^6.18.2" -"@matterlabs/hardhat-zksync-verify@^0.2.0": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-0.2.2.tgz#daa34bc4404096ed0f44461ee366c1cb0e5a4f2f" - integrity sha512-WgcItoZGY702oJ708uCP5uLvmwzDLBfhMqq2D0Kh1U/3fCTlPza9zMGUFHxKMQYsITKTeQ5zKOjKoi8MXOeUdQ== +"@matterlabs/hardhat-zksync-verify@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-0.4.0.tgz#f812c19950022fc36728f3796f6bdae5633e2fcd" + integrity sha512-GPZmAumFl3ZMPKbECX7Qw8CriwZKWd1DlCRhoG/6YYc6mFy4+MXkF1XsHLMs5r34N+GDOfbVZVMeftIlJC96Kg== dependencies: - "@matterlabs/hardhat-zksync-solc" "0.4.1" + "@matterlabs/hardhat-zksync-solc" "^1.0.5" "@nomicfoundation/hardhat-verify" "^1.0.2" axios "^1.4.0" chalk "4.1.2" dockerode "^3.3.4" + zksync-ethers "^5.0.0" "@matterlabs/hardhat-zksync-verify@^1.4.3": version "1.5.0" @@ -1841,20 +1871,20 @@ sinon "^18.0.0" sinon-chai "^3.7.0" -"@matterlabs/hardhat-zksync-vyper@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-vyper/-/hardhat-zksync-vyper-1.1.0.tgz#b3fb304429e88a84b4abc3fe4e5a83b2f5e907bd" - integrity sha512-zDjHPeIuHRpumXiWZUbhoji4UJe09jTDRn4xnxsuVkLH7qLAm0VDFzCXYNMvEuySZSdhbSbekxJsH9Kunc5ycA== +"@matterlabs/hardhat-zksync-vyper@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@matterlabs/hardhat-zksync-vyper/-/hardhat-zksync-vyper-1.0.8.tgz#d5bd496715a1e322b0bf3926b4146b4e18ab64ff" + integrity sha512-XR7rbfDuBG5/LZWYfhQTP9gD+U24hSJHDuZ9U55wgIfiQTOxPoztFwEbQNiC39vjT5MjP/Nv8/IDrlEBkaVCgw== dependencies: - "@nomiclabs/hardhat-docker" "^2.0.2" - chai "^4.3.4" - chalk "^4.1.2" + "@nomiclabs/hardhat-docker" "^2.0.0" + chai "^4.3.6" + chalk "4.1.2" dockerode "^4.0.2" - fs-extra "^11.2.0" - semver "^7.6.2" - sinon "^18.0.0" + fs-extra "^11.1.1" + semver "^7.5.4" + sinon "^17.0.1" sinon-chai "^3.7.0" - undici "^6.18.2" + undici "^5.14.0" "@matterlabs/prettier-config@^1.0.3": version "1.0.3" @@ -1942,6 +1972,11 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.0.tgz#bbb43f0e01f40839b0bd38c2c443cb6910ae955f" integrity sha512-7+rraFk9tCqvfemv9Ita5vTlSBAeO/S5aDKOgGRgYt0JEKZlrX161nDW6UfzMPxWl9GOLEDUzCEaYuNmXseUlg== +"@nomicfoundation/edr-darwin-arm64@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.2.tgz#52c3da9dcdab72c0447b41faa63264de84c9b6c3" + integrity sha512-o4A9SaPlxJ1MS6u8Ozqq7Y0ri2XO0jASw+qkytQyBYowNFNReoGqVSs7SCwenYCDiN+1il8+M0VAUq7wOovnCQ== + "@nomicfoundation/edr-darwin-x64@0.3.4": version "0.3.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.4.tgz#cbcc0a2dcda0a7c0a900a74efc6918cff134dc23" @@ -1952,6 +1987,11 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.0.tgz#b1ffcd9142418fd8498de34a7336b3f977907c86" integrity sha512-+Hrc0mP9L6vhICJSfyGo/2taOToy1AIzVZawO3lU8Lf7oDQXfhQ4UkZnkWAs9SVu1eUwHUGGGE0qB8644piYgg== +"@nomicfoundation/edr-darwin-x64@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.2.tgz#327deb548f2ae62eb456ba183970b022eb98c509" + integrity sha512-WG8BeG2eR3rFC+2/9V1hoPGW7tmNRUcuztdHUijO1h2flRsf2YWv+kEHO+EEnhGkEbgBUiwOrwlwlSMxhe2cGA== + "@nomicfoundation/edr-linux-arm64-gnu@0.3.4": version "0.3.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.4.tgz#12073f97d310176bb24ad7d48c25128ea8eff093" @@ -1962,6 +2002,11 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.0.tgz#8173d16d4f6f2b3e82ba7096d2a1ea3619d8bfa7" integrity sha512-4HUDMchNClQrVRfVTqBeSX92hM/3khCgpZkXP52qrnJPqgbdCxosOehlQYZ65wu0b/kaaZSyvACgvCLSQ5oSzQ== +"@nomicfoundation/edr-linux-arm64-gnu@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.2.tgz#83daecf1ced46bb4c70326e9358d0c2ae69b472a" + integrity sha512-wvHaTmOwuPjRIOqBB+paI3RBdNlG8f3e1F2zWj75EdeWwefimPzzFUs05JxOYuPO0JhDQIn2tbYUgdZbBQ+mqg== + "@nomicfoundation/edr-linux-arm64-musl@0.3.4": version "0.3.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.4.tgz#c9bc685d4d14bf21d9c3e326edd44e009e24492d" @@ -1972,6 +2017,11 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.0.tgz#b1ce293a7c3e0d9f70391e1aef1a82b83b997567" integrity sha512-D4J935ZRL8xfnP3zIFlCI9jXInJ0loDUkCTLeCEbOf2uuDumWDghKNQlF1itUS+EHaR1pFVBbuwqq8hVK0dASg== +"@nomicfoundation/edr-linux-arm64-musl@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.2.tgz#b0666da450d68364975562ec5f7c2b6ee718e36b" + integrity sha512-UrOAxnsywUcEngQM2ZxIuucci0VX29hYxX7jcpwZU50HICCjxNsxnuXYPxv+IM+6gbhBY1FYvYJGW4PJcP1Nyw== + "@nomicfoundation/edr-linux-x64-gnu@0.3.4": version "0.3.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.4.tgz#37486cbe317b8caf7961e500fc0150c45c895a56" @@ -1982,6 +2032,11 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.0.tgz#4c12c4e4bfd3d837f5663ad7cbf7cb6d5634ef83" integrity sha512-6x7HPy+uN5Cb9N77e2XMmT6+QSJ+7mRbHnhkGJ8jm4cZvWuj2Io7npOaeHQ3YHK+TiQpTnlbkjoOIpEwpY3XZA== +"@nomicfoundation/edr-linux-x64-gnu@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.2.tgz#c61ae692ddf906e65078962e6d86daaa04f95d0d" + integrity sha512-gYxlPLi7fkNcmDmCwZWQa5eOfNcTDundE+TWjpyafxLAjodQuKBD4I0p4XbnuocHjoBEeNzLWdE5RShbZEXEJA== + "@nomicfoundation/edr-linux-x64-musl@0.3.4": version "0.3.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.4.tgz#399278807100a1833f6c8a39c17d5beaaf7a9223" @@ -1992,6 +2047,11 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.0.tgz#8842004aa1a47c504f10863687da28b65dca7baa" integrity sha512-3HFIJSXgyubOiaN4MWGXx2xhTnhwlJk0PiSYNf9+L/fjBtcRkb2nM910ZJHTvqCb6OT98cUnaKuAYdXIW2amgw== +"@nomicfoundation/edr-linux-x64-musl@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.2.tgz#a2714ee7a62faf55c7994c7eaddeb32d0622801d" + integrity sha512-ev5hy9wmiHZi1GKQ1l6PJ2+UpsUh+DvK9AwiCZVEdaicuhmTfO6fdL4szgE4An8RU+Ou9DeiI1tZcq6iw++Wuw== + "@nomicfoundation/edr-win32-arm64-msvc@0.3.4": version "0.3.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.4.tgz#879028e2708538fd54efc349c1a4de107a15abb4" @@ -2012,6 +2072,11 @@ resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.0.tgz#29d8bbb2edf9912a95f5453855cf17cdcb269957" integrity sha512-CP4GsllEfXEz+lidcGYxKe5rDJ60TM5/blB5z/04ELVvw6/CK9eLcYeku7HV0jvV7VE6dADYKSdQyUkvd0El+A== +"@nomicfoundation/edr-win32-x64-msvc@0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.2.tgz#5507884a81d57f337363b7fbf9bf4ae93ff69c0c" + integrity sha512-2ZXVVcmdmEeX0Hb3IAurHUjgU3H1GIk9h7Okosdjgl3tl+BaNHxi84Us+DblynO1LRj8nL/ATeVtSfBuW3Z1vw== + "@nomicfoundation/edr@^0.3.1": version "0.3.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.4.tgz#e8eaf41963460139c47b0785f1a6a2a1c1b24ae0" @@ -2040,6 +2105,19 @@ "@nomicfoundation/edr-linux-x64-musl" "0.4.0" "@nomicfoundation/edr-win32-x64-msvc" "0.4.0" +"@nomicfoundation/edr@^0.6.1": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.2.tgz#6911d9a0b36bc054747dcd1ae894ce447400be31" + integrity sha512-yPUegN3sTWiAkRatCmGRkuvMgD9HSSpivl2ebAqq0aU2xgC7qmIO+YQPxQ3Z46MUoi7MrTf4e6GpbT4S/8x0ew== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.6.2" + "@nomicfoundation/edr-darwin-x64" "0.6.2" + "@nomicfoundation/edr-linux-arm64-gnu" "0.6.2" + "@nomicfoundation/edr-linux-arm64-musl" "0.6.2" + "@nomicfoundation/edr-linux-x64-gnu" "0.6.2" + "@nomicfoundation/edr-linux-x64-musl" "0.6.2" + "@nomicfoundation/edr-win32-x64-msvc" "0.6.2" + "@nomicfoundation/ethereumjs-common@4.0.4": version "4.0.4" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" @@ -2231,12 +2309,12 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== -"@openzeppelin/contracts-upgradeable@4.9.5": +"@openzeppelin/contracts-upgradeable-v4@npm:@openzeppelin/contracts-upgradeable@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz#572b5da102fc9be1d73f34968e0ca56765969812" integrity sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg== -"@openzeppelin/contracts@4.9.5": +"@openzeppelin/contracts-v4@npm:@openzeppelin/contracts@4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.5.tgz#1eed23d4844c861a1835b5d33507c1017fa98de8" integrity sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg== @@ -2256,6 +2334,27 @@ resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" + integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -2458,6 +2557,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + "@sinonjs/commons@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" @@ -2524,6 +2628,13 @@ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" @@ -2548,10 +2659,10 @@ mkdirp "^2.1.6" path-browserify "^1.0.1" -"@ts-morph/common@~0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.23.0.tgz#bd4ddbd3f484f29476c8bd985491592ae5fc147e" - integrity sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA== +"@ts-morph/common@~0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.22.0.tgz#8951d451622a26472fbc3a227d6c3a90e687a683" + integrity sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw== dependencies: fast-glob "^3.3.2" minimatch "^9.0.3" @@ -2703,6 +2814,11 @@ dependencies: "@types/node" "*" +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" @@ -3259,6 +3375,11 @@ antlr4@^4.11.0: resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1.tgz#1e0a1830a08faeb86217cb2e6c34716004e4253d" integrity sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== +antlr4@^4.13.1-patch-1: + version "4.13.2" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" + integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg== + antlr4ts@^0.5.0-alpha.4: version "0.5.0-alpha.4" resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" @@ -3829,6 +3950,24 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -3904,6 +4043,19 @@ chai@^4.3.10, chai@^4.3.4, chai@^4.3.6: pathval "^1.1.1" type-detect "^4.0.8" +chai@^4.3.7: + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" + chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -3973,6 +4125,13 @@ chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" + integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== + dependencies: + readdirp "^4.0.1" + chownr@^1.0.1, chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -4070,11 +4229,6 @@ code-block-writer@^12.0.0: resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-12.0.0.tgz#4dd58946eb4234105aff7f0035977b2afdc2a770" integrity sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w== -code-block-writer@^13.0.1: - version "13.0.2" - resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-13.0.2.tgz#e1c6c3dbe5d38b4ac76fb62c4d4b2fc4bf04c9c1" - integrity sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA== - collect-v8-coverage@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" @@ -4214,6 +4368,14 @@ concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -4417,6 +4579,13 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + dedent@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" @@ -4449,6 +4618,11 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -4577,7 +4751,7 @@ dockerode@^3.3.4: docker-modem "^3.0.0" tar-fs "~2.0.1" -dockerode@^4.0.2: +dockerode@^4.0.0, dockerode@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-4.0.2.tgz#dedc8529a1db3ac46d186f5912389899bc309f7d" integrity sha512-9wM1BVpVMFr2Pw3eJNXrYYt6DT9k0xMcsSCjtPvyQ+xa1iPg/Mo3T/gUcwI0B2cczqCeCYRPF8yFYDwtFXT0+w== @@ -5258,7 +5432,7 @@ ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.0.2, ethers@^5.7.0, ethers@^5.7.2, ethers@~5.7.0: +ethers@^5.0.2, ethers@^5.7.0, ethers@^5.7.2, ethers@~5.7.0, ethers@~5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -5669,6 +5843,11 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + form-data@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -5862,7 +6041,7 @@ get-stdin@~9.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -5947,17 +6126,16 @@ glob@8.1.0, glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" -glob@^10.4.1: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== +glob@^10.3.10: + version "10.3.16" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.16.tgz#bf6679d5d51279c8cfae4febe0d051d2a4bf4c6f" + integrity sha512-JDKXl1DiuuHJ6fVS2FXjownaavciiHNUU4mOvV/B793RLh05vZL1rcPnCSaOgv1hDT6RDlY7AB7ZUvFYAtPgAw== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.11.0" glob@^5.0.15: version "5.0.15" @@ -6061,6 +6239,28 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@4.2.10: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -6178,6 +6378,56 @@ hardhat@=2.22.2: uuid "^8.3.2" ws "^7.4.6" +hardhat@^2.14.0: + version "2.22.12" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.12.tgz#a6d0be011fc009c50c454da367ad28c29f58d446" + integrity sha512-yok65M+LsOeTBHQsjg//QreGCyrsaNmeLVzhTFqlOvZ4ZE5y69N0wRxH1b2BC9dGK8S8OPUJMNiL9X0RAvbm8w== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/edr" "^0.6.1" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chalk "^2.4.2" + chokidar "^4.0.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + json-stream-stringify "^3.1.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.8.26" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + hardhat@^2.22.5: version "2.22.5" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.5.tgz#7e1a4311fa9e34a1cfe337784eae06706f6469a5" @@ -6334,6 +6584,11 @@ http-basic@^8.1.1: http-response-object "^3.0.1" parse-cache-control "^1.0.1" +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -6361,6 +6616,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -6465,7 +6728,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -7243,6 +7506,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stream-stringify@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.5.tgz#7184383b397a83ac5da33b62371217522e6ac2f6" + integrity sha512-wurRuTiw27mck9MWaUIGAunfwqhPDxnXQVN/+Rzi+IEQUUALU10AZs1nWkSdtjH7PAVuAUcqQjH11S/JHOWeaA== + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -7412,6 +7680,13 @@ kleur@^3.0.3: dependencies: dotenv "^16.0.3" +latest-version@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" + integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== + dependencies: + package-json "^8.1.0" + level-codec@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" @@ -7681,6 +7956,11 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lru-cache@^10.2.0: version "10.2.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" @@ -7922,6 +8202,16 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -7974,20 +8264,13 @@ minimatch@^7.4.3: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.3: +minimatch@^9.0.1, minimatch@^9.0.3: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - minimatch@~3.0.4: version "3.0.8" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" @@ -8000,16 +8283,11 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8, minimist@~1. resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: version "7.1.1" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - mkdirp-classic@^0.5.2: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" @@ -8263,6 +8541,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== + npm-run-all@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" @@ -8406,7 +8689,7 @@ optionator@^0.9.1, optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -ordinal@^1.0.3: +ordinal@1.0.3, ordinal@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== @@ -8416,6 +8699,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -8482,10 +8770,25 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" + +package-json@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== + dependencies: + got "^12.1.0" + registry-auth-token "^5.0.1" + registry-url "^6.0.0" + semver "^7.3.7" parent-module@^1.0.0: version "1.0.1" @@ -8552,7 +8855,7 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.1: +path-scurry@^1.11.0: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -8892,6 +9195,11 @@ proper-lockfile@^4.1.2: retry "^0.12.0" signal-exit "^3.0.2" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + protobufjs@^7.2.5: version "7.2.6" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215" @@ -8978,6 +9286,11 @@ queue-microtask@^1.2.2, queue-microtask@^1.2.3: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + railroad-diagrams@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" @@ -9008,7 +9321,7 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@~1.2.7: +rc@1.2.8, rc@~1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -9064,6 +9377,11 @@ readable-stream@~1.0.26-4: isarray "0.0.1" string_decoder "~0.10.x" +readdirp@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.1.tgz#b2fe35f8dca63183cd3b86883ecc8f720ea96ae6" + integrity sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9110,6 +9428,20 @@ regexpp@^3.1.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + dependencies: + "@pnpm/npm-conf" "^2.1.0" + +registry-url@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" + integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== + dependencies: + rc "1.2.8" + req-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" @@ -9160,6 +9492,11 @@ require-from-string@^2.0.0, require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -9213,6 +9550,13 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.20.0, resolve@^1.22 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -9613,6 +9957,19 @@ solc@0.8.17: semver "^5.5.0" tmp "0.0.33" +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + solhint-plugin-prettier@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/solhint-plugin-prettier/-/solhint-plugin-prettier-0.0.5.tgz#e3b22800ba435cd640a9eca805a7f8bc3e3e6a6b" @@ -9620,6 +9977,32 @@ solhint-plugin-prettier@^0.0.5: dependencies: prettier-linter-helpers "^1.0.0" +solhint@4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-4.5.4.tgz#171cf33f46c36b8499efe60c0e425f6883a54e50" + integrity sha512-Cu1XiJXub2q1eCr9kkJ9VPv1sGcmj3V7Zb76B0CoezDOB9bu3DxKIFFH7ggCl9fWpEPD6xBmRLfZrYijkVmujQ== + dependencies: + "@solidity-parser/parser" "^0.18.0" + ajv "^6.12.6" + antlr4 "^4.13.1-patch-1" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + latest-version "^7.0.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^7.5.2" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" + optionalDependencies: + prettier "^2.8.3" + solhint@^3.3.2, solhint@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" @@ -10019,7 +10402,7 @@ synckit@^0.8.6: "system-contracts@link:contracts/system-contracts": version "0.1.0" dependencies: - "@matterlabs/hardhat-zksync-deploy" "^0.6.5" + "@matterlabs/hardhat-zksync-deploy" "^0.7.0" "@matterlabs/hardhat-zksync-solc" "^1.1.4" "@matterlabs/hardhat-zksync-verify" "^1.4.3" commander "^9.4.1" @@ -10030,7 +10413,6 @@ synckit@^0.8.6: fast-glob "^3.3.2" hardhat "=2.22.2" preprocess "^3.2.0" - zksync-ethers "^5.9.0" table-layout@^1.0.2: version "1.0.2" @@ -10282,13 +10664,13 @@ ts-morph@^19.0.0: "@ts-morph/common" "~0.20.0" code-block-writer "^12.0.0" -ts-morph@^22.0.0: - version "22.0.0" - resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-22.0.0.tgz#5532c592fb6dddae08846f12c9ab0fc590b1d42e" - integrity sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw== +ts-morph@^21.0.1: + version "21.0.1" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-21.0.1.tgz#712302a0f6e9dbf1aa8d9cf33a4386c4b18c2006" + integrity sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg== dependencies: - "@ts-morph/common" "~0.23.0" - code-block-writer "^13.0.1" + "@ts-morph/common" "~0.22.0" + code-block-writer "^12.0.0" ts-node@^10.1.0, ts-node@^10.7.0: version "10.9.2" @@ -10387,6 +10769,11 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -10919,7 +11306,7 @@ zksync-ethers@5.8.0-beta.5: dependencies: ethers "~5.7.0" -zksync-ethers@^5.9.0: +zksync-ethers@^5.0.0, zksync-ethers@^5.9.0: version "5.9.2" resolved "https://registry.yarnpkg.com/zksync-ethers/-/zksync-ethers-5.9.2.tgz#1c5f34cb25ac0b040fd1a6118f2ba1c2c3bda090" integrity sha512-Y2Mx6ovvxO6UdC2dePLguVzvNToOY8iLWeq5ne+jgGSJxAi/f4He/NF6FNsf6x1aWX0o8dy4Df8RcOQXAkj5qw== @@ -10930,10 +11317,3 @@ zksync-ethers@^6.9.0: version "6.9.0" resolved "https://registry.yarnpkg.com/zksync-ethers/-/zksync-ethers-6.9.0.tgz#efaff1d59e2cff837eeda84c4ba59fdca4972a91" integrity sha512-2CppwvLHtz689L7E9EhevbFtsqVukKC/lVicwdeUS2yqV46ET4iBR11rYdEfGW2oEo1h6yJuuwIBDFm2SybkIA== - -zksync-web3@^0.15.4: - version "0.15.5" - resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.15.5.tgz#aabe379464963ab573e15948660a709f409b5316" - integrity sha512-97gB7OKJL4spegl8fGO54g6cvTd/75G6yFWZWEa2J09zhjTrfqabbwE/GwiUJkFQ5BbzoH4JaTlVz1hoYZI+DQ== - dependencies: - ethers "~5.7.0" diff --git a/zkstack_cli/crates/common/src/contracts.rs b/zkstack_cli/crates/common/src/contracts.rs new file mode 100644 index 000000000000..c95849131c1f --- /dev/null +++ b/zkstack_cli/crates/common/src/contracts.rs @@ -0,0 +1,42 @@ +use std::path::PathBuf; + +use xshell::{cmd, Shell}; + +use crate::cmd::Cmd; + +pub fn build_test_contracts(shell: Shell, link_to_code: PathBuf) -> anyhow::Result<()> { + let _dir_guard = shell.push_dir(link_to_code.join("etc/contracts-test-data")); + Cmd::new(cmd!(shell, "yarn install")).run()?; + Ok(Cmd::new(cmd!(shell, "yarn build")).run()?) +} + +pub fn build_l1_contracts(shell: Shell, link_to_code: PathBuf) -> anyhow::Result<()> { + let _dir_guard = shell.push_dir(link_to_code.join("contracts/l1-contracts")); + Ok(Cmd::new(cmd!(shell, "forge build")).run()?) +} + +pub fn build_l2_contracts(shell: Shell, link_to_code: PathBuf) -> anyhow::Result<()> { + let _dir_guard = shell.push_dir(link_to_code.join("contracts/l2-contracts")); + Ok(Cmd::new(cmd!( + shell, + "forge build --zksync --zk-enable-eravm-extensions" + )) + .run()?) +} + +pub fn build_system_contracts(shell: Shell, link_to_code: PathBuf) -> anyhow::Result<()> { + let _dir_guard = shell.push_dir(link_to_code.join("contracts/system-contracts")); + Cmd::new(cmd!(shell, "yarn install")).run()?; + Cmd::new(cmd!(shell, "yarn preprocess:system-contracts")).run()?; + Cmd::new(cmd!( + shell, + "forge build --zksync --zk-enable-eravm-extensions" + )) + .run()?; + Cmd::new(cmd!(shell, "yarn preprocess:bootloader")).run()?; + Ok(Cmd::new(cmd!( + shell, + "forge build --zksync --zk-enable-eravm-extensions" + )) + .run()?) +} diff --git a/zkstack_cli/crates/common/src/lib.rs b/zkstack_cli/crates/common/src/lib.rs index b0fbdab0d1b0..9680bdd8df39 100644 --- a/zkstack_cli/crates/common/src/lib.rs +++ b/zkstack_cli/crates/common/src/lib.rs @@ -4,6 +4,7 @@ mod term; pub mod cmd; pub mod config; +pub mod contracts; pub mod db; pub mod docker; pub mod ethereum; diff --git a/zkstack_cli/crates/common/src/prerequisites.rs b/zkstack_cli/crates/common/src/prerequisites.rs index 7845249a1ed3..72d3c7d8041d 100644 --- a/zkstack_cli/crates/common/src/prerequisites.rs +++ b/zkstack_cli/crates/common/src/prerequisites.rs @@ -2,74 +2,99 @@ use xshell::{cmd, Shell}; use crate::{cmd::Cmd, logger}; -const PREREQUISITES: [Prerequisite; 5] = [ - Prerequisite { - name: "git", - download_link: "https://git-scm.com/book/en/v2/Getting-Started-Installing-Git", - }, - Prerequisite { - name: "docker", - download_link: "https://docs.docker.com/get-docker/", - }, - Prerequisite { - name: "forge", - download_link: "https://book.getfoundry.sh/getting-started/installation", - }, - Prerequisite { - name: "cargo", - download_link: "https://doc.rust-lang.org/cargo/getting-started/installation.html", - }, - Prerequisite { - name: "yarn", - download_link: "https://yarnpkg.com/getting-started/install", - }, -]; +fn prerequisites() -> [Prerequisite; 5] { + [ + Prerequisite { + name: "git", + download_link: "https://git-scm.com/book/en/v2/Getting-Started-Installing-Git", + custom_validator: None, + }, + Prerequisite { + name: "docker", + download_link: "https://docs.docker.com/get-docker/", + custom_validator: None, + }, + Prerequisite { + name: "forge", + download_link: + "https://github.com/matter-labs/foundry-zksync?tab=readme-ov-file#quick-install", + custom_validator: Some(Box::new(|| { + let shell = Shell::new().unwrap(); + let Ok(result) = Cmd::new(cmd!(shell, "forge build --help")).run_with_output() + else { + return false; + }; + let Ok(stdout) = String::from_utf8(result.stdout) else { + return false; + }; + stdout.contains("ZKSync configuration") + })), + }, + Prerequisite { + name: "cargo", + download_link: "https://doc.rust-lang.org/cargo/getting-started/installation.html", + custom_validator: None, + }, + Prerequisite { + name: "yarn", + download_link: "https://yarnpkg.com/getting-started/install", + custom_validator: None, + }, + ] +} const DOCKER_COMPOSE_PREREQUISITE: Prerequisite = Prerequisite { name: "docker compose", download_link: "https://docs.docker.com/compose/install/", + custom_validator: None, }; pub const GPU_PREREQUISITES: [Prerequisite; 3] = [ Prerequisite { name: "cmake", download_link: "https://cmake.org/download/", + custom_validator: None, }, Prerequisite { name: "nvcc", download_link: "https://developer.nvidia.com/cuda-downloads", + custom_validator: None, }, // CUDA toolkit Prerequisite { name: "nvidia-smi", download_link: "https://developer.nvidia.com/cuda-downloads", + custom_validator: None, }, // CUDA GPU driver ]; pub const GCLOUD_PREREQUISITE: [Prerequisite; 1] = [Prerequisite { name: "gcloud", download_link: "https://cloud.google.com/sdk/docs/install", + custom_validator: None, }]; pub const PROVER_CLI_PREREQUISITE: [Prerequisite; 1] = [Prerequisite { name: "prover_cli", download_link: "https://github.com/matter-labs/zksync-era/tree/main/prover/crates/bin/prover_cli", + custom_validator: None, }]; pub struct Prerequisite { name: &'static str, download_link: &'static str, + custom_validator: Option bool>>, } pub fn check_general_prerequisites(shell: &Shell) { - check_prerequisites(shell, &PREREQUISITES, true); + check_prerequisites(shell, &prerequisites(), true); } pub fn check_prerequisites(shell: &Shell, prerequisites: &[Prerequisite], check_compose: bool) { let mut missing_prerequisites = vec![]; for prerequisite in prerequisites { - if !check_prerequisite(shell, prerequisite.name) { + if !check_prerequisite(shell, prerequisite) { missing_prerequisites.push(prerequisite); } } @@ -95,8 +120,15 @@ pub fn check_prerequisites(shell: &Shell, prerequisites: &[Prerequisite], check_ } } -fn check_prerequisite(shell: &Shell, name: &str) -> bool { - Cmd::new(cmd!(shell, "which {name}")).run().is_ok() +fn check_prerequisite(shell: &Shell, prerequisite: &Prerequisite) -> bool { + let name = prerequisite.name; + if Cmd::new(cmd!(shell, "which {name}")).run().is_err() { + return false; + } + let Some(custom) = &prerequisite.custom_validator else { + return true; + }; + custom() } fn check_docker_compose_prerequisite(shell: &Shell) -> bool { diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/deploy_l2_contracts.rs b/zkstack_cli/crates/zkstack/src/commands/chain/deploy_l2_contracts.rs index 5a4f1f86f350..8dbd5c371c88 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/deploy_l2_contracts.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/deploy_l2_contracts.rs @@ -2,7 +2,7 @@ use std::path::Path; use anyhow::Context; use common::{ - cmd::Cmd, + contracts::build_l2_contracts, forge::{Forge, ForgeScriptArgs}, spinner::Spinner, }; @@ -20,7 +20,7 @@ use config::{ traits::{ReadConfig, SaveConfig, SaveConfigWithBasePath}, ChainConfig, ContractsConfig, EcosystemConfig, }; -use xshell::{cmd, Shell}; +use xshell::Shell; use crate::{ messages::{ @@ -121,7 +121,7 @@ async fn build_and_deploy( signature: Option<&str>, mut update_config: impl FnMut(&Shell, &Path) -> anyhow::Result<()>, ) -> anyhow::Result<()> { - build_l2_contracts(shell, &ecosystem_config.link_to_code)?; + build_l2_contracts(shell.clone(), ecosystem_config.link_to_code.clone())?; call_forge(shell, chain_config, ecosystem_config, forge_args, signature).await?; update_config( shell, @@ -283,8 +283,3 @@ async fn call_forge( forge.run(shell)?; Ok(()) } - -fn build_l2_contracts(shell: &Shell, link_to_code: &Path) -> anyhow::Result<()> { - let _dir_guard = shell.push_dir(link_to_code.join("contracts")); - Ok(Cmd::new(cmd!(shell, "yarn l2 build")).run()?) -} diff --git a/zkstack_cli/crates/zkstack/src/commands/dev/commands/contracts.rs b/zkstack_cli/crates/zkstack/src/commands/dev/commands/contracts.rs index 6f420e66ba03..fbafaec09e6e 100644 --- a/zkstack_cli/crates/zkstack/src/commands/dev/commands/contracts.rs +++ b/zkstack_cli/crates/zkstack/src/commands/dev/commands/contracts.rs @@ -1,16 +1,21 @@ use std::path::PathBuf; use clap::Parser; -use common::{cmd::Cmd, logger, spinner::Spinner}; +use common::{ + contracts::{ + build_l1_contracts, build_l2_contracts, build_system_contracts, build_test_contracts, + }, + logger, + spinner::Spinner, +}; use config::EcosystemConfig; -use xshell::{cmd, Shell}; +use xshell::Shell; use crate::commands::dev::messages::{ MSG_BUILDING_CONTRACTS, MSG_BUILDING_CONTRACTS_SUCCESS, MSG_BUILDING_L1_CONTRACTS_SPINNER, MSG_BUILDING_L2_CONTRACTS_SPINNER, MSG_BUILDING_SYSTEM_CONTRACTS_SPINNER, MSG_BUILDING_TEST_CONTRACTS_SPINNER, MSG_BUILD_L1_CONTRACTS_HELP, MSG_BUILD_L2_CONTRACTS_HELP, - MSG_BUILD_SYSTEM_CONTRACTS_HELP, MSG_BUILD_TEST_CONTRACTS_HELP, MSG_CONTRACTS_DEPS_SPINNER, - MSG_NOTHING_TO_BUILD_MSG, + MSG_BUILD_SYSTEM_CONTRACTS_HELP, MSG_BUILD_TEST_CONTRACTS_HELP, MSG_NOTHING_TO_BUILD_MSG, }; #[derive(Debug, Parser)] @@ -67,53 +72,41 @@ pub enum ContractType { TestContracts, } -#[derive(Debug)] struct ContractBuilder { - dir: PathBuf, - cmd: String, + cmd: Box anyhow::Result<()>>, msg: String, + link_to_code: PathBuf, } impl ContractBuilder { fn new(ecosystem: &EcosystemConfig, contract_type: ContractType) -> Self { match contract_type { ContractType::L1 => Self { - dir: ecosystem.path_to_foundry(), - cmd: "forge build".to_string(), + cmd: Box::new(build_l1_contracts), msg: MSG_BUILDING_L1_CONTRACTS_SPINNER.to_string(), + link_to_code: ecosystem.link_to_code.clone(), }, ContractType::L2 => Self { - dir: ecosystem.link_to_code.clone(), - cmd: "yarn l2-contracts build".to_string(), + cmd: Box::new(build_l2_contracts), msg: MSG_BUILDING_L2_CONTRACTS_SPINNER.to_string(), + link_to_code: ecosystem.link_to_code.clone(), }, ContractType::SystemContracts => Self { - dir: ecosystem.link_to_code.join("contracts"), - cmd: "yarn sc build".to_string(), + cmd: Box::new(build_system_contracts), msg: MSG_BUILDING_SYSTEM_CONTRACTS_SPINNER.to_string(), + link_to_code: ecosystem.link_to_code.clone(), }, ContractType::TestContracts => Self { - dir: ecosystem.link_to_code.join("etc/contracts-test-data"), - cmd: "yarn build".to_string(), + cmd: Box::new(build_test_contracts), msg: MSG_BUILDING_TEST_CONTRACTS_SPINNER.to_string(), + link_to_code: ecosystem.link_to_code.clone(), }, } } - fn build(&self, shell: &Shell) -> anyhow::Result<()> { + fn build(self, shell: Shell) -> anyhow::Result<()> { let spinner = Spinner::new(&self.msg); - let _dir_guard = shell.push_dir(&self.dir); - - let mut args = self.cmd.split_whitespace().collect::>(); - let command = args.remove(0); // It's safe to unwrap here because we know that the vec is not empty - let mut cmd = cmd!(shell, "{command}"); - - for arg in args { - cmd = cmd.arg(arg); - } - - Cmd::new(cmd).run()?; - + (self.cmd)(shell, self.link_to_code.clone())?; spinner.finish(); Ok(()) } @@ -129,17 +122,11 @@ pub fn run(shell: &Shell, args: ContractsArgs) -> anyhow::Result<()> { logger::info(MSG_BUILDING_CONTRACTS); let ecosystem = EcosystemConfig::from_file(shell)?; - let link_to_code = ecosystem.link_to_code.clone(); - - let spinner = Spinner::new(MSG_CONTRACTS_DEPS_SPINNER); - let _dir_guard = shell.push_dir(&link_to_code); - Cmd::new(cmd!(shell, "yarn install")).run()?; - spinner.finish(); contracts .iter() .map(|contract| ContractBuilder::new(&ecosystem, *contract)) - .try_for_each(|builder| builder.build(shell))?; + .try_for_each(|builder| builder.build(shell.clone()))?; logger::outro(MSG_BUILDING_CONTRACTS_SUCCESS); diff --git a/zkstack_cli/crates/zkstack/src/commands/dev/commands/genesis.rs b/zkstack_cli/crates/zkstack/src/commands/dev/commands/genesis.rs new file mode 100644 index 000000000000..683ffe199161 --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/commands/dev/commands/genesis.rs @@ -0,0 +1,26 @@ +use anyhow::Context; +use common::{cmd::Cmd, spinner::Spinner}; +use config::EcosystemConfig; +use xshell::{cmd, Shell}; + +use crate::{ + commands::dev::{ + commands::database::reset::reset_database, dals::get_core_dal, + messages::MSG_GENESIS_FILE_GENERATION_STARTED, + }, + messages::MSG_CHAIN_NOT_FOUND_ERR, +}; + +pub(crate) async fn run(shell: &Shell) -> anyhow::Result<()> { + let ecosystem = EcosystemConfig::from_file(shell)?; + let chain = ecosystem + .load_chain(Some(ecosystem.current_chain().to_string())) + .context(MSG_CHAIN_NOT_FOUND_ERR)?; + let spinner = Spinner::new(MSG_GENESIS_FILE_GENERATION_STARTED); + let secrets_path = chain.path_to_secrets_config(); + let dal = get_core_dal(shell, None)?; + reset_database(shell, ecosystem.link_to_code, dal).await?; + Cmd::new(cmd!(shell,"cargo run --package genesis_generator --bin genesis_generator -- --config-path={secrets_path}")).run()?; + spinner.finish(); + Ok(()) +} diff --git a/zkstack_cli/crates/zkstack/src/commands/dev/commands/mod.rs b/zkstack_cli/crates/zkstack/src/commands/dev/commands/mod.rs index 38ec586e7451..ab98e44533fb 100644 --- a/zkstack_cli/crates/zkstack/src/commands/dev/commands/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/dev/commands/mod.rs @@ -3,6 +3,7 @@ pub mod config_writer; pub mod contracts; pub mod database; pub mod fmt; +pub mod genesis; pub mod lint; pub(crate) mod lint_utils; pub mod prover; diff --git a/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/build.rs b/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/build.rs index f48967f59738..dea6a46bbef6 100644 --- a/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/build.rs +++ b/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/build.rs @@ -6,8 +6,8 @@ use super::utils::{build_contracts, install_and_build_dependencies}; pub fn run(shell: &Shell) -> anyhow::Result<()> { let ecosystem_config = EcosystemConfig::from_file(shell)?; - build_contracts(shell, &ecosystem_config)?; install_and_build_dependencies(shell, &ecosystem_config)?; + build_contracts(shell, &ecosystem_config)?; Ok(()) } diff --git a/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/integration.rs b/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/integration.rs index 3bc3093bf936..8e9e421c2f4e 100644 --- a/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/integration.rs +++ b/zkstack_cli/crates/zkstack/src/commands/dev/commands/test/integration.rs @@ -28,8 +28,8 @@ pub async fn run(shell: &Shell, args: IntegrationArgs) -> anyhow::Result<()> { logger::info(msg_integration_tests_run(args.external_node)); if !args.no_deps { - build_contracts(shell, &ecosystem_config)?; install_and_build_dependencies(shell, &ecosystem_config)?; + build_contracts(shell, &ecosystem_config)?; } let wallets_path: PathBuf = ecosystem_config.link_to_code.join(TEST_WALLETS_PATH); diff --git a/zkstack_cli/crates/zkstack/src/commands/dev/messages.rs b/zkstack_cli/crates/zkstack/src/commands/dev/messages.rs index 00617e26064f..c7e639f8e87c 100644 --- a/zkstack_cli/crates/zkstack/src/commands/dev/messages.rs +++ b/zkstack_cli/crates/zkstack/src/commands/dev/messages.rs @@ -4,6 +4,8 @@ use super::commands::lint_utils::Target; pub(super) const MSG_CHAIN_NOT_FOUND_ERR: &str = "Chain not found"; // Subcommands help +pub(super) const MSG_GENERATE_GENESIS_ABOUT: &str = + "Generate new genesis file based on current contracts"; pub(super) const MSG_PROVER_VERSION_ABOUT: &str = "Protocol version used by provers"; pub(super) const MSG_SUBCOMMAND_DATABASE_ABOUT: &str = "Database related commands"; pub(super) const MSG_SUBCOMMAND_TESTS_ABOUT: &str = "Run tests"; @@ -106,7 +108,6 @@ pub(super) const MSG_RESETTING_TEST_DATABASES: &str = "Resetting test databases" // Contract building related messages pub(super) const MSG_NOTHING_TO_BUILD_MSG: &str = "Nothing to build!"; pub(super) const MSG_BUILDING_CONTRACTS: &str = "Building contracts"; -pub(super) const MSG_CONTRACTS_DEPS_SPINNER: &str = "Installing dependencies.."; pub(super) const MSG_BUILDING_L2_CONTRACTS_SPINNER: &str = "Building L2 contracts.."; pub(super) const MSG_BUILDING_L1_CONTRACTS_SPINNER: &str = "Building L1 contracts.."; pub(super) const MSG_BUILDING_SYSTEM_CONTRACTS_SPINNER: &str = "Building system contracts.."; @@ -230,3 +231,6 @@ pub(super) const MSG_UNABLE_TO_WRITE_FILE_ERR: &str = "Unable to write data to f pub(super) const MSG_UNABLE_TO_READ_PARSE_JSON_ERR: &str = "Unable to parse JSON"; pub(super) const MSG_FAILED_TO_SEND_TXN_ERR: &str = "Failed to send transaction"; pub(super) const MSG_INVALID_L1_RPC_URL_ERR: &str = "Invalid L1 RPC URL"; + +// Genesis +pub(super) const MSG_GENESIS_FILE_GENERATION_STARTED: &str = "Regenerate genesis file"; diff --git a/zkstack_cli/crates/zkstack/src/commands/dev/mod.rs b/zkstack_cli/crates/zkstack/src/commands/dev/mod.rs index e8d23f15b699..9272436a9b9d 100644 --- a/zkstack_cli/crates/zkstack/src/commands/dev/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/dev/mod.rs @@ -7,9 +7,10 @@ use self::commands::{ send_transactions::args::SendTransactionsArgs, snapshot::SnapshotCommands, test::TestCommands, }; use crate::commands::dev::messages::{ - MSG_CONFIG_WRITER_ABOUT, MSG_CONTRACTS_ABOUT, MSG_PROVER_VERSION_ABOUT, MSG_SEND_TXNS_ABOUT, - MSG_SUBCOMMAND_CLEAN, MSG_SUBCOMMAND_DATABASE_ABOUT, MSG_SUBCOMMAND_FMT_ABOUT, - MSG_SUBCOMMAND_LINT_ABOUT, MSG_SUBCOMMAND_SNAPSHOTS_CREATOR_ABOUT, MSG_SUBCOMMAND_TESTS_ABOUT, + MSG_CONFIG_WRITER_ABOUT, MSG_CONTRACTS_ABOUT, MSG_GENERATE_GENESIS_ABOUT, + MSG_PROVER_VERSION_ABOUT, MSG_SEND_TXNS_ABOUT, MSG_SUBCOMMAND_CLEAN, + MSG_SUBCOMMAND_DATABASE_ABOUT, MSG_SUBCOMMAND_FMT_ABOUT, MSG_SUBCOMMAND_LINT_ABOUT, + MSG_SUBCOMMAND_SNAPSHOTS_CREATOR_ABOUT, MSG_SUBCOMMAND_TESTS_ABOUT, }; mod commands; @@ -40,6 +41,8 @@ pub enum DevCommands { ConfigWriter(ConfigWriterArgs), #[command(about = MSG_SEND_TXNS_ABOUT)] SendTransactions(SendTransactionsArgs), + #[command(about = MSG_GENERATE_GENESIS_ABOUT, alias = "genesis")] + GenerateGenesis, } pub async fn run(shell: &Shell, args: DevCommands) -> anyhow::Result<()> { @@ -56,6 +59,7 @@ pub async fn run(shell: &Shell, args: DevCommands) -> anyhow::Result<()> { DevCommands::SendTransactions(args) => { commands::send_transactions::run(shell, args).await? } + DevCommands::GenerateGenesis => commands::genesis::run(shell).await?, } Ok(()) } diff --git a/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs b/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs index bf5a4605c09c..6e006f8d65df 100644 --- a/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs +++ b/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs @@ -3,6 +3,7 @@ use std::{path::PathBuf, str::FromStr}; use anyhow::Context; use common::{ config::global_config, + contracts::build_system_contracts, forge::{Forge, ForgeScriptArgs}, git, logger, spinner::Spinner, @@ -26,7 +27,6 @@ use super::{ args::init::{EcosystemArgsFinal, EcosystemInitArgs, EcosystemInitArgsFinal}, common::deploy_l1, setup_observability, - utils::{build_system_contracts, install_yarn_dependencies}, }; use crate::{ accept_ownership::{accept_admin, accept_owner}, @@ -108,8 +108,7 @@ async fn init_ecosystem( initial_deployment_config: &InitialDeploymentConfig, ) -> anyhow::Result { let spinner = Spinner::new(MSG_INTALLING_DEPS_SPINNER); - install_yarn_dependencies(shell, &ecosystem_config.link_to_code)?; - build_system_contracts(shell, &ecosystem_config.link_to_code)?; + build_system_contracts(shell.clone(), ecosystem_config.link_to_code.clone())?; spinner.finish(); let contracts = deploy_ecosystem(