Skip to content

Commit e1ae7f0

Browse files
authoredMar 11, 2025··
Balancer Contract Registry initialization contract (#1327)
1 parent 40b4cd3 commit e1ae7f0

File tree

1 file changed

+121
-0
lines changed

1 file changed

+121
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
pragma solidity ^0.8.24;
4+
5+
import { IAuthentication } from "@balancer-labs/v3-interfaces/contracts/solidity-utils/helpers/IAuthentication.sol";
6+
import { IBasicAuthorizer } from "@balancer-labs/v3-interfaces/contracts/governance-scripts/IBasicAuthorizer.sol";
7+
import {
8+
IBalancerContractRegistry,
9+
ContractType
10+
} from "@balancer-labs/v3-interfaces/contracts/standalone-utils/IBalancerContractRegistry.sol";
11+
import { IVault } from "@balancer-labs/v3-interfaces/contracts/vault/IVault.sol";
12+
13+
import { SingletonAuthentication } from "@balancer-labs/v3-vault/contracts/SingletonAuthentication.sol";
14+
import { InputHelpers } from "@balancer-labs/v3-solidity-utils/contracts/helpers/InputHelpers.sol";
15+
16+
// Associated with `20250221-balancer-registry-initializer`.
17+
contract BalancerContractRegistryInitializer {
18+
IBalancerContractRegistry public immutable balancerContractRegistry;
19+
20+
// IAuthorizer with interface for granting/revoking roles.
21+
IBasicAuthorizer internal immutable _authorizer;
22+
23+
// Set to true when operation is complete.
24+
bool private _initialized;
25+
26+
string[] private _routerNames;
27+
address[] private _routerAddresses;
28+
29+
string[] private _poolFactoryNames;
30+
address[] private _poolFactoryAddresses;
31+
32+
string[] private _aliasNames;
33+
address[] private _aliasAddresses;
34+
35+
/// @notice The initialization can only be done once.
36+
error AlreadyInitialized();
37+
38+
/// @notice The Vault passed in as a sanity check doesn't match the Vault associated with the registry.
39+
error VaultMismatch();
40+
41+
constructor(
42+
IVault vault,
43+
IBalancerContractRegistry balancerContractRegistry_,
44+
string[] memory routerNames,
45+
address[] memory routerAddresses,
46+
string[] memory poolFactoryNames,
47+
address[] memory poolFactoryAddresses,
48+
string[] memory aliasNames,
49+
address[] memory aliasAddresses
50+
) {
51+
InputHelpers.ensureInputLengthMatch(_routerNames.length, _routerAddresses.length);
52+
InputHelpers.ensureInputLengthMatch(_poolFactoryNames.length, _poolFactoryAddresses.length);
53+
InputHelpers.ensureInputLengthMatch(_aliasNames.length, _aliasAddresses.length);
54+
55+
// Extract the Vault (also indirectly verifying the registry contract is valid).
56+
IVault registryVault = SingletonAuthentication(address(balancerContractRegistry_)).getVault();
57+
if (registryVault != vault) {
58+
revert VaultMismatch();
59+
}
60+
61+
balancerContractRegistry = balancerContractRegistry_;
62+
63+
_routerNames = routerNames;
64+
_routerAddresses = routerAddresses;
65+
_poolFactoryNames = poolFactoryNames;
66+
_poolFactoryAddresses = poolFactoryAddresses;
67+
_aliasNames = aliasNames;
68+
_aliasAddresses = aliasAddresses;
69+
70+
_authorizer = IBasicAuthorizer(address(vault.getAuthorizer()));
71+
}
72+
73+
function initializeBalancerContractRegistry() external {
74+
// Explicitly ensure this can only be called once.
75+
if (_initialized) {
76+
revert AlreadyInitialized();
77+
}
78+
79+
_initialized = true;
80+
81+
// Grant permissions to register contracts and add aliases.
82+
bytes32 registerContractRole = IAuthentication(address(balancerContractRegistry)).getActionId(
83+
IBalancerContractRegistry.registerBalancerContract.selector
84+
);
85+
bytes32 addAliasRole = IAuthentication(address(balancerContractRegistry)).getActionId(
86+
IBalancerContractRegistry.addOrUpdateBalancerContractAlias.selector
87+
);
88+
89+
_authorizer.grantRole(registerContractRole, address(this));
90+
_authorizer.grantRole(addAliasRole, address(this));
91+
92+
// Add Routers.
93+
for (uint256 i = 0; i < _routerNames.length; ++i) {
94+
balancerContractRegistry.registerBalancerContract(
95+
ContractType.ROUTER,
96+
_routerNames[i],
97+
_routerAddresses[i]
98+
);
99+
}
100+
101+
// Add Pool Factories.
102+
for (uint256 i = 0; i < _poolFactoryNames.length; ++i) {
103+
balancerContractRegistry.registerBalancerContract(
104+
ContractType.POOL_FACTORY,
105+
_poolFactoryNames[i],
106+
_poolFactoryAddresses[i]
107+
);
108+
}
109+
110+
// Add (pool factory) aliases.
111+
for (uint256 i = 0; i < _aliasNames.length; ++i) {
112+
balancerContractRegistry.addOrUpdateBalancerContractAlias(_aliasNames[i], _aliasAddresses[i]);
113+
}
114+
115+
// Renounce all roles.
116+
_authorizer.renounceRole(registerContractRole, address(this));
117+
_authorizer.renounceRole(addAliasRole, address(this));
118+
119+
_authorizer.renounceRole(_authorizer.DEFAULT_ADMIN_ROLE(), address(this));
120+
}
121+
}

0 commit comments

Comments
 (0)
Please sign in to comment.