@bananapus/core-v6 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/SKILLS.md +151 -0
  4. package/docs/book.css +13 -0
  5. package/docs/book.toml +12 -0
  6. package/docs/solidity.min.js +74 -0
  7. package/docs/src/README.md +703 -0
  8. package/docs/src/SUMMARY.md +94 -0
  9. package/docs/src/src/JBChainlinkV3PriceFeed.sol/contract.JBChainlinkV3PriceFeed.md +83 -0
  10. package/docs/src/src/JBChainlinkV3SequencerPriceFeed.sol/contract.JBChainlinkV3SequencerPriceFeed.md +88 -0
  11. package/docs/src/src/JBController.sol/contract.JBController.md +1121 -0
  12. package/docs/src/src/JBDeadline.sol/contract.JBDeadline.md +84 -0
  13. package/docs/src/src/JBDirectory.sol/contract.JBDirectory.md +294 -0
  14. package/docs/src/src/JBERC20.sol/contract.JBERC20.md +190 -0
  15. package/docs/src/src/JBFeelessAddresses.sol/contract.JBFeelessAddresses.md +80 -0
  16. package/docs/src/src/JBFundAccessLimits.sol/contract.JBFundAccessLimits.md +253 -0
  17. package/docs/src/src/JBMultiTerminal.sol/contract.JBMultiTerminal.md +1472 -0
  18. package/docs/src/src/JBPermissions.sol/contract.JBPermissions.md +199 -0
  19. package/docs/src/src/JBPrices.sol/contract.JBPrices.md +154 -0
  20. package/docs/src/src/JBProjects.sol/contract.JBProjects.md +131 -0
  21. package/docs/src/src/JBRulesets.sol/contract.JBRulesets.md +677 -0
  22. package/docs/src/src/JBSplits.sol/contract.JBSplits.md +237 -0
  23. package/docs/src/src/JBTerminalStore.sol/contract.JBTerminalStore.md +591 -0
  24. package/docs/src/src/JBTokens.sol/contract.JBTokens.md +353 -0
  25. package/docs/src/src/README.md +25 -0
  26. package/docs/src/src/abstract/JBControlled.sol/abstract.JBControlled.md +64 -0
  27. package/docs/src/src/abstract/JBPermissioned.sol/abstract.JBPermissioned.md +84 -0
  28. package/docs/src/src/abstract/README.md +5 -0
  29. package/docs/src/src/enums/JBApprovalStatus.sol/enum.JBApprovalStatus.md +17 -0
  30. package/docs/src/src/enums/README.md +4 -0
  31. package/docs/src/src/interfaces/IJBCashOutHook.sol/interface.IJBCashOutHook.md +29 -0
  32. package/docs/src/src/interfaces/IJBCashOutTerminal.sol/interface.IJBCashOutTerminal.md +57 -0
  33. package/docs/src/src/interfaces/IJBControlled.sol/interface.IJBControlled.md +12 -0
  34. package/docs/src/src/interfaces/IJBController.sol/interface.IJBController.md +334 -0
  35. package/docs/src/src/interfaces/IJBDirectory.sol/interface.IJBDirectory.md +108 -0
  36. package/docs/src/src/interfaces/IJBDirectoryAccessControl.sol/interface.IJBDirectoryAccessControl.md +19 -0
  37. package/docs/src/src/interfaces/IJBFeeTerminal.sol/interface.IJBFeeTerminal.md +91 -0
  38. package/docs/src/src/interfaces/IJBFeelessAddresses.sol/interface.IJBFeelessAddresses.md +26 -0
  39. package/docs/src/src/interfaces/IJBFundAccessLimits.sol/interface.IJBFundAccessLimits.md +88 -0
  40. package/docs/src/src/interfaces/IJBMigratable.sol/interface.IJBMigratable.md +29 -0
  41. package/docs/src/src/interfaces/IJBMultiTerminal.sol/interface.IJBMultiTerminal.md +50 -0
  42. package/docs/src/src/interfaces/IJBPayHook.sol/interface.IJBPayHook.md +28 -0
  43. package/docs/src/src/interfaces/IJBPayoutTerminal.sol/interface.IJBPayoutTerminal.md +105 -0
  44. package/docs/src/src/interfaces/IJBPermissioned.sol/interface.IJBPermissioned.md +12 -0
  45. package/docs/src/src/interfaces/IJBPermissions.sol/interface.IJBPermissions.md +74 -0
  46. package/docs/src/src/interfaces/IJBPermitTerminal.sol/interface.IJBPermitTerminal.md +15 -0
  47. package/docs/src/src/interfaces/IJBPriceFeed.sol/interface.IJBPriceFeed.md +12 -0
  48. package/docs/src/src/interfaces/IJBPrices.sol/interface.IJBPrices.md +74 -0
  49. package/docs/src/src/interfaces/IJBProjectUriRegistry.sol/interface.IJBProjectUriRegistry.md +19 -0
  50. package/docs/src/src/interfaces/IJBProjects.sol/interface.IJBProjects.md +49 -0
  51. package/docs/src/src/interfaces/IJBRulesetApprovalHook.sol/interface.IJBRulesetApprovalHook.md +35 -0
  52. package/docs/src/src/interfaces/IJBRulesetDataHook.sol/interface.IJBRulesetDataHook.md +97 -0
  53. package/docs/src/src/interfaces/IJBRulesets.sol/interface.IJBRulesets.md +165 -0
  54. package/docs/src/src/interfaces/IJBSplitHook.sol/interface.IJBSplitHook.md +31 -0
  55. package/docs/src/src/interfaces/IJBSplits.sol/interface.IJBSplits.md +35 -0
  56. package/docs/src/src/interfaces/IJBTerminal.sol/interface.IJBTerminal.md +141 -0
  57. package/docs/src/src/interfaces/IJBTerminalStore.sol/interface.IJBTerminalStore.md +198 -0
  58. package/docs/src/src/interfaces/IJBToken.sol/interface.IJBToken.md +54 -0
  59. package/docs/src/src/interfaces/IJBTokenUriResolver.sol/interface.IJBTokenUriResolver.md +12 -0
  60. package/docs/src/src/interfaces/IJBTokens.sol/interface.IJBTokens.md +151 -0
  61. package/docs/src/src/interfaces/README.md +33 -0
  62. package/docs/src/src/libraries/JBCashOuts.sol/library.JBCashOuts.md +40 -0
  63. package/docs/src/src/libraries/JBConstants.sol/library.JBConstants.md +52 -0
  64. package/docs/src/src/libraries/JBCurrencyIds.sol/library.JBCurrencyIds.md +19 -0
  65. package/docs/src/src/libraries/JBFees.sol/library.JBFees.md +52 -0
  66. package/docs/src/src/libraries/JBFixedPointNumber.sol/library.JBFixedPointNumber.md +12 -0
  67. package/docs/src/src/libraries/JBMetadataResolver.sol/library.JBMetadataResolver.md +242 -0
  68. package/docs/src/src/libraries/JBRulesetMetadataResolver.sol/library.JBRulesetMetadataResolver.md +180 -0
  69. package/docs/src/src/libraries/JBSplitGroupIds.sol/library.JBSplitGroupIds.md +14 -0
  70. package/docs/src/src/libraries/JBSurplus.sol/library.JBSurplus.md +44 -0
  71. package/docs/src/src/libraries/README.md +12 -0
  72. package/docs/src/src/periphery/JBDeadline1Day.sol/contract.JBDeadline1Day.md +15 -0
  73. package/docs/src/src/periphery/JBDeadline3Days.sol/contract.JBDeadline3Days.md +15 -0
  74. package/docs/src/src/periphery/JBDeadline3Hours.sol/contract.JBDeadline3Hours.md +15 -0
  75. package/docs/src/src/periphery/JBDeadline7Days.sol/contract.JBDeadline7Days.md +15 -0
  76. package/docs/src/src/periphery/JBMatchingPriceFeed.sol/contract.JBMatchingPriceFeed.md +22 -0
  77. package/docs/src/src/periphery/README.md +8 -0
  78. package/docs/src/src/structs/JBAccountingContext.sol/struct.JBAccountingContext.md +20 -0
  79. package/docs/src/src/structs/JBAfterCashOutRecordedContext.sol/struct.JBAfterCashOutRecordedContext.md +43 -0
  80. package/docs/src/src/structs/JBAfterPayRecordedContext.sol/struct.JBAfterPayRecordedContext.md +42 -0
  81. package/docs/src/src/structs/JBBeforeCashOutRecordedContext.sol/struct.JBBeforeCashOutRecordedContext.md +45 -0
  82. package/docs/src/src/structs/JBBeforePayRecordedContext.sol/struct.JBBeforePayRecordedContext.md +41 -0
  83. package/docs/src/src/structs/JBCashOutHookSpecification.sol/struct.JBCashOutHookSpecification.md +22 -0
  84. package/docs/src/src/structs/JBCurrencyAmount.sol/struct.JBCurrencyAmount.md +17 -0
  85. package/docs/src/src/structs/JBFee.sol/struct.JBFee.md +20 -0
  86. package/docs/src/src/structs/JBFundAccessLimitGroup.sol/struct.JBFundAccessLimitGroup.md +39 -0
  87. package/docs/src/src/structs/JBPayHookSpecification.sol/struct.JBPayHookSpecification.md +22 -0
  88. package/docs/src/src/structs/JBPermissionsData.sol/struct.JBPermissionsData.md +21 -0
  89. package/docs/src/src/structs/JBRuleset.sol/struct.JBRuleset.md +55 -0
  90. package/docs/src/src/structs/JBRulesetConfig.sol/struct.JBRulesetConfig.md +51 -0
  91. package/docs/src/src/structs/JBRulesetMetadata.sol/struct.JBRulesetMetadata.md +79 -0
  92. package/docs/src/src/structs/JBRulesetWeightCache.sol/struct.JBRulesetWeightCache.md +16 -0
  93. package/docs/src/src/structs/JBRulesetWithMetadata.sol/struct.JBRulesetWithMetadata.md +16 -0
  94. package/docs/src/src/structs/JBSingleAllowance.sol/struct.JBSingleAllowance.md +26 -0
  95. package/docs/src/src/structs/JBSplit.sol/struct.JBSplit.md +49 -0
  96. package/docs/src/src/structs/JBSplitGroup.sol/struct.JBSplitGroup.md +17 -0
  97. package/docs/src/src/structs/JBSplitHookContext.sol/struct.JBSplitHookContext.md +29 -0
  98. package/docs/src/src/structs/JBTerminalConfig.sol/struct.JBTerminalConfig.md +16 -0
  99. package/docs/src/src/structs/JBTokenAmount.sol/struct.JBTokenAmount.md +23 -0
  100. package/docs/src/src/structs/README.md +25 -0
  101. package/foundry.lock +11 -0
  102. package/foundry.toml +41 -0
  103. package/package.json +38 -0
  104. package/remappings.txt +1 -0
  105. package/script/Deploy.s.sol +111 -0
  106. package/script/DeployPeriphery.s.sol +287 -0
  107. package/script/helpers/CoreDeploymentLib.sol +121 -0
  108. package/slither-ci.config.json +10 -0
  109. package/sphinx.lock +507 -0
  110. package/src/JBChainlinkV3PriceFeed.sol +77 -0
  111. package/src/JBChainlinkV3SequencerPriceFeed.sol +75 -0
  112. package/src/JBController.sol +1186 -0
  113. package/src/JBDeadline.sol +73 -0
  114. package/src/JBDirectory.sol +343 -0
  115. package/src/JBERC20.sol +131 -0
  116. package/src/JBFeelessAddresses.sol +54 -0
  117. package/src/JBFundAccessLimits.sol +308 -0
  118. package/src/JBMultiTerminal.sol +2024 -0
  119. package/src/JBPermissions.sol +252 -0
  120. package/src/JBPrices.sol +227 -0
  121. package/src/JBProjects.sol +126 -0
  122. package/src/JBRulesets.sol +1093 -0
  123. package/src/JBSplits.sol +324 -0
  124. package/src/JBTerminalStore.sol +908 -0
  125. package/src/JBTokens.sol +376 -0
  126. package/src/abstract/JBControlled.sol +48 -0
  127. package/src/abstract/JBPermissioned.sol +77 -0
  128. package/src/enums/JBApprovalStatus.sol +12 -0
  129. package/src/interfaces/IJBCashOutHook.sol +15 -0
  130. package/src/interfaces/IJBCashOutTerminal.sol +51 -0
  131. package/src/interfaces/IJBControlled.sol +10 -0
  132. package/src/interfaces/IJBController.sol +280 -0
  133. package/src/interfaces/IJBDirectory.sol +69 -0
  134. package/src/interfaces/IJBDirectoryAccessControl.sol +15 -0
  135. package/src/interfaces/IJBFeeTerminal.sol +61 -0
  136. package/src/interfaces/IJBFeelessAddresses.sol +17 -0
  137. package/src/interfaces/IJBFundAccessLimits.sol +94 -0
  138. package/src/interfaces/IJBMigratable.sol +24 -0
  139. package/src/interfaces/IJBMultiTerminal.sol +36 -0
  140. package/src/interfaces/IJBPayHook.sol +14 -0
  141. package/src/interfaces/IJBPayoutTerminal.sol +92 -0
  142. package/src/interfaces/IJBPermissioned.sol +10 -0
  143. package/src/interfaces/IJBPermissions.sol +71 -0
  144. package/src/interfaces/IJBPermitTerminal.sol +14 -0
  145. package/src/interfaces/IJBPriceFeed.sol +10 -0
  146. package/src/interfaces/IJBPrices.sol +65 -0
  147. package/src/interfaces/IJBProjectUriRegistry.sol +15 -0
  148. package/src/interfaces/IJBProjects.sol +27 -0
  149. package/src/interfaces/IJBRulesetApprovalHook.sol +21 -0
  150. package/src/interfaces/IJBRulesetDataHook.sol +56 -0
  151. package/src/interfaces/IJBRulesets.sol +151 -0
  152. package/src/interfaces/IJBSplitHook.sol +16 -0
  153. package/src/interfaces/IJBSplits.sol +28 -0
  154. package/src/interfaces/IJBTerminal.sol +120 -0
  155. package/src/interfaces/IJBTerminalStore.sol +225 -0
  156. package/src/interfaces/IJBToken.sol +39 -0
  157. package/src/interfaces/IJBTokenUriResolver.sol +10 -0
  158. package/src/interfaces/IJBTokens.sol +113 -0
  159. package/src/libraries/JBCashOuts.sol +120 -0
  160. package/src/libraries/JBConstants.sol +14 -0
  161. package/src/libraries/JBCurrencyIds.sol +7 -0
  162. package/src/libraries/JBFees.sol +28 -0
  163. package/src/libraries/JBFixedPointNumber.sol +12 -0
  164. package/src/libraries/JBMetadataResolver.sol +306 -0
  165. package/src/libraries/JBRulesetMetadataResolver.sol +160 -0
  166. package/src/libraries/JBSplitGroupIds.sol +7 -0
  167. package/src/libraries/JBSurplus.sol +40 -0
  168. package/src/periphery/JBDeadline1Day.sol +8 -0
  169. package/src/periphery/JBDeadline3Days.sol +8 -0
  170. package/src/periphery/JBDeadline3Hours.sol +8 -0
  171. package/src/periphery/JBDeadline7Days.sol +8 -0
  172. package/src/periphery/JBMatchingPriceFeed.sol +13 -0
  173. package/src/structs/JBAccountingContext.sol +12 -0
  174. package/src/structs/JBAfterCashOutRecordedContext.sol +30 -0
  175. package/src/structs/JBAfterPayRecordedContext.sol +29 -0
  176. package/src/structs/JBBeforeCashOutRecordedContext.sol +31 -0
  177. package/src/structs/JBBeforePayRecordedContext.sol +28 -0
  178. package/src/structs/JBCashOutHookSpecification.sol +15 -0
  179. package/src/structs/JBCurrencyAmount.sol +10 -0
  180. package/src/structs/JBFee.sol +12 -0
  181. package/src/structs/JBFundAccessLimitGroup.sol +28 -0
  182. package/src/structs/JBPayHookSpecification.sol +15 -0
  183. package/src/structs/JBPermissionsData.sol +13 -0
  184. package/src/structs/JBRuleset.sol +42 -0
  185. package/src/structs/JBRulesetConfig.sol +43 -0
  186. package/src/structs/JBRulesetMetadata.sol +56 -0
  187. package/src/structs/JBRulesetWeightCache.sol +9 -0
  188. package/src/structs/JBRulesetWithMetadata.sol +12 -0
  189. package/src/structs/JBSingleAllowance.sol +16 -0
  190. package/src/structs/JBSplit.sol +37 -0
  191. package/src/structs/JBSplitGroup.sol +12 -0
  192. package/src/structs/JBSplitHookContext.sol +20 -0
  193. package/src/structs/JBTerminalConfig.sol +12 -0
  194. package/src/structs/JBTokenAmount.sol +14 -0
  195. package/test/AuditExploits.t.sol +2710 -0
  196. package/test/ComprehensiveInvariant.t.sol +298 -0
  197. package/test/EconomicSimulation.t.sol +340 -0
  198. package/test/EntryPointPermutations.t.sol +671 -0
  199. package/test/FlashLoanAttacks.t.sol +792 -0
  200. package/test/PermissionEscalation.t.sol +679 -0
  201. package/test/RulesetTransitions.t.sol +699 -0
  202. package/test/SplitLoopTests.t.sol +731 -0
  203. package/test/TestAccessToFunds.sol +2644 -0
  204. package/test/TestCashOut.sol +185 -0
  205. package/test/TestCashOutCountFor.sol +272 -0
  206. package/test/TestCashOutHooks.sol +317 -0
  207. package/test/TestCashOutTimingEdge.sol +229 -0
  208. package/test/TestDurationUnderflow.sol +220 -0
  209. package/test/TestFeeProcessingFailure.sol +208 -0
  210. package/test/TestFees.sol +604 -0
  211. package/test/TestInterfaceSupport.sol +62 -0
  212. package/test/TestJBERC20Inheritance.sol +91 -0
  213. package/test/TestLaunchProject.sol +176 -0
  214. package/test/TestMetaTx.sol +203 -0
  215. package/test/TestMetadataParserLib.sol +438 -0
  216. package/test/TestMigrationHeldFees.sol +249 -0
  217. package/test/TestMintTokensOf.sol +172 -0
  218. package/test/TestMultiTokenSurplus.sol +206 -0
  219. package/test/TestMultipleAccessLimits.sol +642 -0
  220. package/test/TestPayBurnRedeemFlow.sol +180 -0
  221. package/test/TestPayHooks.sol +190 -0
  222. package/test/TestPermissions.sol +305 -0
  223. package/test/TestPermissionsEdge.sol +286 -0
  224. package/test/TestPermit2Terminal.sol +339 -0
  225. package/test/TestRulesetQueueing.sol +1001 -0
  226. package/test/TestRulesetQueuingStress.sol +778 -0
  227. package/test/TestRulesetWeightCaching.sol +177 -0
  228. package/test/TestSplits.sol +369 -0
  229. package/test/TestTerminalMigration.sol +167 -0
  230. package/test/TestTokenFlow.sol +174 -0
  231. package/test/WeirdTokenTests.t.sol +764 -0
  232. package/test/formal/BondingCurveProperties.t.sol +411 -0
  233. package/test/formal/FeeProperties.t.sol +246 -0
  234. package/test/helpers/JBTest.sol +129 -0
  235. package/test/helpers/MetadataResolverHelper.sol +116 -0
  236. package/test/helpers/TestBaseWorkflow.sol +317 -0
  237. package/test/invariants/Phase3DeepInvariant.t.sol +404 -0
  238. package/test/invariants/RulesetsInvariant.t.sol +115 -0
  239. package/test/invariants/TerminalStoreInvariant.t.sol +220 -0
  240. package/test/invariants/TokensInvariant.t.sol +184 -0
  241. package/test/invariants/handlers/ComprehensiveHandler.sol +285 -0
  242. package/test/invariants/handlers/EconomicHandler.sol +347 -0
  243. package/test/invariants/handlers/Phase3Handler.sol +414 -0
  244. package/test/invariants/handlers/RulesetsHandler.sol +111 -0
  245. package/test/invariants/handlers/TerminalStoreHandler.sol +146 -0
  246. package/test/invariants/handlers/TokensHandler.sol +127 -0
  247. package/test/mock/ERC2771ForwarderMock.sol +37 -0
  248. package/test/mock/MockERC20.sol +18 -0
  249. package/test/mock/MockMaliciousBeneficiary.sol +67 -0
  250. package/test/mock/MockMaliciousSplitHook.sol +42 -0
  251. package/test/mock/MockPriceFeed.sol +20 -0
  252. package/test/trees/JBController/burnTokensOf.tree +9 -0
  253. package/test/trees/JBController/claimTokensFor.tree +5 -0
  254. package/test/trees/JBController/deployERC20For.tree +5 -0
  255. package/test/trees/JBController/getRulesetOf.tree +5 -0
  256. package/test/trees/JBController/launchProjectFor.tree +12 -0
  257. package/test/trees/JBController/launchRulesetsFor.tree +8 -0
  258. package/test/trees/JBController/migrateController.tree +12 -0
  259. package/test/trees/JBController/mintTokensOf.tree +12 -0
  260. package/test/trees/JBController/payReservedTokenToTerminal.tree +8 -0
  261. package/test/trees/JBController/receiveMigrationFrom.tree +4 -0
  262. package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +12 -0
  263. package/test/trees/JBController/setMetadataOf.tree +5 -0
  264. package/test/trees/JBController/setSplitGroupsOf.tree +5 -0
  265. package/test/trees/JBController/setTokenFor.tree +5 -0
  266. package/test/trees/JBController/transferCreditsFrom.tree +8 -0
  267. package/test/trees/JBDirectory/primaryTerminalOf.tree +8 -0
  268. package/test/trees/JBDirectory/setControllerOf.tree +11 -0
  269. package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +15 -0
  270. package/test/trees/JBDirectory/setTerminalsOf.tree +11 -0
  271. package/test/trees/JBERC20/initialize.tree +7 -0
  272. package/test/trees/JBERC20/name.tree +5 -0
  273. package/test/trees/JBERC20/nonces.tree +5 -0
  274. package/test/trees/JBERC20/symbol.tree +5 -0
  275. package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +5 -0
  276. package/test/trees/JBFeelessAddresses/supportsInterface.tree +5 -0
  277. package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +5 -0
  278. package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +8 -0
  279. package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +18 -0
  280. package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +5 -0
  281. package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +8 -0
  282. package/test/trees/JBMetadataResolver/getDataFor.tree +8 -0
  283. package/test/trees/JBMultiTerminal/accountingContextsOf.tree +5 -0
  284. package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +10 -0
  285. package/test/trees/JBMultiTerminal/addToBalanceOf.tree +23 -0
  286. package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +23 -0
  287. package/test/trees/JBMultiTerminal/executePayout.tree +32 -0
  288. package/test/trees/JBMultiTerminal/executeProcessFee.tree +14 -0
  289. package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +12 -0
  290. package/test/trees/JBMultiTerminal/pay.tree +23 -0
  291. package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +8 -0
  292. package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +34 -0
  293. package/test/trees/JBMultiTerminal/useAllowanceOf.tree +16 -0
  294. package/test/trees/JBPermissions/hasPermission.tree +8 -0
  295. package/test/trees/JBPermissions/hasPermissions.tree +8 -0
  296. package/test/trees/JBPermissions/setPermissionsFor.tree +5 -0
  297. package/test/trees/JBPrices/addPriceFeedFor.tree +14 -0
  298. package/test/trees/JBPrices/pricePerUnitOf.tree +11 -0
  299. package/test/trees/JBProjects/createFor.tree +11 -0
  300. package/test/trees/JBProjects/setTokenUriResolver.tree +5 -0
  301. package/test/trees/JBProjects/supportsInterface.tree +9 -0
  302. package/test/trees/JBProjects/tokenURI.tree +5 -0
  303. package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +8 -0
  304. package/test/trees/JBRulesets/currentOf.tree +12 -0
  305. package/test/trees/JBRulesets/getRulesetOf.tree +5 -0
  306. package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +10 -0
  307. package/test/trees/JBRulesets/rulesetsOf.tree +11 -0
  308. package/test/trees/JBRulesets/upcomingRulesetOf.tree +20 -0
  309. package/test/trees/JBRulesets/updateRulesetWeightCache.tree +5 -0
  310. package/test/trees/JBSplits/setSplitGroupsOf.tree +17 -0
  311. package/test/trees/JBSplits/splitsOf.tree +5 -0
  312. package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +16 -0
  313. package/test/trees/JBTerminalStore/currentSurplusOf.tree +25 -0
  314. package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +5 -0
  315. package/test/trees/JBTerminalStore/recordCashOutsFor.tree +16 -0
  316. package/test/trees/JBTerminalStore/recordPaymentFrom.tree +14 -0
  317. package/test/trees/JBTerminalStore/recordPayoutFor.tree +10 -0
  318. package/test/trees/JBTerminalStore/recordTerminalMigration.tree +5 -0
  319. package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +10 -0
  320. package/test/trees/JBTokens/burnFrom.tree +10 -0
  321. package/test/trees/JBTokens/claimTokensFor.tree +10 -0
  322. package/test/trees/JBTokens/deployERC20For.tree +12 -0
  323. package/test/trees/JBTokens/mintFor.tree +10 -0
  324. package/test/trees/JBTokens/setTokenFor.tree +11 -0
  325. package/test/trees/JBTokens/totalBalanceOf.tree +5 -0
  326. package/test/trees/JBTokens/totalSupplyOf.tree +5 -0
  327. package/test/trees/JBTokens/transferCreditsFrom.tree +8 -0
  328. package/test/trees/mintTokensOf.tree +12 -0
  329. package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +220 -0
  330. package/test/units/static/JBController/JBControllerSetup.sol +40 -0
  331. package/test/units/static/JBController/TestBurnTokensOf.sol +107 -0
  332. package/test/units/static/JBController/TestClaimTokensFor.sol +60 -0
  333. package/test/units/static/JBController/TestDeployErc20For.sol +80 -0
  334. package/test/units/static/JBController/TestLaunchProjectFor.sol +282 -0
  335. package/test/units/static/JBController/TestLaunchRulesetsFor.sol +322 -0
  336. package/test/units/static/JBController/TestMigrateController.sol +148 -0
  337. package/test/units/static/JBController/TestMintTokensOfUnits.sol +102 -0
  338. package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +71 -0
  339. package/test/units/static/JBController/TestReceiveMigrationFrom.sol +95 -0
  340. package/test/units/static/JBController/TestRulesetViews.sol +219 -0
  341. package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +595 -0
  342. package/test/units/static/JBController/TestSetSplitGroupsOf.sol +63 -0
  343. package/test/units/static/JBController/TestSetTokenFor.sol +227 -0
  344. package/test/units/static/JBController/TestSetUriOf.sol +53 -0
  345. package/test/units/static/JBController/TestTransferCreditsFrom.sol +159 -0
  346. package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +194 -0
  347. package/test/units/static/JBDirectory/JBDirectorySetup.sol +22 -0
  348. package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +122 -0
  349. package/test/units/static/JBDirectory/TestSetControllerOf.sol +173 -0
  350. package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +98 -0
  351. package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +169 -0
  352. package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +128 -0
  353. package/test/units/static/JBERC20/JBERC20Setup.sol +20 -0
  354. package/test/units/static/JBERC20/SigUtils.sol +34 -0
  355. package/test/units/static/JBERC20/TestInitialize.sol +54 -0
  356. package/test/units/static/JBERC20/TestName.sol +30 -0
  357. package/test/units/static/JBERC20/TestNonces.sol +59 -0
  358. package/test/units/static/JBERC20/TestSymbol.sol +31 -0
  359. package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +20 -0
  360. package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +29 -0
  361. package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +35 -0
  362. package/test/units/static/JBFees/TestFeesFuzz.sol +78 -0
  363. package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +16 -0
  364. package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +71 -0
  365. package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +21 -0
  366. package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +159 -0
  367. package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +56 -0
  368. package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +94 -0
  369. package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +182 -0
  370. package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +61 -0
  371. package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +96 -0
  372. package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +89 -0
  373. package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +227 -0
  374. package/test/units/static/JBMetadataResolver/TestMetadataResolverM20M21.sol +245 -0
  375. package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +39 -0
  376. package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +65 -0
  377. package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +313 -0
  378. package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +432 -0
  379. package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +478 -0
  380. package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +577 -0
  381. package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +176 -0
  382. package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +190 -0
  383. package/test/units/static/JBMultiTerminal/TestPay.sol +514 -0
  384. package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +29 -0
  385. package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +243 -0
  386. package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +310 -0
  387. package/test/units/static/JBPermissions/JBPermissionsSetup.sol +18 -0
  388. package/test/units/static/JBPermissions/TestHasPermission.sol +50 -0
  389. package/test/units/static/JBPermissions/TestHasPermissions.sol +93 -0
  390. package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +62 -0
  391. package/test/units/static/JBPrices/JBPricesSetup.sol +26 -0
  392. package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +102 -0
  393. package/test/units/static/JBPrices/TestPricePerUnitOf.sol +129 -0
  394. package/test/units/static/JBPrices/TestPrices.sol +262 -0
  395. package/test/units/static/JBProjects/JBProjectsSetup.sol +20 -0
  396. package/test/units/static/JBProjects/TestCreateFor.sol +69 -0
  397. package/test/units/static/JBProjects/TestInitialProject.sol +19 -0
  398. package/test/units/static/JBProjects/TestInterfaces.sol +27 -0
  399. package/test/units/static/JBProjects/TestSetResolver.sol +36 -0
  400. package/test/units/static/JBProjects/TestTokenUri.sol +38 -0
  401. package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +99 -0
  402. package/test/units/static/JBRulesets/JBRulesetsSetup.sol +21 -0
  403. package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +257 -0
  404. package/test/units/static/JBRulesets/TestCurrentOf.sol +231 -0
  405. package/test/units/static/JBRulesets/TestGetRulesetOf.sol +94 -0
  406. package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +252 -0
  407. package/test/units/static/JBRulesets/TestRulesets.sol +617 -0
  408. package/test/units/static/JBRulesets/TestRulesetsOf.sol +37 -0
  409. package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +526 -0
  410. package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +91 -0
  411. package/test/units/static/JBSplits/JBSplitsSetup.sol +23 -0
  412. package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +502 -0
  413. package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +370 -0
  414. package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +262 -0
  415. package/test/units/static/JBSplits/TestSplitsOf.sol +24 -0
  416. package/test/units/static/JBSplits/TestSplitsPacking.sol +33 -0
  417. package/test/units/static/JBSurplus/TestSurplusFuzz.sol +125 -0
  418. package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +23 -0
  419. package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +434 -0
  420. package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +428 -0
  421. package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +65 -0
  422. package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +479 -0
  423. package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +508 -0
  424. package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +257 -0
  425. package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +131 -0
  426. package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +390 -0
  427. package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +187 -0
  428. package/test/units/static/JBTokens/JBTokensSetup.sol +23 -0
  429. package/test/units/static/JBTokens/TestBurnFrom.sol +104 -0
  430. package/test/units/static/JBTokens/TestClaimTokensFor.sol +107 -0
  431. package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +89 -0
  432. package/test/units/static/JBTokens/TestMintFor.sol +97 -0
  433. package/test/units/static/JBTokens/TestSetTokenFor.sol +95 -0
  434. package/test/units/static/JBTokens/TestTotalBalanceOf.sol +65 -0
  435. package/test/units/static/JBTokens/TestTotalSupplyOf.sol +56 -0
  436. package/test/units/static/JBTokens/TestTransferCreditsFrom.sol +54 -0
