@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,526 @@
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 TestUpcomingOf_Local is JBRulesetsSetup {
8
+ // Necessary params
9
+ JBRulesetMetadata private _metadata;
10
+ JBRulesetMetadata private _metadataWithApprovalHook;
11
+ IJBRulesetApprovalHook private _mockApprovalHook = IJBRulesetApprovalHook(makeAddr("hook"));
12
+ uint256 _packedMetadata;
13
+ uint256 _packedWithApprovalHook;
14
+ uint256 _projectId = 1;
15
+ uint256 _duration = 3 days;
16
+ uint256 _weight = 0;
17
+ uint256 _weightCutPercent = 450_000_000;
18
+ uint48 _mustStartAt = 0;
19
+ uint256 _hookDuration = 1 days;
20
+ IJBRulesetApprovalHook private _noHook = IJBRulesetApprovalHook(address(0));
21
+
22
+ function setUp() public {
23
+ super.rulesetsSetup();
24
+
25
+ // Params for tests
26
+ _metadata = JBRulesetMetadata({
27
+ reservedPercent: 0,
28
+ cashOutTaxRate: 0,
29
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
30
+ pausePay: false,
31
+ pauseCreditTransfers: false,
32
+ allowOwnerMinting: false,
33
+ allowSetCustomToken: false,
34
+ allowTerminalMigration: false,
35
+ allowSetTerminals: false,
36
+ ownerMustSendPayouts: false,
37
+ allowSetController: false,
38
+ allowAddAccountingContext: true,
39
+ allowAddPriceFeed: false,
40
+ holdFees: false,
41
+ useTotalSurplusForCashOuts: false,
42
+ useDataHookForPay: false,
43
+ useDataHookForCashOut: false,
44
+ dataHook: address(0),
45
+ metadata: 0
46
+ });
47
+
48
+ // Params for tests
49
+ _metadataWithApprovalHook = JBRulesetMetadata({
50
+ reservedPercent: 0,
51
+ cashOutTaxRate: 0,
52
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
53
+ pausePay: false,
54
+ pauseCreditTransfers: false,
55
+ allowOwnerMinting: false,
56
+ allowSetCustomToken: false,
57
+ allowTerminalMigration: false,
58
+ allowSetTerminals: false,
59
+ ownerMustSendPayouts: false,
60
+ allowSetController: false,
61
+ allowAddAccountingContext: true,
62
+ allowAddPriceFeed: false,
63
+ holdFees: false,
64
+ useTotalSurplusForCashOuts: false,
65
+ useDataHookForPay: false,
66
+ useDataHookForCashOut: false,
67
+ dataHook: address(0),
68
+ metadata: 0
69
+ });
70
+
71
+ _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
72
+ _packedWithApprovalHook = JBRulesetMetadataResolver.packRulesetMetadata(_metadataWithApprovalHook);
73
+ }
74
+
75
+ function test_WhenLatestRulesetIdEQZero() external view {
76
+ // it will return an empty ruleset
77
+
78
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
79
+ assertEq(_upcoming.id, 0);
80
+ }
81
+
82
+ modifier whenUpcomingRulesetIdDNEQZero() {
83
+ // put code at hook address
84
+ vm.etch(address(_mockApprovalHook), abi.encode(1));
85
+
86
+ // mock call to hook interface support
87
+ mockExpect(
88
+ address(_mockApprovalHook),
89
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
90
+ abi.encode(true)
91
+ );
92
+
93
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
94
+ // permissions, encode & mock that.
95
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
96
+ bytes memory _willReturn = abi.encode(address(this));
97
+
98
+ mockExpect(address(directory), _encodedCall, _willReturn);
99
+
100
+ // mock call to hook duration
101
+ mockExpect(
102
+ address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
103
+ );
104
+
105
+ // Setup: expect ruleset event (RulesetQueued) is emitted
106
+ vm.expectEmit();
107
+ emit IJBRulesets.RulesetQueued(
108
+ block.timestamp,
109
+ _projectId,
110
+ _duration,
111
+ _weight,
112
+ _weightCutPercent,
113
+ _mockApprovalHook,
114
+ _packedWithApprovalHook,
115
+ block.timestamp,
116
+ address(this)
117
+ );
118
+
119
+ // Send: Call from this contract as it's been mock authorized above.
120
+ _rulesets.queueFor({
121
+ projectId: _projectId,
122
+ duration: _duration,
123
+ weight: _weight,
124
+ weightCutPercent: _weightCutPercent,
125
+ approvalHook: _mockApprovalHook,
126
+ metadata: _packedWithApprovalHook,
127
+ mustStartAtOrAfter: _mustStartAt
128
+ });
129
+
130
+ // Setup: expect ruleset event (RulesetQueued) is emitted
131
+ vm.expectEmit();
132
+ emit IJBRulesets.RulesetQueued(
133
+ block.timestamp + 1,
134
+ _projectId,
135
+ _duration,
136
+ _weight,
137
+ _weightCutPercent,
138
+ _mockApprovalHook,
139
+ _packedWithApprovalHook,
140
+ block.timestamp,
141
+ address(this)
142
+ );
143
+
144
+ // Send: Call from this contract as it's been mock authorized above.
145
+ _rulesets.queueFor({
146
+ projectId: _projectId,
147
+ duration: _duration,
148
+ weight: _weight,
149
+ weightCutPercent: _weightCutPercent,
150
+ approvalHook: _mockApprovalHook,
151
+ metadata: _packedWithApprovalHook,
152
+ mustStartAtOrAfter: _mustStartAt
153
+ });
154
+ _;
155
+ }
156
+
157
+ function test_GivenStatusEQApprovedOrApprovalExpectedOrEmpty() external whenUpcomingRulesetIdDNEQZero {
158
+ // it will return that ruleset
159
+ uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
160
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
161
+
162
+ // mock call to hook approvalStatusOf
163
+ mockExpect(
164
+ address(_mockApprovalHook),
165
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
166
+ abi.encode(JBApprovalStatus.ApprovalExpected)
167
+ );
168
+
169
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
170
+ assertEq(_upcoming.id, block.timestamp + 1); // timestamp + 1 = second queued, since the preceeding ruleset is
171
+ // in
172
+ }
173
+
174
+ function test_GivenStatusDNEQApprovedOrApprovalExpectedOrEmpty() external whenUpcomingRulesetIdDNEQZero {
175
+ // it will return the ruleset upcoming was based on
176
+ uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
177
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
178
+
179
+ // mock call to hook approvalStatusOf
180
+ mockExpect(
181
+ address(_mockApprovalHook),
182
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
183
+ abi.encode(JBApprovalStatus.Active)
184
+ );
185
+
186
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
187
+ assertEq(_upcoming.id, block.timestamp); // first queued, since the preceeding ruleset approval hook is still
188
+ // "Active"
189
+ }
190
+
191
+ function test_GivenTheLatestRulesetStartsInTheFuture() external {
192
+ // it will return the ruleset that latestRuleset is based on, which is zero in this case, which defaults to an
193
+ // approval status of "Empty"
194
+
195
+ // put code at hook address
196
+ vm.etch(address(_mockApprovalHook), abi.encode(1));
197
+
198
+ // mock call to hook interface support
199
+ mockExpect(
200
+ address(_mockApprovalHook),
201
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
202
+ abi.encode(true)
203
+ );
204
+
205
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
206
+ // permissions, encode & mock that.
207
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
208
+ bytes memory _willReturn = abi.encode(address(this));
209
+
210
+ mockExpect(address(directory), _encodedCall, _willReturn);
211
+
212
+ // Setup: expect ruleset event (RulesetQueued) is emitted
213
+ vm.expectEmit();
214
+ emit IJBRulesets.RulesetQueued(
215
+ block.timestamp,
216
+ _projectId,
217
+ _duration,
218
+ _weight,
219
+ _weightCutPercent,
220
+ _mockApprovalHook,
221
+ _packedWithApprovalHook,
222
+ block.timestamp + 10 days, // starts in the future
223
+ address(this)
224
+ );
225
+
226
+ // Send: Call from this contract as it's been mock authorized above.
227
+ _rulesets.queueFor({
228
+ projectId: _projectId,
229
+ duration: _duration,
230
+ weight: _weight,
231
+ weightCutPercent: _weightCutPercent,
232
+ approvalHook: _mockApprovalHook,
233
+ metadata: _packedWithApprovalHook,
234
+ mustStartAtOrAfter: uint48(block.timestamp + 10 days)
235
+ });
236
+
237
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
238
+ assertEq(_upcoming.id, block.timestamp);
239
+ }
240
+
241
+ function test_WhenLatestRulesetHasDurationEqZero() external {
242
+ // it will return an empty ruleset
243
+
244
+ // put code at hook address
245
+ vm.etch(address(_mockApprovalHook), abi.encode(1));
246
+
247
+ // mock call to hook interface support
248
+ mockExpect(
249
+ address(_mockApprovalHook),
250
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
251
+ abi.encode(true)
252
+ );
253
+
254
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
255
+ // permissions, encode & mock that.
256
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
257
+ bytes memory _willReturn = abi.encode(address(this));
258
+
259
+ mockExpect(address(directory), _encodedCall, _willReturn);
260
+
261
+ // Setup: expect ruleset event (RulesetQueued) is emitted
262
+ vm.expectEmit();
263
+ emit IJBRulesets.RulesetQueued(
264
+ block.timestamp,
265
+ _projectId,
266
+ 0, // duration zero
267
+ _weight,
268
+ _weightCutPercent,
269
+ _mockApprovalHook,
270
+ _packedWithApprovalHook,
271
+ block.timestamp,
272
+ address(this)
273
+ );
274
+
275
+ // Send: Call from this contract as it's been mock authorized above.
276
+ _rulesets.queueFor({
277
+ projectId: _projectId,
278
+ duration: 0,
279
+ weight: _weight,
280
+ weightCutPercent: _weightCutPercent,
281
+ approvalHook: _mockApprovalHook,
282
+ metadata: _packedWithApprovalHook,
283
+ mustStartAtOrAfter: _mustStartAt
284
+ });
285
+
286
+ // mock call to hook duration
287
+ mockExpect(
288
+ address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
289
+ );
290
+
291
+ // Setup: expect ruleset event (RulesetQueued) is emitted
292
+ vm.expectEmit();
293
+ emit IJBRulesets.RulesetQueued(
294
+ block.timestamp + 1, // incremented by one since queued in the same block and we cant have duplicate ids
295
+ _projectId,
296
+ 0, // duration zero
297
+ _weight,
298
+ _weightCutPercent,
299
+ _mockApprovalHook,
300
+ _packedWithApprovalHook,
301
+ block.timestamp + 10 days,
302
+ address(this)
303
+ );
304
+
305
+ // Send: Call from this contract as it's been mock authorized above.
306
+ _rulesets.queueFor({
307
+ projectId: _projectId,
308
+ duration: 0,
309
+ weight: _weight,
310
+ weightCutPercent: _weightCutPercent,
311
+ approvalHook: _mockApprovalHook,
312
+ metadata: _packedWithApprovalHook,
313
+ mustStartAtOrAfter: uint48(block.timestamp + 10 days)
314
+ });
315
+
316
+ vm.warp(block.timestamp + 11 days);
317
+
318
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
319
+ assertEq(_upcoming.id, 0);
320
+ }
321
+
322
+ function test_GivenApprovalStatusIsApprovedOrEmpty() external whenUpcomingRulesetIdDNEQZero {
323
+ // it will return a simulatedCycledRulesetBasedOn
324
+ uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
325
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
326
+
327
+ // mock call to hook approvalStatusOf
328
+ mockExpect(
329
+ address(_mockApprovalHook),
330
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
331
+ abi.encode(JBApprovalStatus.Approved)
332
+ );
333
+
334
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
335
+ assertEq(_upcoming.id, block.timestamp + 1); // timestamp + 1 = second queued
336
+ }
337
+
338
+ function test_GivenTheRulesetsApprovalFailedAndItsBasedOnDurationDNEQZero() external whenUpcomingRulesetIdDNEQZero {
339
+ // it will return the simulatedCycledRulesetBasedOn it was based on
340
+ uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
341
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
342
+
343
+ // mock call to hook approvalStatusOf
344
+ mockExpect(
345
+ address(_mockApprovalHook),
346
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
347
+ abi.encode(JBApprovalStatus.Failed)
348
+ );
349
+
350
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
351
+ assertEq(_upcoming.id, block.timestamp); // first timestamp = first queued
352
+ }
353
+
354
+ // duplicate covered above in a single case
355
+ function test_GivenTheRulesetsApprovalFailedAndItsBasedOnDurationEQZero() external {
356
+ // it will return an empty ruleset
357
+
358
+ // put code at hook address
359
+ vm.etch(address(_mockApprovalHook), abi.encode(1));
360
+
361
+ // mock call to hook interface support
362
+ mockExpect(
363
+ address(_mockApprovalHook),
364
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
365
+ abi.encode(true)
366
+ );
367
+
368
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
369
+ // permissions, encode & mock that.
370
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
371
+ bytes memory _willReturn = abi.encode(address(this));
372
+
373
+ mockExpect(address(directory), _encodedCall, _willReturn);
374
+
375
+ // Setup: expect ruleset event (RulesetQueued) is emitted
376
+ vm.expectEmit();
377
+ emit IJBRulesets.RulesetQueued(
378
+ block.timestamp,
379
+ _projectId,
380
+ 0, // duration zero
381
+ _weight,
382
+ _weightCutPercent,
383
+ _mockApprovalHook,
384
+ _packedWithApprovalHook,
385
+ block.timestamp,
386
+ address(this)
387
+ );
388
+
389
+ // Send: Call from this contract as it's been mock authorized above.
390
+ _rulesets.queueFor({
391
+ projectId: _projectId,
392
+ duration: 0,
393
+ weight: _weight,
394
+ weightCutPercent: _weightCutPercent,
395
+ approvalHook: _mockApprovalHook,
396
+ metadata: _packedWithApprovalHook,
397
+ mustStartAtOrAfter: _mustStartAt
398
+ });
399
+
400
+ // mock call to hook duration
401
+ mockExpect(
402
+ address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
403
+ );
404
+
405
+ // Setup: expect ruleset event (RulesetQueued) is emitted
406
+ vm.expectEmit();
407
+ emit IJBRulesets.RulesetQueued(
408
+ block.timestamp + 1, // incremented by one since queued in the same block and we cant have duplicate ids
409
+ _projectId,
410
+ _duration,
411
+ _weight,
412
+ _weightCutPercent,
413
+ _mockApprovalHook,
414
+ _packedWithApprovalHook,
415
+ block.timestamp + 10 days,
416
+ address(this)
417
+ );
418
+
419
+ // Send: Call from this contract as it's been mock authorized above.
420
+ _rulesets.queueFor({
421
+ projectId: _projectId,
422
+ duration: _duration,
423
+ weight: _weight,
424
+ weightCutPercent: _weightCutPercent,
425
+ approvalHook: _mockApprovalHook,
426
+ metadata: _packedWithApprovalHook,
427
+ mustStartAtOrAfter: uint48(block.timestamp + 10 days)
428
+ });
429
+
430
+ // it will return the simulatedCycledRulesetBasedOn it was based on
431
+ uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
432
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
433
+
434
+ // mock call to hook approvalStatusOf
435
+ mockExpect(
436
+ address(_mockApprovalHook),
437
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
438
+ abi.encode(JBApprovalStatus.ApprovalExpected)
439
+ );
440
+
441
+ vm.warp(block.timestamp + 11 days);
442
+
443
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
444
+ assertEq(_upcoming.id, 0);
445
+ }
446
+
447
+ // Not sure how to reach the last line of this function..
448
+ function test_baseRulesetDurationDNEQZero() external {
449
+ // it will simulate a ruleset basedOn
450
+
451
+ uint256 ogTimestamp = block.timestamp;
452
+
453
+ // put code at hook address
454
+ vm.etch(address(_mockApprovalHook), abi.encode(1));
455
+
456
+ // mock call to hook interface support
457
+ mockExpect(
458
+ address(_mockApprovalHook),
459
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
460
+ abi.encode(true)
461
+ );
462
+
463
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
464
+ // permissions, encode & mock that.
465
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
466
+ bytes memory _willReturn = abi.encode(address(this));
467
+
468
+ mockExpect(address(directory), _encodedCall, _willReturn);
469
+
470
+ // Setup: expect ruleset event (RulesetQueued) is emitted
471
+ vm.expectEmit();
472
+ emit IJBRulesets.RulesetQueued(
473
+ block.timestamp,
474
+ _projectId,
475
+ _duration,
476
+ _weight,
477
+ _weightCutPercent,
478
+ _mockApprovalHook,
479
+ _packedWithApprovalHook,
480
+ block.timestamp,
481
+ address(this)
482
+ );
483
+
484
+ // Send: Call from this contract as it's been mock authorized above.
485
+ _rulesets.queueFor({
486
+ projectId: _projectId,
487
+ duration: _duration,
488
+ weight: _weight,
489
+ weightCutPercent: _weightCutPercent,
490
+ approvalHook: _mockApprovalHook,
491
+ metadata: _packedWithApprovalHook,
492
+ mustStartAtOrAfter: _mustStartAt
493
+ });
494
+
495
+ // mock call to hook duration
496
+ mockExpect(
497
+ address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
498
+ );
499
+
500
+ // Send: Call from this contract as it's been mock authorized above.
501
+ _rulesets.queueFor({
502
+ projectId: _projectId,
503
+ duration: _duration,
504
+ weight: _weight,
505
+ weightCutPercent: _weightCutPercent,
506
+ approvalHook: _mockApprovalHook,
507
+ metadata: _packedWithApprovalHook,
508
+ mustStartAtOrAfter: 0
509
+ });
510
+
511
+ vm.warp(block.timestamp + 3 days);
512
+
513
+ uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
514
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
515
+
516
+ // mock call to hook approvalStatusOf
517
+ mockExpect(
518
+ address(_mockApprovalHook),
519
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
520
+ abi.encode(JBApprovalStatus.Failed)
521
+ );
522
+
523
+ JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
524
+ assertEq(_upcoming.id, ogTimestamp); // original id
525
+ }
526
+ }
@@ -0,0 +1,91 @@
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 TestUpdateRulesetWeightCache_Local is JBRulesetsSetup {
8
+ // Necessary params
9
+ JBRulesetMetadata private _metadata;
10
+ uint256 _packedMetadata;
11
+ uint256 _projectId = 1;
12
+ uint256 _duration = 3 days;
13
+ uint256 _weight = 0;
14
+ uint256 _weightCutPercent = 450_000_000;
15
+ uint48 _mustStartAt = 0;
16
+ uint256 _hookDuration = 1 days;
17
+ IJBRulesetApprovalHook private _noHook = IJBRulesetApprovalHook(address(0));
18
+
19
+ function setUp() public {
20
+ super.rulesetsSetup();
21
+
22
+ // Params for tests
23
+ _metadata = JBRulesetMetadata({
24
+ reservedPercent: 0,
25
+ cashOutTaxRate: 0,
26
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
27
+ pausePay: false,
28
+ pauseCreditTransfers: false,
29
+ allowOwnerMinting: false,
30
+ allowSetCustomToken: false,
31
+ allowTerminalMigration: false,
32
+ allowSetTerminals: false,
33
+ ownerMustSendPayouts: false,
34
+ allowSetController: false,
35
+ allowAddAccountingContext: true,
36
+ allowAddPriceFeed: false,
37
+ holdFees: false,
38
+ useTotalSurplusForCashOuts: false,
39
+ useDataHookForPay: false,
40
+ useDataHookForCashOut: false,
41
+ dataHook: address(0),
42
+ metadata: 0
43
+ });
44
+
45
+ _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
46
+ }
47
+
48
+ function test_WhenLatestRulesetOfProjectDurationOrWeightCutPercentEQZero() external {
49
+ // it will return without updating
50
+
51
+ _rulesets.updateRulesetWeightCache(_projectId);
52
+ }
53
+
54
+ function test_WhenLatestRulesetHasProperDurationAndWeightCutPercent() external {
55
+ // it will store a new derivedWeightFrom and weightCutMultiple in storage
56
+
57
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
58
+ // permissions, encode & mock that.
59
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
60
+ bytes memory _willReturn = abi.encode(address(this));
61
+
62
+ mockExpect(address(directory), _encodedCall, _willReturn);
63
+
64
+ // Setup: expect ruleset event (RulesetQueued) is emitted
65
+ vm.expectEmit();
66
+ emit IJBRulesets.RulesetQueued(
67
+ block.timestamp,
68
+ _projectId,
69
+ _duration,
70
+ _weight,
71
+ _weightCutPercent,
72
+ _noHook,
73
+ _packedMetadata,
74
+ block.timestamp,
75
+ address(this)
76
+ );
77
+
78
+ // Send: Call from this contract as it's been mock authorized above.
79
+ _rulesets.queueFor({
80
+ projectId: _projectId,
81
+ duration: _duration,
82
+ weight: _weight,
83
+ weightCutPercent: _weightCutPercent,
84
+ approvalHook: _noHook,
85
+ metadata: _packedMetadata,
86
+ mustStartAtOrAfter: _mustStartAt
87
+ });
88
+
89
+ _rulesets.updateRulesetWeightCache(_projectId);
90
+ }
91
+ }
@@ -0,0 +1,23 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+
6
+ /*
7
+ Contract that deploys a target contract with other mock contracts to satisfy the constructor.
8
+ Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
9
+ */
10
+ contract JBSplitsSetup is JBTest {
11
+ address _owner = makeAddr("owner");
12
+
13
+ // Mocks
14
+ IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
15
+
16
+ // Target Contract
17
+ IJBSplits public _splits;
18
+
19
+ function splitsSetup() public virtual {
20
+ // Instantiate the contract being tested
21
+ _splits = new JBSplits(directory);
22
+ }
23
+ }