Skip to content

Commit a87c7d7

Browse files
committed
feat: l1 robust deployment script
1 parent ffa830b commit a87c7d7

File tree

3 files changed

+175
-92
lines changed

3 files changed

+175
-92
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,5 @@ broadcast
1919

2020
# Visual Studio Code
2121
.vscode
22+
23+
volume

scripts/deterministic/DeployScroll.s.sol

Lines changed: 154 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,148 +1011,216 @@ contract DeployScroll is DeterminsticDeployment {
10111011
**********************/
10121012

10131013
function initializeScrollChain() private {
1014-
ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).initialize(
1015-
notnull(L1_MESSAGE_QUEUE_PROXY_ADDR),
1016-
notnull(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR),
1017-
MAX_TX_IN_CHUNK
1018-
);
1014+
if (getInitializeCount(L1_SCROLL_CHAIN_PROXY_ADDR) == 0) {
1015+
ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).initialize(
1016+
notnull(L1_MESSAGE_QUEUE_PROXY_ADDR),
1017+
notnull(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR),
1018+
MAX_TX_IN_CHUNK
1019+
);
1020+
}
10191021

1020-
ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addSequencer(L1_COMMIT_SENDER_ADDR);
1021-
ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addProver(L1_FINALIZE_SENDER_ADDR);
1022+
if (!ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).isSequencer(L1_COMMIT_SENDER_ADDR)) {
1023+
ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addSequencer(L1_COMMIT_SENDER_ADDR);
1024+
}
1025+
if (!ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).isProver(L1_FINALIZE_SENDER_ADDR)) {
1026+
ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addProver(L1_FINALIZE_SENDER_ADDR);
1027+
}
10221028
}
10231029

10241030
function initializeL2GasPriceOracle() private {
1025-
L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).initialize(
1026-
21000, // _txGas
1027-
53000, // _txGasContractCreation
1028-
4, // _zeroGas
1029-
16 // _nonZeroGas
1030-
);
1031-
1032-
L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).updateWhitelist(L1_WHITELIST_ADDR);
1031+
if (getInitializeCount(L2_GAS_PRICE_ORACLE_PROXY_ADDR) == 0) {
1032+
L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).initialize(
1033+
21000, // _txGas
1034+
53000, // _txGasContractCreation
1035+
4, // _zeroGas
1036+
16 // _nonZeroGas
1037+
);
1038+
}
1039+
if (L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).whitelist() != L1_WHITELIST_ADDR) {
1040+
L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).updateWhitelist(L1_WHITELIST_ADDR);
1041+
}
10331042
}
10341043

10351044
function initializeL1MessageQueue() private {
1036-
L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initialize(
1037-
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR),
1038-
notnull(L1_SCROLL_CHAIN_PROXY_ADDR),
1039-
notnull(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR),
1040-
notnull(L2_GAS_PRICE_ORACLE_PROXY_ADDR),
1041-
MAX_L1_MESSAGE_GAS_LIMIT
1042-
);
1043-
1044-
L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initializeV2();
1045+
if (getInitializeCount(L1_MESSAGE_QUEUE_PROXY_ADDR) == 0) {
1046+
L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initialize(
1047+
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR),
1048+
notnull(L1_SCROLL_CHAIN_PROXY_ADDR),
1049+
notnull(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR),
1050+
notnull(L2_GAS_PRICE_ORACLE_PROXY_ADDR),
1051+
MAX_L1_MESSAGE_GAS_LIMIT
1052+
);
1053+
}
1054+
if (
1055+
getInitializeCount(L1_MESSAGE_QUEUE_PROXY_ADDR) == 0 || getInitializeCount(L1_MESSAGE_QUEUE_PROXY_ADDR) == 1
1056+
) {
1057+
L1MessageQueueWithGasPriceOracle(L1_MESSAGE_QUEUE_PROXY_ADDR).initializeV2();
1058+
}
10451059
}
10461060

10471061
function initializeL1ScrollMessenger() private {
1048-
L1ScrollMessenger(payable(L1_SCROLL_MESSENGER_PROXY_ADDR)).initialize(
1049-
notnull(L2_SCROLL_MESSENGER_PROXY_ADDR),
1050-
notnull(L1_FEE_VAULT_ADDR),
1051-
notnull(L1_SCROLL_CHAIN_PROXY_ADDR),
1052-
notnull(L1_MESSAGE_QUEUE_PROXY_ADDR)
1053-
);
1062+
if (getInitializeCount(L1_SCROLL_MESSENGER_PROXY_ADDR) == 0) {
1063+
L1ScrollMessenger(payable(L1_SCROLL_MESSENGER_PROXY_ADDR)).initialize(
1064+
notnull(L2_SCROLL_MESSENGER_PROXY_ADDR),
1065+
notnull(L1_FEE_VAULT_ADDR),
1066+
notnull(L1_SCROLL_CHAIN_PROXY_ADDR),
1067+
notnull(L1_MESSAGE_QUEUE_PROXY_ADDR)
1068+
);
1069+
}
10541070
}
10551071

