@@ -8,7 +8,9 @@ import "../../external-deps/openzeppelin/utils/cryptography/EIP712.sol";
8
8
import "../../external-deps/openzeppelin/utils/structs/EnumerableSet.sol " ;
9
9
10
10
library AccountPermissionsStorage {
11
- bytes32 public constant ACCOUNT_PERMISSIONS_STORAGE_POSITION = keccak256 ("account.permissions.storage " );
11
+ /// @custom:storage-location erc7201:extension.manager.storage
12
+ bytes32 public constant ACCOUNT_PERMISSIONS_STORAGE_POSITION =
13
+ keccak256 (abi.encode (uint256 (keccak256 ("account.permissions.storage " )) - 1 ));
12
14
13
15
struct Data {
14
16
/// @dev The set of all admins of the wallet.
@@ -25,10 +27,10 @@ library AccountPermissionsStorage {
25
27
mapping (bytes32 => bool ) executed;
26
28
}
27
29
28
- function accountPermissionsStorage () internal pure returns (Data storage accountPermissionsData ) {
30
+ function data () internal pure returns (Data storage data_ ) {
29
31
bytes32 position = ACCOUNT_PERMISSIONS_STORAGE_POSITION;
30
32
assembly {
31
- accountPermissionsData .slot := position
33
+ data_ .slot := position
32
34
}
33
35
}
34
36
}
@@ -69,27 +71,25 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
69
71
(bool success , address signer ) = verifySignerPermissionRequest (_req, _signature);
70
72
require (success, "AccountPermissions: invalid signature " );
71
73
72
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
74
+ _accountPermissionsStorage ().allSigners.add (targetSigner);
75
+ _accountPermissionsStorage ().executed[_req.uid] = true ;
73
76
74
- data.allSigners.add (targetSigner);
75
- data.executed[_req.uid] = true ;
76
-
77
- data.signerPermissions[targetSigner] = SignerPermissionsStatic (
77
+ _accountPermissionsStorage ().signerPermissions[targetSigner] = SignerPermissionsStatic (
78
78
_req.nativeTokenLimitPerTransaction,
79
79
_req.permissionStartTimestamp,
80
80
_req.permissionEndTimestamp
81
81
);
82
82
83
- address [] memory currentTargets = data .approvedTargets[targetSigner].values ();
83
+ address [] memory currentTargets = _accountPermissionsStorage () .approvedTargets[targetSigner].values ();
84
84
uint256 currentLen = currentTargets.length ;
85
85
86
86
for (uint256 i = 0 ; i < currentLen; i += 1 ) {
87
- data .approvedTargets[targetSigner].remove (currentTargets[i]);
87
+ _accountPermissionsStorage () .approvedTargets[targetSigner].remove (currentTargets[i]);
88
88
}
89
89
90
90
uint256 len = _req.approvedTargets.length ;
91
91
for (uint256 i = 0 ; i < len; i += 1 ) {
92
- data .approvedTargets[targetSigner].add (_req.approvedTargets[i]);
92
+ _accountPermissionsStorage () .approvedTargets[targetSigner].add (_req.approvedTargets[i]);
93
93
}
94
94
95
95
_afterSignerPermissionsUpdate (_req);
@@ -103,30 +103,27 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
103
103
104
104
/// @notice Returns whether the given account is an admin.
105
105
function isAdmin (address _account ) public view virtual returns (bool ) {
106
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
107
- return data.isAdmin[_account];
106
+ return _accountPermissionsStorage ().isAdmin[_account];
108
107
}
109
108
110
109
/// @notice Returns whether the given account is an active signer on the account.
111
110
function isActiveSigner (address signer ) public view returns (bool ) {
112
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
113
- SignerPermissionsStatic memory permissions = data.signerPermissions[signer];
111
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage ().signerPermissions[signer];
114
112
115
113
return
116
114
permissions.startTimestamp <= block .timestamp &&
117
115
block .timestamp < permissions.endTimestamp &&
118
- data .approvedTargets[signer].length () > 0 ;
116
+ _accountPermissionsStorage () .approvedTargets[signer].length () > 0 ;
119
117
}
120
118
121
119
/// @notice Returns the restrictions under which a signer can use the smart wallet.
122
120
function getPermissionsForSigner (address signer ) external view returns (SignerPermissions memory ) {
123
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
124
- SignerPermissionsStatic memory permissions = data.signerPermissions[signer];
121
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage ().signerPermissions[signer];
125
122
126
123
return
127
124
SignerPermissions (
128
125
signer,
129
- data .approvedTargets[signer].values (),
126
+ _accountPermissionsStorage () .approvedTargets[signer].values (),
130
127
permissions.nativeTokenLimitPerTransaction,
131
128
permissions.startTimestamp,
132
129
permissions.endTimestamp
@@ -140,25 +137,23 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
140
137
virtual
141
138
returns (bool success , address signer )
142
139
{
143
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
144
140
signer = _recoverAddress (req, signature);
145
- success = ! data .executed[req.uid] && isAdmin (signer);
141
+ success = ! _accountPermissionsStorage () .executed[req.uid] && isAdmin (signer);
146
142
}
147
143
148
144
/// @notice Returns all active and inactive signers of the account.
149
145
function getAllSigners () external view returns (SignerPermissions[] memory signers ) {
150
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
151
- address [] memory allSigners = data.allSigners.values ();
146
+ address [] memory allSigners = _accountPermissionsStorage ().allSigners.values ();
152
147
153
148
uint256 len = allSigners.length ;
154
149
signers = new SignerPermissions [](len);
155
150
for (uint256 i = 0 ; i < len; i += 1 ) {
156
151
address signer = allSigners[i];
157
- SignerPermissionsStatic memory permissions = data .signerPermissions[signer];
152
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage () .signerPermissions[signer];
158
153
159
154
signers[i] = SignerPermissions (
160
155
signer,
161
- data .approvedTargets[signer].values (),
156
+ _accountPermissionsStorage () .approvedTargets[signer].values (),
162
157
permissions.nativeTokenLimitPerTransaction,
163
158
permissions.startTimestamp,
164
159
permissions.endTimestamp
@@ -168,8 +163,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
168
163
169
164
/// @notice Returns all signers with active permissions to use the account.
170
165
function getAllActiveSigners () external view returns (SignerPermissions[] memory signers ) {
171
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
172
- address [] memory allSigners = data.allSigners.values ();
166
+ address [] memory allSigners = _accountPermissionsStorage ().allSigners.values ();
173
167
174
168
uint256 len = allSigners.length ;
175
169
uint256 numOfActiveSigners = 0 ;
@@ -192,11 +186,11 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
192
186
continue ;
193
187
}
194
188
address signer = allSigners[i];
195
- SignerPermissionsStatic memory permissions = data .signerPermissions[signer];
189
+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage () .signerPermissions[signer];
196
190
197
191
signers[index++ ] = SignerPermissions (
198
192
signer,
199
- data .approvedTargets[signer].values (),
193
+ _accountPermissionsStorage () .approvedTargets[signer].values (),
200
194
permissions.nativeTokenLimitPerTransaction,
201
195
permissions.startTimestamp,
202
196
permissions.endTimestamp
@@ -206,8 +200,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
206
200
207
201
/// @notice Returns all admins of the account.
208
202
function getAllAdmins () external view returns (address [] memory ) {
209
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
210
- return data.allAdmins.values ();
203
+ return _accountPermissionsStorage ().allAdmins.values ();
211
204
}
212
205
213
206
/*///////////////////////////////////////////////////////////////
@@ -219,13 +212,12 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
219
212
220
213
/// @notice Makes the given account an admin.
221
214
function _setAdmin (address _account , bool _isAdmin ) internal virtual {
222
- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
223
- data.isAdmin[_account] = _isAdmin;
215
+ _accountPermissionsStorage ().isAdmin[_account] = _isAdmin;
224
216
225
217
if (_isAdmin) {
226
- data .allAdmins.add (_account);
218
+ _accountPermissionsStorage () .allAdmins.add (_account);
227
219
} else {
228
- data .allAdmins.remove (_account);
220
+ _accountPermissionsStorage () .allAdmins.remove (_account);
229
221
}
230
222
231
223
emit AdminUpdated (_account, _isAdmin);
@@ -256,4 +248,9 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
256
248
_req.uid
257
249
);
258
250
}
251
+
252
+ /// @dev Returns the AccountPermissions storage.
253
+ function _accountPermissionsStorage () internal pure returns (AccountPermissionsStorage.Data storage data ) {
254
+ data = AccountPermissionsStorage.data ();
255
+ }
259
256
}
0 commit comments