12345678910111213141516171819202122232425262728293031 |
- definition knownAsNonPrivileged(method f) returns bool = false
- /* ( f.selector == isWhitelistedOtoken(address).selector ||
- f.selector == isWhitelistedProduct(address,address,address,bool).selector ||
- f.selector == owner().selector ||
- f.selector == isWhitelistedCallee(address).selector ||
- f.selector == whitelistOtoken(address).selector ||
- f.selector == addressBook().selector ||
- f.selector == isWhitelistedCollateral(address).selector )*/;
- rule privilegedOperation(method f, address privileged)
- description "$f can be called by more than one user without reverting"
- {
- env e1;
- calldataarg arg;
- require !knownAsNonPrivileged(f);
- require e1.msg.sender == privileged;
- storage initialStorage = lastStorage;
- invoke f(e1, arg); // privileged succeeds executing candidate privileged operation.
- bool firstSucceeded = !lastReverted;
- env e2;
- calldataarg arg2;
- require e2.msg.sender != privileged;
- invoke f(e2, arg2) at initialStorage; // unprivileged
- bool secondSucceeded = !lastReverted;
- assert !(firstSucceeded && secondSucceeded), "${f.selector} can be called by both ${e1.msg.sender} and ${e2.msg.sender}, so it is not privileged";
- }
|