Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit 11b9f67

Browse files
nmlinaricmpetrun5
andauthored
feat: rearrange core contracts addresses (#32)
* Fix missing custom errors * Update tests * fix: add renounce admin zero address check * Rearrange core contracts addresses and functions * Update tests after core addresses and functions rearrangement * set getters as views in IBridge * Set Bridge as single source of truth for Router and Executor addresses --------- Co-authored-by: mpetrun5 <[email protected]>
1 parent 5e3de66 commit 11b9f67

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+224
-306
lines changed

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"@metamask/eth-sig-util": "^7.0.0",
2626
"@nomicfoundation/hardhat-chai-matchers": "^2.0.2",
2727
"@nomicfoundation/hardhat-ethers": "^3.0.4",
28-
"@nomicfoundation/hardhat-network-helpers": "^1.0.9",
28+
"@nomicfoundation/hardhat-network-helpers": "^1.0.10",
2929
"@nomicfoundation/hardhat-toolbox": "^3.0.0",
3030
"@nomicfoundation/hardhat-verify": "^1.0.0",
3131
"@openzeppelin/contracts": "4.9.3",
@@ -39,6 +39,7 @@
3939
"@typescript-eslint/parser": "^7.3.1",
4040
"chai": "^4.2.0",
4141
"chain": "^0.4.0",
42+
"dotenv": "^16.4.1",
4243
"eslint": "^8.57.0",
4344
"eslint-config-prettier": "^9.0.0",
4445
"eslint-plugin-prettier": "^5.0.1",
@@ -53,8 +54,7 @@
5354
"solidity-coverage": "^0.8.0",
5455
"ts-node": ">=8.0.0",
5556
"tslint-config-prettier": "^1.18.0",
56-
"typescript": "5.3.3",
57-
"dotenv": "^16.4.1"
57+
"typescript": "5.3.3"
5858
},
5959
"dependencies": {
6060
"hardhat": "^2.17.4",

src/contracts/Bridge.sol

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ contract Bridge is Pausable, Context {
2020
uint8 public immutable _domainID;
2121

2222
IFeeHandler public _feeHandler;
23-
2423
IAccessControlSegregator public _accessControl;
24+
address public _executorAddress;
25+
address public _routerAddress;
26+
2527

2628
// resourceID => handler address
2729
mapping(bytes32 => address) public _resourceIDToHandlerAddress;
@@ -140,4 +142,12 @@ contract Bridge is Pausable, Context {
140142
IERCHandler handler = IERCHandler(handlerAddress);
141143
handler.withdraw(data);
142144
}
145+
146+
function adminChangeRouterAddress(address routerAddress) external onlyAllowed {
147+
_routerAddress = routerAddress;
148+
}
149+
150+
function adminChangeExecutorAddress(address executorAddress) external onlyAllowed {
151+
_executorAddress = executorAddress;
152+
}
143153
}

src/contracts/TestContracts.sol

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pragma solidity 0.8.11;
55
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol";
66
import "./handlers/ERCHandlerHelpers.sol";
77
import "./interfaces/IERC20Plus.sol";
8+
import "./interfaces/IBridge.sol";
89

910
contract NoArgument {
1011
event NoArgumentCalled();
@@ -58,13 +59,9 @@ abstract contract HandlerRevert is ERCHandlerHelpers {
5859
uint256 private _totalAmount;
5960

6061
constructor(
61-
address bridgeAddress,
62-
address routerAddress,
63-
address executorAddress
62+
IBridge bridgeAddress
6463
) ERCHandlerHelpers(
65-
bridgeAddress,
66-
routerAddress,
67-
executorAddress
64+
bridgeAddress
6865
) {}
6966

7067
function executeProposal(bytes32, bytes calldata) external view {

src/contracts/handlers/ERC20Handler.sol

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,41 @@ import "../ERC20Safe.sol";
1313
*/
1414
contract ERC20Handler is IHandler, ERCHandlerHelpers, ERC20Safe {
1515
/**
16-
@param bridgeAddress Contract address of previously deployed Bridge.
16+
@param bridge Contract address of previously deployed Bridge.
1717
*/
1818
constructor(
19-
address bridgeAddress,
20-
address routerAddress,
21-
address executorAddress
19+
IBridge bridge
2220
) ERCHandlerHelpers(
23-
bridgeAddress,
24-
routerAddress,
25-
executorAddress
21+
bridge
2622
) {}
2723

24+
modifier onlyBridge() {
25+
_onlyBridge();
26+
_;
27+
}
28+
29+
modifier onlyRouter() {
30+
_onlyRouter();
31+
_;
32+
}
33+
34+
modifier onlyExecutor() {
35+
_onlyExecutor();
36+
_;
37+
}
38+
39+
function _onlyBridge() private {
40+
if (msg.sender != address(_bridge)) revert SenderNotBridgeContract();
41+
}
42+
43+
function _onlyExecutor() private {
44+
if (msg.sender != _bridge._executorAddress()) revert SenderNotExecutorContract();
45+
}
46+
47+
function _onlyRouter() private {
48+
if (msg.sender != _bridge._routerAddress()) revert SenderNotRouterContract();
49+
}
50+
2851
/**
2952
@notice A deposit is initiated by making a deposit in the Bridge contract.
3053
@param resourceID ResourceID used to find address of token to be used for deposit.
@@ -114,7 +137,7 @@ contract ERC20Handler is IHandler, ERCHandlerHelpers, ERC20Safe {
114137
recipient address bytes 32 - 64
115138
amount uint256 bytes 64 - 96
116139
*/
117-
function withdraw(bytes memory data) external override onlyBridge {
140+
function withdraw(bytes memory data) external onlyBridge {
118141
address tokenAddress;
119142
address recipient;
120143
uint256 amount;
@@ -142,4 +165,13 @@ contract ERC20Handler is IHandler, ERCHandlerHelpers, ERC20Safe {
142165
_setDecimals(contractAddress, externalTokenDecimals);
143166
}
144167
}
168+
169+
/**
170+
@notice First verifies {contractAddress} is whitelisted, then sets
171+
{_tokenContractAddressToTokenProperties[contractAddress].isBurnable} to true.
172+
@param contractAddress Address of contract to be used when making or executing deposits.
173+
*/
174+
function setBurnable(address contractAddress) external onlyBridge {
175+
_setBurnable(contractAddress);
176+
}
145177
}

src/contracts/handlers/ERCHandlerHelpers.sol

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
pragma solidity 0.8.11;
44

55
import "../interfaces/IERCHandler.sol";
6+
import "../interfaces/IBridge.sol";
7+
68

79
/**
810
@title Function used across handler contracts.
911
@author ChainSafe Systems.
1012
@notice This contract is intended to be used with the Bridge contract.
1113
*/
12-
abstract contract ERCHandlerHelpers is IERCHandler {
13-
address public immutable _bridgeAddress;
14-
address public immutable _routerAddress;
15-
address public immutable _executorAddress;
14+
contract ERCHandlerHelpers {
15+
IBridge public _bridge;
1616

1717
uint8 public constant DEFAULT_DECIMALS = 18;
1818

@@ -40,52 +40,11 @@ abstract contract ERCHandlerHelpers is IERCHandler {
4040
// token contract address => ERCTokenContractProperties
4141
mapping(address => ERCTokenContractProperties) public _tokenContractAddressToTokenProperties;
4242

43-
modifier onlyBridge() {
44-
_onlyBridge();
45-
_;
46-
}
47-
48-
modifier onlyRouter() {
49-
_onlyRouter();
50-
_;
51-
}
52-
53-
modifier onlyExecutor() {
54-
_onlyExecutor();
55-
_;
56-
}
57-
58-
function _onlyBridge() private view {
59-
if (msg.sender != _bridgeAddress) revert SenderNotBridgeContract();
60-
}
61-
62-
function _onlyExecutor() private view {
63-
if (msg.sender != _executorAddress) revert SenderNotExecutorContract();
64-
}
65-
66-
function _onlyRouter() private view {
67-
if (msg.sender != _routerAddress) revert SenderNotRouterContract();
68-
}
69-
70-
7143
/**
72-
@param bridgeAddress Contract address of previously deployed Bridge.
73-
@param routerAddress Contract address of previously deployed Router.
74-
@param executorAddress Contract address of previously deployed Executor.
75-
*/
76-
constructor(address bridgeAddress, address routerAddress, address executorAddress) {
77-
_bridgeAddress = bridgeAddress;
78-
_routerAddress = routerAddress;
79-
_executorAddress = executorAddress;
80-
}
81-
82-
/**
83-
@notice First verifies {contractAddress} is whitelisted, then sets
84-
{_tokenContractAddressToTokenProperties[contractAddress].isBurnable} to true.
85-
@param contractAddress Address of contract to be used when making or executing deposits.
44+
@param bridge Contract address of previously deployed Bridge.
8645
*/
87-
function setBurnable(address contractAddress) external override onlyBridge {
88-
_setBurnable(contractAddress);
46+
constructor(IBridge bridge) {
47+
_bridge = bridge;
8948
}
9049

9150
function _setResource(bytes32 resourceID, address contractAddress) internal {

src/contracts/handlers/FeeHandlerRouter.sol

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
pragma solidity 0.8.11;
44

55
import "../interfaces/IFeeHandler.sol";
6+
import "../interfaces/IBridge.sol";
67
import "@openzeppelin/contracts/access/AccessControl.sol";
78

89
/**
@@ -11,7 +12,7 @@ import "@openzeppelin/contracts/access/AccessControl.sol";
1112
@notice This contract is intended to be used with the Bridge contract.
1213
*/
1314
contract FeeHandlerRouter is IFeeHandler, AccessControl {
14-
address public immutable _routerAddress;
15+
IBridge public immutable _bridge;
1516

1617
// domainID => resourceID => securityModel => feeHandlerAddress
1718
mapping(uint8 => mapping(bytes32 => mapping(uint8 => IFeeHandler))) public
@@ -32,8 +33,8 @@ contract FeeHandlerRouter is IFeeHandler, AccessControl {
3233
_;
3334
}
3435

35-
function _onlyRouter() private view {
36-
if (msg.sender != _routerAddress) revert SenderNotRouterContract();
36+
function _onlyRouter() private {
37+
if (msg.sender != _bridge._routerAddress()) revert SenderNotRouterContract();
3738
}
3839

3940
modifier onlyAdmin() {
@@ -46,10 +47,10 @@ contract FeeHandlerRouter is IFeeHandler, AccessControl {
4647
}
4748

4849
/**
49-
@param routerAddress Contract address of previously deployed Router.
50+
@param bridge Contract address of previously deployed Bridge.
5051
*/
51-
constructor(address routerAddress) {
52-
_routerAddress = routerAddress;
52+
constructor(IBridge bridge) {
53+
_bridge = bridge;
5354
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
5455
}
5556

src/contracts/handlers/PermissionlessGenericHandler.sol

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
pragma solidity 0.8.11;
55
import "../interfaces/IHandler.sol";
6+
import "../interfaces/IBridge.sol";
67

78
/**
89
@title Handles generic deposits and deposit executions.
@@ -12,8 +13,7 @@ import "../interfaces/IHandler.sol";
1213
contract PermissionlessGenericHandler is IHandler {
1314
uint256 public constant MAX_FEE = 1000000;
1415

15-
address public immutable _bridgeAddress;
16-
address public immutable _executorAddress;
16+
IBridge public immutable _bridge;
1717

1818
modifier onlyBridge() {
1919
_onlyBridge();
@@ -27,25 +27,23 @@ contract PermissionlessGenericHandler is IHandler {
2727
error InvalidExecutioDataDepositor(address executioDataDepositor);
2828

2929
function _onlyBridge() private view {
30-
if (msg.sender != _bridgeAddress) revert SenderNotBridgeContract();
30+
if (msg.sender != address(_bridge)) revert SenderNotBridgeContract();
3131
}
3232

3333
modifier onlyExecutor() {
3434
_onlyExecutor();
3535
_;
3636
}
3737

38-
function _onlyExecutor() private view {
39-
if (msg.sender != _executorAddress) revert SenderNotExecutorContract();
38+
function _onlyExecutor() private {
39+
if (msg.sender != _bridge._executorAddress()) revert SenderNotExecutorContract();
4040
}
4141

4242
/**
43-
@param bridgeAddress Contract address of previously deployed Bridge.
44-
@param executorAddress Contract address of previously deployed Executor.
43+
@param bridge Contract address of previously deployed Bridge.
4544
*/
46-
constructor(address bridgeAddress, address executorAddress) {
47-
_bridgeAddress = bridgeAddress;
48-
_executorAddress = executorAddress;
45+
constructor(IBridge bridge) {
46+
_bridge = bridge;
4947
}
5048

5149
/**

src/contracts/handlers/fee/BasicFeeHandler.sol

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
pragma solidity 0.8.11;
44

55
import "../../interfaces/IFeeHandler.sol";
6+
import "../../interfaces/IBridge.sol";
67
import "@openzeppelin/contracts/access/AccessControl.sol";
78

89
import "../FeeHandlerRouter.sol";
@@ -13,9 +14,8 @@ import "../FeeHandlerRouter.sol";
1314
@notice This contract is intended to be used with the Bridge contract.
1415
*/
1516
contract BasicFeeHandler is IFeeHandler, AccessControl {
16-
address public immutable _bridgeAddress;
17+
IBridge public immutable _bridge;
1718
address public immutable _feeHandlerRouterAddress;
18-
address public immutable _routerAddress;
1919
// domainID => resourceID => securityModel => fee
2020
mapping (uint8 => mapping(bytes32 => mapping(uint8 => uint256))) public _domainResourceIDSecurityModelToFee;
2121

@@ -44,25 +44,23 @@ contract BasicFeeHandler is IFeeHandler, AccessControl {
4444
_;
4545
}
4646

47-
function _onlyRouterOrFeeRouter() private view {
47+
function _onlyRouterOrFeeRouter() private {
4848
if (msg.sender != _feeHandlerRouterAddress &&
49-
msg.sender != _routerAddress
49+
msg.sender != _bridge._routerAddress()
5050
) revert SenderNotBridgeOrRouter();
5151
}
5252

5353
/**
54-
@param bridgeAddress Contract address of previously deployed Bridge.
54+
@param bridge Contract address of previously deployed Bridge.
5555
@param feeHandlerRouterAddress Contract address of previously deployed FeeHandlerRouter.
5656
*/
57-
constructor(address bridgeAddress, address feeHandlerRouterAddress, address routerAddress) {
58-
if (bridgeAddress == address(0) ||
59-
feeHandlerRouterAddress == address(0) ||
60-
routerAddress == address(0)
57+
constructor(IBridge bridge, address feeHandlerRouterAddress) {
58+
if (address(bridge) == address(0) ||
59+
feeHandlerRouterAddress == address(0)
6160
) revert ZeroAddressProvided();
6261

63-
_bridgeAddress = bridgeAddress;
62+
_bridge = bridge;
6463
_feeHandlerRouterAddress = feeHandlerRouterAddress;
65-
_routerAddress = routerAddress;
6664
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
6765
}
6866

0 commit comments

Comments
 (0)