@@ -0,0 +1,617 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBRulesetWeightCache} from "src/structs/JBRulesetWeightCache.sol";
6
+
7
+ contract TestJBRulesetsUnits_Local is JBTest {
8
+ // Contracts
9
+ JBRulesets public _rulesets;
10
+ IJBDirectory internal _directory;
11
+ IJBPermissions internal _permissions;
12
+
13
+ // Necessary params
14
+ JBRulesetMetadata private _metadata;
15
+ JBRulesetMetadata private _metadataWithApprovalHook;
16
+ IJBRulesetApprovalHook private _mockApprovalHook = IJBRulesetApprovalHook(makeAddr("hook"));
17
+ uint256 _packedMetadata;
18
+ uint256 _packedWithApprovalHook;
19
+ uint64 _projectId = 1;
20
+ uint32 _duration = 3 days;
21
+ uint112 _weight = 0;
22
+ uint32 _weightCutPercent = 450_000_000;
23
+ uint256 _mustStartAt = 0;
24
+ uint256 _hookDuration = 1 days;
25
+ IJBRulesetApprovalHook private _hook = IJBRulesetApprovalHook(address(0));
26
+
27
+ function equals(JBRuleset memory queued, JBRuleset memory stored) internal pure returns (bool) {
28
+ // Just compare the output of hashing all fields packed.
29
+ return (keccak256(
30
+ abi.encodePacked(
31
+ queued.cycleNumber,
32
+ queued.id,
33
+ queued.basedOnId,
34
+ queued.start,
35
+ queued.duration,
36
+ queued.weight,
37
+ queued.weightCutPercent,
38
+ queued.approvalHook,
39
+ queued.metadata
40
+ )
41
+ )
42
+ == keccak256(
43
+ abi.encodePacked(
44
+ stored.cycleNumber,
45
+ stored.id,
46
+ stored.basedOnId,
47
+ stored.start,
48
+ stored.duration,
49
+ stored.weight,
50
+ stored.weightCutPercent,
51
+ stored.approvalHook,
52
+ stored.metadata
53
+ )
54
+ ));
55
+ }
56
+
57
+ function setUp() public {
58
+ // Mock contracts and label them
59
+ _directory = IJBDirectory(makeAddr("JBDirectory"));
60
+ _permissions = IJBPermissions(makeAddr("JBPermissions"));
61
+
62
+ // Instantiate the contract being tested
63
+ _rulesets = new JBRulesets(_directory);
64
+
65
+ // Params for tests
66
+ _metadata = JBRulesetMetadata({
67
+ reservedPercent: 0,
68
+ cashOutTaxRate: 0,
69
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
70
+ pausePay: false,
71
+ pauseCreditTransfers: false,
72
+ allowOwnerMinting: false,
73
+ allowSetCustomToken: false,
74
+ allowTerminalMigration: false,
75
+ allowSetTerminals: false,
76
+ ownerMustSendPayouts: false,
77
+ allowSetController: false,
78
+ allowAddAccountingContext: true,
79
+ allowAddPriceFeed: false,
80
+ holdFees: false,
81
+ useTotalSurplusForCashOuts: false,
82
+ useDataHookForPay: false,
83
+ useDataHookForCashOut: false,
84
+ dataHook: address(0),
85
+ metadata: 0
86
+ });
87
+
88
+ // Params for tests
89
+ _metadataWithApprovalHook = JBRulesetMetadata({
90
+ reservedPercent: 0,
91
+ cashOutTaxRate: 0,
92
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
93
+ pausePay: false,
94
+ pauseCreditTransfers: false,
95
+ allowOwnerMinting: false,
96
+ allowSetCustomToken: false,
97
+ allowTerminalMigration: false,
98
+ allowSetTerminals: false,
99
+ ownerMustSendPayouts: false,
100
+ allowSetController: false,
101
+ allowAddAccountingContext: true,
102
+ allowAddPriceFeed: false,
103
+ holdFees: false,
104
+ useTotalSurplusForCashOuts: false,
105
+ useDataHookForPay: false,
106
+ useDataHookForCashOut: false,
107
+ dataHook: address(0),
108
+ metadata: 0
109
+ });
110
+
111
+ _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
112
+ _packedWithApprovalHook = JBRulesetMetadataResolver.packRulesetMetadata(_metadataWithApprovalHook);
113
+ }
114
+
115
+ function testQueueForHappyPath() public {
116
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
117
+ // permissions, encode & mock that.
118
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
119
+ bytes memory _willReturn = abi.encode(address(this));
120
+
121
+ mockExpect(address(_directory), _encodedCall, _willReturn);
122
+
123
+ // Setup: expect ruleset event (RulesetQueued) is emitted
124
+ vm.expectEmit();
125
+ emit IJBRulesets.RulesetQueued(
126
+ block.timestamp,
127
+ _projectId,
128
+ _duration,
129
+ _weight,
130
+ _weightCutPercent,
131
+ _hook,
132
+ _packedMetadata,
133
+ block.timestamp,
134
+ address(this)
135
+ );
136
+
137
+ // Send: Call from this contract as it's been mock authorized above.
138
+ _rulesets.queueFor({
139
+ projectId: _projectId,
140
+ duration: _duration,
141
+ weight: _weight,
142
+ weightCutPercent: _weightCutPercent,
143
+ approvalHook: _hook,
144
+ metadata: _packedMetadata,
145
+ mustStartAtOrAfter: _mustStartAt
146
+ });
147
+
148
+ // Get a reference to the now configured ruleset.
149
+ JBRuleset memory configuredRuleset = _rulesets.currentOf(_projectId);
150
+
151
+ // Reference queued attributes for sake of comparison.
152
+ JBRuleset memory queued = JBRuleset({
153
+ cycleNumber: 1,
154
+ id: uint48(block.timestamp),
155
+ basedOnId: 0,
156
+ start: uint48(block.timestamp),
157
+ duration: _duration,
158
+ weight: _weight,
159
+ weightCutPercent: _weightCutPercent,
160
+ approvalHook: _hook,
161
+ metadata: configuredRuleset.metadata
162
+ });
163
+
164
+ // Check: structs are the same.
165
+ bool same = equals(queued, configuredRuleset);
166
+ assertEq(same, true);
167
+ }
168
+
169
+ function testQueueForPastMustStart() public {
170
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
171
+ // permissions, encode & mock that.
172
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
173
+ bytes memory _willReturn = abi.encode(address(this));
174
+
175
+ mockExpect(address(_directory), _encodedCall, _willReturn);
176
+
177
+ // Setup: expect ruleset event (RulesetQueued) is emitted
178
+ vm.expectEmit();
179
+ emit IJBRulesets.RulesetQueued(
180
+ block.timestamp,
181
+ _projectId,
182
+ _duration,
183
+ _weight,
184
+ _weightCutPercent,
185
+ _hook,
186
+ _packedMetadata,
187
+ block.timestamp - 1,
188
+ address(this)
189
+ );
190
+
191
+ // Send: Call from this contract as it's been mock authorized above.
192
+ _rulesets.queueFor({
193
+ projectId: _projectId,
194
+ duration: _duration,
195
+ weight: _weight,
196
+ weightCutPercent: _weightCutPercent,
197
+ approvalHook: _hook,
198
+ metadata: _packedMetadata,
199
+ // Set this in the past
200
+ mustStartAtOrAfter: block.timestamp - 1
201
+ });
202
+
203
+ // Get a reference to the now configured ruleset.
204
+ JBRuleset memory configuredRuleset = _rulesets.currentOf(_projectId);
205
+
206
+ // Reference queued attributes for sake of comparison.
207
+ JBRuleset memory queued = JBRuleset({
208
+ cycleNumber: 1,
209
+ id: uint48(block.timestamp),
210
+ basedOnId: 0,
211
+ start: uint48(block.timestamp - 1),
212
+ duration: _duration,
213
+ weight: _weight,
214
+ weightCutPercent: _weightCutPercent,
215
+ approvalHook: _hook,
216
+ metadata: configuredRuleset.metadata
217
+ });
218
+
219
+ // Check: structs are the same.
220
+ bool same = equals(queued, configuredRuleset);
221
+ assertEq(same, true);
222
+ }
223
+
224
+ function testQueueForInvalidDuration() public {
225
+ uint256 _invalidDuration = uint256(type(uint32).max) + 1;
226
+
227
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
228
+ // permissions, encode & mock that.
229
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
230
+ bytes memory _willReturn = abi.encode(address(this));
231
+
232
+ mockExpect(address(_directory), _encodedCall, _willReturn);
233
+
234
+ vm.expectRevert(
235
+ abi.encodeWithSelector(
236
+ JBRulesets.JBRulesets_InvalidRulesetDuration.selector, _invalidDuration, type(uint32).max
237
+ )
238
+ );
239
+
240
+ // Send: Call from this contract as it's been mock authorized above.
241
+ _rulesets.queueFor({
242
+ projectId: _projectId,
243
+ duration: _invalidDuration,
244
+ weight: _weight,
245
+ weightCutPercent: _weightCutPercent,
246
+ approvalHook: _hook,
247
+ metadata: _packedMetadata,
248
+ mustStartAtOrAfter: _mustStartAt
249
+ });
250
+ }
251
+
252
+ function testQueueForInvalidWeightCutPercent() public {
253
+ uint256 _invalidWeightCutPercent = JBConstants.MAX_WEIGHT_CUT_PERCENT + 1;
254
+
255
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
256
+ // permissions, encode & mock that.
257
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
258
+ bytes memory _willReturn = abi.encode(address(this));
259
+
260
+ mockExpect(address(_directory), _encodedCall, _willReturn);
261
+
262
+ vm.expectRevert(
263
+ abi.encodeWithSelector(JBRulesets.JBRulesets_InvalidWeightCutPercent.selector, _invalidWeightCutPercent)
264
+ );
265
+
266
+ // Send: Call from this contract as it's been mock authorized above.
267
+ _rulesets.queueFor({
268
+ projectId: _projectId,
269
+ duration: _duration,
270
+ weight: _weight,
271
+ weightCutPercent: _invalidWeightCutPercent,
272
+ approvalHook: _hook,
273
+ metadata: _packedMetadata,
274
+ mustStartAtOrAfter: _mustStartAt
275
+ });
276
+ }
277
+
278
+ function testQueueForInvalidWeight() public {
279
+ uint256 _invalidWeight = uint256(type(uint112).max) + 1;
280
+
281
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
282
+ // permissions, encode & mock that.
283
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
284
+ bytes memory _willReturn = abi.encode(address(this));
285
+
286
+ mockExpect(address(_directory), _encodedCall, _willReturn);
287
+
288
+ vm.expectRevert(
289
+ abi.encodeWithSelector(JBRulesets.JBRulesets_InvalidWeight.selector, _invalidWeight, type(uint112).max)
290
+ );
291
+
292
+ // Send: Call from this contract as it's been mock authorized above.
293
+ _rulesets.queueFor({
294
+ projectId: _projectId,
295
+ duration: _duration,
296
+ weight: _invalidWeight,
297
+ weightCutPercent: _weightCutPercent,
298
+ approvalHook: _hook,
299
+ metadata: _packedMetadata,
300
+ mustStartAtOrAfter: _mustStartAt
301
+ });
302
+ }
303
+
304
+ function testFuzzQueueForInvalidEndTime(uint256 _bigDuration, uint256 _bigStartAt) public {
305
+ _bigDuration = bound(_bigDuration, 1, type(uint32).max);
306
+ _bigStartAt = bound(_bigStartAt, 1, type(uint48).max);
307
+
308
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
309
+ // permissions, encode & mock that.
310
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
311
+ bytes memory _willReturn = abi.encode(address(this));
312
+
313
+ mockExpect(address(_directory), _encodedCall, _willReturn);
314
+
315
+ // Use unchecked arithmetic to force an overflow.
316
+ uint256 _sum;
317
+ unchecked {
318
+ _sum = _bigDuration + _bigStartAt;
319
+ }
320
+
321
+ // Sum should always be less if overflowed
322
+ if (_bigDuration > _sum) {
323
+ vm.expectRevert(stdError.arithmeticError);
324
+ }
325
+
326
+ if (_bigDuration + _bigStartAt > type(uint48).max) {
327
+ vm.expectRevert(
328
+ abi.encodeWithSelector(
329
+ JBRulesets.JBRulesets_InvalidRulesetEndTime.selector, _bigDuration + _bigStartAt, type(uint48).max
330
+ )
331
+ );
332
+ }
333
+
334
+ // Send: Call from this contract as it's been mock authorized above.
335
+ _rulesets.queueFor({
336
+ projectId: _projectId,
337
+ duration: _bigDuration,
338
+ weight: _weight,
339
+ weightCutPercent: _weightCutPercent,
340
+ approvalHook: _hook,
341
+ metadata: _packedMetadata,
342
+ mustStartAtOrAfter: _bigStartAt
343
+ });
344
+ }
345
+
346
+ function testQueueApprovalHookCodeReqsAndLogic() public {
347
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
348
+ // permissions, encode & mock that.
349
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
350
+ bytes memory _willReturn = abi.encode(address(this));
351
+
352
+ // note: this applies to subsequent calls unless we clear mocks
353
+ mockExpect(address(_directory), _encodedCall, _willReturn);
354
+
355
+ // will revert since code length is zero
356
+ vm.expectRevert(
357
+ abi.encodeWithSelector(JBRulesets.JBRulesets_InvalidRulesetApprovalHook.selector, _mockApprovalHook)
358
+ );
359
+
360
+ // Send: Call from this contract as it's been mock authorized above.
361
+ _rulesets.queueFor({
362
+ projectId: _projectId,
363
+ duration: _duration,
364
+ weight: _weight,
365
+ weightCutPercent: _weightCutPercent,
366
+ approvalHook: _mockApprovalHook,
367
+ metadata: _packedWithApprovalHook,
368
+ mustStartAtOrAfter: _mustStartAt
369
+ });
370
+
371
+ // try another with any length of code deployed and mock interface support to pass other checks
372
+ bytes memory code = address(_rulesets).code;
373
+ vm.etch(address(_mockApprovalHook), code);
374
+
375
+ bytes memory _encodedCall3 =
376
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId));
377
+ bytes memory _willReturn3 = abi.encode(true);
378
+
379
+ mockExpect(address(_mockApprovalHook), _encodedCall3, _willReturn3);
380
+
381
+ // Send: Call from this contract as it's been mock authorized above.
382
+ _rulesets.queueFor({
383
+ projectId: _projectId,
384
+ duration: _duration,
385
+ weight: _weight,
386
+ weightCutPercent: _weightCutPercent,
387
+ approvalHook: _mockApprovalHook,
388
+ metadata: _packedWithApprovalHook,
389
+ mustStartAtOrAfter: _mustStartAt
390
+ });
391
+
392
+ uint256 firstId = block.timestamp;
393
+
394
+ // Mock call to approval hook duration
395
+ bytes memory _encodedDurationCall = abi.encodeCall(IJBRulesetApprovalHook.DURATION, ());
396
+ bytes memory _willReturnDuration = abi.encode(_hookDuration);
397
+
398
+ mockExpect(address(_mockApprovalHook), _encodedDurationCall, _willReturnDuration);
399
+
400
+ // avoid overwrite
401
+ vm.warp(block.timestamp + 1);
402
+
403
+ uint256 latestId = block.timestamp;
404
+
405
+ // Send: Anotha One! Call from this contract as it's been mock authorized above.
406
+ _rulesets.queueFor({
407
+ projectId: _projectId,
408
+ duration: _duration,
409
+ weight: _weight,
410
+ weightCutPercent: _weightCutPercent,
411
+ approvalHook: _mockApprovalHook,
412
+ metadata: _packedWithApprovalHook,
413
+ mustStartAtOrAfter: block.timestamp
414
+ });
415
+
416
+ // avoid overwrite
417
+ vm.warp(block.timestamp + 2 days);
418
+ uint256 previouslyApprovedDurationEnds = block.timestamp + 3 days - 2 days - 1;
419
+
420
+ // Get the ruleset.
421
+ JBRuleset memory latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
422
+
423
+ // Mock call to approvalStatusOf and return an approved status
424
+ bytes memory _encodedApprovalCall =
425
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
426
+ bytes memory _willReturnStatus = abi.encode(JBApprovalStatus.Approved);
427
+
428
+ mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
429
+
430
+ // Send: Anotha One! Call from this contract as it's been mock authorized above.
431
+ _rulesets.queueFor({
432
+ projectId: _projectId,
433
+ duration: _duration,
434
+ weight: _weight,
435
+ weightCutPercent: _weightCutPercent,
436
+ approvalHook: _mockApprovalHook,
437
+ metadata: _packedWithApprovalHook,
438
+ mustStartAtOrAfter: block.timestamp
439
+ });
440
+
441
+ latestId = block.timestamp;
442
+ latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
443
+
444
+ // avoid overwrite
445
+ vm.warp(block.timestamp + 1);
446
+
447
+ previouslyApprovedDurationEnds = block.timestamp + 6 days - 2 days - 2;
448
+
449
+ // Mock call to approvalStatusOf and return an approvalExpected status
450
+ _encodedApprovalCall = abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
451
+ _willReturnStatus = abi.encode(JBApprovalStatus.ApprovalExpected);
452
+
453
+ mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
454
+
455
+ // Send: Anotha One! Call from this contract as it's been mock authorized above.
456
+ _rulesets.queueFor({
457
+ projectId: _projectId,
458
+ duration: _duration,
459
+ weight: _weight,
460
+ weightCutPercent: _weightCutPercent,
461
+ approvalHook: _mockApprovalHook,
462
+ metadata: _packedWithApprovalHook,
463
+ mustStartAtOrAfter: block.timestamp
464
+ });
465
+
466
+ latestId = block.timestamp;
467
+ latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
468
+
469
+ // avoid overwrite
470
+ vm.warp(block.timestamp + 1);
471
+ previouslyApprovedDurationEnds = block.timestamp + 6 days - 2 days - 3;
472
+
473
+ // Mock call to approvalStatusOf and return a failed status
474
+ _encodedApprovalCall = abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
475
+ _willReturnStatus = abi.encode(JBApprovalStatus.Failed);
476
+
477
+ mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
478
+
479
+ // Send: Anotha One! Call from this contract as it's been mock authorized above.
480
+ _rulesets.queueFor({
481
+ projectId: _projectId,
482
+ duration: _duration,
483
+ weight: _weight,
484
+ weightCutPercent: _weightCutPercent,
485
+ approvalHook: _mockApprovalHook,
486
+ metadata: _packedWithApprovalHook,
487
+ mustStartAtOrAfter: block.timestamp
488
+ });
489
+
490
+ latestId = block.timestamp;
491
+ latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
492
+
493
+ // avoid overwrite
494
+ vm.warp(block.timestamp + 1);
495
+
496
+ previouslyApprovedDurationEnds = block.timestamp + 6 days - 2 days - 4;
497
+
498
+ // Mock call to approvalStatusOf and return an empty status
499
+ _encodedApprovalCall = abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
500
+ _willReturnStatus = abi.encode(JBApprovalStatus.Empty);
501
+
502
+ mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
503
+
504
+ // Send: Anotha One! Call from this contract as it's been mock authorized above.
505
+ _rulesets.queueFor({
506
+ projectId: _projectId,
507
+ duration: _duration,
508
+ weight: _weight,
509
+ weightCutPercent: _weightCutPercent,
510
+ approvalHook: _mockApprovalHook,
511
+ metadata: _packedWithApprovalHook,
512
+ mustStartAtOrAfter: block.timestamp
513
+ });
514
+
515
+ JBRuleset[] memory queuedRulesetsOf = _rulesets.allOf(_projectId, block.timestamp, 3);
516
+
517
+ // check: 2 rulesets will be enqueued, we just overwrote the last queued
518
+ assertEq(queuedRulesetsOf.length, 3);
519
+ assertEq(queuedRulesetsOf[0].id, block.timestamp);
520
+
521
+ // check first timestamp
522
+ assertEq(queuedRulesetsOf[2].id, firstId);
523
+ }
524
+
525
+ function test_WhenCacheIsUpdatedTooSoon() external {
526
+ // the weight cut multiple will be re-used if it's the same.
527
+
528
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
529
+ // permissions, encode & mock that.
530
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
531
+ bytes memory _willReturn = abi.encode(address(this));
532
+
533
+ mockExpect(address(_directory), _encodedCall, _willReturn);
534
+
535
+ _rulesets.queueFor({
536
+ projectId: _projectId,
537
+ duration: 1 days, // 3 days
538
+ weight: 1e18,
539
+ weightCutPercent: JBConstants.MAX_WEIGHT_CUT_PERCENT / 10,
540
+ approvalHook: _hook,
541
+ metadata: _packedMetadata,
542
+ mustStartAtOrAfter: 0
543
+ });
544
+
545
+ vm.warp(block.timestamp + (20_000 days));
546
+
547
+ // Update the weight cache incrementally — each call advances by at most 20,000 cycles.
548
+ // With 20,000 cycles and 10% weight cut per cycle, weight reaches 0 well before 20,000 cycles.
549
+ // First call: advances cache by up to 20,000 cycles (weight decays to 0).
550
+ _rulesets.updateRulesetWeightCache(_projectId);
551
+
552
+ // Second call during the same block should mirror the previous (cache already covers current time).
553
+ _rulesets.updateRulesetWeightCache(_projectId);
554
+ }
555
+
556
+ function test_QueueForApprovalHookDNSupportInterface() external {
557
+ //
558
+
559
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
560
+ // permissions, mock that call.
561
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
562
+ bytes memory _willReturn = abi.encode(address(this));
563
+
564
+ mockExpect(address(_directory), _encodedCall, _willReturn);
565
+
566
+ mockExpect(
567
+ address(123),
568
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
569
+ abi.encode(false)
570
+ );
571
+
572
+ // Since hook address is not 0 interface support will be checked.
573
+ vm.expectRevert(
574
+ abi.encodeWithSelector(
575
+ JBRulesets.JBRulesets_InvalidRulesetApprovalHook.selector, (IJBRulesetApprovalHook(address(123)))
576
+ )
577
+ );
578
+ _rulesets.queueFor({
579
+ projectId: _projectId,
580
+ duration: 1 days, // 3 days
581
+ weight: 1e18,
582
+ weightCutPercent: JBConstants.MAX_WEIGHT_CUT_PERCENT / 10,
583
+ approvalHook: IJBRulesetApprovalHook(address(123)),
584
+ metadata: _packedMetadata,
585
+ mustStartAtOrAfter: 0
586
+ });
587
+ }
588
+
589
+ function test_QueueForApprovalHookDNSupportInterfaceCatch() external {
590
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
591
+ // permissions, mock that call.
592
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
593
+ bytes memory _willReturn = abi.encode(address(this));
594
+
595
+ mockExpect(address(_directory), _encodedCall, _willReturn);
596
+
597
+ vm.mockCallRevert(
598
+ address(123), abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)), "ERROR"
599
+ );
600
+
601
+ // Since hook address is not 0 interface support will be checked.
602
+ vm.expectRevert(
603
+ abi.encodeWithSelector(
604
+ JBRulesets.JBRulesets_InvalidRulesetApprovalHook.selector, (IJBRulesetApprovalHook(address(123)))
605
+ )
606
+ );
607
+ _rulesets.queueFor({
608
+ projectId: _projectId,
609
+ duration: 1 days, // 3 days
610
+ weight: 1e18,
611
+ weightCutPercent: JBConstants.MAX_WEIGHT_CUT_PERCENT / 10,
612
+ approvalHook: IJBRulesetApprovalHook(address(123)),
613
+ metadata: _packedMetadata,
614
+ mustStartAtOrAfter: 0
615
+ });
616
+ }
617
+ }
@@ -0,0 +1,37 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBRulesetsSetup} from "./JBRulesetsSetup.sol";
6
+
7
+ contract TestRulesetsOf_Local is JBRulesetsSetup {
8
+ // Necessary params
9
+ uint256 _projectId = 1;
10
+
11
+ function setUp() public {
12
+ super.rulesetsSetup();
13
+ }
14
+
15
+ function test_WhenStartingIdEqZero() external {
16
+ // it will return latest ruleset
17
+ }
18
+
19
+ function test_WhenStartingIdDneqZero() external {
20
+ // it will return predecessors up to latest ruleset
21
+ }
22
+
23
+ function test_WhenSizeIsZero() external view {
24
+ // it will return an empty array
25
+
26
+ JBRuleset[] memory _rulesets = _rulesets.allOf(_projectId, 0, 0);
27
+ assertEq(_rulesets.length, 0);
28
+ }
29
+
30
+ function test_WhenThereAreNoRulesets() external {
31
+ // it will return an empty array
32
+ }
33
+
34
+ function test_WhenSizeIsGtConfiguredRulesets() external {
35
+ // it will return up to latest ruleset
36
+ }
37
+ }