ERC1155Pausable.spec 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. methods {
  2. balanceOf(address, uint256) returns uint256 envfree
  3. paused() returns bool envfree
  4. }
  5. /// When a contract is in a paused state, the token balance for a given user and
  6. /// token must not change.
  7. rule balancesUnchangedWhenPaused() {
  8. address user; uint256 token;
  9. uint256 balanceBefore = balanceOf(user, token);
  10. require paused();
  11. method f; calldataarg arg; env e;
  12. f(e, arg);
  13. uint256 balanceAfter = balanceOf(user, token);
  14. assert balanceBefore == balanceAfter,
  15. "Token balance for a user must not change in a paused contract";
  16. }
  17. /// When a contract is in a paused state, transfer methods must revert.
  18. rule transferMethodsRevertWhenPaused (method f)
  19. filtered {
  20. f -> f.selector == safeTransferFrom(address,address,uint256,uint256,bytes).selector
  21. || f.selector == safeBatchTransferFrom(address,address,uint256[],uint256[],bytes).selector
  22. }
  23. {
  24. require paused();
  25. env e; calldataarg args;
  26. f@withrevert(e, args);
  27. assert lastReverted,
  28. "Transfer methods must revert in a paused contract";
  29. }
  30. /// Calling pause must pause an unpaused contract.
  31. /// When a contract is in an unpaused state, calling pause() must pause.
  32. rule pauseMethodPausesContract {
  33. require !paused();
  34. env e;
  35. pause(e);
  36. assert paused(),
  37. "Calling pause must pause an unpaused contract";
  38. }
  39. /// When a contract is in a paused state, calling unpause() must unpause.
  40. rule unpauseMethodUnpausesContract {
  41. require paused();
  42. env e;
  43. unpause(e);
  44. assert !paused(),
  45. "Calling unpause must unpause a paused contract";
  46. }
  47. /// When a contract is in a paused state, calling pause() must revert.
  48. rule cannotPauseWhilePaused {
  49. require paused();
  50. env e;
  51. pause@withrevert(e);
  52. assert lastReverted,
  53. "A call to pause when already paused must revert";
  54. }
  55. /// When a contract is in an unpaused state, calling unpause() must revert.
  56. rule cannotUnpauseWhileUnpaused {
  57. require !paused();
  58. env e;
  59. unpause@withrevert(e);
  60. assert lastReverted,
  61. "A call to unpause when already unpaused must revert";
  62. }
  63. /// When a contract is in a paused state, functions with the whenNotPaused
  64. /// modifier must revert.
  65. rule whenNotPausedModifierCausesRevertIfPaused {
  66. require paused();
  67. env e; calldataarg args;
  68. onlyWhenNotPausedMethod@withrevert(e, args);
  69. assert lastReverted,
  70. "Functions with the whenNotPaused modifier must revert if the contract is paused";
  71. }
  72. /// When a contract is in an unpaused state, functions with the whenPaused
  73. /// modifier must revert.
  74. rule whenPausedModifierCausesRevertIfUnpaused {
  75. require !paused();
  76. env e; calldataarg args;
  77. onlyWhenPausedMethod@withrevert(e, args);
  78. assert lastReverted,
  79. "Functions with the whenPaused modifier must revert if the contract is not paused";
  80. }
  81. /// This rule should always fail.
  82. rule sanity {
  83. method f; env e; calldataarg args;
  84. f(e, args);
  85. assert false,
  86. "This rule should always fail";
  87. }