forked from ethereum-optimism/optimism
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMintManager.t.sol
146 lines (118 loc) · 4.68 KB
/
MintManager.t.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// Testing utilities
import { CommonTest } from "./CommonTest.t.sol";
// Target contract dependencies
import { GovernanceToken } from "../src/governance/GovernanceToken.sol";
// Target contract
import { MintManager } from "../src/governance/MintManager.sol";
contract MintManager_Initializer is CommonTest {
address constant owner = address(0x1234);
address constant rando = address(0x5678);
GovernanceToken internal gov;
MintManager internal manager;
/// @dev Sets up the test suite.
function setUp() public virtual override {
super.setUp();
vm.prank(owner);
gov = new GovernanceToken();
vm.prank(owner);
manager = new MintManager(owner, address(gov));
vm.prank(owner);
gov.transferOwnership(address(manager));
}
}
contract MintManager_constructor_Test is MintManager_Initializer {
/// @dev Tests that the constructor properly configures the contract.
function test_constructor_succeeds() external {
assertEq(manager.owner(), owner);
assertEq(address(manager.governanceToken()), address(gov));
}
}
contract MintManager_mint_Test is MintManager_Initializer {
/// @dev Tests that the mint function properly mints tokens when called by the owner.
function test_mint_fromOwner_succeeds() external {
// Mint once.
vm.prank(owner);
manager.mint(owner, 100);
// Token balance increases.
assertEq(gov.balanceOf(owner), 100);
}
/// @dev Tests that the mint function reverts when called by a non-owner.
function test_mint_fromNotOwner_reverts() external {
// Mint from rando fails.
vm.prank(rando);
vm.expectRevert("Ownable: caller is not the owner");
manager.mint(owner, 100);
}
/// @dev Tests that the mint function properly mints tokens when called by the owner a second
/// time after the mint period has elapsed.
function test_mint_afterPeriodElapsed_succeeds() external {
// Mint once.
vm.prank(owner);
manager.mint(owner, 100);
// Token balance increases.
assertEq(gov.balanceOf(owner), 100);
// Mint again after period elapsed (2% max).
vm.warp(block.timestamp + manager.MINT_PERIOD() + 1);
vm.prank(owner);
manager.mint(owner, 2);
// Token balance increases.
assertEq(gov.balanceOf(owner), 102);
}
/// @dev Tests that the mint function always reverts when called before the mint period has
/// elapsed, even if the caller is the owner.
function test_mint_beforePeriodElapsed_reverts() external {
// Mint once.
vm.prank(owner);
manager.mint(owner, 100);
// Token balance increases.
assertEq(gov.balanceOf(owner), 100);
// Mint again.
vm.prank(owner);
vm.expectRevert("MintManager: minting not permitted yet");
manager.mint(owner, 100);
// Token balance does not increase.
assertEq(gov.balanceOf(owner), 100);
}
/// @dev Tests that the owner cannot mint more than the mint cap.
function test_mint_moreThanCap_reverts() external {
// Mint once.
vm.prank(owner);
manager.mint(owner, 100);
// Token balance increases.
assertEq(gov.balanceOf(owner), 100);
// Mint again (greater than 2% max).
vm.warp(block.timestamp + manager.MINT_PERIOD() + 1);
vm.prank(owner);
vm.expectRevert("MintManager: mint amount exceeds cap");
manager.mint(owner, 3);
// Token balance does not increase.
assertEq(gov.balanceOf(owner), 100);
}
}
contract MintManager_upgrade_Test is MintManager_Initializer {
/// @dev Tests that the owner can upgrade the mint manager.
function test_upgrade_fromOwner_succeeds() external {
// Upgrade to new manager.
vm.prank(owner);
manager.upgrade(rando);
// New manager is rando.
assertEq(gov.owner(), rando);
}
/// @dev Tests that the upgrade function reverts when called by a non-owner.
function test_upgrade_fromNotOwner_reverts() external {
// Upgrade from rando fails.
vm.prank(rando);
vm.expectRevert("Ownable: caller is not the owner");
manager.upgrade(rando);
}
/// @dev Tests that the upgrade function reverts when attempting to update to the zero
/// address, even if the caller is the owner.
function test_upgrade_toZeroAddress_reverts() external {
// Upgrade to zero address fails.
vm.prank(owner);
vm.expectRevert("MintManager: mint manager cannot be the zero address");
manager.upgrade(address(0));
}
}