Просмотр исходного кода

Make isConsumingScheduleOp return bytes4 to mitigate clashes (#4575)

Co-authored-by: Francisco Giordano <fg@frang.io>
Hadrien Croubois 2 лет назад
Родитель
Сommit
5a77c9995f

+ 2 - 2
contracts/access/manager/AccessManaged.sol

@@ -85,8 +85,8 @@ abstract contract AccessManaged is Context, IAccessManaged {
      * being consumed. Prevents denial of service for delayed restricted calls in the case that the contract performs
      * attacker controlled calls.
      */
-    function isConsumingScheduledOp() public view returns (bool) {
-        return _consumingSchedule;
+    function isConsumingScheduledOp() public view returns (bytes4) {
+        return _consumingSchedule ? this.isConsumingScheduledOp.selector : bytes4(0);
     }
 
     /**

+ 4 - 2
contracts/access/manager/AccessManager.sol

@@ -655,7 +655,9 @@ contract AccessManager is Context, Multicall, IAccessManager {
      */
     function consumeScheduledOp(address caller, bytes calldata data) public virtual {
         address target = _msgSender();
-        require(IAccessManaged(target).isConsumingScheduledOp());
+        if (IAccessManaged(target).isConsumingScheduledOp() != IAccessManaged.isConsumingScheduledOp.selector) {
+            revert AccessManagerUnauthorizedConsume(target);
+        }
         _consumeScheduledOp(_hashOperation(caller, target, data));
     }
 
@@ -704,7 +706,7 @@ contract AccessManager is Context, Multicall, IAccessManager {
             (bool isAdmin, ) = hasGroup(ADMIN_GROUP, msgsender);
             (bool isGuardian, ) = hasGroup(getGroupGuardian(getTargetFunctionGroup(target, selector)), msgsender);
             if (!isAdmin && !isGuardian) {
-                revert AccessManagerCannotCancel(msgsender, caller, target, selector);
+                revert AccessManagerUnauthorizedCancel(msgsender, caller, target, selector);
             }
         }
 

+ 1 - 1
contracts/access/manager/IAccessManaged.sol

@@ -13,5 +13,5 @@ interface IAccessManaged {
 
     function setAuthority(address) external;
 
-    function isConsumingScheduledOp() external view returns (bool);
+    function isConsumingScheduledOp() external view returns (bytes4);
 }

+ 2 - 1
contracts/access/manager/IAccessManager.sol

@@ -48,7 +48,8 @@ interface IAccessManager {
     error AccessManagerBadConfirmation();
     error AccessManagerUnauthorizedAccount(address msgsender, uint64 groupId);
     error AccessManagerUnauthorizedCall(address caller, address target, bytes4 selector);
-    error AccessManagerCannotCancel(address msgsender, address caller, address target, bytes4 selector);
+    error AccessManagerUnauthorizedConsume(address target);
+    error AccessManagerUnauthorizedCancel(address msgsender, address caller, address target, bytes4 selector);
     error AccessManagerInvalidInitialAdmin(address initialAdmin);
 
     function canCall(

+ 1 - 1
test/access/manager/AccessManager.test.js

@@ -961,7 +961,7 @@ contract('AccessManager', function (accounts) {
 
         expect(await this.manager.getSchedule(this.opId)).to.not.be.bignumber.equal('0');
 
-        await expectRevertCustomError(this.cancel({ from: other }), 'AccessManagerCannotCancel', [
+        await expectRevertCustomError(this.cancel({ from: other }), 'AccessManagerUnauthorizedCancel', [
           other,
           user,
           ...this.call,