ERC1155Pausable.spec 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. /// When a contract is in an unpaused state, calling pause() must pause.
  31. rule pauseMethodPausesContract {
  32. require !paused();
  33. env e;
  34. pause(e);
  35. assert paused(),
  36. "Calling pause must pause an unpaused contract";
  37. }
  38. /// When a contract is in a paused state, calling unpause() must unpause.
  39. rule unpauseMethodUnpausesContract {
  40. require paused();
  41. env e;
  42. unpause(e);
  43. assert !paused(),
  44. "Calling unpause must unpause a paused contract";
  45. }
  46. /// When a contract is in a paused state, calling pause() must revert.
  47. rule cannotPauseWhilePaused {
  48. require paused();
  49. env e;
  50. pause@withrevert(e);
  51. assert lastReverted,
  52. "A call to pause when already paused must revert";
  53. }
  54. /// When a contract is in an unpaused state, calling unpause() must revert.
  55. rule cannotUnpauseWhileUnpaused {
  56. require !paused();
  57. env e;
  58. unpause@withrevert(e);
  59. assert lastReverted,
  60. "A call to unpause when already unpaused must revert";
  61. }
  62. /// When a contract is in a paused state, functions with the whenNotPaused
  63. /// modifier must revert.
  64. rule whenNotPausedModifierCausesRevertIfPaused {
  65. require paused();
  66. env e; calldataarg args;
  67. onlyWhenNotPausedMethod@withrevert(e, args);
  68. assert lastReverted,
  69. "Functions with the whenNotPaused modifier must revert if the contract is paused";
  70. }
  71. /// When a contract is in an unpaused state, functions with the whenPaused
  72. /// modifier must revert.
  73. rule whenPausedModifierCausesRevertIfUnpaused {
  74. require !paused();
  75. env e; calldataarg args;
  76. onlyWhenPausedMethod@withrevert(e, args);
  77. assert lastReverted,
  78. "Functions with the whenPaused modifier must revert if the contract is not paused";
  79. }
  80. /// This rule should always fail.
  81. rule sanity {
  82. method f; env e; calldataarg args;
  83. f(e, args);
  84. assert false,
  85. "This rule should always fail";
  86. }