Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 58 additions & 50 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ ArbitrumVestingWalletTest:testDoesDeploy() (gas: 15971357)
ArbitrumVestingWalletTest:testReleaseAffordance() (gas: 16008664)
ArbitrumVestingWalletTest:testVestedAmountStart() (gas: 16074932)
CancelTimelockAndRemoveMemberActionTest:testAction() (gas: 8159)
E2E:testE2E() (gas: 86427645)
E2E:testE2E() (gas: 86859495)
FixedDelegateErc20WalletTest:testInit() (gas: 5822585)
FixedDelegateErc20WalletTest:testInitZeroToken() (gas: 5816815)
FixedDelegateErc20WalletTest:testTransfer() (gas: 5932228)
Expand Down Expand Up @@ -95,11 +95,11 @@ L2GovernanceFactoryTest:testSanityCheckValues() (gas: 28571182)
L2GovernanceFactoryTest:testSetMinDelay() (gas: 28519939)
L2GovernanceFactoryTest:testSetMinDelayRevertsForCoreAddress() (gas: 28572810)
L2GovernanceFactoryTest:testUpgraderCanCancel() (gas: 28812928)
L2SecurityCouncilMgmtFactoryTest:testMemberElectionGovDeployment() (gas: 32000015)
L2SecurityCouncilMgmtFactoryTest:testNomineeElectionGovDeployment() (gas: 32004246)
L2SecurityCouncilMgmtFactoryTest:testOnlyOwnerCanDeploy() (gas: 26965166)
L2SecurityCouncilMgmtFactoryTest:testRemovalGovDeployment() (gas: 32002246)
L2SecurityCouncilMgmtFactoryTest:testSecurityCouncilManagerDeployment() (gas: 32023711)
L2SecurityCouncilMgmtFactoryTest:testMemberElectionGovDeployment() (gas: 32322314)
L2SecurityCouncilMgmtFactoryTest:testNomineeElectionGovDeployment() (gas: 32326589)
L2SecurityCouncilMgmtFactoryTest:testOnlyOwnerCanDeploy() (gas: 27265404)
L2SecurityCouncilMgmtFactoryTest:testRemovalGovDeployment() (gas: 32324545)
L2SecurityCouncilMgmtFactoryTest:testSecurityCouncilManagerDeployment() (gas: 32345900)
NomineeGovernorV2UpgradeActionTest:testAction() (gas: 8153)
OfficeHoursActionTest:testConstructor() (gas: 9050)
OfficeHoursActionTest:testFuzzOfficeHoursDeployment(uint256,uint256,int256,uint256,uint256,uint256) (runs: 256, μ: 317059, ~: 317184)
Expand All @@ -117,37 +117,34 @@ OutboxActionsTest:testRemoveAllOutboxes() (gas: 693079)
OutboxActionsTest:testRemoveOutboxes() (gas: 853972)
ProxyUpgradeAndCallActionTest:testUpgrade() (gas: 137140)
ProxyUpgradeAndCallActionTest:testUpgradeAndCall() (gas: 143087)
RotateMembersUpgradeActionTest:testAction() (gas: 8153)
SecurityCouncilManagerTest:testAddMemberAffordances() (gas: 253923)
SecurityCouncilManagerTest:testAddMemberAffordances() (gas: 253879)
SecurityCouncilManagerTest:testAddMemberSpecialAddresses() (gas: 20770)
SecurityCouncilManagerTest:testAddMemberToFirstCohort() (gas: 349222)
SecurityCouncilManagerTest:testAddMemberToSecondCohort() (gas: 352657)
SecurityCouncilManagerTest:testAddMemberToFirstCohort() (gas: 349200)
SecurityCouncilManagerTest:testAddMemberToSecondCohort() (gas: 352635)
SecurityCouncilManagerTest:testAddSC() (gas: 118742)
SecurityCouncilManagerTest:testAddSCAffordances() (gas: 112296)
SecurityCouncilManagerTest:testCantUpdateCohortWithADup() (gas: 148550)
SecurityCouncilManagerTest:testCohortMethods() (gas: 137958)
SecurityCouncilManagerTest:testInitialization() (gas: 206820)
SecurityCouncilManagerTest:testPostUpgradeInit() (gas: 5255512)
SecurityCouncilManagerTest:testRemoveMember() (gas: 217503)
SecurityCouncilManagerTest:testRemoveMemberAffordances() (gas: 101612)
SecurityCouncilManagerTest:testRemoveMemberRotated() (gas: 423630)
SecurityCouncilManagerTest:testRemoveSCAffordances() (gas: 81486)
SecurityCouncilManagerTest:testRemoveSeC() (gas: 38435)
SecurityCouncilManagerTest:testReplaceCohortRotatingTo() (gas: 963734)
SecurityCouncilManagerTest:testReplaceMemberAffordances() (gas: 216337)
SecurityCouncilManagerTest:testReplaceMemberInFirstCohort() (gas: 266597)
SecurityCouncilManagerTest:testReplaceMemberInFirstCohortAfterRotation() (gas: 471835)
SecurityCouncilManagerTest:testReplaceMemberInSecondCohort() (gas: 479079)
SecurityCouncilManagerTest:testReplaceMemberInSecondCohortAfterRotation() (gas: 270188)
SecurityCouncilManagerTest:testRotateMember() (gas: 1016355)
SecurityCouncilManagerTest:testRotateMemberNotContender() (gas: 3869126)
SecurityCouncilManagerTest:testSetMinRotationPeriod() (gas: 65924)
SecurityCouncilManagerTest:testSetRotatingTo() (gas: 113048)
SecurityCouncilManagerTest:testUpdateCohortAffordances() (gas: 83230)
SecurityCouncilManagerTest:testUpdateFirstCohort() (gas: 327741)
SecurityCouncilManagerTest:testUpdateRouter() (gas: 76429)
SecurityCouncilManagerTest:testUpdateRouterAffordances() (gas: 112452)
SecurityCouncilManagerTest:testUpdateSecondCohort() (gas: 327845)
SecurityCouncilManagerTest:testAddSCAffordances() (gas: 112428)
SecurityCouncilManagerTest:testCantUpdateCohortWithADup() (gas: 136633)
SecurityCouncilManagerTest:testCohortMethods() (gas: 137890)
SecurityCouncilManagerTest:testInitialization() (gas: 206665)
SecurityCouncilManagerTest:testPostUpgradeInit() (gas: 5000887)
SecurityCouncilManagerTest:testRemoveMember() (gas: 217459)
SecurityCouncilManagerTest:testRemoveMemberAffordances() (gas: 101567)
SecurityCouncilManagerTest:testRemoveMemberRotated() (gas: 423573)
SecurityCouncilManagerTest:testRemoveSCAffordances() (gas: 81441)
SecurityCouncilManagerTest:testRemoveSeC() (gas: 38383)
SecurityCouncilManagerTest:testReplaceMemberAffordances() (gas: 216447)
SecurityCouncilManagerTest:testReplaceMemberInFirstCohort() (gas: 266641)
SecurityCouncilManagerTest:testReplaceMemberInFirstCohortAfterRotation() (gas: 471806)
SecurityCouncilManagerTest:testReplaceMemberInSecondCohort() (gas: 479028)
SecurityCouncilManagerTest:testReplaceMemberInSecondCohortAfterRotation() (gas: 270210)
SecurityCouncilManagerTest:testRotateMember() (gas: 1015787)
SecurityCouncilManagerTest:testRotateMemberNotContender() (gas: 4078679)
SecurityCouncilManagerTest:testSetMinRotationPeriod() (gas: 65814)
SecurityCouncilManagerTest:testUpdateCohortAffordances() (gas: 83252)
SecurityCouncilManagerTest:testUpdateFirstCohort() (gas: 313830)
SecurityCouncilManagerTest:testUpdateRouter() (gas: 76407)
SecurityCouncilManagerTest:testUpdateRouterAffordances() (gas: 112474)
SecurityCouncilManagerTest:testUpdateSecondCohort() (gas: 313924)
SecurityCouncilMemberElectionGovernorTest:testCannotUseMoreVotesThanAvailable() (gas: 247018)
SecurityCouncilMemberElectionGovernorTest:testCastBySig() (gas: 302873)
SecurityCouncilMemberElectionGovernorTest:testCastBySigTwice() (gas: 266265)
Expand Down Expand Up @@ -197,21 +194,32 @@ SecurityCouncilMemberSyncActionTest:testRemoveOne() (gas: 8086867)
SecurityCouncilMemberSyncActionTest:testUpdateCohort() (gas: 8328313)
SecurityCouncilMemberSyncActionTest:testUpdateCohort() (gas: 8329174)
SecurityCouncilMgmtUtilsTests:testIsInArray() (gas: 2102)
SecurityCouncilNomineeElectionGovernorTest:testAddContender() (gas: 270750)
SecurityCouncilNomineeElectionGovernorTest:testCastBySig() (gas: 333730)
SecurityCouncilNomineeElectionGovernorTest:testCastBySigTwice() (gas: 296589)
SecurityCouncilNomineeElectionGovernorTest:testCastVoteReverts() (gas: 35278)
SecurityCouncilNomineeElectionGovernorTest:testCountVote() (gas: 582574)
SecurityCouncilNomineeElectionGovernorTest:testCreateElection() (gas: 253153)
SecurityCouncilNomineeElectionGovernorTest:testExcludeNominee() (gas: 456505)
SecurityCouncilNomineeElectionGovernorTest:testExecute() (gas: 677159)
SecurityCouncilNomineeElectionGovernorTest:testForceSupport() (gas: 194733)
SecurityCouncilNomineeElectionGovernorTest:testIncludeNominee() (gas: 674020)
SecurityCouncilNomineeElectionGovernorTest:testInvalidInit() (gas: 7256741)
SecurityCouncilNomineeElectionGovernorTest:testProperInitialization() (gas: 78113)
SecurityCouncilNomineeElectionGovernorTest:testProposeFails() (gas: 19740)
SecurityCouncilNomineeElectionGovernorTest:testRelay() (gas: 42427)
SecurityCouncilNomineeElectionGovernorTest:testSetNomineeVetter() (gas: 39905)
SecurityCouncilNomineeElectionGovernorTest:testAddContender() (gas: 418329)
SecurityCouncilNomineeElectionGovernorTest:testCadenceWithLargeValues() (gas: 52898)
SecurityCouncilNomineeElectionGovernorTest:testCastBySig() (gas: 338828)
SecurityCouncilNomineeElectionGovernorTest:testCastBySigTwice() (gas: 301643)
SecurityCouncilNomineeElectionGovernorTest:testCastVoteReverts() (gas: 35303)
SecurityCouncilNomineeElectionGovernorTest:testCountVote() (gas: 593196)
SecurityCouncilNomineeElectionGovernorTest:testCreateElection() (gas: 257942)
SecurityCouncilNomineeElectionGovernorTest:testDefaultCadence() (gas: 14950)
SecurityCouncilNomineeElectionGovernorTest:testElectionTimestampsWithDefaultCadence() (gas: 37625)
SecurityCouncilNomineeElectionGovernorTest:testExcludeNominee() (gas: 461501)
SecurityCouncilNomineeElectionGovernorTest:testExecute() (gas: 679315)
SecurityCouncilNomineeElectionGovernorTest:testForceSupport() (gas: 199863)
SecurityCouncilNomineeElectionGovernorTest:testIncludeNominee() (gas: 679144)
SecurityCouncilNomineeElectionGovernorTest:testInvalidInit() (gas: 7833321)
SecurityCouncilNomineeElectionGovernorTest:testMultipleCadenceChanges() (gas: 238915)
SecurityCouncilNomineeElectionGovernorTest:testProperInitialization() (gas: 78159)
SecurityCouncilNomineeElectionGovernorTest:testProposeFails() (gas: 19786)
SecurityCouncilNomineeElectionGovernorTest:testRelay() (gas: 42411)
SecurityCouncilNomineeElectionGovernorTest:testRotateNominee() (gas: 510312)
SecurityCouncilNomineeElectionGovernorTest:testSetCadenceAfterElections() (gas: 227636)
SecurityCouncilNomineeElectionGovernorTest:testSetCadenceBeforeFirstElection() (gas: 42502)
SecurityCouncilNomineeElectionGovernorTest:testSetCadenceInvalidValue() (gas: 26056)
SecurityCouncilNomineeElectionGovernorTest:testSetCadenceOnlyOwner() (gas: 16090)
SecurityCouncilNomineeElectionGovernorTest:testSetCadenceTooSoonReverts() (gas: 148112)
SecurityCouncilNomineeElectionGovernorTest:testSetNomineeVetter() (gas: 40024)
SecurityCouncilUpgradeActionTest:testAction() (gas: 8153)
SequencerActionsTest:testAddAndRemoveSequencer() (gas: 486652)
SequencerActionsTest:testCantAddZeroAddress() (gas: 235659)
SetInitialGovParamsActionTest:testL1() (gas: 259949)
Expand Down
2 changes: 1 addition & 1 deletion foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ via_ir = false
solc_version = '0.8.16'