10561072
function initializeEnforcedTxGateway() private {
1057-
EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).initialize(
1058-
notnull(L1_MESSAGE_QUEUE_PROXY_ADDR),
1059-
notnull(L1_FEE_VAULT_ADDR)
1060-
);
1073+
if (getInitializeCount(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR) == 0) {
1074+
EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).initialize(
1075+
notnull(L1_MESSAGE_QUEUE_PROXY_ADDR),
1076+
notnull(L1_FEE_VAULT_ADDR)
1077+
);
1078+
}
10611079

10621080
// disable gateway
1063-
EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).setPause(true);
1081+
if (!EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).paused()) {
1082+
EnforcedTxGateway(payable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR)).setPause(true);
1083+
}
10641084
}
10651085

10661086
function initializeL1GatewayRouter() private {
1067-
L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).initialize(
1068-
notnull(L1_ETH_GATEWAY_PROXY_ADDR),
1069-
notnull(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR)
1070-
);
1087+
if (getInitializeCount(L1_GATEWAY_ROUTER_PROXY_ADDR) == 0) {
1088+
L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).initialize(
1089+
notnull(L1_ETH_GATEWAY_PROXY_ADDR),
1090+
notnull(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR)
1091+
);
1092+
}
10711093
}
10721094

10731095
function initializeL1CustomERC20Gateway() private {
1074-
L1CustomERC20Gateway(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).initialize(
1075-
notnull(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR),
1076-
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1077-
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1078-
);
1096+
if (getInitializeCount(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR) == 0) {
1097+
L1CustomERC20Gateway(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).initialize(
1098+
notnull(L2_CUSTOM_ERC20_GATEWAY_PROXY_ADDR),
1099+
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1100+
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1101+
);
1102+
}
10791103
}
10801104

10811105
function initializeL1ERC1155Gateway() private {
1082-
L1ERC1155Gateway(L1_ERC1155_GATEWAY_PROXY_ADDR).initialize(
1083-
notnull(L2_ERC1155_GATEWAY_PROXY_ADDR),
1084-
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1085-
);
1106+
if (getInitializeCount(L1_ERC1155_GATEWAY_PROXY_ADDR) == 0) {
1107+
L1ERC1155Gateway(L1_ERC1155_GATEWAY_PROXY_ADDR).initialize(
1108+
notnull(L2_ERC1155_GATEWAY_PROXY_ADDR),
1109+
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1110+
);
1111+
}
10861112
}
10871113

10881114
function initializeL1ERC721Gateway() private {
1089-
L1ERC721Gateway(L1_ERC721_GATEWAY_PROXY_ADDR).initialize(
1090-
notnull(L2_ERC721_GATEWAY_PROXY_ADDR),
1091-
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1092-
);
1115+
if (getInitializeCount(L1_ERC721_GATEWAY_PROXY_ADDR) == 0) {
1116+
L1ERC721Gateway(L1_ERC721_GATEWAY_PROXY_ADDR).initialize(
1117+
notnull(L2_ERC721_GATEWAY_PROXY_ADDR),
1118+
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1119+
);
1120+
}
10931121
}
10941122

10951123
function initializeL1ETHGateway() private {
1096-
L1ETHGateway(L1_ETH_GATEWAY_PROXY_ADDR).initialize(
1097-
notnull(L2_ETH_GATEWAY_PROXY_ADDR),
1098-
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1099-
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1100-
);
1124+
if (getInitializeCount(L1_ETH_GATEWAY_PROXY_ADDR) == 0) {
1125+
L1ETHGateway(L1_ETH_GATEWAY_PROXY_ADDR).initialize(
1126+
notnull(L2_ETH_GATEWAY_PROXY_ADDR),
1127+
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1128+
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1129+
);
1130+
}
11011131
}
11021132

