Privileged.spec 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. definition knownAsNonPrivileged(method f) returns bool = false
  2. /* ( f.selector == isWhitelistedOtoken(address).selector ||
  3. f.selector == isWhitelistedProduct(address,address,address,bool).selector ||
  4. f.selector == owner().selector ||
  5. f.selector == isWhitelistedCallee(address).selector ||
  6. f.selector == whitelistOtoken(address).selector ||
  7. f.selector == addressBook().selector ||
  8. f.selector == isWhitelistedCollateral(address).selector )*/;
  9. rule privilegedOperation(method f, address privileged)
  10. description "$f can be called by more than one user without reverting"
  11. {
  12. env e1;
  13. calldataarg arg;
  14. require !knownAsNonPrivileged(f);
  15. require e1.msg.sender == privileged;
  16. storage initialStorage = lastStorage;
  17. invoke f(e1, arg); // privileged succeeds executing candidate privileged operation.
  18. bool firstSucceeded = !lastReverted;
  19. env e2;
  20. calldataarg arg2;
  21. require e2.msg.sender != privileged;
  22. invoke f(e2, arg2) at initialStorage; // unprivileged
  23. bool secondSucceeded = !lastReverted;
  24. assert !(firstSucceeded && secondSucceeded), "${f.selector} can be called by both ${e1.msg.sender} and ${e2.msg.sender}, so it is not privileged";
  25. }