diff --git a/l1-contracts/script/BaseScript.s.sol b/l1-contracts/script/BaseScript.s.sol index 374d85e..1d49d0e 100644 --- a/l1-contracts/script/BaseScript.s.sol +++ b/l1-contracts/script/BaseScript.s.sol @@ -1,13 +1,13 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0 <0.9.0; -import "forge-std/Script.sol"; +import "./utils/ContractAddressManager.s.sol"; /** * @title Base Script * @author Puffer Finance */ -abstract contract BaseScript is Script { +abstract contract BaseScript is ContractAddressManager { uint256 internal PK = 55358659325830545179143827536745912452716312441367500916455484419538098489698; // makeAddr("pufferDeployer") // Anvil and `forge test` environment share the same chainId diff --git a/l1-contracts/script/utils/ContractAddressManager.s.sol b/l1-contracts/script/utils/ContractAddressManager.s.sol new file mode 100644 index 0000000..1cb69bb --- /dev/null +++ b/l1-contracts/script/utils/ContractAddressManager.s.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +contract ContractAddressManager is Script { + using stdJson for string; + + string private constant OUTPUT_DIR = "output/"; + string private constant FILE_NAME = "contractDeployments.json"; + + function writeAddress(string memory contractName, address contractAddress) public { + string memory filePath = getFilePath(); + string memory json = vm.readFile(filePath); + + if (bytes(json).length == 0) { + json = "{}"; + } + + json = json.serialize(contractName, contractAddress); + vm.writeFile(filePath, json); + + console.log("Wrote address for", contractName, ":", contractAddress); + } + + function readAddress(string memory contractName) public view returns (address) { + string memory filePath = getFilePath(); + string memory json = vm.readFile(filePath); + + if (bytes(json).length == 0) { + revert("Contract address file is empty or doesn't exist"); + } + + address contractAddress = json.readAddress(string(abi.encodePacked(".", contractName))); + return contractAddress; + } + + function getFilePath() private view returns (string memory) { + uint256 chainId = block.chainid; + return string(abi.encodePacked(OUTPUT_DIR, vm.toString(chainId), "/", FILE_NAME)); + } +} diff --git a/l1-contracts/script/utils/DeploymentScript.s.sol b/l1-contracts/script/utils/DeploymentScript.s.sol new file mode 100644 index 0000000..3ea29cb --- /dev/null +++ b/l1-contracts/script/utils/DeploymentScript.s.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Script.sol"; +import "./ContractAddressManager.s.sol"; + +abstract contract DeploymentScript is Script, ContractAddressManager { + // Add any common state variables here + + function run() public { + vm.startBroadcast(); + + // Pre-deployment actions + preDeploymentActions(); + + // Deployment + deploy(); + + // Post-deployment actions + postDeploymentActions(); + + vm.stopBroadcast(); + } + + function preDeploymentActions() internal virtual { + // Read necessary contract addresses + // Example: + // address someContract = readAddress("SomeContract"); + } + + function deploy() internal virtual { + // Implement the actual deployment logic + // This function should be overridden in the specific deployment scripts + } + + function postDeploymentActions() internal virtual { + // Write new contract addresses + // Example: + // writeAddress("NewContract", address(newContract)); + + // Setup ACL for the contract selectors + setupAccessControl(); + } + + function setupAccessControl() internal virtual { + // Setup ACL for the deployed contracts + } +}