Skip to content

Commit 10adcd1

Browse files
w-woloszyndiego-G
andauthored
feat: automation, fixes, and genesis updates (#46)
Co-authored-by: Diego Garcia <diego.gm@pm.me>
1 parent cff535c commit 10adcd1

10 files changed

Lines changed: 117 additions & 122 deletions

File tree

contracts/.env.example

Lines changed: 0 additions & 85 deletions
This file was deleted.

contracts/.env.template

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
T1_L1_RPC=https://sepolia.infura.io/v3/e8d8888d41bb42c39dd591d376f5a2ba
2+
T1_L2_RPC=http://127.0.0.1:8545
3+
CHAIN_ID_L2=3151908
4+
5+
# ---------------------------------------------------------
6+
# BEGIN 1Password PRIVATE KEYS
7+
# ---------------------------------------------------------
8+
L1_DEPLOYER_PRIVATE_KEY=
9+
L2_DEPLOYER_PRIVATE_KEY=
10+
L1_SECURITY_COUNCIL_PRIVATE_KEY=
11+
TEST_PRIVATE_KEY=
12+
ALICE_PRIVATE_KEY=
13+
MARKET_MAKER_PRIVATE_KEY=
14+
# ---------------------------------------------------------
15+
# END
16+
# ---------------------------------------------------------
17+
18+
# ---------------------------------------------------------
19+
# BEGIN CONSTANT ADDRESSES
20+
# ---------------------------------------------------------
21+
MARKET_MAKER_ADDRESS=
22+
L1_POSTMAN_SIGNER_ADDRESS=0xa3e5e908868E2D881E70c304C18636A2f43E933f
23+
L1_PLONK_VERIFIER_ADDR=0x0000000000000000000000000000000000000001
24+
25+
NETWORK=devnet
26+
L1_T1_MULTISIG_ADDR=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
27+
L1_SECURITY_COUNCIL_ADDR=0xd5B9Fc2fb05A3B95cf6C9eB6aD75707d43397d57
28+
L1_PROPOSAL_EXECUTOR_ADDR=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
29+
30+
L2_T1_MULTISIG_ADDR=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
31+
L2_SECURITY_COUNCIL_ADDR=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
32+
L2_PROPOSAL_EXECUTOR_ADDR=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
33+
34+
MAX_TX_IN_CHUNK=100
35+
MAX_L1_MESSAGE_GAS_LIMIT=10000000
36+
L1_COMMIT_SENDER_ADDRESS=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
37+
L1_FINALIZE_SENDER_ADDRESS=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
38+
L1_FEE_VAULT_ADDR=0x0000000000000000000000000000000000000001
39+
40+
L1_EMERGENCY_MULTISIG_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
41+
L1_1D_TIMELOCK_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
42+
L1_7D_TIMELOCK_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
43+
L1_14D_TIMELOCK_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
44+
45+
L2_EMERGENCY_MULTISIG_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
46+
L2_1D_TIMELOCK_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
47+
L2_7D_TIMELOCK_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
48+
L2_14D_TIMELOCK_ADDR=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
49+
50+
L1_USDT_ADDR=0x30E9b6B0d161cBd5Ff8cf904Ff4FA43Ce66AC346
51+
L2_USDT_ADDR=0x337bE36E710f7af68E1fD3DDd48070Cecc5Bb136
52+
L1_WETH_ADDR=0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9
53+
L1_PERMIT2=0x000000000022D473030F116dDEE9F6B43aC78BA3
54+
# ---------------------------------------------------------
55+
# END CONSTANT ADDRESSES
56+
# ---------------------------------------------------------

contracts/deploy.sh

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,41 +10,54 @@ reload_env() {
1010
set +o allexport
1111
}
1212

13-
1413
# Initial environment load
1514
reload_env
1615

17-
# Function to determine RPC URL from the script name, dirty
18-
get_rpc_url() {
16+
# Function to determine RPC URL and verification settings
17+
get_rpc_and_verifier() {
1918
local script_name=$1
19+
local rpc_url=""
20+
local verifier=""
21+
local verifier_url=""
22+
local api_key_flag=""
2023

2124
if [[ $script_name == *"L1"* ]]; then
22-
echo "$T1_L1_RPC"
25+
rpc_url="$T1_L1_RPC"
26+
verifier="etherscan"
27+
verifier_url="https://api-sepolia.etherscan.io/api"
28+
api_key_flag="--etherscan-api-key $ETHERSCAN_API_KEY" # Only needed for Etherscan
2329
elif [[ $script_name == *"L2"* ]]; then
24-
echo "$T1_L2_RPC"
30+
rpc_url="$T1_L2_RPC"
31+
verifier="blockscout"
32+
verifier_url="$BLOCKSCOUT_API_URL" # Ensure this is set in your .env
33+
api_key_flag="" # Blockscout does not require an API key
2534
else
2635
echo "ERROR: Could not determine RPC URL for script: $script_name" >&2
2736
exit 1
2837
fi
38+
39+
echo "$rpc_url $verifier $verifier_url $api_key_flag"
2940
}
3041

31-
# Function to execute a script with the correct RPC URL
42+
# Function to execute a script with the correct RPC URL and verify it
3243
run_script() {
3344
local script_path=$1
3445
local contract_name=$2
35-
local rpc_url
46+
local rpc_url verifier verifier_url api_key_flag
3647

37-
rpc_url=$(get_rpc_url "$contract_name")
48+
read rpc_url verifier verifier_url api_key_flag < <(get_rpc_and_verifier "$contract_name")
3849

39-
echo "=== Running $contract_name ==="
40-
forge script "$script_path:$contract_name" --rpc-url "$rpc_url" --broadcast
50+
echo "=== Deploying $contract_name on $( [[ $verifier == "etherscan" ]] && echo 'Sepolia' || echo 'L2 Blockscout' ) ==="
4151

52+
forge script "$script_path:$contract_name" --rpc-url "$rpc_url" --broadcast --verify --verifier "$verifier" --verifier-url "$verifier_url" $api_key_flag
53+
54+
echo "=== Deployment & Verification of $contract_name completed ==="
55+
4256
# Wait for the .env file to be updated
4357
sleep 10
44-
#reload_env
4558
}
4659

47-
# Deploy contracts
60+
# Deploy & Verify contracts
4861
run_script script/deploy/DeployL1BridgeProxyPlaceholder.s.sol DeployL1BridgeProxyPlaceholder
4962
run_script script/deploy/DeployL1T1Owner.s.sol DeployL1T1Owner
5063
run_script script/deploy/DeployL2BridgeProxyPlaceholder.s.sol DeployL2BridgeProxyPlaceholder
@@ -55,4 +68,4 @@ run_script script/deploy/DeployL1BridgeContracts.s.sol DeployL1BridgeContracts
5568
run_script script/deploy/InitializeL1BridgeContracts.s.sol InitializeL1BridgeContracts
5669
run_script script/deploy/InitializeL2BridgeContracts.s.sol InitializeL2BridgeContracts
5770
run_script script/deploy/InitializeL1T1Owner.s.sol InitializeL1T1Owner
58-
run_script script/deploy/InitializeL2T1Owner.s.sol InitializeL2T1Owner
71+

contracts/script/deploy/InitializeL1BridgeContracts.s.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { L2GasPriceOracle } from "../../src/L1/rollup/L2GasPriceOracle.sol";
2121

2222
contract InitializeL1BridgeContracts is Script {
2323
uint256 private L1_DEPLOYER_PRIVATE_KEY = vm.envUint("L1_DEPLOYER_PRIVATE_KEY");
24-
address private L1_DEPLOYER_ADDRESS = vm.envAddress("L1_DEPLOYER_ADDRESS");
24+
address private L1_POSTMAN_SIGNER_ADDRESS = vm.envAddress("L1_POSTMAN_SIGNER_ADDRESS");
2525

2626
uint256 private CHAIN_ID_L2 = vm.envUint("CHAIN_ID_L2");
2727
uint256 private MAX_TX_IN_CHUNK = vm.envUint("MAX_TX_IN_CHUNK");
@@ -75,7 +75,7 @@ contract InitializeL1BridgeContracts is Script {
7575
T1Chain(L1_T1_CHAIN_PROXY_ADDR).addSequencer(L1_COMMIT_SENDER_ADDRESS);
7676
T1Chain(L1_T1_CHAIN_PROXY_ADDR).addProver(L1_FINALIZE_SENDER_ADDRESS);
7777

78-
T1Chain(L1_T1_CHAIN_PROXY_ADDR).addProver(L1_DEPLOYER_ADDRESS);
78+
T1Chain(L1_T1_CHAIN_PROXY_ADDR).addProver(L1_POSTMAN_SIGNER_ADDRESS);
7979

8080
// initialize L2GasPriceOracle
8181
L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).initialize(

contracts/script/deploy/InitializeL1T1Owner.s.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,5 +205,6 @@ contract InitializeL1T1Owner is Script {
205205
_selectors[1] = L1GatewayRouter.setMM.selector;
206206
owner.updateAccess(L1_GATEWAY_ROUTER_PROXY_ADDR, _selectors, T1_MULTISIG_NO_DELAY_ROLE, true);
207207
owner.updateAccess(L1_GATEWAY_ROUTER_PROXY_ADDR, _selectors, EMERGENCY_MULTISIG_NO_DELAY_ROLE, true);
208+
owner.updateAccess(L1_GATEWAY_ROUTER_PROXY_ADDR, _selectors, SECURITY_COUNCIL_NO_DELAY_ROLE, true);
208209
}
209210
}

contracts/script/lib/DeploymentUtils.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity >=0.8.28;
33

4-
import "forge-std/Script.sol";
5-
import "forge-std/console.sol";
4+
import { Script } from "forge-std/Script.sol";
5+
import { console } from "forge-std/console.sol";
66

77
/**
88
* @dev An abstract contract that extends `Script`.

contracts/script/test/DepositUsdtFromL1ToL2.s.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ contract DepositUsdtFromL1ToL2 is Script {
2121

2222
uint256 gasLimit = 1_000_000;
2323

24-
T1StandardERC20(L1_USDT_ADDR).approve(L1_GATEWAY_ROUTER_PROXY_ADDR, 0.01 ether);
24+
T1StandardERC20(L1_USDT_ADDR).approve(L1_GATEWAY_ROUTER_PROXY_ADDR, 1000 ether);
2525

26-
IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).depositERC20(L1_USDT_ADDR, 0.01 ether, gasLimit);
26+
IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).depositERC20(L1_USDT_ADDR, 1000 ether, gasLimit);
2727

2828
address l2usdtAddress = IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).getL2ERC20Address(L1_USDT_ADDR);
2929
logAddress("L2_USDT_ADDR", l2usdtAddress);

contracts/script/test/SetMM.s.sol

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
pragma solidity >=0.8.28;
44

5+
import { console } from "forge-std/console.sol";
56
import { Script } from "forge-std/Script.sol";
67

78
import { IL1GatewayRouter } from "../../src/L1/gateways/IL1GatewayRouter.sol";
@@ -10,25 +11,28 @@ import { T1Owner } from "../../src/misc/T1Owner.sol";
1011
// solhint-disable var-name-mixedcase
1112

1213
contract SetMM is Script {
13-
address private L1_SECURITY_COUNCIL_ADDR = vm.envAddress("L1_SECURITY_COUNCIL_ADDR");
14+
bytes32 private constant SECURITY_COUNCIL_NO_DELAY_ROLE = keccak256("SECURITY_COUNCIL_NO_DELAY_ROLE");
15+
1416
address private L1_GATEWAY_ROUTER_PROXY_ADDR = vm.envAddress("L1_GATEWAY_ROUTER_PROXY_ADDR");
15-
uint256 private L1_DEPLOYER_PRIVATE_KEY = vm.envUint("L1_DEPLOYER_PRIVATE_KEY");
16-
uint256 private ALICE_PRIVATE_KEY = vm.envUint("ALICE_PRIVATE_KEY");
17-
address private filler = vm.addr(ALICE_PRIVATE_KEY);
17+
address private L1_T1_OWNER_ADDR = vm.envAddress("L1_T1_OWNER_ADDR");
18+
uint256 private L1_SECURITY_COUNCIL_PRIVATE_KEY = vm.envUint("L1_SECURITY_COUNCIL_PRIVATE_KEY");
19+
address private newMarketMaker = vm.envAddress("MARKET_MAKER_ADDRESS");
1820

1921
function run() external {
2022
vm.createSelectFork(vm.rpcUrl("sepolia"));
21-
vm.startBroadcast(L1_DEPLOYER_PRIVATE_KEY);
23+
vm.startBroadcast(L1_SECURITY_COUNCIL_PRIVATE_KEY);
2224

2325
// Check if the market maker is set to this address
24-
if (IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).marketMaker() != filler) {
25-
T1Owner(payable(L1_SECURITY_COUNCIL_ADDR)).execute(
26+
if (IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).marketMaker() != newMarketMaker) {
27+
T1Owner(payable(L1_T1_OWNER_ADDR)).execute(
2628
L1_GATEWAY_ROUTER_PROXY_ADDR,
2729
0,
28-
abi.encodeWithSelector(IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).setMM.selector, filler),
29-
bytes32(0)
30+
abi.encodeWithSelector(IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).setMM.selector, newMarketMaker),
31+
SECURITY_COUNCIL_NO_DELAY_ROLE
3032
);
3133
}
34+
35+
console.log("[%s] is the new market maker", IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).marketMaker());
3236
vm.stopBroadcast();
3337
}
3438
}

contracts/script/test/SwapERC20.s.sol

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { PermitSignature } from "../../src/test/utils/PermitSignature.sol";
1616
import { T1Constants } from "../../src/libraries/constants/T1Constants.sol";
1717

1818
// solhint-disable var-name-mixedcase
19+
// solhint-disable reason-string
1920

2021
contract SwapERC20 is Script, PermitSignature {
2122
address private L1_GATEWAY_ROUTER_PROXY_ADDR = vm.envAddress("L1_GATEWAY_ROUTER_PROXY_ADDR");
@@ -24,12 +25,14 @@ contract SwapERC20 is Script, PermitSignature {
2425
address private L1_USDT_ADDR = vm.envAddress("L1_USDT_ADDR");
2526
uint256 private ALICE_PRIVATE_KEY = vm.envUint("ALICE_PRIVATE_KEY");
2627
address private alice = vm.addr(ALICE_PRIVATE_KEY);
27-
uint256 private inputTokenAmount = 1e15; // WETH
28-
uint256 private outputTokenAmount = 10e18; // USDT
28+
uint256 private MARKET_MAKER_PRIVATE_KEY = vm.envUint("MARKET_MAKER_PRIVATE_KEY");
29+
address private marketMaker = vm.addr(MARKET_MAKER_PRIVATE_KEY);
30+
uint256 private inputTokenAmount = 0.0001 ether; // WETH
31+
uint256 private outputTokenAmount = 1 ether; // USDT
2932

3033
function run() external {
3134
vm.createSelectFork(vm.rpcUrl("sepolia"));
32-
vm.startBroadcast(ALICE_PRIVATE_KEY);
35+
vm.startBroadcast(MARKET_MAKER_PRIVATE_KEY);
3336

3437
// Alice needs WETH to swap for USDT
3538
// Bridge should have USDT to swap for WETH
@@ -38,8 +41,8 @@ contract SwapERC20 is Script, PermitSignature {
3841

3942
ISignatureTransfer.PermitTransferFrom memory permit = ISignatureTransfer.PermitTransferFrom({
4043
permitted: ISignatureTransfer.TokenPermissions({ token: L1_WETH_ADDR, amount: inputTokenAmount }),
41-
nonce: 0,
42-
deadline: block.timestamp + 1000
44+
nonce: uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.prevrandao))),
45+
deadline: block.timestamp + 10_000_000
4346
});
4447

4548
IL1GatewayRouter.Witness memory witness = IL1GatewayRouter.Witness({
@@ -71,11 +74,11 @@ contract SwapERC20 is Script, PermitSignature {
7174
}
7275

7376
// Check if the ERC20 gateway has approved the permit2 to transfer USDT
74-
// TODO include check allowance transfer to the router on USDT
77+
// TODO - Check if allowance has expired
7578
if (T1StandardERC20(L1_USDT_ADDR).allowance(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR, permit2) < outputTokenAmount)
7679
{
7780
IL1StandardERC20Gateway(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).allowRouterToTransfer(
78-
L1_USDT_ADDR, type(uint160).max, uint48(block.timestamp + 1000)
81+
L1_USDT_ADDR, type(uint160).max, uint48(block.timestamp + 10_000_000)
7982
);
8083
}
8184

@@ -85,9 +88,9 @@ contract SwapERC20 is Script, PermitSignature {
8588
"ERC20 gateway doesn't have enough USDT"
8689
);
8790

88-
// Use SetMM script to set this address as the router's market maker
91+
// Use SetMM script to set alice as the router's market maker
8992
require(
90-
IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).marketMaker() == address(this),
93+
IL1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).marketMaker() == marketMaker,
9194
"Signer is not the market maker in the router"
9295
);
9396

docker-compose/reth/network-configs/genesis.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@
103103
},
104104
"0xa46E94F9705E17041c7Bf8d06f3c0f2B1E71C218": {
105105
"balance": "1000000000000000000000000"
106+
},
107+
"0xF1441F1d18cE531F8B16F3D80892864e9f9F333a": {
108+
"balance": "1000000000000000000000000"
106109
}
107110
}
108111
}

0 commit comments

Comments
 (0)