Add setAuthority rule to AccessManaged
This commit is contained in:
@ -7,9 +7,10 @@ methods {
|
||||
function authority_canCall_immediate(address) external returns (bool);
|
||||
function authority_canCall_delay(address) external returns (uint32);
|
||||
function authority_getSchedule(address) external returns (uint48);
|
||||
function _hasCode(address) external returns (bool) envfree;
|
||||
|
||||
// Summaries
|
||||
function _.setAuthority(address) external => DISPATCHER(true);
|
||||
function _.setAuthority(address) external => DISPATCHER(true);
|
||||
}
|
||||
|
||||
invariant isConsumingScheduledOpClean()
|
||||
@ -35,3 +36,24 @@ rule callRestrictedFunction(env e) {
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Rule: Only valid authorities can be set by the current authority │
|
||||
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
*/
|
||||
rule setAuthority(env e) {
|
||||
require nonpayable(e);
|
||||
|
||||
address newAuthority;
|
||||
|
||||
address previousAuthority = authority();
|
||||
|
||||
setAuthority@withrevert(e, newAuthority);
|
||||
bool success = !lastReverted;
|
||||
|
||||
assert (success && authority() == newAuthority) <=> (
|
||||
previousAuthority == e.msg.sender &&
|
||||
_hasCode(newAuthority)
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user