From b3080bad8334f9e3d2e86be1f1a6ddca182f126f Mon Sep 17 00:00:00 2001 From: error2215 Date: Thu, 18 Jan 2024 16:56:29 +0200 Subject: [PATCH] fix create2 address (#39) * fix create2 address * revert DEFAULT_CREATE2_DEPLOYER_CODE --- abi/src/bindings/hevm.rs | 2 +- cli/src/cmd/probe/create2.rs | 4 ++-- cli/src/cmd/spark/script/mod.rs | 4 ++-- cli/tests/it/script.rs | 4 ++-- evm/src/executor/backend/error.rs | 2 +- evm/src/executor/inspector/cheatcodes/util.rs | 6 +++--- testdata/repros/Issue3708.sol | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/abi/src/bindings/hevm.rs b/abi/src/bindings/hevm.rs index 17f196c2..9ce9c357 100644 --- a/abi/src/bindings/hevm.rs +++ b/abi/src/bindings/hevm.rs @@ -11,7 +11,7 @@ pub use hevm::*; )] pub mod hevm { #[rustfmt::skip] - const __ABI: &str = "[\nstruct Log { bytes32[] topics; bytes data; }\r\nstruct Rpc { string name; string url; }\r\nstruct DirEntry { string errorMessage; string path; uint64 depth; bool isDir; bool isSymlink; }\r\nstruct FsMetadata { bool isDir; bool isSymlink; uint256 length; bool readOnly; uint256 modified; uint256 accessed; uint256 created; }\r\n\r\nallowCheatcodes(address)\r\n\r\nffi(string[])(bytes)\r\n\r\nbreakpoint(string)\r\nbreakpoint(string,bool)\r\n\r\nroll(uint256)\r\nwarp(uint256)\r\ndifficulty(uint256)\r\nfee(uint256)\r\ncoinbase(address)\r\nstore(address,bytes32,bytes32)\r\nload(address,bytes32)(bytes32)\r\n\r\nsetEnv(string,string)\r\nenvBool(string)(bool)\r\nenvUint(string)(uint256)\r\nenvInt(string)(int256)\r\nenvAddress(string)(address)\r\nenvBytes32(string)(bytes32)\r\nenvString(string)(string)\r\nenvBytes(string)(bytes)\r\nenvBool(string,string)(bool[])\r\nenvUint(string,string)(uint256[])\r\nenvInt(string,string)(int256[])\r\nenvAddress(string,string)(address[])\r\nenvBytes32(string,string)(bytes32[])\r\nenvString(string,string)(string[])\r\nenvBytes(string,string)(bytes[])\r\nenvOr(string,bool)(bool)\r\nenvOr(string,uint256)(uint256)\r\nenvOr(string,int256)(int256)\r\nenvOr(string,address)(address)\r\nenvOr(string,bytes32)(bytes32)\r\nenvOr(string,string)(string)\r\nenvOr(string,bytes)(bytes)\r\nenvOr(string,string,bool[])(bool[])\r\nenvOr(string,string,uint256[])(uint256[])\r\nenvOr(string,string,int256[])(int256[])\r\nenvOr(string,string,address[])(address[])\r\nenvOr(string,string,bytes32[])(bytes32[])\r\nenvOr(string,string,string[])(string[])\r\nenvOr(string,string,bytes[])(bytes[])\r\n\r\naddr(string)(address)\r\nsign(string,bytes32)(bytes)\r\nderiveKey(string,uint32)(uint256)\r\nderiveKey(string,string,uint32)(uint256)\r\nderiveKey(string,uint32,string)(uint256)\r\nderiveKey(string,string,uint32,string)(uint256)\r\nrememberKey(string)(address)\r\n\r\nprank(address)\r\nprank(address,address)\r\nreadCallers()(uint256,address,address)\r\nstartPrank(address)\r\nstartPrank(address,address)\r\nstopPrank()\r\n\r\ndeal(address,uint256)\r\netch(address,bytes)\r\nexpectRevert()\r\nexpectRevert(bytes)\r\nexpectRevert(bytes4)\r\nrecord()\r\naccesses(address)(bytes32[],bytes32[])\r\nskip(bool)\r\n\r\nrecordLogs()\r\ngetRecordedLogs()(Log[])\r\n\r\nexpectEmit()\r\nexpectEmit(address)\r\nexpectEmit(bool,bool,bool,bool)\r\nexpectEmit(bool,bool,bool,bool,address)\r\n\r\nmockCall(address,bytes,bytes)\r\nmockCall(address,uint256,bytes,bytes)\r\nmockCallRevert(address,bytes,bytes)\r\nmockCallRevert(address,uint256,bytes,bytes)\r\nclearMockedCalls()\r\n\r\nexpectCall(address,bytes)\r\nexpectCall(address,bytes,uint64)\r\nexpectCall(address,uint256,bytes)\r\nexpectCall(address,uint256,bytes,uint64)\r\nexpectCall(address,uint256,uint64,bytes)\r\nexpectCall(address,uint256,uint64,bytes,uint64)\r\nexpectCallMinGas(address,uint256,uint64,bytes)\r\nexpectCallMinGas(address,uint256,uint64,bytes,uint64)\r\nexpectSafeMemory(uint64,uint64)\r\nexpectSafeMemoryCall(uint64,uint64)\r\n\r\ngetCode(string)\r\ngetDeployedCode(string)\r\nlabel(address,string)\r\ngetLabel(address)(string)\r\nassume(bool)\r\nsetNonce(address,uint64)\r\ngetNonce(address)\r\nresetNonce(address)\r\nsetNonceUnsafe(address,uint64)\r\nchainId(uint256)\r\ntxGasPrice(uint256)\r\n\r\nbroadcast()\r\nbroadcast(address)\r\nbroadcast(string)\r\nstartBroadcast()\r\nstartBroadcast(address)\r\nstartBroadcast(string)\r\nstopBroadcast()\r\n\r\nprojectRoot()(string)\r\nreadFile(string)(string)\r\nreadFileBinary(string)(bytes)\r\nwriteFile(string,string)\r\nwriteFileBinary(string,bytes)\r\nopenFile(string)\r\nreadLine(string)(string)\r\nwriteLine(string,string)\r\ncloseFile(string)\r\nremoveFile(string)\r\ncreateDir(string, bool)\r\nremoveDir(string, bool)\r\nreadDir(string)(DirEntry[])\r\nreadDir(string, uint64)(DirEntry[])\r\nreadDir(string, uint64, bool)(DirEntry[])\r\nreadLink(string)(string)\r\nfsMetadata(string)(FsMetadata)\r\n\r\ntoString(bytes)\r\ntoString(address)\r\ntoString(uint256)\r\ntoString(int256)\r\ntoString(bytes32)\r\ntoString(bool)\r\nparseBytes(string)(bytes)\r\nparseAddress(string)(address)\r\nparseUint(string)(uint256)\r\nparseInt(string)(int256)\r\nparseBytes32(string)(bytes32)\r\nparseBool(string)(bool)\r\n\r\nsnapshot()(uint256)\r\nrevertTo(uint256)(bool)\r\ncreateFork(string,uint256)(uint256)\r\ncreateFork(string,bytes32)(uint256)\r\ncreateFork(string)(uint256)\r\ncreateSelectFork(string,uint256)(uint256)\r\ncreateSelectFork(string,bytes32)(uint256)\r\ncreateSelectFork(string)(uint256)\r\nselectFork(uint256)\r\nactiveFork()(uint256)\r\ntransact(bytes32)\r\ntransact(uint256,bytes32)\r\nmakePersistent(address)\r\nmakePersistent(address,address)\r\nmakePersistent(address,address,address)\r\nmakePersistent(address[])\r\nrevokePersistent(address)\r\nrevokePersistent(address[])\r\nisPersistent(address)(bool)\r\nrollFork(uint256)\r\nrollFork(bytes32)\r\nrollFork(uint256,uint256)\r\nrollFork(uint256,bytes32)\r\nrpcUrl(string)(string)\r\nrpcUrls()(string[2][])\r\nrpcUrlStructs()(Rpc[])\r\n\r\nwriteJson(string, string)\r\nwriteJson(string, string, string)\r\nparseJson(string)(bytes)\r\nparseJson(string, string)(bytes)\r\nparseJsonUint(string, string)(uint256)\r\nparseJsonUintArray(string, string)(uint256[])\r\nparseJsonInt(string, string)(int256)\r\nparseJsonIntArray(string, string)(int256[])\r\nparseJsonString(string, string)(string)\r\nparseJsonStringArray(string, string)(string[])\r\nparseJsonAddress(string, string)(address)\r\nparseJsonAddressArray(string, string)(address[])\r\nparseJsonBool(string, string)(bool)\r\nparseJsonBoolArray(string, string)(bool[])\r\nparseJsonBytes(string, string)(bytes)\r\nparseJsonBytesArray(string, string)(bytes[])\r\nparseJsonBytes32(string, string)(bytes32)\r\nparseJsonBytes32Array(string, string)(bytes32[])\r\nserializeBool(string,string,bool)(string)\r\nserializeBool(string,string,bool[])(string)\r\nserializeUint(string,string,uint256)(string)\r\nserializeUint(string,string,uint256[])(string)\r\nserializeInt(string,string,int256)(string)\r\nserializeInt(string,string,int256[])(string)\r\nserializeAddress(string,string,address)(string)\r\nserializeAddress(string,string,address[])(string)\r\nserializeBytes32(string,string,bytes32)(string)\r\nserializeBytes32(string,string,bytes32[])(string)\r\nserializeString(string,string,string)(string)\r\nserializeString(string,string,string[])(string)\r\nserializeBytes(string,string,bytes)(string)\r\nserializeBytes(string,string,bytes[])(string)\r\n\r\npauseGasMetering()\r\nresumeGasMetering()\r\n\n]"; + const __ABI: &str = "[\nstruct Log { bytes32[] topics; bytes data; }\r\nstruct Rpc { string name; string url; }\r\nstruct DirEntry { string errorMessage; string path; uint64 depth; bool isDir; bool isSymlink; }\r\nstruct FsMetadata { bool isDir; bool isSymlink; uint256 length; bool readOnly; uint256 modified; uint256 accessed; uint256 created; }\r\n\r\nallowCheatcodes(address)\r\n\r\nffi(string[])(bytes)\r\n\r\nbreakpoint(string)\r\nbreakpoint(string,bool)\r\n\r\nroll(uint256)\r\nwarp(uint256)\r\ndifficulty(uint256)\r\nfee(uint256)\r\ncoinbase(address)\r\nstore(address,bytes32,bytes32)\r\nload(address,bytes32)(bytes32)\r\n\r\nsetEnv(string,string)\r\nenvBool(string)(bool)\r\nenvUint(string)(uint256)\r\nenvInt(string)(int256)\r\nenvAddress(string)(address)\r\nenvBytes32(string)(bytes32)\r\nenvString(string)(string)\r\nenvBytes(string)(bytes)\r\nenvBool(string,string)(bool[])\r\nenvUint(string,string)(uint256[])\r\nenvInt(string,string)(int256[])\r\nenvAddress(string,string)(address[])\r\nenvBytes32(string,string)(bytes32[])\r\nenvString(string,string)(string[])\r\nenvBytes(string,string)(bytes[])\r\nenvOr(string,bool)(bool)\r\nenvOr(string,uint256)(uint256)\r\nenvOr(string,int256)(int256)\r\nenvOr(string,address)(address)\r\nenvOr(string,bytes32)(bytes32)\r\nenvOr(string,string)(string)\r\nenvOr(string,bytes)(bytes)\r\nenvOr(string,string,bool[])(bool[])\r\nenvOr(string,string,uint256[])(uint256[])\r\nenvOr(string,string,int256[])(int256[])\r\nenvOr(string,string,address[])(address[])\r\nenvOr(string,string,bytes32[])(bytes32[])\r\nenvOr(string,string,string[])(string[])\r\nenvOr(string,string,bytes[])(bytes[])\r\n\r\naddr(string)(address)\r\nsign(string,bytes32)(bytes)\r\nderiveKey(string,uint32)(uint256)\r\nderiveKey(string,string,uint32)(uint256)\r\nderiveKey(string,uint32,string)(uint256)\r\nderiveKey(string,string,uint32,string)(uint256)\r\nrememberKey(string)(address)\r\n\r\nprank(address)\r\nprank(address,address)\r\nreadCallers()(uint256,address,address)\r\nstartPrank(address)\r\nstartPrank(address,address)\r\nstopPrank()\r\n\r\ndeal(address,uint256)\r\netch(address,bytes)\r\nexpectRevert()\r\nexpectRevert(bytes)\r\nexpectRevert(bytes4)\r\nrecord()\r\naccesses(address)(bytes32[],bytes32[])\r\nskip(bool)\r\n\r\nrecordLogs()\r\ngetRecordedLogs()(Log[])\r\n\r\nexpectEmit()\r\nexpectEmit(address)\r\nexpectEmit(bool,bool,bool,bool)\r\nexpectEmit(bool,bool,bool,bool,address)\r\n\r\nmockCall(address,bytes,bytes)\r\nmockCall(address,uint256,bytes,bytes)\r\nmockCallRevert(address,bytes,bytes)\r\nmockCallRevert(address,uint256,bytes,bytes)\r\nclearMockedCalls()\r\n\r\nexpectCall(address,bytes)\r\nexpectCall(address,bytes,uint64)\r\nexpectCall(address,uint256,bytes)\r\nexpectCall(address,uint256,bytes,uint64)\r\nexpectCall(address,uint256,uint64,bytes)\r\nexpectCall(address,uint256,uint64,bytes,uint64)\r\nexpectCallMinGas(address,uint256,uint64,bytes)\r\nexpectCallMinGas(address,uint256,uint64,bytes,uint64)\r\nexpectSafeMemory(uint64,uint64)\r\nexpectSafeMemoryCall(uint64,uint64)\r\n\r\ngetCode(string)\r\ngetDeployedCode(string)\r\nlabel(address,string)\r\ngetLabel(address)(string)\r\nassume(bool)\r\nsetNonce(address,uint64)\r\ngetNonce(address)\r\nresetNonce(address)\r\nsetNonceUnsafe(address,uint64)\r\nchainId(uint256)\r\ntxGasPrice(uint256)\r\n\r\ncomputeCreateAddress(address,uint256)\r\ncomputeCreate2Address(bytes32,bytes32,address)\r\ncomputeCreate2Address(bytes32,bytes32)\r\n\r\nbroadcast()\r\nbroadcast(address)\r\nbroadcast(string)\r\nstartBroadcast()\r\nstartBroadcast(address)\r\nstartBroadcast(string)\r\nstopBroadcast()\r\n\r\nprojectRoot()(string)\r\nreadFile(string)(string)\r\nreadFileBinary(string)(bytes)\r\nwriteFile(string,string)\r\nwriteFileBinary(string,bytes)\r\nopenFile(string)\r\nreadLine(string)(string)\r\nwriteLine(string,string)\r\ncloseFile(string)\r\nremoveFile(string)\r\ncreateDir(string, bool)\r\nremoveDir(string, bool)\r\nreadDir(string)(DirEntry[])\r\nreadDir(string, uint64)(DirEntry[])\r\nreadDir(string, uint64, bool)(DirEntry[])\r\nreadLink(string)(string)\r\nfsMetadata(string)(FsMetadata)\r\n\r\ntoString(bytes)\r\ntoString(address)\r\ntoString(uint256)\r\ntoString(int256)\r\ntoString(bytes32)\r\ntoString(bool)\r\nparseBytes(string)(bytes)\r\nparseAddress(string)(address)\r\nparseUint(string)(uint256)\r\nparseInt(string)(int256)\r\nparseBytes32(string)(bytes32)\r\nparseBool(string)(bool)\r\n\r\nsnapshot()(uint256)\r\nrevertTo(uint256)(bool)\r\ncreateFork(string,uint256)(uint256)\r\ncreateFork(string,bytes32)(uint256)\r\ncreateFork(string)(uint256)\r\ncreateSelectFork(string,uint256)(uint256)\r\ncreateSelectFork(string,bytes32)(uint256)\r\ncreateSelectFork(string)(uint256)\r\nselectFork(uint256)\r\nactiveFork()(uint256)\r\ntransact(bytes32)\r\ntransact(uint256,bytes32)\r\nmakePersistent(address)\r\nmakePersistent(address,address)\r\nmakePersistent(address,address,address)\r\nmakePersistent(address[])\r\nrevokePersistent(address)\r\nrevokePersistent(address[])\r\nisPersistent(address)(bool)\r\nrollFork(uint256)\r\nrollFork(bytes32)\r\nrollFork(uint256,uint256)\r\nrollFork(uint256,bytes32)\r\nrpcUrl(string)(string)\r\nrpcUrls()(string[2][])\r\nrpcUrlStructs()(Rpc[])\r\n\r\nwriteJson(string, string)\r\nwriteJson(string, string, string)\r\nparseJson(string)(bytes)\r\nparseJson(string, string)(bytes)\r\nparseJsonUint(string, string)(uint256)\r\nparseJsonUintArray(string, string)(uint256[])\r\nparseJsonInt(string, string)(int256)\r\nparseJsonIntArray(string, string)(int256[])\r\nparseJsonString(string, string)(string)\r\nparseJsonStringArray(string, string)(string[])\r\nparseJsonAddress(string, string)(address)\r\nparseJsonAddressArray(string, string)(address[])\r\nparseJsonBool(string, string)(bool)\r\nparseJsonBoolArray(string, string)(bool[])\r\nparseJsonBytes(string, string)(bytes)\r\nparseJsonBytesArray(string, string)(bytes[])\r\nparseJsonBytes32(string, string)(bytes32)\r\nparseJsonBytes32Array(string, string)(bytes32[])\r\nserializeBool(string,string,bool)(string)\r\nserializeBool(string,string,bool[])(string)\r\nserializeUint(string,string,uint256)(string)\r\nserializeUint(string,string,uint256[])(string)\r\nserializeInt(string,string,int256)(string)\r\nserializeInt(string,string,int256[])(string)\r\nserializeAddress(string,string,address)(string)\r\nserializeAddress(string,string,address[])(string)\r\nserializeBytes32(string,string,bytes32)(string)\r\nserializeBytes32(string,string,bytes32[])(string)\r\nserializeString(string,string,string)(string)\r\nserializeString(string,string,string[])(string)\r\nserializeBytes(string,string,bytes)(string)\r\nserializeBytes(string,string,bytes[])(string)\r\n\r\npauseGasMetering()\r\nresumeGasMetering()\r\nstartMappingRecording()\r\nstopMappingRecording()\r\ngetMappingLength(address,bytes32)\r\ngetMappingSlotAt(address,bytes32,uint256)\r\ngetMappingKeyAndParentOf(address,bytes32)\n]"; ///The parsed human-readable ABI of the contract. pub static HEVM_ABI: ::corebc_contract::Lazy<::corebc_core::abi::Abi> = ::corebc_contract::Lazy::new(|| ::corebc_core::abi::parse_abi_str(__ABI).expect("ABI is always valid")); diff --git a/cli/src/cmd/probe/create2.rs b/cli/src/cmd/probe/create2.rs index 0d066471..40084471 100644 --- a/cli/src/cmd/probe/create2.rs +++ b/cli/src/cmd/probe/create2.rs @@ -40,7 +40,7 @@ pub struct Create2Args { #[clap( short, long, - default_value = "cb914e59b44847b379578588920ca78fbf26c0b4956c", + default_value = "cb063edadf999cb7b8b3ebc71f5e97783176d289d640", value_name = "ADDRESS" )] deployer: Address, @@ -176,7 +176,7 @@ mod tests { use super::*; - const DEPLOYER: &str = "cb914e59b44847b379578588920ca78fbf26c0b4956c"; + const DEPLOYER: &str = "cb063edadf999cb7b8b3ebc71f5e97783176d289d640"; #[test] fn basic_create2() { diff --git a/cli/src/cmd/spark/script/mod.rs b/cli/src/cmd/spark/script/mod.rs index 05c3c3fe..0039b302 100644 --- a/cli/src/cmd/spark/script/mod.rs +++ b/cli/src/cmd/spark/script/mod.rs @@ -730,7 +730,7 @@ mod tests { "foxar-cli", "Contract.sol", "--sender", - "cb914e59b44847b379578588920ca78fbf26c0b4956c", + "cb063edadf999cb7b8b3ebc71f5e97783176d289d640", "--unlocked", ]); assert!(args.unlocked); @@ -740,7 +740,7 @@ mod tests { "foxar-cli", "Contract.sol", "--sender", - "cb914e59b44847b379578588920ca78fbf26c0b4956c", + "cb063edadf999cb7b8b3ebc71f5e97783176d289d640", "--unlocked", "--private-key", key.to_string().as_str(), diff --git a/cli/tests/it/script.rs b/cli/tests/it/script.rs index 94a2e9c5..fbfd7b8d 100644 --- a/cli/tests/it/script.rs +++ b/cli/tests/it/script.rs @@ -629,7 +629,7 @@ sparktest_async!(can_deploy_with_create2, |prj: TestProject, cmd: TestCommand| a let mut tester = ScriptTester::new_broadcast(cmd, &handle.http_endpoint(), prj.root()); // Prepare CREATE2 Deployer - let addr = Address::from_str("cb914e59b44847b379578588920ca78fbf26c0b4956c").unwrap(); + let addr = Address::from_str("cb063edadf999cb7b8b3ebc71f5e97783176d289d640").unwrap(); let code = hex::decode("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3").expect("Could not decode create2 deployer init_code").into(); api.shuttle_set_code(addr, code).await.unwrap(); @@ -715,7 +715,7 @@ sparktest_async!( let mut tester = ScriptTester::new_broadcast(cmd, &handle.http_endpoint(), prj.root()); // Prepare CREATE2 Deployer - let addr = Address::from_str("cb914e59b44847b379578588920ca78fbf26c0b4956c").unwrap(); + let addr = Address::from_str("cb063edadf999cb7b8b3ebc71f5e97783176d289d640").unwrap(); let code = hex::decode("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3").expect("Could not decode create2 deployer init_code").into(); api.shuttle_set_code(addr, code).await.unwrap(); diff --git a/evm/src/executor/backend/error.rs b/evm/src/executor/backend/error.rs index 6e3d63ad..cb8ad86e 100644 --- a/evm/src/executor/backend/error.rs +++ b/evm/src/executor/backend/error.rs @@ -38,7 +38,7 @@ pub enum DatabaseError { #[error("Transaction {0:?} not found")] TransactionNotFound(H256), #[error( - "CREATE2 Deployer not present on this chain. [cb914e59b44847b379578588920ca78fbf26c0b4956c]" + "CREATE2 Deployer not present on this chain. [cb063edadf999cb7b8b3ebc71f5e97783176d289d640]" )] MissingCreate2Deployer, #[error(transparent)] diff --git a/evm/src/executor/inspector/cheatcodes/util.rs b/evm/src/executor/inspector/cheatcodes/util.rs index 061536a7..9d29c93f 100644 --- a/evm/src/executor/inspector/cheatcodes/util.rs +++ b/evm/src/executor/inspector/cheatcodes/util.rs @@ -32,10 +32,10 @@ use std::{collections::VecDeque, str::FromStr}; const DEFAULT_DERIVATION_PATH_PREFIX: &str = "m/44'/60'/0'/0/"; -/// Address of the default CREATE2 deployer cb914e59b44847b379578588920ca78fbf26c0b4956c +/// Address of the default CREATE2 deployer cb063edadf999cb7b8b3ebc71f5e97783176d289d640 pub const DEFAULT_CREATE2_DEPLOYER: H176 = H176([ - 203, 145, 78, 89, 180, 72, 71, 179, 121, 87, 133, 136, 146, 12, 167, 143, 191, 38, 192, 180, - 149, 108, + 0xcb, 0x06, 0x3e, 0xda, 0xdf, 0x99, 0x9c, 0xb7, 0xb8, 0xb3, 0xeb, 0xc7, 0x1f, 0x5e, 0x97, 0x78, + 0x31, 0x76, 0xd2, 0x89, 0xd6, 0x40, ]); pub const MAGIC_SKIP_BYTES: &[u8] = b"FOXAR::SKIP"; diff --git a/testdata/repros/Issue3708.sol b/testdata/repros/Issue3708.sol index cd78217b..2e63d444 100644 --- a/testdata/repros/Issue3708.sol +++ b/testdata/repros/Issue3708.sol @@ -6,9 +6,9 @@ import "../cheats/Cheats.sol"; // https://github.com/foxar-rs/foxar/issues/3708 contract Issue3708Test is DSTest { - // https://optimistic.etherscan.io/address/0xcb914e59b44847b379578588920ca78fbf26c0b4956c#code + // https://optimistic.etherscan.io/address/0xcb063edadf999cb7b8b3ebc71f5e97783176d289d640#code address constant CREATE2_DEPLOYER = - 0xcb914e59b44847b379578588920ca78fbf26c0b4956c; + 0xcb063edadf999cb7b8b3ebc71f5e97783176d289d640; Cheats constant vm = Cheats(HEVM_ADDRESS); function setUp() public {