@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,231 @@
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 TestCurrentOf_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_WhenLatestrulesetOfProjectEQZero() external view {
76
+ // it will return an empty ruleset
77
+
78
+ JBRuleset memory _ruleset = _rulesets.currentOf(_projectId);
79
+ assertEq(_ruleset.id, 0);
80
+ }
81
+
82
+ modifier whenLatestRulesetIdDNEQZero() {
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
+ // First queue a base funding cycle
101
+
102
+ // Setup: expect ruleset event (RulesetQueued) is emitted
103
+ vm.expectEmit();
104
+ emit IJBRulesets.RulesetQueued(
105
+ block.timestamp,
106
+ _projectId,
107
+ _duration,
108
+ _weight,
109
+ _weightCutPercent,
110
+ _mockApprovalHook,
111
+ _packedWithApprovalHook,
112
+ block.timestamp,
113
+ address(this)
114
+ );
115
+
116
+ // mock call to hook duration
117
+ mockExpect(
118
+ address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
119
+ );
120
+
121
+ // Send: Call from this contract as it's been mock authorized above.
122
+ _rulesets.queueFor({
123
+ projectId: _projectId,
124
+ duration: _duration,
125
+ weight: _weight,
126
+ weightCutPercent: _weightCutPercent,
127
+ approvalHook: _mockApprovalHook,
128
+ metadata: _packedWithApprovalHook,
129
+ mustStartAtOrAfter: _mustStartAt
130
+ });
131
+
132
+ // Setup: expect ruleset event (RulesetQueued) is emitted
133
+ vm.expectEmit();
134
+ emit IJBRulesets.RulesetQueued(
135
+ block.timestamp + 1,
136
+ _projectId,
137
+ _duration,
138
+ _weight,
139
+ _weightCutPercent,
140
+ _noHook,
141
+ _packedMetadata,
142
+ block.timestamp,
143
+ address(this)
144
+ );
145
+
146
+ // Send: Call from this contract as it's been mock authorized above.
147
+ _rulesets.queueFor({
148
+ projectId: _projectId,
149
+ duration: _duration,
150
+ weight: _weight,
151
+ weightCutPercent: _weightCutPercent,
152
+ approvalHook: _noHook,
153
+ metadata: _packedMetadata,
154
+ mustStartAtOrAfter: _mustStartAt
155
+ });
156
+
157
+ /* // mock call to hook approvalStatusOf
158
+ mockExpect(
159
+ address(_mockApprovalHook),
160
+ abi.encodeCall(
161
+ IJBRulesetApprovalHook.approvalStatusOf, (_projectId, block.timestamp + 1, block.timestamp + _duration)
162
+ ),
163
+ abi.encode(JBApprovalStatus.Failed)
164
+ ); */
165
+
166
+ _;
167
+ }
168
+
169
+ function test_GivenTheCurrentlyApprovableRulesetIdOfApprovalStatusEQApprovedOrEmpty()
170
+ external
171
+ whenLatestRulesetIdDNEQZero
172
+ {
173
+ // it will return the latest approved ruleset
174
+
175
+ JBRuleset memory _current = _rulesets.currentOf(_projectId);
176
+ assertEq(_current.id, block.timestamp);
177
+ }
178
+
179
+ function test_GivenTheCurrentlyApprovableRulesetIdOfApprovalStatusDNEQApprovedOrEmpty()
180
+ external
181
+ whenLatestRulesetIdDNEQZero
182
+ {
183
+ // it will return the ruleset the pending approval ruleset is basedOn
184
+
185
+ uint256 _firstRulesetId = block.timestamp;
186
+ uint256 _rulesetWithHookId = block.timestamp + 1;
187
+
188
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _rulesetWithHookId);
189
+
190
+ vm.warp(block.timestamp + 3 days);
191
+
192
+ // mock approvalStatusOf to return Pending
193
+ mockExpect(
194
+ address(_mockApprovalHook),
195
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
196
+ abi.encode(JBApprovalStatus.Active)
197
+ );
198
+
199
+ JBRuleset memory _current = _rulesets.currentOf(_projectId);
200
+ assertEq(_current.id, _firstRulesetId);
201
+ }
202
+
203
+ function test_GivenTheCurrentlyApprovableRulesetIdOfEQZeroAndApprovalStatusOfTheLatestRulesetDNEQApprovedOrEmpty()
204
+ external
205
+ whenLatestRulesetIdDNEQZero
206
+ {
207
+ // it will return the basedOn of the latest ruleset
208
+
209
+ uint256 _firstRulesetId = block.timestamp;
210
+ uint256 _rulesetWithHookId = block.timestamp + 1;
211
+
212
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _rulesetWithHookId);
213
+
214
+ vm.warp(block.timestamp + 4 days);
215
+
216
+ // mock approvalStatusOf to return Pending
217
+ mockExpect(
218
+ address(_mockApprovalHook),
219
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
220
+ abi.encode(JBApprovalStatus.Active)
221
+ );
222
+
223
+ JBRuleset memory _current = _rulesets.currentOf(_projectId);
224
+ assertEq(_current.id, _firstRulesetId);
225
+ }
226
+
227
+ // covered above - tree had typo
228
+ /* function test_WhenBaseOfTheCurrentlyApprovableRulesetIdOfDurationDNEQZero() external {
229
+ // it will return simulateCycledRulesetBasedOn with allowMidRuleset true
230
+ } */
231
+ }
@@ -0,0 +1,94 @@
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 TestGetRulesetOf_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_WhenRulesetIdDneqZeroAndARulesetIsConfigured() external {
49
+ // it will return a JBRuleset derived from _packedIntrinsicPropertiesOf
50
+
51
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
52
+ // permissions, encode & mock that.
53
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
54
+ bytes memory _willReturn = abi.encode(address(this));
55
+
56
+ mockExpect(address(directory), _encodedCall, _willReturn);
57
+
58
+ // Setup: expect ruleset event (RulesetQueued) is emitted
59
+ vm.expectEmit();
60
+ emit IJBRulesets.RulesetQueued(
61
+ block.timestamp,
62
+ _projectId,
63
+ _duration,
64
+ _weight,
65
+ _weightCutPercent,
66
+ _noHook,
67
+ _packedMetadata,
68
+ block.timestamp,
69
+ address(this)
70
+ );
71
+
72
+ // Send: Call from this contract as it's been mock authorized above.
73
+ _rulesets.queueFor({
74
+ projectId: _projectId,
75
+ duration: _duration,
76
+ weight: _weight,
77
+ weightCutPercent: _weightCutPercent,
78
+ approvalHook: _noHook,
79
+ metadata: _packedMetadata,
80
+ mustStartAtOrAfter: _mustStartAt
81
+ });
82
+
83
+ JBRuleset memory _gottenRulesetOf = _rulesets.getRulesetOf(_projectId, block.timestamp);
84
+
85
+ assertEq(_gottenRulesetOf.weight, _weight);
86
+ }
87
+
88
+ function test_WhenRulesetIdEqZero() external view {
89
+ // it will return an empty ruleset
90
+
91
+ JBRuleset memory _gottenRulesetOf = _rulesets.getRulesetOf(_projectId, 0);
92
+ assertEq(_gottenRulesetOf.id, 0);
93
+ }
94
+ }
@@ -0,0 +1,252 @@
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 TestLatestQueuedRulesetOf_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
+ modifier whenTheLatestRulesetIdDneqZero() {
76
+ // put code at hook address
77
+ vm.etch(address(_mockApprovalHook), abi.encode(1));
78
+
79
+ // mock call to hook interface support
80
+ mockExpect(
81
+ address(_mockApprovalHook),
82
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
83
+ abi.encode(true)
84
+ );
85
+
86
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
87
+ // permissions, encode & mock that.
88
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
89
+ bytes memory _willReturn = abi.encode(address(this));
90
+
91
+ mockExpect(address(directory), _encodedCall, _willReturn);
92
+
93
+ // Setup: expect ruleset event (RulesetQueued) is emitted
94
+ vm.expectEmit();
95
+ emit IJBRulesets.RulesetQueued(
96
+ block.timestamp,
97
+ _projectId,
98
+ _duration,
99
+ _weight,
100
+ _weightCutPercent,
101
+ _mockApprovalHook,
102
+ _packedWithApprovalHook,
103
+ block.timestamp,
104
+ address(this)
105
+ );
106
+
107
+ // Send: Call from this contract as it's been mock authorized above.
108
+ _rulesets.queueFor({
109
+ projectId: _projectId,
110
+ duration: _duration,
111
+ weight: _weight,
112
+ weightCutPercent: _weightCutPercent,
113
+ approvalHook: _mockApprovalHook,
114
+ metadata: _packedWithApprovalHook,
115
+ mustStartAtOrAfter: _mustStartAt
116
+ });
117
+
118
+ _;
119
+ }
120
+
121
+ function test_GivenTheRulesetIsBasedOnRulesetZero() external whenTheLatestRulesetIdDneqZero {
122
+ // it will return JBApprovalStatus.Empty
123
+
124
+ (JBRuleset memory _latestRuleset, JBApprovalStatus _latestApprovalStatus) = _rulesets.latestQueuedOf(_projectId);
125
+ assertEq(uint256(_latestApprovalStatus), 0);
126
+ assertEq(_latestRuleset.id, block.timestamp);
127
+ }
128
+
129
+ function test_GivenTheRulesetIsBasedOnNonzeroRulesetAndTheBasedOnApprovalhookDneqZeroAddress()
130
+ external
131
+ whenTheLatestRulesetIdDneqZero
132
+ {
133
+ // it will return the approvalHooks approvalStatusOf
134
+
135
+ // mock call to hook duration
136
+ mockExpect(
137
+ address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
138
+ );
139
+
140
+ // Setup: expect ruleset event (RulesetQueued) is emitted
141
+ vm.expectEmit();
142
+ emit IJBRulesets.RulesetQueued(
143
+ block.timestamp + 1, // queued after the first in the modifier
144
+ _projectId,
145
+ _duration,
146
+ _weight,
147
+ _weightCutPercent,
148
+ _noHook,
149
+ _packedMetadata,
150
+ block.timestamp,
151
+ address(this)
152
+ );
153
+
154
+ // Send: Call from this contract as it's been mock authorized above.
155
+ _rulesets.queueFor({
156
+ projectId: _projectId,
157
+ duration: _duration,
158
+ weight: _weight,
159
+ weightCutPercent: _weightCutPercent,
160
+ approvalHook: _noHook,
161
+ metadata: _packedMetadata,
162
+ mustStartAtOrAfter: _mustStartAt
163
+ });
164
+
165
+ uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
166
+ JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
167
+
168
+ // mock call to hook approvalStatusOf
169
+ mockExpect(
170
+ address(_mockApprovalHook),
171
+ abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
172
+ abi.encode(JBApprovalStatus.ApprovalExpected)
173
+ );
174
+
175
+ (JBRuleset memory _latestRuleset, JBApprovalStatus _latestApprovalStatus) = _rulesets.latestQueuedOf(_projectId);
176
+ assertEq(uint256(_latestApprovalStatus), 3); // 3 = enum ApprovalExpected of the basedOn ruleset
177
+ assertEq(_latestRuleset.id, block.timestamp + 1); // second queued ruleset
178
+ }
179
+
180
+ function test_GivenTheRulesetIsBasedOnNonzeroRulesetAndTheBasedOnApprovalhookEqZeroAddress() external {
181
+ // it will return JBApprovalStatus.Empty
182
+
183
+ // Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
184
+ // permissions, encode & mock that.
185
+ bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
186
+ bytes memory _willReturn = abi.encode(address(this));
187
+
188
+ mockExpect(address(directory), _encodedCall, _willReturn);
189
+
190
+ // Setup: expect ruleset event (RulesetQueued) is emitted
191
+ vm.expectEmit();
192
+ emit IJBRulesets.RulesetQueued(
193
+ block.timestamp, // queued after the first in the modifier
194
+ _projectId,
195
+ _duration,
196
+ _weight,
197
+ _weightCutPercent,
198
+ _noHook,
199
+ _packedMetadata,
200
+ block.timestamp,
201
+ address(this)
202
+ );
203
+
204
+ // Send: Call from this contract as it's been mock authorized above.
205
+ _rulesets.queueFor({
206
+ projectId: _projectId,
207
+ duration: _duration,
208
+ weight: _weight,
209
+ weightCutPercent: _weightCutPercent,
210
+ approvalHook: _noHook,
211
+ metadata: _packedMetadata,
212
+ mustStartAtOrAfter: _mustStartAt
213
+ });
214
+
215
+ // Setup: expect ruleset event (RulesetQueued) is emitted
216
+ vm.expectEmit();
217
+ emit IJBRulesets.RulesetQueued(
218
+ block.timestamp + 1, // queued after the first in the modifier
219
+ _projectId,
220
+ _duration,
221
+ _weight,
222
+ _weightCutPercent,
223
+ _noHook,
224
+ _packedMetadata,
225
+ block.timestamp,
226
+ address(this)
227
+ );
228
+
229
+ // Send: Call from this contract as it's been mock authorized above.
230
+ _rulesets.queueFor({
231
+ projectId: _projectId,
232
+ duration: _duration,
233
+ weight: _weight,
234
+ weightCutPercent: _weightCutPercent,
235
+ approvalHook: _noHook,
236
+ metadata: _packedMetadata,
237
+ mustStartAtOrAfter: _mustStartAt
238
+ });
239
+
240
+ (JBRuleset memory _latestRuleset, JBApprovalStatus _latestApprovalStatus) = _rulesets.latestQueuedOf(_projectId);
241
+ assertEq(uint256(_latestApprovalStatus), 0); // 0 = enum Empty of the basedOn ruleset
242
+ assertEq(_latestRuleset.id, block.timestamp + 1); // second queued ruleset
243
+ }
244
+
245
+ function test_WhenTheLatestRulesetIdEqZero() external view {
246
+ // it will return empty ruleset and JBApprovalStatus.Empty
247
+
248
+ (JBRuleset memory _latestRuleset, JBApprovalStatus _latestApprovalStatus) = _rulesets.latestQueuedOf(_projectId);
249
+ assertEq(uint256(_latestApprovalStatus), 0); // 0 = enum Empty of the basedOn ruleset
250
+ assertEq(_latestRuleset.id, 0); // second queued ruleset
251
+ }
252
+ }