specs.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. const product = (...arrays) => arrays.reduce((a, b) => a.flatMap(ai => b.map(bi => [ai, bi].flat())));
  2. module.exports = [].concat(
  3. // AccessControl
  4. {
  5. spec: 'AccessControl',
  6. contract: 'AccessControlHarness',
  7. files: ['certora/harnesses/AccessControlHarness.sol'],
  8. },
  9. {
  10. spec: 'AccessControlDefaultAdminRules',
  11. contract: 'AccessControlDefaultAdminRulesHarness',
  12. files: ['certora/harnesses/AccessControlDefaultAdminRulesHarness.sol'],
  13. },
  14. {
  15. spec: 'Ownable',
  16. contract: 'OwnableHarness',
  17. files: ['certora/harnesses/OwnableHarness.sol'],
  18. },
  19. {
  20. spec: 'Ownable2Step',
  21. contract: 'Ownable2StepHarness',
  22. files: ['certora/harnesses/Ownable2StepHarness.sol'],
  23. },
  24. // Tokens
  25. {
  26. spec: 'ERC20',
  27. contract: 'ERC20PermitHarness',
  28. files: ['certora/harnesses/ERC20PermitHarness.sol'],
  29. options: ['--optimistic_loop'],
  30. },
  31. {
  32. spec: 'ERC20FlashMint',
  33. contract: 'ERC20FlashMintHarness',
  34. files: ['certora/harnesses/ERC20FlashMintHarness.sol', 'certora/harnesses/ERC3156FlashBorrowerHarness.sol'],
  35. options: ['--optimistic_loop'],
  36. },
  37. {
  38. spec: 'ERC20Wrapper',
  39. contract: 'ERC20WrapperHarness',
  40. files: ['certora/harnesses/ERC20PermitHarness.sol', 'certora/harnesses/ERC20WrapperHarness.sol'],
  41. options: ['--link ERC20WrapperHarness:_underlying=ERC20PermitHarness', '--optimistic_loop'],
  42. },
  43. {
  44. spec: 'ERC721',
  45. contract: 'ERC721Harness',
  46. files: ['certora/harnesses/ERC721Harness.sol', 'certora/harnesses/ERC721ReceiverHarness.sol'],
  47. options: ['--optimistic_loop'],
  48. },
  49. // Security
  50. {
  51. spec: 'Pausable',
  52. contract: 'PausableHarness',
  53. files: ['certora/harnesses/PausableHarness.sol'],
  54. },
  55. // Proxy
  56. {
  57. spec: 'Initializable',
  58. contract: 'InitializableHarness',
  59. files: ['certora/harnesses/InitializableHarness.sol'],
  60. },
  61. // Structures
  62. {
  63. spec: 'DoubleEndedQueue',
  64. contract: 'DoubleEndedQueueHarness',
  65. files: ['certora/harnesses/DoubleEndedQueueHarness.sol'],
  66. },
  67. {
  68. spec: 'EnumerableSet',
  69. contract: 'EnumerableSetHarness',
  70. files: ['certora/harnesses/EnumerableSetHarness.sol'],
  71. },
  72. {
  73. spec: 'EnumerableMap',
  74. contract: 'EnumerableMapHarness',
  75. files: ['certora/harnesses/EnumerableMapHarness.sol'],
  76. },
  77. // Governance
  78. {
  79. spec: 'TimelockController',
  80. contract: 'TimelockControllerHarness',
  81. files: ['certora/harnesses/TimelockControllerHarness.sol'],
  82. options: ['--optimistic_hashing', '--optimistic_loop'],
  83. },
  84. // Governor
  85. product(
  86. [
  87. ...product(['GovernorHarness'], ['GovernorInvariants', 'GovernorBaseRules', 'GovernorChanges', 'GovernorStates']),
  88. ...product(['GovernorPreventLateHarness'], ['GovernorPreventLateQuorum']),
  89. ],
  90. ['ERC20VotesBlocknumberHarness', 'ERC20VotesTimestampHarness'],
  91. ).map(([contract, spec, token]) => ({
  92. spec,
  93. contract,
  94. files: [
  95. `certora/harnesses/${contract}.sol`,
  96. `certora/harnesses/${token}.sol`,
  97. `certora/harnesses/TimelockControllerHarness.sol`,
  98. ],
  99. options: [
  100. `--link ${contract}:token=${token}`,
  101. `--link ${contract}:_timelock=TimelockControllerHarness`,
  102. '--optimistic_hashing',
  103. '--optimistic_loop',
  104. ],
  105. })),
  106. product(
  107. ['GovernorHarness'],
  108. ['GovernorFunctions'],
  109. ['ERC20VotesBlocknumberHarness', 'ERC20VotesTimestampHarness'],
  110. ['castVote', 'execute'], // 'propose', 'queue', 'cancel' // these rules timeout/fail
  111. ).map(([contract, spec, token, fn]) => ({
  112. spec,
  113. contract,
  114. files: [
  115. `certora/harnesses/${contract}.sol`,
  116. `certora/harnesses/${token}.sol`,
  117. `certora/harnesses/TimelockControllerHarness.sol`,
  118. ],
  119. options: [
  120. `--link ${contract}:token=${token}`,
  121. `--link ${contract}:_timelock=TimelockControllerHarness`,
  122. '--optimistic_hashing',
  123. '--optimistic_loop',
  124. '--rules',
  125. ...['liveness', 'effect', 'sideeffect'].map(kind => `${fn}_${kind}`),
  126. ],
  127. })),
  128. );