Skip to content

Commit 215c0db

Browse files
committed
upgrade to openzeppelin 5.3.0 + solc 0.8.20 + optimization
1 parent 38ede16 commit 215c0db

File tree

8 files changed

+62
-21
lines changed

8 files changed

+62
-21
lines changed

abi/SecureOwnable.abi.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,26 @@
11
[
2+
{
3+
"inputs": [
4+
{
5+
"internalType": "address",
6+
"name": "owner",
7+
"type": "address"
8+
}
9+
],
10+
"name": "OwnableInvalidOwner",
11+
"type": "error"
12+
},
13+
{
14+
"inputs": [
15+
{
16+
"internalType": "address",
17+
"name": "account",
18+
"type": "address"
19+
}
20+
],
21+
"name": "OwnableUnauthorizedAccount",
22+
"type": "error"
23+
},
224
{
325
"anonymous": false,
426
"inputs": [

contracts/GuardianAccountAbstraction.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: MPL-2.0
2-
pragma solidity ^0.8.0;
2+
pragma solidity ^0.8.2;
33

44
import "./core/access/SecureOwnable.sol";
55

contracts/core/access/ISecureOwnable.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: MPL-2.0
2-
pragma solidity ^0.8.0;
2+
pragma solidity ^0.8.2;
33

44
// OpenZeppelin imports
55
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

contracts/core/access/SecureOwnable.sol

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// SPDX-License-Identifier: MPL-2.0
2-
pragma solidity ^0.8.0;
2+
pragma solidity ^0.8.2;
33

44
// OpenZeppelin imports
55
import "@openzeppelin/contracts/access/Ownable.sol";
@@ -80,7 +80,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
8080
}
8181

8282
modifier onlyRecovery() {
83-
require(msg.sender == _recoveryAddress, "Restricted to recovery owner");
83+
require(msg.sender == _recoveryAddress, "Restricted to recovery");
8484
_;
8585
}
8686

@@ -101,7 +101,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
101101
address broadcaster,
102102
address recovery,
103103
uint256 timeLockPeriodInMinutes
104-
) {
104+
) Ownable(initialOwner) {
105105
_timeLockPeriodInMinutes = timeLockPeriodInMinutes;
106106
_recoveryAddress = recovery;
107107
_broadcaster = broadcaster;
@@ -137,7 +137,6 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
137137
_secureState.addRoleForFunction(UPDATE_RECOVERY_META_SELECTOR, MultiPhaseSecureOperation.BROADCASTER_ROLE);
138138
_secureState.addRoleForFunction(UPDATE_TIMELOCK_META_SELECTOR, MultiPhaseSecureOperation.BROADCASTER_ROLE);
139139

140-
_transferOwnership(initialOwner);
141140
}
142141

143142
// Ownership Management
@@ -188,7 +187,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
188187
*/
189188
function transferOwnershipApprovalWithMetaTx(MultiPhaseSecureOperation.MetaTransaction memory metaTx) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory) {
190189
_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);
192191
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txApprovalWithMetaTx(metaTx);
193192
_validateOperationType(updatedRecord.params.operationType, OWNERSHIP_TRANSFER);
194193
_hasOpenOwnershipRequest = false;
@@ -217,7 +216,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
217216
*/
218217
function transferOwnershipCancellationWithMetaTx(MultiPhaseSecureOperation.MetaTransaction memory metaTx) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory) {
219218
_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);
221220
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txCancellationWithMetaTx(metaTx);
222221
_validateOperationType(updatedRecord.params.operationType, OWNERSHIP_TRANSFER);
223222
_hasOpenOwnershipRequest = false;
@@ -235,7 +234,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
235234
function updateBroadcasterRequest(address newBroadcaster) public onlyOwner returns (MultiPhaseSecureOperation.TxRecord memory) {
236235
require(!_hasOpenBroadcasterRequest, "Request is already pending");
237236
_validateNotZeroAddress(newBroadcaster);
238-
require(newBroadcaster != _broadcaster, "New broadcaster must be different");
237+
_validateNewAddress(newBroadcaster, _broadcaster);
239238

240239
bytes memory executionOptions = MultiPhaseSecureOperation.createStandardExecutionOptions(
241240
UPDATE_BROADCASTER_SELECTOR,
@@ -278,7 +277,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
278277
*/
279278
function updateBroadcasterApprovalWithMetaTx(MultiPhaseSecureOperation.MetaTransaction memory metaTx) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory) {
280279
_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);
282281
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txApprovalWithMetaTx(metaTx);
283282
_validateOperationType(updatedRecord.params.operationType, BROADCASTER_UPDATE);
284283
_hasOpenBroadcasterRequest = false;
@@ -307,7 +306,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
307306
*/
308307
function updateBroadcasterCancellationWithMetaTx(MultiPhaseSecureOperation.MetaTransaction memory metaTx) public onlyBroadcaster returns (MultiPhaseSecureOperation.TxRecord memory) {
309308
_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);
311310
MultiPhaseSecureOperation.TxRecord memory updatedRecord = _secureState.txCancellationWithMetaTx(metaTx);
312311
_validateOperationType(updatedRecord.params.operationType, BROADCASTER_UPDATE);
313312
_hasOpenBroadcasterRequest = false;
@@ -326,7 +325,7 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
326325
address newRecoveryAddress
327326
) public view returns (bytes memory) {
328327
_validateNotZeroAddress(newRecoveryAddress);
329-
require(newRecoveryAddress != _recoveryAddress, "New recovery must be different");
328+
_validateNewAddress(newRecoveryAddress, _recoveryAddress);
330329

331330
return MultiPhaseSecureOperation.createStandardExecutionOptions(
332331
UPDATE_RECOVERY_SELECTOR,
@@ -691,6 +690,24 @@ abstract contract SecureOwnable is Ownable, ERC165, ISecureOwnable {
691690
require(actualType == expectedType, "Invalid operation type");
692691
}
693692

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+
694711
/**
695712
* @dev See {IERC165-supportsInterface}.
696713
*/

contracts/lib/MultiPhaseSecureOperation.sol

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// SPDX-License-Identifier: MPL-2.0
2-
pragma solidity ^0.8.0;
2+
pragma solidity ^0.8.2;
33

44
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5-
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
5+
import { MessageHashUtils } from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
66

77
/**
88
* @title MultiPhaseSecureOperation
@@ -21,6 +21,8 @@ import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
2121
* that require high levels of security and flexibility.
2222
*/
2323
library MultiPhaseSecureOperation {
24+
using MessageHashUtils for bytes32;
25+
2426
enum TxStatus {
2527
UNDEFINED,
2628
PENDING,
@@ -633,7 +635,7 @@ library MultiPhaseSecureOperation {
633635
require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "Invalid s value");
634636
require(v == 27 || v == 28, "Invalid v value");
635637

636-
address signer = ecrecover(ECDSA.toEthSignedMessageHash(messageHash), v, r, s);
638+
address signer = ecrecover(messageHash.toEthSignedMessageHash(), v, r, s);
637639
require(signer != address(0), "ECDSA: invalid signature");
638640

639641
return signer;

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"author": "Particle Crypto Security",
2323
"license": "MPL-2.0",
2424
"dependencies": {
25-
"@openzeppelin/contracts": "^4.9.6"
25+
"@openzeppelin/contracts": "^5.3.0"
2626
},
2727
"devDependencies": {
2828
"@nomiclabs/hardhat-ethers": "^2.2.3",

truffle-config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ module.exports = {
8989
// Configure your compilers
9090
compilers: {
9191
solc: {
92-
version: "0.8.9", // Fetch exact version from solc-bin (default: truffle's version)
92+
version: "0.8.20", // Fetch exact version from solc-bin (default: truffle's version)
9393
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
9494
settings: { // See the solidity docs for advice about optimization and evmVersion
9595
optimizer: {

0 commit comments

Comments
 (0)