AccessManaged.spec 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import "helpers/helpers.spec";
  2. import "methods/IAccessManaged.spec";
  3. methods {
  4. // FV
  5. function someFunction() external;
  6. function authority_canCall_immediate(address) external returns (bool);
  7. function authority_canCall_delay(address) external returns (uint32);
  8. function authority_getSchedule(address) external returns (uint48);
  9. // Summaries
  10. function _.setAuthority(address) external => DISPATCHER(true);
  11. }
  12. invariant isConsumingScheduledOpClean()
  13. isConsumingScheduledOp() == to_bytes4(0);
  14. rule callRestrictedFunction(env e) {
  15. bool immediate = authority_canCall_immediate(e, e.msg.sender);
  16. uint32 delay = authority_canCall_delay(e, e.msg.sender);
  17. uint48 scheduleBefore = authority_getSchedule(e, e.msg.sender);
  18. someFunction@withrevert(e);
  19. bool success = !lastReverted;
  20. uint48 scheduleAfter = authority_getSchedule(e, e.msg.sender);
  21. // can only call if immediate, or (with delay) by consuming a scheduled op
  22. assert success => (
  23. immediate ||
  24. (
  25. delay > 0 &&
  26. isSetAndPast(e, scheduleBefore) &&
  27. scheduleAfter == 0
  28. )
  29. );
  30. }