diff --git a/src/gov-action-contracts/address-registries/L1AddressRegistry.sol b/src/gov-action-contracts/address-registries/L1AddressRegistry.sol index 053a22a3..e424b201 100644 --- a/src/gov-action-contracts/address-registries/L1AddressRegistry.sol +++ b/src/gov-action-contracts/address-registries/L1AddressRegistry.sol @@ -8,17 +8,23 @@ contract L1AddressRegistry is IL1AddressRegistry { IL1Timelock public immutable l1Timelock; IL1CustomGateway public immutable customGateway; IL1GatewayRouter public immutable gatewayRouter; + address[] public outboxes; + address[] public sequencers; constructor( IInbox _inbox, IL1Timelock _l1Timelock, IL1CustomGateway _customGateway, - IL1GatewayRouter _gatewayRouter + IL1GatewayRouter _gatewayRouter, + address[] memory _outboxes, + address[] memory _sequencers ) { inbox = _inbox; l1Timelock = _l1Timelock; customGateway = _customGateway; gatewayRouter = _gatewayRouter; + outboxes = _outboxes; + sequencers = _sequencers; } function rollup() public view returns (IRollupCore) { @@ -32,4 +38,12 @@ contract L1AddressRegistry is IL1AddressRegistry { function sequencerInbox() public view returns (ISequencerInbox) { return inbox.sequencerInbox(); } + + function getOutboxes() public view returns (address[] memory) { + return outboxes; + } + + function getSequencers() public view returns (address[] memory) { + return sequencers; + } } diff --git a/src/gov-action-contracts/address-registries/interfaces.sol b/src/gov-action-contracts/address-registries/interfaces.sol index 9a713356..4e222fba 100644 --- a/src/gov-action-contracts/address-registries/interfaces.sol +++ b/src/gov-action-contracts/address-registries/interfaces.sol @@ -77,4 +77,7 @@ interface IL1AddressRegistry is IL1TimelockGetter, IL1GatewayRouterGetter, IL1CustomGatewayGetter -{} +{ + function getSequencers() external view returns (address[] memory); + function getOutboxes() external view returns (address[] memory); +} diff --git a/src/gov-action-contracts/pause-all/PauseAllAction.sol b/src/gov-action-contracts/pause-all/PauseAllAction.sol new file mode 100644 index 00000000..1fc10ccb --- /dev/null +++ b/src/gov-action-contracts/pause-all/PauseAllAction.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.16; + +import "../address-registries/interfaces.sol"; +import "../set-outbox/OutboxActionLib.sol"; +import "../sequencer/SequencerActionLib.sol"; + +/// @notice pause inbox and rollup, remove all outboxes and sequencers +contract PauseAllAction { + IL1AddressRegistry public immutable addressRegistry; + + constructor(IL1AddressRegistry _addressRegistry) { + addressRegistry = _addressRegistry; + } + + function perform() external { + addressRegistry.inbox().pause(); + addressRegistry.rollup().pause(); + OutboxActionLib.bridgeRemoveAllOutboxes(addressRegistry); + address[] memory sequencersToRemove = addressRegistry.getSequencers(); + for (uint256 i = 0; i < sequencersToRemove.length; i++) { + SequencerActionLib.removeSequencer(addressRegistry, sequencersToRemove[i]); + } + } +} diff --git a/src/gov-action-contracts/pause-all/UnpauseAllAction.sol b/src/gov-action-contracts/pause-all/UnpauseAllAction.sol new file mode 100644 index 00000000..ba417dd3 --- /dev/null +++ b/src/gov-action-contracts/pause-all/UnpauseAllAction.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.16; + +import "../address-registries/interfaces.sol"; +import "../set-outbox/OutboxActionLib.sol"; +import "../sequencer/SequencerActionLib.sol"; + +/// @notice unpause inbox and rollup, add outboxes and sequencers (i.e., undoes PauseAllAction) +contract UnPauseAllAction { + IL1AddressRegistry public immutable addressRegistry; + + constructor(IL1AddressRegistry _addressRegistry) { + addressRegistry = _addressRegistry; + } + + function perform() external { + addressRegistry.inbox().unpause(); + addressRegistry.rollup().resume(); + OutboxActionLib.bridgeAddOutboxes(addressRegistry, addressRegistry.getOutboxes()); + address[] memory sequencersToAdd = addressRegistry.getSequencers(); + for (uint256 i = 0; i < sequencersToAdd.length; i++) { + SequencerActionLib.addSequencer(addressRegistry, sequencersToAdd[i]); + } + } +} diff --git a/src/gov-action-contracts/set-outbox/OutboxActionLib.sol b/src/gov-action-contracts/set-outbox/OutboxActionLib.sol index ee7f57da..2e356e52 100644 --- a/src/gov-action-contracts/set-outbox/OutboxActionLib.sol +++ b/src/gov-action-contracts/set-outbox/OutboxActionLib.sol @@ -6,9 +6,7 @@ import "@openzeppelin/contracts/utils/Address.sol"; import "@arbitrum/nitro-contracts/src/bridge/IOutbox.sol"; library OutboxActionLib { - function bridgeAddOutboxes(IBridgeGetter addressRegistry, address[] calldata outboxes) - internal - { + function bridgeAddOutboxes(IBridgeGetter addressRegistry, address[] memory outboxes) internal { IBridge bridge = addressRegistry.bridge(); for (uint256 i = 0; i < outboxes.length; i++) { address outbox = outboxes[i]; @@ -20,7 +18,7 @@ library OutboxActionLib { } } - function bridgeRemoveOutboxes(IBridgeGetter addressRegistry, address[] calldata outboxes) + function bridgeRemoveOutboxes(IBridgeGetter addressRegistry, address[] memory outboxes) internal { IBridge bridge = addressRegistry.bridge(); diff --git a/test/util/ActionTestBase.sol b/test/util/ActionTestBase.sol index 4cbb92b6..a3334631 100644 --- a/test/util/ActionTestBase.sol +++ b/test/util/ActionTestBase.sol @@ -86,9 +86,11 @@ abstract contract ActionTestBase { l1Timelock.grantRole(l1Timelock.TIMELOCK_ADMIN_ROLE(), address(ue)); l1Timelock.revokeRole(l1Timelock.TIMELOCK_ADMIN_ROLE(), address(l1Timelock)); l1Timelock.revokeRole(l1Timelock.TIMELOCK_ADMIN_ROLE(), address(this)); + address[] memory outboxes = new address[](0); + address[] memory sequencers = new address[](0); addressRegistry = - new _ar.L1AddressRegistry(IInbox(address(inbox)), _ifaces.IL1Timelock(address(l1Timelock)), _ifaces.IL1CustomGateway(address(0)), _ifaces.IL1GatewayRouter(address(0))); + new _ar.L1AddressRegistry(IInbox(address(inbox)), _ifaces.IL1Timelock(address(l1Timelock)), _ifaces.IL1CustomGateway(address(0)), _ifaces.IL1GatewayRouter(address(0)), outboxes, sequencers); bridgeGetter = _ifaces.IBridgeGetter(address(addressRegistry)); inboxGetter = _ifaces.IInboxGetter(address(addressRegistry)); sequencerInboxGetter = _ifaces.ISequencerInboxGetter(address(addressRegistry));