1
1
// SPDX-License-Identifier: MPL-2.0
2
- pragma solidity ^ 0.8.0 ;
2
+ pragma solidity ^ 0.8.2 ;
3
3
4
4
// OpenZeppelin imports
5
5
import "@openzeppelin/contracts/access/Ownable.sol " ;
@@ -80,7 +80,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
80
80
}
81
81
82
82
modifier onlyRecovery () {
83
- require (msg .sender == _recoveryAddress, "Restricted to recovery owner " );
83
+ require (msg .sender == _recoveryAddress, "Restricted to recovery " );
84
84
_;
85
85
}
86
86
@@ -101,7 +101,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
101
101
address broadcaster ,
102
102
address recovery ,
103
103
uint256 timeLockPeriodInMinutes
104
- ) {
104
+ ) Ownable (initialOwner) {
105
105
_timeLockPeriodInMinutes = timeLockPeriodInMinutes;
106
106
_recoveryAddress = recovery;
107
107
_broadcaster = broadcaster;
@@ -137,7 +137,6 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
137
137
_secureState.addRoleForFunction (UPDATE_RECOVERY_META_SELECTOR, MultiPhaseSecureOperation.BROADCASTER_ROLE);
138
138
_secureState.addRoleForFunction (UPDATE_TIMELOCK_META_SELECTOR, MultiPhaseSecureOperation.BROADCASTER_ROLE);
139
139
140
- _transferOwnership (initialOwner);
141
140
}
142
141
143
142
// Ownership Management
@@ -188,7 +187,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
188
187
*/
189
188
function transferOwnershipApprovalWithMetaTx (MultiPhaseSecureOperation.MetaTransaction memory metaTx ) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory ) {
190
189
_secureState.checkPermission (TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR);
191
- require (metaTx.params.handlerSelector == TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR, " Invalid handler selector " );
190
+ _validateHandlerSelector (metaTx.params.handlerSelector, TRANSFER_OWNERSHIP_APPROVE_META_SELECTOR );
192
191
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txApprovalWithMetaTx (metaTx);
193
192
_validateOperationType (updatedRecord.params.operationType, OWNERSHIP_TRANSFER);
194
193
_hasOpenOwnershipRequest = false ;
@@ -217,7 +216,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
217
216
*/
218
217
function transferOwnershipCancellationWithMetaTx (MultiPhaseSecureOperation.MetaTransaction memory metaTx ) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory ) {
219
218
_secureState.checkPermission (TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR);
220
- require (metaTx.params.handlerSelector == TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR, " Invalid handler selector " );
219
+ _validateHandlerSelector (metaTx.params.handlerSelector, TRANSFER_OWNERSHIP_CANCEL_META_SELECTOR );
221
220
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txCancellationWithMetaTx (metaTx);
222
221
_validateOperationType (updatedRecord.params.operationType, OWNERSHIP_TRANSFER);
223
222
_hasOpenOwnershipRequest = false ;
@@ -235,7 +234,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
235
234
function updateBroadcasterRequest (address newBroadcaster ) public onlyOwner returns (MultiPhaseSecureOperation.TxRecord memory ) {
236
235
require (! _hasOpenBroadcasterRequest, "Request is already pending " );
237
236
_validateNotZeroAddress (newBroadcaster);
238
- require (newBroadcaster != _broadcaster, " New broadcaster must be different " );
237
+ _validateNewAddress (newBroadcaster, _broadcaster );
239
238
240
239
bytes memory executionOptions = MultiPhaseSecureOperation.createStandardExecutionOptions (
241
240
UPDATE_BROADCASTER_SELECTOR,
@@ -278,7 +277,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
278
277
*/
279
278
function updateBroadcasterApprovalWithMetaTx (MultiPhaseSecureOperation.MetaTransaction memory metaTx ) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory ) {
280
279
_secureState.checkPermission (UPDATE_BROADCASTER_APPROVE_META_SELECTOR);
281
- require (metaTx.params.handlerSelector == UPDATE_BROADCASTER_APPROVE_META_SELECTOR, " Invalid handler selector " );
280
+ _validateHandlerSelector (metaTx.params.handlerSelector, UPDATE_BROADCASTER_APPROVE_META_SELECTOR );
282
281
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txApprovalWithMetaTx (metaTx);
283
282
_validateOperationType (updatedRecord.params.operationType, BROADCASTER_UPDATE);
284
283
_hasOpenBroadcasterRequest = false ;
@@ -307,7 +306,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
307
306
*/
308
307
function updateBroadcasterCancellationWithMetaTx (MultiPhaseSecureOperation.MetaTransaction memory metaTx ) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory ) {
309
308
_secureState.checkPermission (UPDATE_BROADCASTER_CANCEL_META_SELECTOR);
310
- require (metaTx.params.handlerSelector == UPDATE_BROADCASTER_CANCEL_META_SELECTOR, " Invalid handler selector " );
309
+ _validateHandlerSelector (metaTx.params.handlerSelector, UPDATE_BROADCASTER_CANCEL_META_SELECTOR );
311
310
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txCancellationWithMetaTx (metaTx);
312
311
_validateOperationType (updatedRecord.params.operationType, BROADCASTER_UPDATE);
313
312
_hasOpenBroadcasterRequest = false ;
@@ -326,7 +325,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
326
325
address newRecoveryAddress
327
326
) public view returns (bytes memory ) {
328
327
_validateNotZeroAddress (newRecoveryAddress);
329
- require (newRecoveryAddress != _recoveryAddress, " New recovery must be different " );
328
+ _validateNewAddress (newRecoveryAddress, _recoveryAddress );
330
329
331
330
return MultiPhaseSecureOperation.createStandardExecutionOptions (
332
331
UPDATE_RECOVERY_SELECTOR,
@@ -691,6 +690,24 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
691
690
require (actualType == expectedType, "Invalid operation type " );
692
691
}
693
692
693
+ /**
694
+ * @dev Validates that the handler selector matches the expected selector
695
+ * @param actualSelector The actual handler selector from the meta transaction
696
+ * @param expectedSelector The expected handler selector to validate against
697
+ */
698
+ function _validateHandlerSelector (bytes4 actualSelector , bytes4 expectedSelector ) internal pure {
699
+ require (actualSelector == expectedSelector, "Invalid handler selector " );
700
+ }
701
+
702
+ /**
703
+ * @dev Validates that the new address is different from the current address
704
+ * @param newAddress The proposed new address
705
+ * @param currentAddress The current address to compare against
706
+ */
707
+ function _validateNewAddress (address newAddress , address currentAddress ) internal pure {
708
+ require (newAddress != currentAddress, "Not new address " );
709
+ }
710
+
694
711
/**
695
712
* @dev See {IERC165-supportsInterface}.
696
713
*/
0 commit comments