From c8884ea1f4e234cbd13b4e918fc617d035543cf7 Mon Sep 17 00:00:00 2001 From: Kai Hiroi Date: Thu, 2 May 2024 14:56:39 +0900 Subject: [PATCH 1/5] Refactor Global Methods: reorg & rename --- devkit/MCDevKit.sol | 16 +++--- devkit/utils/global/MCContextLib.sol | 25 --------- devkit/utils/global/MCDeployLib.sol | 16 +++--- devkit/utils/global/MCFinderLib.sol | 22 ++++---- devkit/utils/global/MCHelpers.sol | 55 +++++++++++++++++++ .../global/{MCBundleLib.sol => MCInitLib.sol} | 24 +++++--- .../global/{MCTestLib.sol => MCMockLib.sol} | 35 ++++-------- devkit/utils/global/MCSetupLib.sol | 22 -------- docs/devkit_utils.md | 37 +++++++++++++ 9 files changed, 147 insertions(+), 105 deletions(-) delete mode 100644 devkit/utils/global/MCContextLib.sol create mode 100644 devkit/utils/global/MCHelpers.sol rename devkit/utils/global/{MCBundleLib.sol => MCInitLib.sol} (82%) rename devkit/utils/global/{MCTestLib.sol => MCMockLib.sol} (76%) delete mode 100644 devkit/utils/global/MCSetupLib.sol create mode 100644 docs/devkit_utils.md diff --git a/devkit/MCDevKit.sol b/devkit/MCDevKit.sol index 33deac06..59801dfc 100644 --- a/devkit/MCDevKit.sol +++ b/devkit/MCDevKit.sol @@ -9,14 +9,13 @@ import {DictionaryRegistry} from "devkit/registry/DictionaryRegistry.sol"; import {ProxyRegistry} from "devkit/registry/ProxyRegistry.sol"; // Global Methods -import {MCSetupLib} from "devkit/utils/global/MCSetupLib.sol"; -import {MCBundleLib} from "devkit/utils/global/MCBundleLib.sol"; +import {MCInitLib} from "devkit/utils/global/MCInitLib.sol"; import {MCDeployLib} from "devkit/utils/global/MCDeployLib.sol"; import {MCFinderLib} from "devkit/utils/global/MCFinderLib.sol"; -import {MCContextLib} from "devkit/utils/global/MCContextLib.sol"; -import {MCTestLib} from "devkit/utils/global/MCTestLib.sol"; +import {MCMockLib} from "devkit/utils/global/MCMockLib.sol"; +import {MCHelpers} from "devkit/utils/global/MCHelpers.sol"; -// System +// System Methods import {Tracer} from "devkit/system/Tracer.sol"; @@ -30,10 +29,9 @@ struct MCDevKit { DictionaryRegistry dictionary; ProxyRegistry proxy; } -using MCSetupLib for MCDevKit global; -using MCBundleLib for MCDevKit global; +using MCInitLib for MCDevKit global; using MCDeployLib for MCDevKit global; using MCFinderLib for MCDevKit global; -using MCContextLib for MCDevKit global; -using MCTestLib for MCDevKit global; +using MCMockLib for MCDevKit global; +using MCHelpers for MCDevKit global; using Tracer for MCDevKit global; diff --git a/devkit/utils/global/MCContextLib.sol b/devkit/utils/global/MCContextLib.sol deleted file mode 100644 index f8789ec4..00000000 --- a/devkit/utils/global/MCContextLib.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -import {MCDevKit} from "devkit/MCDevKit.sol"; - - -/*********************************************** - ๐ŸŽญ Context - โ™ป๏ธ Reset Current Context -************************************************/ -library MCContextLib { - - /**----------------------------- - โ™ป๏ธ Reset Current Context - -------------------------------*/ - function reset(MCDevKit storage mc) internal returns(MCDevKit storage) { - uint pid = mc.startProcess("reset"); - mc.bundle.current.reset(); - mc.functions.current.reset(); - mc.dictionary.current.reset(); - mc.proxy.current.reset(); - return mc.finishProcess(pid); - } - -} diff --git a/devkit/utils/global/MCDeployLib.sol b/devkit/utils/global/MCDeployLib.sol index e9771eb0..f156bae8 100644 --- a/devkit/utils/global/MCDeployLib.sol +++ b/devkit/utils/global/MCDeployLib.sol @@ -23,14 +23,14 @@ import {NameGenerator} from "devkit/utils/mapping/NameGenerator.sol"; using NameGenerator for mapping(string => Proxy); -/*************************************** - ๐Ÿš€ Deployment - ๐ŸŒž Deploy Meta Contract - ๐Ÿ  Deploy Proxy - ๐Ÿ“š Deploy Dictionary - ๐Ÿ”‚ Duplicate Dictionary - ๐Ÿ’ฝ Load Dictionary -****************************************/ +/************************************ + * ๐Ÿš€ Deployment + * ๐ŸŒž Deploy Meta Contract + * ๐Ÿ  Deploy Proxy + * ๐Ÿ“š Deploy Dictionary + * ๐Ÿ”‚ Duplicate Dictionary + * ๐Ÿ’ฝ Load Dictionary +*************************************/ library MCDeployLib { /**----------------------------- diff --git a/devkit/utils/global/MCFinderLib.sol b/devkit/utils/global/MCFinderLib.sol index 16985d6d..e3686f04 100644 --- a/devkit/utils/global/MCFinderLib.sol +++ b/devkit/utils/global/MCFinderLib.sol @@ -12,23 +12,23 @@ import {Proxy} from "devkit/core/Proxy.sol"; import {Dictionary} from "devkit/core/Dictionary.sol"; -/********************************** - ๐Ÿ” Finder - ๐Ÿ  Find Proxy - ๐Ÿ“š Find Dictionary -***********************************/ +/******************************************** + * ๐Ÿ” Finder + * ๐Ÿ  Find Current Proxy Address + * ๐Ÿ“š Find Current Dictionary Address +*********************************************/ library MCFinderLib { - /**------------------- - ๐Ÿ  Find Proxy - ---------------------*/ + /**---------------------------------- + ๐Ÿ  Find Current Proxy Address + ------------------------------------*/ function toProxyAddress(MCDevKit storage mc) internal returns(address) { return mc.proxy.findCurrent().addr; } - /**------------------------ - ๐Ÿ“š Find Dictionary - --------------------------*/ + /**---------------------------------------- + ๐Ÿ“š Find Current Dictionary Address + ------------------------------------------*/ function toDictionaryAddress(MCDevKit storage mc) internal returns(address) { return mc.dictionary.findCurrent().addr; } diff --git a/devkit/utils/global/MCHelpers.sol b/devkit/utils/global/MCHelpers.sol new file mode 100644 index 00000000..338b05b6 --- /dev/null +++ b/devkit/utils/global/MCHelpers.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; +// Validation +import {Validator} from "devkit/system/Validator.sol"; + +import {MCDevKit} from "devkit/MCDevKit.sol"; +import {System} from "devkit/system/System.sol"; +// Utils +import {param} from "devkit/system/Tracer.sol"; +import {ForgeHelper} from "devkit/utils/ForgeHelper.sol"; +// Core +// functions +import {Bundle} from "devkit/core/Bundle.sol"; +import {Function} from "devkit/core/Function.sol"; +// proxy +import {Proxy, ProxyLib} from "devkit/core/Proxy.sol"; +// dictionary +import {Dictionary, DictionaryLib} from "devkit/core/Dictionary.sol"; + + +/****************************************** + * ๐Ÿ› ๏ธ Helper + * โ™ป๏ธ Reset Current Context + * ๐Ÿคฒ Set Storage Reader +*******************************************/ +library MCHelpers { + + /**----------------------------- + โ™ป๏ธ Reset Current Context + -------------------------------*/ + function reset(MCDevKit storage mc) internal returns(MCDevKit storage) { + uint pid = mc.startProcess("reset"); + mc.bundle.current.reset(); + mc.functions.current.reset(); + mc.dictionary.current.reset(); + mc.proxy.current.reset(); + return mc.finishProcess(pid); + } + + /**-------------------------- + ๐Ÿคฒ Set Storage Reader + ----------------------------*/ + function setStorageReader(MCDevKit storage mc, Dictionary memory dictionary, bytes4 selector, address implementation) internal returns(MCDevKit storage) { + uint pid = mc.startProcess("setStorageReader", param(dictionary, selector, implementation)); + dictionary.set(selector, implementation); + return mc.finishProcess(pid); + } + function setStorageReader(MCDevKit storage mc, string memory bundleName, bytes4 selector, address implementation) internal returns(MCDevKit storage) { + return mc.setStorageReader(mc.dictionary.find(bundleName), selector, implementation); + } + function setStorageReader(MCDevKit storage mc, bytes4 selector, address implementation) internal returns(MCDevKit storage) { + return mc.setStorageReader(mc.dictionary.findCurrent(), selector, implementation); + } + +} diff --git a/devkit/utils/global/MCBundleLib.sol b/devkit/utils/global/MCInitLib.sol similarity index 82% rename from devkit/utils/global/MCBundleLib.sol rename to devkit/utils/global/MCInitLib.sol index 93b5e91d..f97c7b88 100644 --- a/devkit/utils/global/MCBundleLib.sol +++ b/devkit/utils/global/MCInitLib.sol @@ -15,13 +15,14 @@ import {NameGenerator} from "devkit/utils/mapping/NameGenerator.sol"; using NameGenerator for mapping(string => Bundle); -/********************************* - ๐Ÿ—‚๏ธ Bundle Configuration - ๐ŸŒฑ Init Bundle - ๐Ÿ”— Use Function - ๐ŸชŸ Use Facade -**********************************/ -library MCBundleLib { +/************************************** + * ๐ŸŽ MC Initial Configuration + * ๐ŸŒฑ Init Bundle + * ๐Ÿ”— Use Function + * ๐ŸชŸ Use Facade + * ๐Ÿฐ Setup Standard Functions +***************************************/ +library MCInitLib { /**-------------------- ๐ŸŒฑ Init Bundle @@ -71,4 +72,13 @@ library MCBundleLib { return mc.finishProcess(pid); } + /**-------------------------------- + ๐Ÿฐ Setup Standard Functions + ----------------------------------*/ + function setupStdFunctions(MCDevKit storage mc) internal returns(MCDevKit storage) { + uint pid = mc.startProcess("setupStdFunctions"); + mc.std.complete(); + return mc.finishProcess(pid); + } + } diff --git a/devkit/utils/global/MCTestLib.sol b/devkit/utils/global/MCMockLib.sol similarity index 76% rename from devkit/utils/global/MCTestLib.sol rename to devkit/utils/global/MCMockLib.sol index 414f9ee0..d7e21160 100644 --- a/devkit/utils/global/MCTestLib.sol +++ b/devkit/utils/global/MCMockLib.sol @@ -18,14 +18,19 @@ import {Proxy, ProxyLib} from "devkit/core/Proxy.sol"; import {Dictionary, DictionaryLib} from "devkit/core/Dictionary.sol"; -/****************************************** - ๐Ÿงช Test +/************************************* + * ๐ŸŽญ Mock + * ๐ŸŒž Mocking Meta Contract + * ๐Ÿ  Mocking Proxy + * ๐Ÿ“š Mocking Dictionary +**************************************/ +library MCMockLib { + + /**----------------------------- ๐ŸŒž Mocking Meta Contract - ๐Ÿ  Mocking Proxy - ๐Ÿ“š Mocking Dictionary - ๐Ÿคฒ Set Storage Reader -*******************************************/ -library MCTestLib { + -------------------------------*/ + + /**--------------------- ๐Ÿ  Mocking Proxy -----------------------*/ @@ -83,20 +88,4 @@ library MCTestLib { mc.finishProcess(pid); } - - /**-------------------------- - ๐Ÿคฒ Set Storage Reader - ----------------------------*/ - function setStorageReader(MCDevKit storage mc, Dictionary memory dictionary, bytes4 selector, address implementation) internal returns(MCDevKit storage) { - uint pid = mc.startProcess("setStorageReader", param(dictionary, selector, implementation)); - dictionary.set(selector, implementation); - return mc.finishProcess(pid); - } - function setStorageReader(MCDevKit storage mc, string memory bundleName, bytes4 selector, address implementation) internal returns(MCDevKit storage) { - return mc.setStorageReader(mc.dictionary.find(bundleName), selector, implementation); - } - function setStorageReader(MCDevKit storage mc, bytes4 selector, address implementation) internal returns(MCDevKit storage) { - return mc.setStorageReader(mc.dictionary.findCurrent(), selector, implementation); - } - } diff --git a/devkit/utils/global/MCSetupLib.sol b/devkit/utils/global/MCSetupLib.sol deleted file mode 100644 index 90fe15d8..00000000 --- a/devkit/utils/global/MCSetupLib.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -import {MCDevKit} from "devkit/MCDevKit.sol"; -import {System} from "devkit/system/System.sol"; - -/********************************** - ๐Ÿ— Setup - ๐Ÿงฉ Setup Standard Funcs -***********************************/ -library MCSetupLib { - - /**---------------------------- - ๐Ÿงฉ Setup Standard Funcs - ------------------------------*/ - function setupStdFunctions(MCDevKit storage mc) internal returns(MCDevKit storage) { - uint pid = mc.startProcess("setupStdFunctions"); - mc.std.complete(); - return mc.finishProcess(pid); - } - -} diff --git a/docs/devkit_utils.md b/docs/devkit_utils.md new file mode 100644 index 00000000..2fdddca0 --- /dev/null +++ b/docs/devkit_utils.md @@ -0,0 +1,37 @@ +# DevKit Utils + +## Global Methods +- MCInitLib + - `mc.init()` + - `mc.use()` + - `mc.useFacade()` + - `mc.setupStdFunctions()` +- MCDeployLib + - `mc.deploy()` + - `mc.deployProxy()` + - `mc.deployDictionary()` + - `mc.duplicateDictionary()` + - `mc.loadDictionary()` +- MCFinderLib + - `mc.toProxyAddress()` + - `mc.toDictionaryAddress()` +- MCMockLib + - `mc.createMockProxy()` + - `mc.createMockDictionary()` +- MCHelpers + - `mc.reset()` + - `mc.setStorageReader()` + +## Core Methods +- Function +- Bundle +- Dictionary +- Proxy + +## Registry Methods +- StdRegistry + - StdFunctions +- FunctionRegistry +- BundleRegistry +- DictionaryRegistry +- ProxyRegistry From 04a26e9c3622cca5113b1c520c1ed05d4c719e1f Mon Sep 17 00:00:00 2001 From: Kai Hiroi Date: Thu, 2 May 2024 15:56:55 +0900 Subject: [PATCH 2/5] Update MCHelpers --- devkit/MCBase.sol | 2 +- devkit/utils/ForgeHelper.sol | 26 ++++++---- devkit/utils/global/MCHelpers.sol | 81 ++++++++++++++++++++++++++++++- devkit/utils/test/TestLib.sol | 43 ---------------- 4 files changed, 97 insertions(+), 55 deletions(-) delete mode 100644 devkit/utils/test/TestLib.sol diff --git a/devkit/MCBase.sol b/devkit/MCBase.sol index ce35f6e8..8d07e151 100644 --- a/devkit/MCBase.sol +++ b/devkit/MCBase.sol @@ -28,7 +28,7 @@ abstract contract MCScriptBase is MCBase, ForgeScript { } function _startBroadcastWith(string memory envKey) internal { - deployerKey = ForgeHelper.getPrivateKey(envKey); + deployerKey = mc.loadPrivateKey(envKey); deployer = vm.addr(deployerKey); vm.startBroadcast(deployerKey); } diff --git a/devkit/utils/ForgeHelper.sol b/devkit/utils/ForgeHelper.sol index b9cb3755..47296cb2 100644 --- a/devkit/utils/ForgeHelper.sol +++ b/devkit/utils/ForgeHelper.sol @@ -27,7 +27,7 @@ library ForgeHelper { /**------------------- ๐Ÿ”ง Env File ---------------------*/ - function getPrivateKey(string memory envKey) internal view returns(uint256) { + function loadPrivateKey(string memory envKey) internal view returns(uint256) { return uint256(vm.envBytes32(envKey)); } @@ -35,22 +35,28 @@ library ForgeHelper { return vm.envOr(envKey, address(0)); } - // TODO: check version - function canGetDeployedContract(string memory envKey) internal view returns(bool) { - if (vm.envOr(envKey, address(0)).code.length != 0) return true; - return false; - } - /**------------------ ๐Ÿ“ Address --------------------*/ - function loadAddress(address target, bytes32 slot) internal view returns(address) { + function getAddress(address target, bytes32 slot) internal view returns(address) { return address(uint160(uint256(vm.load(target, slot)))); } function getDictionaryAddress(address proxy) internal view returns(address) { - return loadAddress(proxy, ProxyUtils.DICTIONARY_SLOT); + return getAddress(proxy, ProxyUtils.DICTIONARY_SLOT); + } + + function injectCode(address target, bytes memory runtimeBytecode) internal { + vm.etch(target, runtimeBytecode); + } + + function injectAddressToStorage(address target, bytes32 slot, address addr) internal { + vm.store(target, slot, bytes32(uint256(uint160(addr)))); + } + + function injectDictionary(address proxy, address dictionary) internal { + injectAddressToStorage(proxy, ProxyUtils.DICTIONARY_SLOT, dictionary); } function assumeAddressIsNotReserved(address addr) internal pure { @@ -118,7 +124,7 @@ library ForgeHelper { } function resumeBroadcast() internal { (VmSafe.CallerMode mode,,) = vm.readCallers(); - if (mode == VmSafe.CallerMode.RecurrentBroadcast) vm.startBroadcast(getPrivateKey("DEPLOYER_PRIV_KEY")); // Without CALL TODO + if (mode == VmSafe.CallerMode.RecurrentBroadcast) vm.startBroadcast(loadPrivateKey("DEPLOYER_PRIV_KEY")); // Without CALL TODO } } diff --git a/devkit/utils/global/MCHelpers.sol b/devkit/utils/global/MCHelpers.sol index 338b05b6..7440c9da 100644 --- a/devkit/utils/global/MCHelpers.sol +++ b/devkit/utils/global/MCHelpers.sol @@ -1,5 +1,16 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; + +// Forge-std +import {Vm, VmSafe} from "forge-std/Vm.sol"; +// Constants +/// @dev address(uint160(uint256(keccak256("hevm cheat code")))); +Vm constant vm = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + +import {ProxyUtils} from "@ucs.mc/proxy/ProxyUtils.sol"; + +import {Logger} from "devkit/system/Logger.sol"; + // Validation import {Validator} from "devkit/system/Validator.sol"; @@ -17,7 +28,6 @@ import {Proxy, ProxyLib} from "devkit/core/Proxy.sol"; // dictionary import {Dictionary, DictionaryLib} from "devkit/core/Dictionary.sol"; - /****************************************** * ๐Ÿ› ๏ธ Helper * โ™ป๏ธ Reset Current Context @@ -37,6 +47,7 @@ library MCHelpers { return mc.finishProcess(pid); } + /**-------------------------- ๐Ÿคฒ Set Storage Reader ----------------------------*/ @@ -52,4 +63,72 @@ library MCHelpers { return mc.setStorageReader(mc.dictionary.findCurrent(), selector, implementation); } + + /// ForgeHelper Wrapper + + /**------------------- + ๐Ÿ”ง Env File + ---------------------*/ + function loadPrivateKey(MCDevKit storage, string memory envKey) internal view returns(uint256) { + return ForgeHelper.loadPrivateKey(envKey); + } + + function loadAddressFromEnv(MCDevKit storage, string memory envKey) internal view returns(address) { + return ForgeHelper.loadAddressFromEnv(envKey); + } + + + /**------------------------- + ๐Ÿ“ Address Operation + ---------------------------*/ + function injectCode(MCDevKit storage, address target, bytes memory runtimeBytecode) internal { + ForgeHelper.injectCode(target, runtimeBytecode); + } + + function injectDictionary(MCDevKit storage, address proxy, address dictionary) internal { + ForgeHelper.injectDictionary(proxy, dictionary); + } + + function getAddress(MCDevKit storage, address target, bytes32 slot) internal view returns(address) { + return ForgeHelper.getAddress(target, slot); + } + + function getDictionaryAddress(MCDevKit storage, address proxy) internal view returns(address) { + return ForgeHelper.getDictionaryAddress(proxy); + } + + function assumeAddressIsNotReserved(MCDevKit storage, address addr) internal pure { + ForgeHelper.assumeAddressIsNotReserved(addr); + } + + + /**---------------- + ๐Ÿ““ Context + ------------------*/ + function msgSender(MCDevKit storage) internal returns(address) { + return ForgeHelper.msgSender(); + } + + + /**--------------- + ๐Ÿท๏ธ Label + -----------------*/ + function assignLabel(MCDevKit storage, address addr, string memory name) internal returns(address) { + return ForgeHelper.assignLabel(addr, name); + } + + function getLabel(MCDevKit storage, address addr) internal view returns(string memory) { + return ForgeHelper.getLabel(addr); + } + + + /**------------------ + ๐Ÿ“ก Broadcast + --------------------*/ + function pauseBroadcast(MCDevKit storage) internal { + ForgeHelper.pauseBroadcast(); + } + function resumeBroadcast(MCDevKit storage) internal { + ForgeHelper.resumeBroadcast(); + } } diff --git a/devkit/utils/test/TestLib.sol b/devkit/utils/test/TestLib.sol deleted file mode 100644 index b192c630..00000000 --- a/devkit/utils/test/TestLib.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; -/**-------------------------- - Apply Support Methods -----------------------------*/ - -// Core Type -import {Proxy} from "devkit/core/Proxy.sol"; - - -/**=============== - ๐Ÿ  Proxy -=================*/ -library TestLib { - /**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ๐Ÿš€ Deploy Proxy - ๐Ÿงช Test Utils - ๐Ÿค– Create Mock Proxy - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - - /**------------------- - ๐Ÿงช Test Utils - ---------------------*/ - function loadDictionary(Proxy storage proxy) internal returns(Dictionary storage) { - return ForgeHelper.loadAddress(proxy.addr, ERC7546Utils.DICTIONARY_SLOT).asDictionary(); - } - - function changeDictionary(Proxy storage proxy) internal {} - - function injectCode(address target, bytes memory runtimeBytecode) internal { - // vm.assume(runtimeBytecode.length > 0); - vm.etch(target, runtimeBytecode); - } - - function injectDictionary(address target, address dictionary) internal { - injectAddressToStorage(target, ERC7546Utils.DICTIONARY_SLOT, dictionary); - } - - function injectAddressToStorage(address target, bytes32 slot, address addr) internal { - vm.store(target, slot, bytes32(uint256(uint160(addr)))); - } - -} From 7455ce7f641069c0a619c3a27b91e1e5101f951d Mon Sep 17 00:00:00 2001 From: Kai Hiroi Date: Thu, 2 May 2024 17:30:33 +0900 Subject: [PATCH 3/5] Update isVerifiable(): without broadcast --- devkit/system/Validator.sol | 4 ++-- devkit/utils/ForgeHelper.sol | 15 ++++++++------- devkit/utils/global/MCHelpers.sol | 4 ++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/devkit/system/Validator.sol b/devkit/system/Validator.sol index 165c97ca..60d000cb 100644 --- a/devkit/system/Validator.sol +++ b/devkit/system/Validator.sol @@ -47,9 +47,9 @@ library Validator { // Validate without broadcast modifier noBroadcast() { - ForgeHelper.pauseBroadcast(); + (bool isBroadcasting, address currentSender) = ForgeHelper.pauseBroadcast(); _; - ForgeHelper.resumeBroadcast(); + ForgeHelper.resumeBroadcast(isBroadcasting, currentSender); } diff --git a/devkit/utils/ForgeHelper.sol b/devkit/utils/ForgeHelper.sol index 47296cb2..6b004315 100644 --- a/devkit/utils/ForgeHelper.sol +++ b/devkit/utils/ForgeHelper.sol @@ -118,13 +118,14 @@ library ForgeHelper { /**------------------ ๐Ÿ“ก Broadcast --------------------*/ - function pauseBroadcast() internal { - (VmSafe.CallerMode mode,,) = vm.readCallers(); - if (mode == VmSafe.CallerMode.RecurrentBroadcast) vm.stopBroadcast(); - } - function resumeBroadcast() internal { - (VmSafe.CallerMode mode,,) = vm.readCallers(); - if (mode == VmSafe.CallerMode.RecurrentBroadcast) vm.startBroadcast(loadPrivateKey("DEPLOYER_PRIV_KEY")); // Without CALL TODO + function pauseBroadcast() internal returns(bool isBroadcasting, address) { + (,address currentSender,) = vm.readCallers(); + isBroadcasting = vm.isContext(VmSafe.ForgeContext.ScriptBroadcast); + if (isBroadcasting) vm.stopBroadcast(); + return (isBroadcasting, currentSender); + } + function resumeBroadcast(bool isBroadcasting, address currentSender) internal { + if (isBroadcasting) vm.startBroadcast(currentSender); } } diff --git a/devkit/utils/global/MCHelpers.sol b/devkit/utils/global/MCHelpers.sol index 7440c9da..7487f06a 100644 --- a/devkit/utils/global/MCHelpers.sol +++ b/devkit/utils/global/MCHelpers.sol @@ -128,7 +128,7 @@ library MCHelpers { function pauseBroadcast(MCDevKit storage) internal { ForgeHelper.pauseBroadcast(); } - function resumeBroadcast(MCDevKit storage) internal { - ForgeHelper.resumeBroadcast(); + function resumeBroadcast(MCDevKit storage, bool isBroadcasting, address currentSender) internal { + ForgeHelper.resumeBroadcast(isBroadcasting, currentSender); } } From 833a1725a1a1b011f6b1aef44fdac4634be5afcc Mon Sep 17 00:00:00 2001 From: Kai Hiroi Date: Thu, 2 May 2024 17:38:42 +0900 Subject: [PATCH 4/5] Refactor MCBase Contracts --- devkit/MCBase.sol | 29 ++++++--------------------- devkit/MCScript.sol | 8 -------- devkit/MCTest.sol | 10 +-------- script/DeployStdDictionary.s.sol | 4 ++-- script/DeployStdFunctions.s.sol | 4 ++-- test/devkit/MCDevKit.t.sol | 2 +- test/devkit/global/MCBundle.t.sol | 4 ++-- test/devkit/global/MCContext.t.sol | 4 ++-- test/devkit/global/MCDeploy.t.sol | 4 ++-- test/devkit/global/MCFinder.t.sol | 4 ++-- test/devkit/global/MCSetup.t.sol | 4 ++-- test/devkit/global/MCTest.t.sol | 4 ++-- test/script/DeployStdDictionary.t.sol | 19 ++++++++++++++++++ test/std/bundles/Std.t.sol | 4 ++-- 14 files changed, 45 insertions(+), 59 deletions(-) create mode 100644 test/script/DeployStdDictionary.t.sol diff --git a/devkit/MCBase.sol b/devkit/MCBase.sol index 8d07e151..45903a00 100644 --- a/devkit/MCBase.sol +++ b/devkit/MCBase.sol @@ -7,49 +7,32 @@ import {Script as ForgeScript} from "forge-std/Script.sol"; import {Test as ForgeTest} from "forge-std/Test.sol"; import {MCDevKit} from "devkit/MCDevKit.sol"; -import {ForgeHelper} from "devkit/utils/ForgeHelper.sol"; +import {System} from "devkit/system/System.sol"; abstract contract MCBase is CommonBase { MCDevKit internal mc; uint256 internal deployerKey; address internal deployer; + + constructor() { + System.Config().load(); + } } abstract contract MCScriptBase is MCBase, ForgeScript { modifier startBroadcastWith(string memory envKey) { - _startBroadcastWith(envKey); - _; - } - - modifier startBroadcastWithDeployerPrivKey() { - _startBroadcastWith("DEPLOYER_PRIV_KEY"); - _; - } - - function _startBroadcastWith(string memory envKey) internal { deployerKey = mc.loadPrivateKey(envKey); deployer = vm.addr(deployerKey); vm.startBroadcast(deployerKey); + _; } } abstract contract MCTestBase is MCBase, ForgeTest { modifier startPrankWith(string memory envKey) { - _startPrankWith(envKey); - _; - } - modifier startPrankWithDeployer() { - _startPrankWith("DEPLOYER"); - _; - } - function _startPrankWith(string memory envKey) internal { deployer = vm.envOr(envKey, makeAddr(envKey)); vm.startPrank(deployer); - } - - modifier assumeAddressIsNotReserved(address addr) { - ForgeHelper.assumeAddressIsNotReserved(addr); _; } } diff --git a/devkit/MCScript.sol b/devkit/MCScript.sol index f5dfabce..c62449d3 100644 --- a/devkit/MCScript.sol +++ b/devkit/MCScript.sol @@ -12,14 +12,6 @@ import {MCScriptBase} from "./MCBase.sol"; // โญ๏ธ MC SCRIPT abstract contract MCScript is MCScriptBase { constructor() { - System.Config().load(); if (System.Config().SETUP.STD_FUNCS) mc.setupStdFunctions(); } } - -// โญ๏ธ MC SCRIPT without Setup -abstract contract MCScriptWithoutSetup is MCScriptBase { - constructor() { - System.Config().load(); - } -} diff --git a/devkit/MCTest.sol b/devkit/MCTest.sol index 59fbfa62..98836546 100644 --- a/devkit/MCTest.sol +++ b/devkit/MCTest.sol @@ -18,7 +18,6 @@ import {MCTestBase} from "./MCBase.sol"; // โญ๏ธ MC TEST abstract contract MCTest is MCTestBase { constructor() { - System.Config().load(); if (System.Config().SETUP.STD_FUNCS) mc.setupStdFunctions(); } } @@ -36,7 +35,7 @@ abstract contract MCStateFuzzingTest is MCTestBase, OZProxy { // solhint-disable address dictionary; constructor() { - System.Config().load(); + // System.Config().load(); implementations[bytes4(0)] = address(new Receive()); } @@ -55,10 +54,3 @@ abstract contract MCStateFuzzingTest is MCTestBase, OZProxy { // solhint-disable } } - -// ๐ŸŒŸ MC TEST for DevKit -abstract contract MCDevKitTest is MCTestBase { - constructor() { - System.Config().load(); - } -} diff --git a/script/DeployStdDictionary.s.sol b/script/DeployStdDictionary.s.sol index fceec90e..9618a93a 100644 --- a/script/DeployStdDictionary.s.sol +++ b/script/DeployStdDictionary.s.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCScriptWithoutSetup} from "devkit/MCScript.sol"; +import {MCScriptBase} from "devkit/MCBase.sol"; import {DeployLib} from "./DeployLib.sol"; import {MCDevKit} from "devkit/MCDevKit.sol"; -contract DeployStdDictionary is MCScriptWithoutSetup { +contract DeployStdDictionary is MCScriptBase { using DeployLib for MCDevKit; function setUp() public { diff --git a/script/DeployStdFunctions.s.sol b/script/DeployStdFunctions.s.sol index 83efdae1..42b72dc9 100644 --- a/script/DeployStdFunctions.s.sol +++ b/script/DeployStdFunctions.s.sol @@ -1,11 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCScriptWithoutSetup} from "devkit/MCScript.sol"; +import {MCScriptBase} from "devkit/MCBase.sol"; import {DeployLib} from "./DeployLib.sol"; import {MCDevKit} from "devkit/MCDevKit.sol"; -contract DeployStdFunctions is MCScriptWithoutSetup { +contract DeployStdFunctions is MCScriptBase { using DeployLib for MCDevKit; function setUp() public { diff --git a/test/devkit/MCDevKit.t.sol b/test/devkit/MCDevKit.t.sol index 9aeafa98..8390985e 100644 --- a/test/devkit/MCDevKit.t.sol +++ b/test/devkit/MCDevKit.t.sol @@ -10,7 +10,7 @@ // import {StringUtils} from "devkit/utils/primitive/StringUtils.sol"; // using StringUtils for string; -// contract MCDevKitTest is Test { +// contract MCTestBase is Test { // MCDevKit internal mc; // function setUp() public { // mc.stopLog(); diff --git a/test/devkit/global/MCBundle.t.sol b/test/devkit/global/MCBundle.t.sol index 33d6f220..82c552fb 100644 --- a/test/devkit/global/MCBundle.t.sol +++ b/test/devkit/global/MCBundle.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCDevKitTest} from "devkit/MCTest.sol"; +import {MCTestBase} from "devkit/MCBase.sol"; import {Inspector} from "devkit/types/Inspector.sol"; using Inspector for string; @@ -15,7 +15,7 @@ import {Function} from "devkit/core/Function.sol"; import {DummyFunction} from "test/utils/DummyFunction.sol"; import {DummyFacade} from "test/utils/DummyFacade.sol"; -contract DevKitTest_MCBundle is MCDevKitTest { +contract DevKitTest_MCBundle is MCTestBase { /**--------------------------- ๐ŸŒฑ Init Custom Bundle -----------------------------*/ diff --git a/test/devkit/global/MCContext.t.sol b/test/devkit/global/MCContext.t.sol index 47b9eb20..0565cd9b 100644 --- a/test/devkit/global/MCContext.t.sol +++ b/test/devkit/global/MCContext.t.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCDevKitTest} from "devkit/MCTest.sol"; +import {MCTestBase} from "devkit/MCBase.sol"; import {Inspector} from "devkit/types/Inspector.sol"; using Inspector for string; import {MessageHead as HEAD} from "devkit/system/message/MessageHead.sol"; -contract DevKitTest_MCContext is MCDevKitTest { +contract DevKitTest_MCContext is MCTestBase { /**----------------------------- โ™ป๏ธ Reset Current Context -------------------------------*/ diff --git a/test/devkit/global/MCDeploy.t.sol b/test/devkit/global/MCDeploy.t.sol index 250411b1..48e29981 100644 --- a/test/devkit/global/MCDeploy.t.sol +++ b/test/devkit/global/MCDeploy.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCDevKitTest} from "devkit/MCTest.sol"; +import {MCTestBase} from "devkit/MCBase.sol"; import {Inspector} from "devkit/types/Inspector.sol"; using Inspector for string; @@ -15,7 +15,7 @@ import {Function} from "devkit/core/Function.sol"; import {DummyFunction} from "test/utils/DummyFunction.sol"; import {DummyFacade} from "test/utils/DummyFacade.sol"; -contract DevKitTest_MCDeploy is MCDevKitTest { +contract DevKitTest_MCDeploy is MCTestBase { /**----------------------------- ๐ŸŒž Deploy Meta Contract -------------------------------*/ diff --git a/test/devkit/global/MCFinder.t.sol b/test/devkit/global/MCFinder.t.sol index f92df3f3..fb089442 100644 --- a/test/devkit/global/MCFinder.t.sol +++ b/test/devkit/global/MCFinder.t.sol @@ -1,14 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCDevKitTest} from "devkit/MCTest.sol"; +import {MCTestBase} from "devkit/MCBase.sol"; import {MessageHead as HEAD} from "devkit/system/message/MessageHead.sol"; import {Formatter} from "devkit/types/Formatter.sol"; using Formatter for string; import {DummyFunction} from "../../utils/DummyFunction.sol"; import {DummyFacade} from "../../utils/DummyFacade.sol"; -contract DevKitTest_MCFinder is MCDevKitTest { +contract DevKitTest_MCFinder is MCTestBase { /**------------------- ๐Ÿ  Find Proxy diff --git a/test/devkit/global/MCSetup.t.sol b/test/devkit/global/MCSetup.t.sol index 7aa863db..4335d51a 100644 --- a/test/devkit/global/MCSetup.t.sol +++ b/test/devkit/global/MCSetup.t.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCDevKitTest} from "devkit/MCTest.sol"; +import {MCTestBase} from "devkit/MCBase.sol"; import {Function} from "devkit/core/Function.sol"; import {TestHelper} from "test/utils/TestHelper.sol"; using TestHelper for Function; -contract DevKitTest_MCSetup is MCDevKitTest { +contract DevKitTest_MCSetup is MCTestBase { /**---------------------------- ๐Ÿงฉ Setup Standard Funcs diff --git a/test/devkit/global/MCTest.t.sol b/test/devkit/global/MCTest.t.sol index 38b8a4c7..a5ffd43e 100644 --- a/test/devkit/global/MCTest.t.sol +++ b/test/devkit/global/MCTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCDevKitTest} from "devkit/MCTest.sol"; +import {MCTestBase} from "devkit/MCBase.sol"; import {Inspector} from "devkit/types/Inspector.sol"; using Inspector for string; @@ -15,7 +15,7 @@ import {Function} from "devkit/core/Function.sol"; import {DummyFunction} from "test/utils/DummyFunction.sol"; import {DummyFacade} from "test/utils/DummyFacade.sol"; -contract DevKitTest_MCTest is MCDevKitTest { +contract DevKitTest_MCTest is MCTestBase { function setUp() public { mc.setupStdFunctions(); } diff --git a/test/script/DeployStdDictionary.t.sol b/test/script/DeployStdDictionary.t.sol new file mode 100644 index 00000000..5701007f --- /dev/null +++ b/test/script/DeployStdDictionary.t.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +import {MCTestBase} from "devkit/MCBase.sol"; +import {DeployLib} from "../../script/DeployLib.sol"; +import {MCDevKit} from "devkit/MCDevKit.sol"; + +contract DeployStdDictionaryTest is MCTestBase { + using DeployLib for MCDevKit; + + function setUp() public { + mc.std.functions.fetch(); + } + + function test_Run_Success() public startPrankWith("DEPLOYER_PRIV_KEY") { + mc.deployStdDictionary(); + } + +} diff --git a/test/std/bundles/Std.t.sol b/test/std/bundles/Std.t.sol index 7fa4498f..92437c15 100644 --- a/test/std/bundles/Std.t.sol +++ b/test/std/bundles/Std.t.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {MCDevKitTest} from "devkit/MCTest.sol"; +import {MCTestBase} from "devkit/MCBase.sol"; import {DeployLib} from "script/DeployLib.sol"; import {MCDevKit} from "devkit/MCDevKit.sol"; import {Clone} from "mc-std/functions/Clone.sol"; -contract StdTest is MCDevKitTest { +contract StdTest is MCTestBase { using DeployLib for MCDevKit; function setUp() public { // mc.startDebug(); From f6df00c52269863a9d68ef8c54a5caa4160b759a Mon Sep 17 00:00:00 2001 From: Kai Hiroi Date: Thu, 2 May 2024 17:44:02 +0900 Subject: [PATCH 5/5] Update CI --- .github/workflows/ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4f3bf5b2..db1718a3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,11 +61,9 @@ jobs: mkdir /tmp/install-with-template-test cd /tmp/install-with-template-test forge init mc-example-project -t metacontract/template - forge test - name: Run forge test run: | cd ./mc-example-project - forge init mc-example-project -t metacontract/template forge test # slither: