@@ -8,7 +8,9 @@ import "../../external-deps/openzeppelin/utils/cryptography/EIP712.sol";
88import "../../external-deps/openzeppelin/utils/structs/EnumerableSet.sol " ;
99
1010library 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 ));
1214
1315 struct Data {
1416 /// @dev The set of all admins of the wallet.
@@ -25,10 +27,10 @@ library AccountPermissionsStorage {
2527 mapping (bytes32 => bool ) executed;
2628 }
2729
28- function accountPermissionsStorage () internal pure returns (Data storage accountPermissionsData ) {
30+ function data () internal pure returns (Data storage data_ ) {
2931 bytes32 position = ACCOUNT_PERMISSIONS_STORAGE_POSITION;
3032 assembly {
31- accountPermissionsData .slot := position
33+ data_ .slot := position
3234 }
3335 }
3436}
@@ -69,27 +71,25 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
6971 (bool success , address signer ) = verifySignerPermissionRequest (_req, _signature);
7072 require (success, "AccountPermissions: invalid signature " );
7173
72- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
74+ _accountPermissionsStorage ().allSigners.add (targetSigner);
75+ _accountPermissionsStorage ().executed[_req.uid] = true ;
7376
74- data.allSigners.add (targetSigner);
75- data.executed[_req.uid] = true ;
76-
77- data.signerPermissions[targetSigner] = SignerPermissionsStatic (
77+ _accountPermissionsStorage ().signerPermissions[targetSigner] = SignerPermissionsStatic (
7878 _req.nativeTokenLimitPerTransaction,
7979 _req.permissionStartTimestamp,
8080 _req.permissionEndTimestamp
8181 );
8282
83- address [] memory currentTargets = data .approvedTargets[targetSigner].values ();
83+ address [] memory currentTargets = _accountPermissionsStorage () .approvedTargets[targetSigner].values ();
8484 uint256 currentLen = currentTargets.length ;
8585
8686 for (uint256 i = 0 ; i < currentLen; i += 1 ) {
87- data .approvedTargets[targetSigner].remove (currentTargets[i]);
87+ _accountPermissionsStorage () .approvedTargets[targetSigner].remove (currentTargets[i]);
8888 }
8989
9090 uint256 len = _req.approvedTargets.length ;
9191 for (uint256 i = 0 ; i < len; i += 1 ) {
92- data .approvedTargets[targetSigner].add (_req.approvedTargets[i]);
92+ _accountPermissionsStorage () .approvedTargets[targetSigner].add (_req.approvedTargets[i]);
9393 }
9494
9595 _afterSignerPermissionsUpdate (_req);
@@ -103,30 +103,27 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
103103
104104 /// @notice Returns whether the given account is an admin.
105105 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];
108107 }
109108
110109 /// @notice Returns whether the given account is an active signer on the account.
111110 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];
114112
115113 return
116114 permissions.startTimestamp <= block .timestamp &&
117115 block .timestamp < permissions.endTimestamp &&
118- data .approvedTargets[signer].length () > 0 ;
116+ _accountPermissionsStorage () .approvedTargets[signer].length () > 0 ;
119117 }
120118
121119 /// @notice Returns the restrictions under which a signer can use the smart wallet.
122120 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];
125122
126123 return
127124 SignerPermissions (
128125 signer,
129- data .approvedTargets[signer].values (),
126+ _accountPermissionsStorage () .approvedTargets[signer].values (),
130127 permissions.nativeTokenLimitPerTransaction,
131128 permissions.startTimestamp,
132129 permissions.endTimestamp
@@ -140,25 +137,23 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
140137 virtual
141138 returns (bool success , address signer )
142139 {
143- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
144140 signer = _recoverAddress (req, signature);
145- success = ! data .executed[req.uid] && isAdmin (signer);
141+ success = ! _accountPermissionsStorage () .executed[req.uid] && isAdmin (signer);
146142 }
147143
148144 /// @notice Returns all active and inactive signers of the account.
149145 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 ();
152147
153148 uint256 len = allSigners.length ;
154149 signers = new SignerPermissions [](len);
155150 for (uint256 i = 0 ; i < len; i += 1 ) {
156151 address signer = allSigners[i];
157- SignerPermissionsStatic memory permissions = data .signerPermissions[signer];
152+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage () .signerPermissions[signer];
158153
159154 signers[i] = SignerPermissions (
160155 signer,
161- data .approvedTargets[signer].values (),
156+ _accountPermissionsStorage () .approvedTargets[signer].values (),
162157 permissions.nativeTokenLimitPerTransaction,
163158 permissions.startTimestamp,
164159 permissions.endTimestamp
@@ -168,8 +163,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
168163
169164 /// @notice Returns all signers with active permissions to use the account.
170165 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 ();
173167
174168 uint256 len = allSigners.length ;
175169 uint256 numOfActiveSigners = 0 ;
@@ -192,11 +186,11 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
192186 continue ;
193187 }
194188 address signer = allSigners[i];
195- SignerPermissionsStatic memory permissions = data .signerPermissions[signer];
189+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage () .signerPermissions[signer];
196190
197191 signers[index++ ] = SignerPermissions (
198192 signer,
199- data .approvedTargets[signer].values (),
193+ _accountPermissionsStorage () .approvedTargets[signer].values (),
200194 permissions.nativeTokenLimitPerTransaction,
201195 permissions.startTimestamp,
202196 permissions.endTimestamp
@@ -206,8 +200,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
206200
207201 /// @notice Returns all admins of the account.
208202 function getAllAdmins () external view returns (address [] memory ) {
209- AccountPermissionsStorage.Data storage data = AccountPermissionsStorage.accountPermissionsStorage ();
210- return data.allAdmins.values ();
203+ return _accountPermissionsStorage ().allAdmins.values ();
211204 }
212205
213206 /*///////////////////////////////////////////////////////////////
@@ -219,13 +212,12 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
219212
220213 /// @notice Makes the given account an admin.
221214 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;
224216
225217 if (_isAdmin) {
226- data .allAdmins.add (_account);
218+ _accountPermissionsStorage () .allAdmins.add (_account);
227219 } else {
228- data .allAdmins.remove (_account);
220+ _accountPermissionsStorage () .allAdmins.remove (_account);
229221 }
230222
231223 emit AdminUpdated (_account, _isAdmin);
@@ -256,4 +248,9 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
256248 _req.uid
257249 );
258250 }
251+
252+ /// @dev Returns the AccountPermissions storage.
253+ function _accountPermissionsStorage () internal pure returns (AccountPermissionsStorage.Data storage data ) {
254+ data = AccountPermissionsStorage.data ();
255+ }
259256}
0 commit comments