[profile.sec_council_mgmt]
optimizer_runs = 750
optimizer_runs = 200

[fmt]
number_underscore = 'thousands'
Expand Down
2 changes: 1 addition & 1 deletion hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const solidityProfiles = {
settings: {
optimizer: {
enabled: true,
runs: 750
runs: 200
},
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.16;

import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "../../address-registries/L2AddressRegistryInterfaces.sol";
import "@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol";
import
"@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol";
import "../../../security-council-mgmt/governors/SecurityCouncilNomineeElectionGovernor.sol";

/// @notice Perform the following upgrade proposed by the Arbitrum Foundation:
/// - Upgrade the sec council manager to allow member rotation and sets min rotation vars
/// - Upgrade the sec council nominee election governor to allow modifying the cadence of election
/// - Adjusting the qualification threshold of the Member Election phase from 0.2% to 0.1%
/// - Allowing existing sec council members to automatically progress from the Nominee Selection phase
/// - Updating the ArbitrumDAO Constitution to reflect these changes
contract SecurityCouncilUpgradeAction {
IL2AddressRegistry public immutable l2AddressRegistry;
address public immutable secCouncilManagerImpl;
address public immutable scNomineeElectionGovernorImpl;
uint256 public immutable minRotationPeriod;
address public immutable minRotationPeriodSetter;
uint256 public immutable cadenceInMonths;
bytes32 public immutable newConstitutionHash;

constructor(
IL2AddressRegistry _l2AddressRegistry,
address _secCouncilManagerImpl,
address _scNomineeElectionGovernorImpl,
uint256 _minRotationPeriod,
address _minRotationPeriodSetter,
uint256 _cadenceInMonths,
bytes32 _newConstitutionHash
) {
l2AddressRegistry = _l2AddressRegistry;
secCouncilManagerImpl = _secCouncilManagerImpl;
scNomineeElectionGovernorImpl = _scNomineeElectionGovernorImpl;
minRotationPeriod = _minRotationPeriod;
minRotationPeriodSetter = _minRotationPeriodSetter;
cadenceInMonths = _cadenceInMonths;
newConstitutionHash = _newConstitutionHash;
}

function perform() external {
SecurityCouncilNomineeElectionGovernor scNomineeElectionGovernor =
SecurityCouncilNomineeElectionGovernor(
payable(address(l2AddressRegistry.scNomineeElectionGovernor()))
);
require(
scNomineeElectionGovernor.electionCount() == 5,
"SecurityCouncilUpgradeAction: not expected timing"
);

// Upgrade the sec council manager to allow member rotation and sets min rotation vars
ISecurityCouncilManager secCouncilManager = l2AddressRegistry.securityCouncilManager();
l2AddressRegistry.govProxyAdmin().upgradeAndCall(
TransparentUpgradeableProxy(payable(address(secCouncilManager))),
secCouncilManagerImpl,
abi.encodeCall(
ISecurityCouncilManager(secCouncilManagerImpl).postUpgradeInit,
(minRotationPeriod, minRotationPeriodSetter)
)
);
require(
minRotationPeriod == secCouncilManager.minRotationPeriod(),
"SecurityCouncilUpgradeAction: Min rotation period not set"
);
require(
IAccessControlUpgradeable(address(secCouncilManager)).hasRole(
secCouncilManager.MIN_ROTATION_PERIOD_SETTER_ROLE(), minRotationPeriodSetter
),
"SecurityCouncilUpgradeAction: Min rotation period setter not set"
);

// Upgrade the sec council nominee election governor to allow modifying the cadence of election
// Allowing existing sec council members to automatically progress from the Nominee Selection phase
l2AddressRegistry.govProxyAdmin().upgradeAndCall(
TransparentUpgradeableProxy(payable(address(scNomineeElectionGovernor))),
scNomineeElectionGovernorImpl,
abi.encodeCall(scNomineeElectionGovernor.postUpgradeInit, ())
);

scNomineeElectionGovernor.relay(
address(scNomineeElectionGovernor),
0,
abi.encodeCall(scNomineeElectionGovernor.setCadence, (cadenceInMonths))
);
require(
scNomineeElectionGovernor.cadenceInMonths() == cadenceInMonths,
"SecurityCouncilUpgradeAction: Cadence not set"
);

// Adjusting the qualification threshold of the Member Election phase from 0.2% to 0.1%
scNomineeElectionGovernor.relay(
address(scNomineeElectionGovernor),
0,
abi.encodeCall(scNomineeElectionGovernor.updateQuorumNumerator, (10))
);
require(
scNomineeElectionGovernor.quorumNumerator() == 10,
"SecurityCouncilUpgradeAction: Quorum numerator not set"
);

// Updating the ArbitrumDAO Constitution to reflect these changes
IArbitrumDAOConstitution arbitrumDaoConstitution =
l2AddressRegistry.arbitrumDAOConstitution();
arbitrumDaoConstitution.setConstitutionHash(newConstitutionHash);
require(
arbitrumDaoConstitution.constitutionHash() == newConstitutionHash,
"SecurityCouncilUpgradeAction: new constitution hash not set"
);
}
}
Loading
Loading