Skip to content

Commit 0b2ed9d

Browse files
authored
feat: access control contract (#1758)
* feat: access control contract * fix: deprecated fn * refactor: embed access control into eigenDA Directory * doc: constants * feat: use multiple roles to simplify code
1 parent 3633ba4 commit 0b2ed9d

12 files changed

+65
-199
lines changed

contracts/script/EigenDADeployer.s.sol

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {IEigenDADisperserRegistry} from "src/core/interfaces/IEigenDADisperserRe
3333
import {EigenDARelayRegistry} from "src/core/EigenDARelayRegistry.sol";
3434
import {ISocketRegistry, SocketRegistry} from "../lib/eigenlayer-middleware/src/SocketRegistry.sol";
3535
import {IEigenDADirectory, EigenDADirectory} from "src/core/EigenDADirectory.sol";
36+
import {EigenDAAccessControl} from "src/core/EigenDAAccessControl.sol";
3637
import {
3738
DeployOpenEigenLayer,
3839
ProxyAdmin,
@@ -70,8 +71,10 @@ contract EigenDADeployer is DeployOpenEigenLayer {
7071
IPaymentVault public paymentVault;
7172
EigenDARelayRegistry public eigenDARelayRegistry;
7273
IEigenDADisperserRegistry public eigenDADisperserRegistry;
74+
EigenDAAccessControl public eigenDAAccessControl;
7375

7476
EigenDADirectory public eigenDADirectoryImplementation;
77+
7578
BLSApkRegistry public apkRegistryImplementation;
7679
EigenDAServiceManager public eigenDAServiceManagerImplementation;
7780
EigenDACertVerifierRouter public eigenDACertVerifierRouterImplementation;
@@ -145,13 +148,15 @@ contract EigenDADeployer is DeployOpenEigenLayer {
145148

146149
emptyContract = new EmptyContract();
147150

151+
eigenDAAccessControl = new EigenDAAccessControl(addressConfig.eigenLayerCommunityMultisig);
152+
148153
eigenDADirectoryImplementation = new EigenDADirectory();
149154
eigenDADirectory = EigenDADirectory(
150155
address(
151156
new TransparentUpgradeableProxy(
152157
address(eigenDADirectoryImplementation),
153158
address(eigenDAProxyAdmin),
154-
abi.encodeWithSelector(EigenDADirectory.initialize.selector, msg.sender)
159+
abi.encodeWithSelector(EigenDADirectory.initialize.selector, address(eigenDAAccessControl))
155160
)
156161
)
157162
);
@@ -400,7 +405,5 @@ contract EigenDADeployer is DeployOpenEigenLayer {
400405
address(eigenDARelayRegistryImplementation),
401406
abi.encodeWithSelector(EigenDARelayRegistry.initialize.selector, addressConfig.eigenDACommunityMultisig)
402407
);
403-
404-
eigenDADirectory.transferOwnership(addressConfig.eigenLayerCommunityMultisig);
405408
}
406409
}

contracts/script/deploy/eigenda-directory/DeployEigenDADirectory.sol

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

contracts/script/deploy/eigenda-directory/config/example.config.toml

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

contracts/script/deploy/eigenda-directory/config/holesky.preprod.config.toml

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

contracts/script/deploy/eigenda-directory/config/holesky.testnet.config.toml

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

contracts/script/deploy/eigenda-directory/config/mainnet.beta.config.toml

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

contracts/script/deploy/eigenda-directory/config/mainnet.config.toml

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

contracts/script/deploy/eigenda-directory/config/sepolia.testnet.config.toml

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.9;
3+
4+
import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";
5+
import {AccessControlConstants} from "src/core/libraries/v3/access-control/AccessControlConstants.sol";
6+
7+
/// @title EigenDAAccessControl
8+
/// @notice This contract is to serve as the centralized source of truth for access control in all EigenDA contracts.
9+
contract EigenDAAccessControl is AccessControl {
10+
constructor(address owner) {
11+
// The DEFAULT_ADMIN_ROLE can set the admin role for all other roles, and should be put behind a timelock.
12+
_grantRole(DEFAULT_ADMIN_ROLE, owner);
13+
// The OWNER_ROLE is the default ownership role for EigenDA contracts.
14+
_grantRole(AccessControlConstants.OWNER_ROLE, owner);
15+
}
16+
}

contracts/src/core/EigenDADirectory.sol

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,36 @@ pragma solidity ^0.8.9;
44
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
55
import {AddressDirectoryLib} from "src/core/libraries/v3/address-directory/AddressDirectoryLib.sol";
66
import {IEigenDADirectory} from "src/core/interfaces/IEigenDADirectory.sol";
7+
import {AccessControlConstants} from "src/core/libraries/v3/access-control/AccessControlConstants.sol";
8+
import {AddressDirectoryConstants} from "src/core/libraries/v3/address-directory/AddressDirectoryConstants.sol";
9+
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
10+
import {InitializableLib} from "src/core/libraries/v3/initializable/InitializableLib.sol";
711

8-
contract EigenDADirectory is OwnableUpgradeable, IEigenDADirectory {
12+
contract EigenDADirectory is IEigenDADirectory {
913
using AddressDirectoryLib for string;
1014
using AddressDirectoryLib for bytes32;
1115

12-
function initialize(address _initialOwner) external initializer {
13-
_transferOwnership(_initialOwner);
16+
modifier initializer() {
17+
InitializableLib.initialize();
18+
_;
19+
}
20+
21+
modifier onlyOwner() {
22+
require(
23+
IAccessControl(AddressDirectoryConstants.ACCESS_CONTROL_NAME.getKey().getAddress()).hasRole(
24+
AccessControlConstants.OWNER_ROLE, msg.sender
25+
),
26+
"Caller is not the owner"
27+
);
28+
_;
29+
}
30+
31+
/// @dev If doing a fresh deployment, this contract should be deployed AFTER an access control contract has been deployed.
32+
function initialize(address accessControl) external initializer {
33+
require(accessControl != address(0), "Access control address cannot be zero");
34+
bytes32 key = AddressDirectoryConstants.ACCESS_CONTROL_NAME.getKey();
35+
AddressDirectoryConstants.ACCESS_CONTROL_NAME.getKey().setAddress(accessControl);
36+
emit AddressAdded(AddressDirectoryConstants.ACCESS_CONTROL_NAME, key, accessControl);
1437
}
1538

1639
/// @inheritdoc IEigenDADirectory

0 commit comments

Comments
 (0)