@@ -46,35 +46,42 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
4646 );
4747
4848 modifier onlyAdmin () virtual {
49- require (isAdmin (msg .sender ), "caller is not an admin " );
49+ require (isAdmin (msg .sender ), "! admin " );
5050 _;
5151 }
5252
5353 /*///////////////////////////////////////////////////////////////
5454 External functions
5555 //////////////////////////////////////////////////////////////*/
5656
57- /// @notice Adds / removes an account as an admin.
58- function setAdmin (address _account , bool _isAdmin ) external virtual onlyAdmin {
59- _setAdmin (_account, _isAdmin);
60- }
61-
6257 /// @notice Sets the permissions for a given signer.
6358 function setPermissionsForSigner (SignerPermissionRequest calldata _req , bytes calldata _signature ) external {
6459 address targetSigner = _req.signer;
65- require (! isAdmin (targetSigner), "signer is already an admin " );
6660
6761 require (
6862 _req.reqValidityStartTimestamp <= block .timestamp && block .timestamp < _req.reqValidityEndTimestamp,
69- "invalid request validity period "
63+ "! period "
7064 );
7165
7266 (bool success , address signer ) = verifySignerPermissionRequest (_req, _signature);
73- require (success, "invalid signature " );
67+ require (success, "!sig " );
7468
75- _accountPermissionsStorage ().allSigners.add (targetSigner);
7669 _accountPermissionsStorage ().executed[_req.uid] = true ;
7770
71+ //isAdmin > 0, set admin or remove admin
72+ if (_req.isAdmin > 0 ) {
73+ //isAdmin = 1, set admin
74+ //isAdmin > 1, remove admin
75+ bool _isAdmin = _req.isAdmin == 1 ;
76+
77+ _setAdmin (targetSigner, _isAdmin);
78+ return ;
79+ }
80+
81+ require (! isAdmin (targetSigner), "already admin " );
82+
83+ _accountPermissionsStorage ().allSigners.add (targetSigner);
84+
7885 _accountPermissionsStorage ().signerPermissions[targetSigner] = SignerPermissionsStatic (
7986 _req.nativeTokenLimitPerTransaction,
8087 _req.permissionStartTimestamp,
@@ -138,7 +145,7 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
138145 virtual
139146 returns (bool success , address signer )
140147 {
141- signer = _recoverAddress (req, signature);
148+ signer = _recoverAddress (_encodeRequest ( req) , signature);
142149 success = ! _accountPermissionsStorage ().executed[req.uid] && isAdmin (signer);
143150 }
144151
@@ -168,34 +175,30 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
168175
169176 uint256 len = allSigners.length ;
170177 uint256 numOfActiveSigners = 0 ;
171- bool [] memory isSignerActive = new bool [](len);
172178
173179 for (uint256 i = 0 ; i < len; i += 1 ) {
174- address signer = allSigners[i];
175-
176- bool isActive = isActiveSigner (signer);
177- isSignerActive[i] = isActive;
178- if (isActive) {
180+ if (isActiveSigner (allSigners[i])) {
179181 numOfActiveSigners++ ;
182+ } else {
183+ allSigners[i] = address (0 );
180184 }
181185 }
182186
183187 signers = new SignerPermissions [](numOfActiveSigners);
184188 uint256 index = 0 ;
185189 for (uint256 i = 0 ; i < len; i += 1 ) {
186- if (! isSignerActive[i]) {
187- continue ;
190+ if (allSigners[i] != address (0 )) {
191+ address signer = allSigners[i];
192+ SignerPermissionsStatic memory permissions = _accountPermissionsStorage ().signerPermissions[signer];
193+
194+ signers[index++ ] = SignerPermissions (
195+ signer,
196+ _accountPermissionsStorage ().approvedTargets[signer].values (),
197+ permissions.nativeTokenLimitPerTransaction,
198+ permissions.startTimestamp,
199+ permissions.endTimestamp
200+ );
188201 }
189- address signer = allSigners[i];
190- SignerPermissionsStatic memory permissions = _accountPermissionsStorage ().signerPermissions[signer];
191-
192- signers[index++ ] = SignerPermissions (
193- signer,
194- _accountPermissionsStorage ().approvedTargets[signer].values (),
195- permissions.nativeTokenLimitPerTransaction,
196- permissions.startTimestamp,
197- permissions.endTimestamp
198- );
199202 }
200203 }
201204
@@ -225,13 +228,8 @@ abstract contract AccountPermissions is IAccountPermissions, EIP712 {
225228 }
226229
227230 /// @dev Returns the address of the signer of the request.
228- function _recoverAddress (SignerPermissionRequest calldata _req , bytes calldata _signature )
229- internal
230- view
231- virtual
232- returns (address )
233- {
234- return _hashTypedDataV4 (keccak256 (_encodeRequest (_req))).recover (_signature);
231+ function _recoverAddress (bytes memory _encoded , bytes calldata _signature ) internal view virtual returns (address ) {
232+ return _hashTypedDataV4 (keccak256 (_encoded)).recover (_signature);
235233 }
236234
237235 /// @dev Encodes a request for recovery of the signer in `recoverAddress`.
0 commit comments