11031133
function initializeL1StandardERC20Gateway() private {
1104-
L1StandardERC20Gateway(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).initialize(
1105-
notnull(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR),
1106-
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1107-
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR),
1108-
notnull(L2_SCROLL_STANDARD_ERC20_ADDR),
1109-
notnull(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR)
1110-
);
1134+
if (getInitializeCount(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR) == 0) {
1135+
L1StandardERC20Gateway(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).initialize(
1136+
notnull(L2_STANDARD_ERC20_GATEWAY_PROXY_ADDR),
1137+
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1138+
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR),
1139+
notnull(L2_SCROLL_STANDARD_ERC20_ADDR),
1140+
notnull(L2_SCROLL_STANDARD_ERC20_FACTORY_ADDR)
1141+
);
1142+
}
11111143
}
11121144

11131145
function initializeL1WETHGateway() private {
1114-
L1WETHGateway(payable(L1_WETH_GATEWAY_PROXY_ADDR)).initialize(
1115-
notnull(L2_WETH_GATEWAY_PROXY_ADDR),
1116-
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1117-
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1118-
);
1146+
if (getInitializeCount(L1_WETH_GATEWAY_PROXY_ADDR) == 0) {
1147+
L1WETHGateway(payable(L1_WETH_GATEWAY_PROXY_ADDR)).initialize(
1148+
notnull(L2_WETH_GATEWAY_PROXY_ADDR),
1149+
notnull(L1_GATEWAY_ROUTER_PROXY_ADDR),
1150+
notnull(L1_SCROLL_MESSENGER_PROXY_ADDR)
1151+
);
1152+
}
11191153

11201154
// set WETH gateway in router
11211155
{
11221156
address[] memory _tokens = new address[](1);
11231157
_tokens[0] = notnull(L1_WETH_ADDR);
11241158
address[] memory _gateways = new address[](1);
11251159
_gateways[0] = notnull(L1_WETH_GATEWAY_PROXY_ADDR);
1126-
L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).setERC20Gateway(_tokens, _gateways);
1160+
if (L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).ERC20Gateway(_tokens[0]) != _gateways[0]) {
1161+
L1GatewayRouter(L1_GATEWAY_ROUTER_PROXY_ADDR).setERC20Gateway(_tokens, _gateways);
1162+
}
11271163
}
11281164
}
11291165

11301166
function initializeL1Whitelist() private {
11311167
address[] memory accounts = new address[](1);
11321168
accounts[0] = L1_GAS_ORACLE_SENDER_ADDR;
1133-
Whitelist(L1_WHITELIST_ADDR).updateWhitelistStatus(accounts, true);
1169+
if (!Whitelist(L1_WHITELIST_ADDR).isSenderAllowed(accounts[0])) {
1170+
Whitelist(L1_WHITELIST_ADDR).updateWhitelistStatus(accounts, true);
1171+
}
11341172
}
11351173

