Skip to content

Commit e02a973

Browse files
committed
🔒 exa: require initialize call before initialize2
1 parent 95a3cb7 commit e02a973

3 files changed

Lines changed: 27 additions & 13 deletions

File tree

.gas-snapshot

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,26 +100,27 @@ DebtRollerTest:test_rollFixed_reverts_whenNotMarket() (gas: 49047)
100100
DebtRollerTest:test_rollFixed_rolls() (gas: 1100854)
101101
DebtRollerTest:test_rollFixed_rolls_partial() (gas: 1140051)
102102
EXATest:test_burn_burnsAndEmitsCrosschainBurn() (gas: 149890)
103-
EXATest:test_burn_reverts_whenCallerLacksBridgeRole() (gas: 69277)
103+
EXATest:test_burn_reverts_whenCallerLacksBridgeRole() (gas: 69255)
104104
EXATest:test_crosschainBurn_burnsAndEmitsCrosschainBurn() (gas: 149888)
105105
EXATest:test_crosschainBurn_reverts_whenCallerLacksBridgeRole() (gas: 69268)
106-
EXATest:test_crosschainMint_mintsAndEmitsCrosschainMint() (gas: 103234)
106+
EXATest:test_crosschainMint_mintsAndEmitsCrosschainMint() (gas: 103300)
107107
EXATest:test_crosschainMint_reverts_whenCallerLacksBridgeRole() (gas: 69277)
108-
EXATest:test_initialize2_grantsAdminRole() (gas: 30356)
109-
EXATest:test_initialize2_reverts_whenAdminIsZeroAddress() (gas: 5633722)
110-
EXATest:test_initialize2_reverts_whenCalledByNotProxyAdmin() (gas: 3392762)
111-
EXATest:test_initialize2_reverts_whenCalledTwice() (gas: 2290266)
112-
EXATest:test_initialize_reverts_whenCalledByNotProxyAdmin() (gas: 3284161)
113-
EXATest:test_initialize_reverts_whenCalledOnImplementation() (gas: 2261057)
108+
EXATest:test_initialize2_grantsAdminRole() (gas: 30379)
109+
EXATest:test_initialize2_reverts_whenAdminIsZeroAddress() (gas: 5661254)
110+
EXATest:test_initialize2_reverts_whenCalledBeforeInitialize() (gas: 3313044)
111+
EXATest:test_initialize2_reverts_whenCalledByNotProxyAdmin() (gas: 3406504)
112+
EXATest:test_initialize2_reverts_whenCalledTwice() (gas: 2304030)
113+
EXATest:test_initialize_reverts_whenCalledByNotProxyAdmin() (gas: 3297925)
114+
EXATest:test_initialize_reverts_whenCalledOnImplementation() (gas: 2274821)
114115
EXATest:test_initialize_reverts_whenCalledTwice() (gas: 38964)
115116
EXATest:test_initialize_setsNameSymbolAndSupply() (gas: 55624)
116-
EXATest:test_initialize_succeeds_whenProxyAlreadyDeployedAndUpgradedWithCall() (gas: 5654939)
117-
EXATest:test_initialize_totalSupplyIsZero_whenNotOptimism() (gas: 3396691)
117+
EXATest:test_initialize_succeeds_whenProxyAlreadyDeployedAndUpgradedWithCall() (gas: 5682459)
118+
EXATest:test_initialize_totalSupplyIsZero_whenNotOptimism() (gas: 3410455)
118119
EXATest:test_mint_mintsAndEmitsCrosschainMint() (gas: 103345)
119120
EXATest:test_mint_reverts_whenCallerLacksBridgeRole() (gas: 69342)
120-
EXATest:test_supportsInterface_returnsFalse_forInvalidInterface() (gas: 15813)
121+
EXATest:test_supportsInterface_returnsFalse_forInvalidInterface() (gas: 15791)
121122
EXATest:test_supportsInterface_returnsTrue_forIAccessControl() (gas: 15793)
122-
EXATest:test_supportsInterface_returnsTrue_forIERC165() (gas: 15815)
123+
EXATest:test_supportsInterface_returnsTrue_forIERC165() (gas: 15793)
123124
EXATest:test_supportsInterface_returnsTrue_forIERC7802() (gas: 15661)
124125
EscrowedEXATest:testCancelExternalStreams() (gas: 398267)
125126
EscrowedEXATest:testCancelExternalStreamsWithesEXACancel() (gas: 1137424)

contracts/periphery/EXA.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ contract EXA is ERC20VotesUpgradeable, AccessControlUpgradeable, IERC7802 {
3232
function initialize2(address admin_) external reinitializer(2) {
3333
if (msg.sender != StorageSlotUpgradeable.getAddressSlot(ADMIN_SLOT).value) revert NotProxyAdmin();
3434
if (admin_ == address(0)) revert ZeroAddress();
35+
if (bytes(symbol()).length == 0) revert NotInitialized();
3536

3637
__AccessControl_init();
3738
_grantRole(DEFAULT_ADMIN_ROLE, admin_);
@@ -73,5 +74,6 @@ contract EXA is ERC20VotesUpgradeable, AccessControlUpgradeable, IERC7802 {
7374
}
7475
}
7576

77+
error NotInitialized();
7678
error NotProxyAdmin();
7779
error ZeroAddress();

test/EXA.t.sol

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { IAccessControl } from "@openzeppelin/contracts/access/IAccessControl.so
1111
import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
1212
import { IERC7802 } from "@openzeppelin/contracts/interfaces/draft-IERC7802.sol";
1313

14-
import { EXA, NotProxyAdmin, ZeroAddress } from "../contracts/periphery/EXA.sol";
14+
import { EXA, NotInitialized, NotProxyAdmin, ZeroAddress } from "../contracts/periphery/EXA.sol";
1515

1616
contract EXATest is Test {
1717
EXA internal exa;
@@ -127,6 +127,17 @@ contract EXATest is Test {
127127
assertTrue(exa.hasRole(exa.DEFAULT_ADMIN_ROLE(), admin));
128128
}
129129

130+
function test_initialize2_reverts_whenCalledBeforeInitialize() external {
131+
ProxyAdmin proxyAdmin_ = new ProxyAdmin();
132+
address implementation = address(new EXA());
133+
ITransparentUpgradeableProxy proxy_ = ITransparentUpgradeableProxy(
134+
payable(address(new TransparentUpgradeableProxy(implementation, address(proxyAdmin_), "")))
135+
);
136+
137+
vm.expectRevert(NotInitialized.selector);
138+
proxyAdmin_.upgradeAndCall(proxy_, implementation, abi.encodeCall(EXA.initialize2, (admin)));
139+
}
140+
130141
function test_initialize2_reverts_whenCalledTwice() external {
131142
EXA implementation = new EXA();
132143

0 commit comments

Comments
 (0)