AccessManaged.spec 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  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. }
  10. invariant isConsumingScheduledOpClean()
  11. isConsumingScheduledOp() == to_bytes4(0);
  12. rule callRestrictedFunction(env e) {
  13. bool immediate = authority_canCall_immediate(e, e.msg.sender);
  14. uint32 delay = authority_canCall_delay(e, e.msg.sender);
  15. uint48 scheduleBefore = authority_getSchedule(e, e.msg.sender);
  16. someFunction@withrevert(e);
  17. bool success = !lastReverted;
  18. uint48 scheduleAfter = authority_getSchedule(e, e.msg.sender);
  19. // can only call if immediate, or (with delay) by consuming a scheduled op
  20. assert success => (
  21. immediate ||
  22. (
  23. delay > 0 &&
  24. isSetAndPast(e, scheduleBefore) &&
  25. scheduleAfter == 0
  26. )
  27. );
  28. }