Skip to content

Commit 7d24315

Browse files
committed
Refactor governor deployment to allow for hook testing
1 parent 8a7120c commit 7d24315

File tree

5 files changed

+116
-54
lines changed

5 files changed

+116
-54
lines changed

src/BaseHook.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ abstract contract BaseHook is IHooks {
7373
}
7474

7575
/// @inheritdoc IHooks
76-
function beforePropose(address, address[] memory, uint256[] memery, bytes[] memory, string memory)
76+
function beforePropose(address, address[] memory, uint256[] memory, bytes[] memory, string memory)
7777
external
7878
virtual
7979
returns (bytes4, uint256)

test/AgoraGovernor.t.sol

+3-47
Original file line numberDiff line numberDiff line change
@@ -12,62 +12,18 @@ import {AgoraGovernor} from "src/AgoraGovernor.sol";
1212
import {AgoraGovernorMock} from "test/mocks/AgoraGovernorMock.sol";
1313

1414
import {MockToken} from "test/mocks/MockToken.sol";
15+
import {Deployers} from "test/utils/Deployers.sol";
1516

16-
contract AgoraGovernorTest is Test {
17-
// Contracts
18-
AgoraGovernorMock public governor;
19-
TimelockController public timelock;
20-
MockToken public token;
21-
22-
// Addresses
23-
address deployer = makeAddr("deployer");
24-
address admin = makeAddr("admin");
25-
address proxyAdmin = makeAddr("proxyAdmin");
26-
address manager = makeAddr("manager");
27-
address minter = makeAddr("minter");
28-
17+
contract AgoraGovernorTest is Test, Deployers {
2918
// Variables
30-
uint256 timelockDelay = 2 days;
31-
uint48 votingDelay = 1;
32-
uint32 votingPeriod = 14;
33-
uint256 proposalThreshold = 1;
34-
uint256 quorumNumerator = 3000;
3519
uint256 counter;
3620

3721
/*//////////////////////////////////////////////////////////////
3822
SETUP
3923
//////////////////////////////////////////////////////////////*/
4024

4125
function setUp() public virtual {
42-
vm.startPrank(deployer);
43-
44-
// Deploy token
45-
token = new MockToken(minter);
46-
47-
// Calculate governor address
48-
address governorAddress = vm.computeCreateAddress(deployer, vm.getNonce(deployer) + 1);
49-
50-
// Deploy timelock
51-
address[] memory proposers = new address[](1);
52-
proposers[0] = governorAddress;
53-
address[] memory executors = new address[](1);
54-
executors[0] = governorAddress;
55-
timelock = new TimelockController(timelockDelay, proposers, executors, deployer);
56-
57-
// Deploy governor
58-
governor = new AgoraGovernorMock(
59-
votingDelay,
60-
votingPeriod,
61-
proposalThreshold,
62-
quorumNumerator,
63-
token,
64-
timelock,
65-
admin,
66-
manager,
67-
IHooks(address(0))
68-
);
69-
70-
vm.stopPrank();
26+
deployGovernor(address(0));
7127
}
7228

7329
function executeCallback() public payable virtual {

test/BaseHook.t.sol

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.24;
3+
4+
import "forge-std/Test.sol";
5+
import {BaseHook} from "src/BaseHook.sol";
6+
import {BaseHookMock, BaseHookMockReverts} from "test/mocks/BaseHookMock.sol";
7+
import {IHooks} from "src/interfaces/IHooks.sol";
8+
import {Hooks} from "src/libraries/Hooks.sol";
9+
10+
import {Deployers} from "test/utils/Deployers.sol";
11+
12+
contract BaseHookTest is Test, Deployers {
13+
BaseHookMock hook;
14+
BaseHookMockReverts hookReverts;
15+
16+
function setUp() public {
17+
hook = BaseHookMock(
18+
address(
19+
uint160(
20+
Hooks.BEFORE_INITIALIZE_FLAG | Hooks.AFTER_INITIALIZE_FLAG
21+
| Hooks.BEFORE_QUORUM_CALCULATION_FLAG| Hooks.AFTER_QUORUM_CALCULATION_FLAG
22+
| Hooks.BEFORE_VOTE_FLAG | Hooks.AFTER_VOTE_FLAG
23+
| Hooks.BEFORE_PROPOSE_FLAG | Hooks.AFTER_PROPOSE_FLAG
24+
| Hooks.BEFORE_CANCEL_FLAG | Hooks.AFTER_CANCEL_FLAG
25+
| Hooks.BEFORE_QUEUE_FLAG | Hooks.AFTER_QUEUE_FLAG
26+
| Hooks.BEFORE_EXECUTE_FLAG | Hooks.AFTER_EXECUTE_FLAG
27+
)
28+
)
29+
);
30+
31+
deployCodeTo("test/mocks/BaseHookMock.sol:BaseHookMock", abi.encode(governorAddress), address(hook));
32+
33+
hookReverts = BaseHookMockReverts(address(0x1000000000000000000000000000000000003ffF));
34+
deployCodeTo("test/mocks/BaseHookMock.sol:BaseHookMockReverts", abi.encode(governorAddress), address(hookReverts));
35+
}
36+
37+
function test_initialize_succeeds() public {
38+
// Deploy governor
39+
vm.expectEmit(address(hook));
40+
emit BaseHookMock.BeforeInitialize();
41+
vm.expectEmit(address(hook));
42+
emit BaseHookMock.AfterInitialize();
43+
deployGovernor(address(hook));
44+
}
45+
}

test/mocks/BaseHookMock.sol

+1-6
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,7 @@ contract BaseHookMock is BaseHook {
4343
return (this.beforeQuorumCalculation.selector, beforeQuorum);
4444
}
4545

46-
function afterQuorumCalculation(address, uint256 afterQuorum)
47-
external
48-
virtual
49-
override
50-
returns (bytes4, uint256)
51-
{
46+
function afterQuorumCalculation(address, uint256 afterQuorum) external virtual override returns (bytes4, uint256) {
5247
emit AfterQuorumCalculation();
5348
return (this.afterQuorumCalculation.selector, afterQuorum);
5449
}

test/utils/Deployers.sol

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.20;
3+
4+
import "forge-std/Test.sol";
5+
6+
import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";
7+
8+
import {IHooks} from "src/interfaces/IHooks.sol";
9+
import {AgoraGovernor} from "src/AgoraGovernor.sol";
10+
import {AgoraGovernorMock} from "test/mocks/AgoraGovernorMock.sol";
11+
12+
import {MockToken} from "test/mocks/MockToken.sol";
13+
14+
contract Deployers is Test {
15+
// Contracts
16+
AgoraGovernorMock public governor;
17+
TimelockController public timelock;
18+
MockToken public token;
19+
20+
// Addresses
21+
address deployer = makeAddr("deployer");
22+
address admin = makeAddr("admin");
23+
address proxyAdmin = makeAddr("proxyAdmin");
24+
address manager = makeAddr("manager");
25+
address minter = makeAddr("minter");
26+
27+
// Variables
28+
uint256 timelockDelay = 2 days;
29+
uint48 votingDelay = 1;
30+
uint32 votingPeriod = 14;
31+
uint256 proposalThreshold = 1;
32+
uint256 quorumNumerator = 3000;
33+
34+
// Calculate governor address
35+
address governorAddress = vm.computeCreateAddress(deployer, vm.getNonce(deployer) + 2);
36+
37+
function deployGovernor(address hook) internal virtual {
38+
vm.startPrank(deployer);
39+
40+
// Deploy token
41+
token = new MockToken(minter);
42+
43+
// Deploy timelock
44+
address[] memory proposers = new address[](1);
45+
proposers[0] = governorAddress;
46+
address[] memory executors = new address[](1);
47+
executors[0] = governorAddress;
48+
timelock = new TimelockController(timelockDelay, proposers, executors, deployer);
49+
50+
// Deploy governor
51+
governor = new AgoraGovernorMock(
52+
votingDelay,
53+
votingPeriod,
54+
proposalThreshold,
55+
quorumNumerator,
56+
token,
57+
timelock,
58+
admin,
59+
manager,
60+
IHooks(hook)
61+
);
62+
63+
vm.stopPrank();
64+
}
65+
}
66+

0 commit comments

Comments
 (0)