Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(contracts): foundry scripts for ScrollOwner #838

Merged
merged 38 commits into from
Sep 21, 2023
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
3a7a74c
add foundry scripts for ScrollOwner
zimpha Aug 21, 2023
3cfc36b
Merge remote-tracking branch 'origin/develop' into feat/scroll_owner_…
zimpha Aug 21, 2023
e20839f
chore: auto version bump [bot]
zimpha Aug 21, 2023
a3a02e6
also transfer owner in script
zimpha Sep 1, 2023
1e865df
merge with develop branch
zimpha Sep 1, 2023
15fed3e
chore: auto version bump [bot]
zimpha Sep 1, 2023
1df9ccd
Merge branch 'develop' into feat/scroll_owner_deploy_and_initialize
Thegaram Sep 7, 2023
8b56cb1
update selector
Thegaram Sep 8, 2023
fbc9c12
merge with develop branch
zimpha Sep 12, 2023
ab73964
fix missing updateVerifier for scroll multisig; add rate limiter and …
zimpha Sep 12, 2023
2ceabe1
Merge remote-tracking branch 'origin/develop' into feat/scroll_owner_…
zimpha Sep 14, 2023
1dee8a0
fix comments
zimpha Sep 14, 2023
e3cee0d
Merge remote-tracking branch 'origin/develop' into feat/scroll_owner_…
zimpha Sep 18, 2023
0fe1069
make no delay on rate-limit update
zimpha Sep 18, 2023
8c318d5
Update contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol
zimpha Sep 20, 2023
e096b00
Update contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol
zimpha Sep 20, 2023
5584780
Update contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol
zimpha Sep 20, 2023
8df94ce
Update contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol
zimpha Sep 20, 2023
456e54c
Update contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol
zimpha Sep 20, 2023
6fccd48
Update contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol
zimpha Sep 20, 2023
5a271ea
Update contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol
zimpha Sep 20, 2023
08d26e4
Update contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol
zimpha Sep 20, 2023
65d91e3
Merge branch 'develop' into feat/scroll_owner_deploy_and_initialize
zimpha Sep 20, 2023
03d7843
use smaller delay in testnet
zimpha Sep 20, 2023
fc80630
remove ownable in configMultipleVersionRollupVerifier
zimpha Sep 20, 2023
b784f5b
add InitializeL2RateLimiter for initialization
zimpha Sep 20, 2023
80c7067
Update contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol
zimpha Sep 20, 2023
767069e
make setIntrinsicParams onlyOwner
zimpha Sep 20, 2023
88e064c
Merge branch 'develop' into feat/scroll_owner_deploy_and_initialize
Thegaram Sep 20, 2023
461c8e8
fix: use consistent name for timelock controller contracts (#957)
Thegaram Sep 20, 2023
ab6c986
configure L1Whitelist
Thegaram Sep 20, 2023
4830388
use DEFAULT_ADMIN_ROLE()
Thegaram Sep 20, 2023
2153097
configure L1ScrollMessenger updateMaxReplayTimes
Thegaram Sep 20, 2023
fd5dcda
fix based on latest access control docs
zimpha Sep 21, 2023
050afbd
fix based on latest access control docs
zimpha Sep 21, 2023
3bd52de
transfer ownership for L2MessageQueue
Thegaram Sep 21, 2023
963ff7f
Merge branch 'develop' into feat/scroll_owner_deploy_and_initialize
Thegaram Sep 21, 2023
8e59a2e
Merge branch 'develop' into feat/scroll_owner_deploy_and_initialize
Thegaram Sep 21, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
88 changes: 88 additions & 0 deletions contracts/scripts/foundry/DeployL1ScrollOwner.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;

import {Script} from "forge-std/Script.sol";
import {console} from "forge-std/console.sol";

import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";

import {ScrollOwner} from "../../src/misc/ScrollOwner.sol";

// solhint-disable state-visibility
// solhint-disable var-name-mixedcase

contract DeployL1ScrollOwner is Script {
string NETWORK = vm.envString("NETWORK");

uint256 L1_DEPLOYER_PRIVATE_KEY = vm.envUint("L1_DEPLOYER_PRIVATE_KEY");

address SCROLL_MULTISIG_ADDR = vm.envAddress("L1_SCROLL_MULTISIG_ADDR");

address SECURITY_COUNCIL_ADDR = vm.envAddress("L1_SECURITY_COUNCIL_ADDR");

address L1_PROPOSAL_EXECUTOR_ADDR = vm.envAddress("L1_PROPOSAL_EXECUTOR_ADDR");

function run() external {
vm.startBroadcast(L1_DEPLOYER_PRIVATE_KEY);

deployScrollOwner();

if (keccak256(abi.encodePacked(NETWORK)) == keccak256(abi.encodePacked("sepolia"))) {
// for sepolia
deployMinuteDelayTimelockController(1);
deployMinuteDelayTimelockController(7);
deployMinuteDelayTimelockController(14);
} else if (keccak256(abi.encodePacked(NETWORK)) == keccak256(abi.encodePacked("mainnet"))) {
// for mainnet
deployDayDelayTimelockController(1);
deployDayDelayTimelockController(7);
deployDayDelayTimelockController(14);
}

vm.stopBroadcast();
}

function deployScrollOwner() internal {
ScrollOwner owner = new ScrollOwner();

logAddress("L1_SCROLL_OWNER_ADDR", address(owner));
}

function deployDayDelayTimelockController(uint256 delayInDay) internal {
address[] memory proposers = new address[](1);
address[] memory executors = new address[](1);

proposers[0] = SCROLL_MULTISIG_ADDR;
executors[0] = L1_PROPOSAL_EXECUTOR_ADDR;

TimelockController timelock = new TimelockController(
delayInDay * 1 days,
Thegaram marked this conversation as resolved.
Show resolved Hide resolved
proposers,
executors,
SECURITY_COUNCIL_ADDR
Thegaram marked this conversation as resolved.
Show resolved Hide resolved
Thegaram marked this conversation as resolved.
Show resolved Hide resolved
);

logAddress(string(abi.encodePacked("L1_", vm.toString(delayInDay), "D_TIMELOCK_ADDR")), address(timelock));
}

function deployMinuteDelayTimelockController(uint256 delayInMinute) internal {
address[] memory proposers = new address[](1);
address[] memory executors = new address[](1);

proposers[0] = SCROLL_MULTISIG_ADDR;
executors[0] = L1_PROPOSAL_EXECUTOR_ADDR;

TimelockController timelock = new TimelockController(
delayInMinute * 1 minutes,
proposers,
executors,
SECURITY_COUNCIL_ADDR
);

logAddress(string(abi.encodePacked("L1_", vm.toString(delayInMinute), "M_TIMELOCK_ADDR")), address(timelock));
Thegaram marked this conversation as resolved.
Show resolved Hide resolved
}

function logAddress(string memory name, address addr) internal view {
console.log(string(abi.encodePacked(name, "=", vm.toString(address(addr)))));
}
}
70 changes: 70 additions & 0 deletions contracts/scripts/foundry/DeployL2RateLimiter.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;

import {Script} from "forge-std/Script.sol";
import {console} from "forge-std/console.sol";

import {ScrollGatewayBase} from "../../src/libraries/gateway/ScrollGatewayBase.sol";
import {ScrollMessengerBase} from "../../src/libraries/ScrollMessengerBase.sol";

import {ETHRateLimiter} from "../../src/rate-limiter/ETHRateLimiter.sol";
import {TokenRateLimiter} from "../../src/rate-limiter/TokenRateLimiter.sol";

contract DeployL2RateLimiter is Script {
uint256 L2_DEPLOYER_PRIVATE_KEY = vm.envUint("L2_DEPLOYER_PRIVATE_KEY");

address L2_SCROLL_MESSENGER_PROXY_ADDR = vm.envAddress("L2_SCROLL_MESSENGER_PROXY_ADDR");

address L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR = vm.envAddress("L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR");
address L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR = vm.envAddress("L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR");
address L2_DAI_GATEWAY_PROXY_ADDR = vm.envAddress("L2_DAI_GATEWAY_PROXY_ADDR");
// address L2_USDC_GATEWAY_PROXY_ADDR = vm.envAddress("L2_USDC_GATEWAY_PROXY_ADDR");

uint256 RATE_LIMITER_PERIOD_LENGTH = vm.envUint("RATE_LIMITER_PERIOD_LENGTH");
uint104 ETH_TOTAL_LIMIT = uint104(vm.envUint("ETH_TOTAL_LIMIT"));

function run() external {
vm.startBroadcast(L2_DEPLOYER_PRIVATE_KEY);

deployETHRateLimiter();
deployTokenRateLimiter();

vm.stopBroadcast();
}

function deployETHRateLimiter() internal {
ETHRateLimiter limiter = new ETHRateLimiter(
RATE_LIMITER_PERIOD_LENGTH,
L2_SCROLL_MESSENGER_PROXY_ADDR,
ETH_TOTAL_LIMIT
);

logAddress("L2_ETH_RATE_LIMITER_ADDR", address(limiter));

ScrollMessengerBase(payable(L2_SCROLL_MESSENGER_PROXY_ADDR)).updateRateLimiter(address(limiter));
zimpha marked this conversation as resolved.
Show resolved Hide resolved
}

function deployTokenRateLimiter() internal {
TokenRateLimiter limiter = new TokenRateLimiter(RATE_LIMITER_PERIOD_LENGTH);

logAddress("L2_TOKEN_RATE_LIMITER_ADDR", address(limiter));

bytes32 TOKEN_SPENDER_ROLE = limiter.TOKEN_SPENDER_ROLE();

limiter.grantRole(TOKEN_SPENDER_ROLE, L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR);
limiter.grantRole(TOKEN_SPENDER_ROLE, L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR);
limiter.grantRole(TOKEN_SPENDER_ROLE, L2_DAI_GATEWAY_PROXY_ADDR);

ScrollGatewayBase(payable(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR)).updateRateLimiter(address(limiter));
ScrollGatewayBase(payable(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR)).updateRateLimiter(address(limiter));
ScrollGatewayBase(payable(L2_DAI_GATEWAY_PROXY_ADDR)).updateRateLimiter(address(limiter));

// @note comments out for now
// limiter.grantRole(TOKEN_SPENDER_ROLE, L2_USDC_GATEWAY_PROXY_ADDR);
// ScrollGatewayBase(payable(L2_USDC_GATEWAY_PROXY_ADDR)).updateRateLimiter(address(limiter));
}

function logAddress(string memory name, address addr) internal view {
console.log(string(abi.encodePacked(name, "=", vm.toString(address(addr)))));
}
}
88 changes: 88 additions & 0 deletions contracts/scripts/foundry/DeployL2ScrollOwner.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;

import {Script} from "forge-std/Script.sol";
import {console} from "forge-std/console.sol";

import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";

import {ScrollOwner} from "../../src/misc/ScrollOwner.sol";

// solhint-disable state-visibility
// solhint-disable var-name-mixedcase

contract DeployL2ScrollOwner is Script {
string NETWORK = vm.envString("NETWORK");

uint256 L2_DEPLOYER_PRIVATE_KEY = vm.envUint("L2_DEPLOYER_PRIVATE_KEY");

address SCROLL_MULTISIG_ADDR = vm.envAddress("L2_SCROLL_MULTISIG_ADDR");

address SECURITY_COUNCIL_ADDR = vm.envAddress("L2_SECURITY_COUNCIL_ADDR");

address L2_PROPOSAL_EXECUTOR_ADDR = vm.envAddress("L2_PROPOSAL_EXECUTOR_ADDR");

function run() external {
vm.startBroadcast(L2_DEPLOYER_PRIVATE_KEY);

deployScrollOwner();

if (keccak256(abi.encodePacked(NETWORK)) == keccak256(abi.encodePacked("sepolia"))) {
// for sepolia
deployMinuteDelayTimelockController(1);
deployMinuteDelayTimelockController(7);
deployMinuteDelayTimelockController(14);
} else if (keccak256(abi.encodePacked(NETWORK)) == keccak256(abi.encodePacked("mainnet"))) {
// for mainnet
deployDayDelayTimelockController(1);
deployDayDelayTimelockController(7);
deployDayDelayTimelockController(14);
}

vm.stopBroadcast();
}

function deployScrollOwner() internal {
ScrollOwner owner = new ScrollOwner();

logAddress("L2_SCROLL_OWNER_ADDR", address(owner));
}

function deployDayDelayTimelockController(uint256 delayInDay) internal {
address[] memory proposers = new address[](1);
address[] memory executors = new address[](1);

proposers[0] = SCROLL_MULTISIG_ADDR;
executors[0] = L2_PROPOSAL_EXECUTOR_ADDR;

TimelockController timelock = new TimelockController(
delayInDay * 1 days,
proposers,
executors,
SECURITY_COUNCIL_ADDR
);

logAddress(string(abi.encodePacked("L2_", vm.toString(delayInDay), "D_TIMELOCK_ADDR")), address(timelock));
}

function deployMinuteDelayTimelockController(uint256 delayInMinute) internal {
address[] memory proposers = new address[](1);
address[] memory executors = new address[](1);

proposers[0] = SCROLL_MULTISIG_ADDR;
executors[0] = L2_PROPOSAL_EXECUTOR_ADDR;

TimelockController timelock = new TimelockController(
delayInMinute * 1 minutes,
proposers,
executors,
SECURITY_COUNCIL_ADDR
);

logAddress(string(abi.encodePacked("L2_", vm.toString(delayInMinute), "M_TIMELOCK_ADDR")), address(timelock));
}

function logAddress(string memory name, address addr) internal view {
console.log(string(abi.encodePacked(name, "=", vm.toString(address(addr)))));
}
}