11361174
function transferL1ContractOwnership() private {
11371175
if (DEPLOYER_ADDR == OWNER_ADDR) {
11381176
return;
11391177
}
11401178

1141-
Ownable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1142-
Ownable(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1143-
Ownable(L1_ERC1155_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1144-
Ownable(L1_ERC721_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1145-
Ownable(L1_ETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1146-
Ownable(L1_GATEWAY_ROUTER_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1147-
Ownable(L1_MESSAGE_QUEUE_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1148-
Ownable(L1_SCROLL_MESSENGER_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1149-
Ownable(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1150-
Ownable(L1_WETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1151-
Ownable(L2_GAS_PRICE_ORACLE_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1152-
Ownable(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR).transferOwnership(OWNER_ADDR);
1153-
Ownable(L1_PROXY_ADMIN_ADDR).transferOwnership(OWNER_ADDR);
1154-
Ownable(L1_SCROLL_CHAIN_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1155-
Ownable(L1_WHITELIST_ADDR).transferOwnership(OWNER_ADDR);
1179+
if (Ownable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) {
1180+
Ownable(L1_ENFORCED_TX_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1181+
}
1182+
if (Ownable(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) {
1183+
Ownable(L1_CUSTOM_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1184+
}
1185+
if (Ownable(L1_ERC1155_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) {
1186+
Ownable(L1_ERC1155_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1187+
}
1188+
if (Ownable(L1_ERC721_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) {
1189+
Ownable(L1_ERC721_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1190+
}
1191+
if (Ownable(L1_ETH_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) {
1192+
Ownable(L1_ETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1193+
}
1194+
if (Ownable(L1_GATEWAY_ROUTER_PROXY_ADDR).owner() != OWNER_ADDR) {
1195+
Ownable(L1_GATEWAY_ROUTER_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1196+
}
1197+
if (Ownable(L1_MESSAGE_QUEUE_PROXY_ADDR).owner() != OWNER_ADDR) {
1198+
Ownable(L1_MESSAGE_QUEUE_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1199+
}
1200+
if (Ownable(L1_SCROLL_MESSENGER_PROXY_ADDR).owner() != OWNER_ADDR) {
1201+
Ownable(L1_SCROLL_MESSENGER_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1202+
}
1203+
if (Ownable(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) {
1204+
Ownable(L1_STANDARD_ERC20_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1205+
}
1206+
if (Ownable(L1_WETH_GATEWAY_PROXY_ADDR).owner() != OWNER_ADDR) {
1207+
Ownable(L1_WETH_GATEWAY_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1208+
}
1209+
if (Ownable(L2_GAS_PRICE_ORACLE_PROXY_ADDR).owner() != OWNER_ADDR) {
1210+
Ownable(L2_GAS_PRICE_ORACLE_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1211+
}
1212+
if (Ownable(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR).owner() != OWNER_ADDR) {
1213+
Ownable(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR).transferOwnership(OWNER_ADDR);
1214+
}
1215+
if (Ownable(L1_PROXY_ADMIN_ADDR).owner() != OWNER_ADDR) {
1216+
Ownable(L1_PROXY_ADMIN_ADDR).transferOwnership(OWNER_ADDR);
1217+
}
1218+
if (Ownable(L1_SCROLL_CHAIN_PROXY_ADDR).owner() != OWNER_ADDR) {
1219+
Ownable(L1_SCROLL_CHAIN_PROXY_ADDR).transferOwnership(OWNER_ADDR);
1220+
}
1221+
if (Ownable(L1_WHITELIST_ADDR).owner() != OWNER_ADDR) {
1222+
Ownable(L1_WHITELIST_ADDR).transferOwnership(OWNER_ADDR);
1223+
}
11561224
}
11571225

11581226
/**********************

scripts/deterministic/DeterministicDeployment.sol

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {stdToml} from "forge-std/StdToml.sol";
66

77
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
88
import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
9+
import {ERC1967Upgrade} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol";
910

1011
import {CONFIG_CONTRACTS_PATH, DEFAULT_DEPLOYMENT_SALT, DETERMINISTIC_DEPLOYMENT_PROXY_ADDR} from "./Constants.sol";
1112
import {Configuration} from "./Configuration.sol";
@@ -115,19 +116,26 @@ abstract contract DeterminsticDeployment is Configuration {
115116
address proxyAddr,
116117
address implAddr
117118
) internal {
118-
if (!skipDeploy) {
119+
address addr = _getImplementation(proxyAddr);
120+
121+
if (!skipDeploy && addr != implAddr) {
119122
ProxyAdmin(notnull(proxyAdminAddr)).upgrade(
120123
ITransparentUpgradeableProxy(notnull(proxyAddr)),
121124
notnull(implAddr)
122125
);
123126
}
124127
}
125128

129+
function getInitializeCount(address contractAddr) internal view returns (uint8) {
130+
bytes32 slotValue = vm.load(address(contractAddr), bytes32(uint256(0)));
131+
return uint8(uint256(slotValue));
132+
}
133+
126134
/*********************
127135
* Private functions *
128136
*********************/
129137

130-
function _getSalt(string memory name) internal view returns (bytes32) {
138+
function _getSalt(string memory name) private view returns (bytes32) {
131139
return keccak256(abi.encodePacked(saltPrefix, name));
132140
}
133141

@@ -148,11 +156,9 @@ abstract contract DeterminsticDeployment is Configuration {
148156
return addr;
149157
}
150158

151-
// revert if the contract is already deployed
159+
// skip if the contract is already deployed
152160
if (addr.code.length > 0) {
153-
revert(
154-
string(abi.encodePacked("[ERROR] contract ", name, " (", vm.toString(addr), ") is already deployed"))
155-
);
161+
return addr;
156162
}
157163

158164
// deploy contract
@@ -223,4 +229,11 @@ abstract contract DeterminsticDeployment is Configuration {
223229
}
224230
}
225231
}
232+
233+
function _getImplementation(address proxyAddr) private view returns (address) {
234+
// ERC1967Upgrade implementation slot
235+
bytes32 _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
236+
// get implementation address
237+
return address(uint160(uint256(vm.load(address(proxyAddr), _IMPLEMENTATION_SLOT))));
238+
}
226239
}

0 commit comments

Comments
 (0)