@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,595 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBControllerSetup} from "./JBControllerSetup.sol";
6
+
7
+ contract TestSendReservedTokensToSplitsOf_Local is JBControllerSetup {
8
+ using stdStorage for StdStorage;
9
+ using JBRulesetMetadataResolver for JBRulesetMetadata;
10
+
11
+ uint64 _projectId = 1;
12
+ uint256 _tokenCount = 1e18;
13
+ uint8 _decimals = 18;
14
+ string _memo = "JUICAY";
15
+ address _beneficiary = makeAddr("bene");
16
+ IJBSplitHook _hook = IJBSplitHook(makeAddr("hook"));
17
+ IJBToken _token = IJBToken(makeAddr("token"));
18
+
19
+ function setUp() public {
20
+ super.controllerSetup();
21
+ vm.label(_beneficiary, "client");
22
+ vm.label(address(_controller), "controller");
23
+ }
24
+
25
+ function test_WhenTheProjectHasNoReservedTokens() external {
26
+ // it will revert NO_RESERVED_TOKENS
27
+
28
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
29
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
30
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
31
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
32
+ pausePay: false,
33
+ pauseCreditTransfers: false,
34
+ allowOwnerMinting: false,
35
+ allowSetCustomToken: false,
36
+ allowTerminalMigration: false,
37
+ allowSetTerminals: false,
38
+ ownerMustSendPayouts: false,
39
+ allowSetController: false,
40
+ allowAddAccountingContext: true,
41
+ allowAddPriceFeed: false,
42
+ holdFees: false,
43
+ useTotalSurplusForCashOuts: true,
44
+ useDataHookForPay: false,
45
+ useDataHookForCashOut: false,
46
+ dataHook: address(0),
47
+ metadata: 0
48
+ });
49
+
50
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
51
+
52
+ // splits
53
+ JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](0);
54
+
55
+ // Package up the ruleset configuration.
56
+ JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
57
+ _rulesetConfigurations[0].mustStartAtOrAfter = 0;
58
+ _rulesetConfigurations[0].duration = 0;
59
+ _rulesetConfigurations[0].weight = 1e18;
60
+ _rulesetConfigurations[0].weightCutPercent = 0;
61
+ _rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
62
+ _rulesetConfigurations[0].metadata = _rulesMetadata;
63
+ _rulesetConfigurations[0].splitGroups = _splitsGroup;
64
+ _rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
65
+
66
+ vm.expectRevert(JBController.JBController_NoReservedTokens.selector);
67
+ _controller.sendReservedTokensToSplitsOf(_projectId);
68
+ }
69
+
70
+ modifier whenTheProjectHasReservedTokensGtZero() {
71
+ // Set some pending reserved token balance
72
+ stdstore.target(address(_controller)).sig("pendingReservedTokenBalanceOf(uint256)").with_key(_projectId)
73
+ .depth(0).checked_write(1e18);
74
+
75
+ _;
76
+ }
77
+
78
+ function test_GivenAHookIsConfigured() external whenTheProjectHasReservedTokensGtZero {
79
+ // it will mint to hook and call its processSplitWith function
80
+
81
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
82
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
83
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
84
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
85
+ pausePay: false,
86
+ pauseCreditTransfers: false,
87
+ allowOwnerMinting: false,
88
+ allowSetCustomToken: false,
89
+ allowTerminalMigration: false,
90
+ allowSetTerminals: false,
91
+ ownerMustSendPayouts: false,
92
+ allowSetController: false,
93
+ allowAddAccountingContext: true,
94
+ allowAddPriceFeed: false,
95
+ holdFees: false,
96
+ useTotalSurplusForCashOuts: true,
97
+ useDataHookForPay: false,
98
+ useDataHookForCashOut: false,
99
+ dataHook: address(0),
100
+ metadata: 0
101
+ });
102
+
103
+ uint256 _packed = _rulesMetadata.packRulesetMetadata();
104
+
105
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
106
+
107
+ // splits
108
+ JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
109
+ JBSplit[] memory _splits = new JBSplit[](1);
110
+
111
+ _splits[0] = JBSplit({
112
+ preferAddToBalance: false,
113
+ percent: JBConstants.SPLITS_TOTAL_PERCENT,
114
+ projectId: _projectId,
115
+ beneficiary: payable(address(0)),
116
+ lockedUntil: 0,
117
+ hook: _hook
118
+ });
119
+
120
+ _splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
121
+
122
+ // Package up the ruleset configuration.
123
+ JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
124
+ _rulesetConfigurations[0].mustStartAtOrAfter = 0;
125
+ _rulesetConfigurations[0].duration = 0;
126
+ _rulesetConfigurations[0].weight = 1e18;
127
+ _rulesetConfigurations[0].weightCutPercent = 0;
128
+ _rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
129
+ _rulesetConfigurations[0].metadata = _rulesMetadata;
130
+ _rulesetConfigurations[0].splitGroups = _splitsGroup;
131
+ _rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
132
+
133
+ // JBRulesets calldata
134
+ JBRuleset memory _returnedRuleset = JBRuleset({
135
+ cycleNumber: uint48(block.timestamp),
136
+ id: uint48(block.timestamp),
137
+ basedOnId: 0,
138
+ start: uint48(block.timestamp),
139
+ duration: _rulesetConfigurations[0].duration,
140
+ weight: _rulesetConfigurations[0].weight,
141
+ weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
142
+ approvalHook: _rulesetConfigurations[0].approvalHook,
143
+ metadata: _packed
144
+ });
145
+
146
+ // mock call to JBRulesets currentOf
147
+ bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
148
+ bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
149
+ mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
150
+
151
+ // mock call to JBProjects ownerOf
152
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
153
+ bytes memory _projectsCallReturn = abi.encode(address(this));
154
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
155
+
156
+ //mock call to JBSplits splitsOf
157
+ bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
158
+ bytes memory _splitsCallReturn = abi.encode(_splits);
159
+ mockExpect(address(splits), _splitsCall, _splitsCallReturn);
160
+
161
+ // mock call to JBTokens mintFor
162
+ bytes memory _tokensMintCall =
163
+ abi.encodeCall(IJBTokens.mintFor, (address(_controller), _projectId, _tokenCount));
164
+ mockExpect(address(tokens), _tokensMintCall, abi.encode(_token));
165
+
166
+ // Mock send after minting to controller.
167
+ mockExpect(address(_token), abi.encodeCall(IERC20.transfer, (address(_hook), _tokenCount)), abi.encode(true));
168
+
169
+ // split hook data
170
+ JBSplitHookContext memory _context = JBSplitHookContext({
171
+ token: address(_token),
172
+ amount: _tokenCount,
173
+ decimals: _decimals,
174
+ projectId: _projectId,
175
+ groupId: 1,
176
+ split: _splits[0]
177
+ });
178
+
179
+ // mock call to split hook processSplitWith
180
+ bytes memory _hookCall = abi.encodeCall(IJBSplitHook.processSplitWith, (_context));
181
+ mockExpect(address(_hook), _hookCall, "");
182
+
183
+ vm.expectEmit();
184
+ emit IJBController.SendReservedTokensToSplits(
185
+ block.timestamp, block.timestamp, _projectId, address(this), _tokenCount, 0, address(this)
186
+ );
187
+ _controller.sendReservedTokensToSplitsOf(_projectId);
188
+ }
189
+
190
+ function test_GivenABeneficiaryIsConfiguredAndProjectIsZero() external whenTheProjectHasReservedTokensGtZero {
191
+ // it will mint for the beneficiary
192
+
193
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
194
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
195
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
196
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
197
+ pausePay: false,
198
+ pauseCreditTransfers: false,
199
+ allowOwnerMinting: false,
200
+ allowSetCustomToken: false,
201
+ allowTerminalMigration: false,
202
+ allowSetTerminals: false,
203
+ ownerMustSendPayouts: false,
204
+ allowSetController: false,
205
+ allowAddAccountingContext: true,
206
+ allowAddPriceFeed: false,
207
+ holdFees: false,
208
+ useTotalSurplusForCashOuts: true,
209
+ useDataHookForPay: false,
210
+ useDataHookForCashOut: false,
211
+ dataHook: address(0),
212
+ metadata: 0
213
+ });
214
+
215
+ uint256 _packed = _rulesMetadata.packRulesetMetadata();
216
+
217
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
218
+
219
+ // splits
220
+ JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
221
+ JBSplit[] memory _splits = new JBSplit[](1);
222
+
223
+ _splits[0] = JBSplit({
224
+ preferAddToBalance: false,
225
+ percent: JBConstants.SPLITS_TOTAL_PERCENT,
226
+ projectId: 0,
227
+ beneficiary: payable(_beneficiary),
228
+ lockedUntil: 0,
229
+ hook: IJBSplitHook(address(0))
230
+ });
231
+
232
+ _splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
233
+
234
+ // Package up the ruleset configuration.
235
+ JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
236
+ _rulesetConfigurations[0].mustStartAtOrAfter = 0;
237
+ _rulesetConfigurations[0].duration = 0;
238
+ _rulesetConfigurations[0].weight = 1e18;
239
+ _rulesetConfigurations[0].weightCutPercent = 0;
240
+ _rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
241
+ _rulesetConfigurations[0].metadata = _rulesMetadata;
242
+ _rulesetConfigurations[0].splitGroups = _splitsGroup;
243
+ _rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
244
+
245
+ // JBRulesets calldata
246
+ JBRuleset memory _returnedRuleset = JBRuleset({
247
+ cycleNumber: uint48(block.timestamp),
248
+ id: uint48(block.timestamp),
249
+ basedOnId: 0,
250
+ start: uint48(block.timestamp),
251
+ duration: _rulesetConfigurations[0].duration,
252
+ weight: _rulesetConfigurations[0].weight,
253
+ weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
254
+ approvalHook: _rulesetConfigurations[0].approvalHook,
255
+ metadata: _packed
256
+ });
257
+
258
+ // mock call to JBRulesets currentOf
259
+ bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
260
+ bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
261
+ mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
262
+
263
+ // mock call to JBProjects ownerOf
264
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
265
+ bytes memory _projectsCallReturn = abi.encode(address(this));
266
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
267
+
268
+ //mock call to JBSplits splitsOf
269
+ bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
270
+ bytes memory _splitsCallReturn = abi.encode(_splits);
271
+ mockExpect(address(splits), _splitsCall, _splitsCallReturn);
272
+
273
+ // Mock send after minting to controller.
274
+ mockExpect(address(_token), abi.encodeCall(IERC20.transfer, (_beneficiary, _tokenCount)), abi.encode(true));
275
+
276
+ // mock call to JBTokens mintFor
277
+ bytes memory _tokensMintCall =
278
+ abi.encodeCall(IJBTokens.mintFor, (address(_controller), _projectId, _tokenCount));
279
+ mockExpect(address(tokens), _tokensMintCall, abi.encode(_token));
280
+
281
+ vm.expectEmit();
282
+ emit IJBController.SendReservedTokensToSplit(
283
+ _projectId, block.timestamp, 1, _splits[0], _tokenCount, address(this)
284
+ );
285
+ _controller.sendReservedTokensToSplitsOf(_projectId);
286
+ }
287
+
288
+ function test_GivenADeadAddressBeneficiary() external whenTheProjectHasReservedTokensGtZero {
289
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
290
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
291
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
292
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
293
+ pausePay: false,
294
+ pauseCreditTransfers: false,
295
+ allowOwnerMinting: false,
296
+ allowSetCustomToken: false,
297
+ allowTerminalMigration: false,
298
+ allowSetTerminals: false,
299
+ ownerMustSendPayouts: false,
300
+ allowSetController: false,
301
+ allowAddAccountingContext: true,
302
+ allowAddPriceFeed: false,
303
+ holdFees: false,
304
+ useTotalSurplusForCashOuts: true,
305
+ useDataHookForPay: false,
306
+ useDataHookForCashOut: false,
307
+ dataHook: address(0),
308
+ metadata: 0
309
+ });
310
+
311
+ uint256 _packed = _rulesMetadata.packRulesetMetadata();
312
+
313
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
314
+
315
+ // splits
316
+ JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
317
+ JBSplit[] memory _splits = new JBSplit[](1);
318
+
319
+ _splits[0] = JBSplit({
320
+ preferAddToBalance: false,
321
+ percent: JBConstants.SPLITS_TOTAL_PERCENT,
322
+ projectId: 0,
323
+ beneficiary: payable(address(0xdead)),
324
+ lockedUntil: 0,
325
+ hook: IJBSplitHook(address(0))
326
+ });
327
+
328
+ _splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
329
+
330
+ // Package up the ruleset configuration.
331
+ JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
332
+ _rulesetConfigurations[0].mustStartAtOrAfter = 0;
333
+ _rulesetConfigurations[0].duration = 0;
334
+ _rulesetConfigurations[0].weight = 1e18;
335
+ _rulesetConfigurations[0].weightCutPercent = 0;
336
+ _rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
337
+ _rulesetConfigurations[0].metadata = _rulesMetadata;
338
+ _rulesetConfigurations[0].splitGroups = _splitsGroup;
339
+ _rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
340
+
341
+ // JBRulesets calldata
342
+ JBRuleset memory _returnedRuleset = JBRuleset({
343
+ cycleNumber: uint48(block.timestamp),
344
+ id: uint48(block.timestamp),
345
+ basedOnId: 0,
346
+ start: uint48(block.timestamp),
347
+ duration: _rulesetConfigurations[0].duration,
348
+ weight: _rulesetConfigurations[0].weight,
349
+ weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
350
+ approvalHook: _rulesetConfigurations[0].approvalHook,
351
+ metadata: _packed
352
+ });
353
+
354
+ // mock call to JBRulesets currentOf
355
+ bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
356
+ bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
357
+ mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
358
+
359
+ // mock call to JBProjects ownerOf
360
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
361
+ bytes memory _projectsCallReturn = abi.encode(address(this));
362
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
363
+
364
+ //mock call to JBSplits splitsOf
365
+ bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
366
+ bytes memory _splitsCallReturn = abi.encode(_splits);
367
+ mockExpect(address(splits), _splitsCall, _splitsCallReturn);
368
+
369
+ // mock call to JBTokens mintFor
370
+ bytes memory _tokensMintCall =
371
+ abi.encodeCall(IJBTokens.mintFor, (address(_controller), _projectId, _tokenCount));
372
+ mockExpect(address(tokens), _tokensMintCall, abi.encode(_token));
373
+
374
+ mockExpect(address(tokens), abi.encodeCall(IJBTokens.burnFrom, (address(_controller), 1, _tokenCount)), "");
375
+
376
+ vm.expectEmit();
377
+ emit IJBController.SendReservedTokensToSplit(
378
+ _projectId, block.timestamp, 1, _splits[0], _tokenCount, address(this)
379
+ );
380
+
381
+ _controller.sendReservedTokensToSplitsOf(_projectId);
382
+ }
383
+
384
+ function test_GivenSplitIsPayableToAProjectWhichAcceptsTheToken() external whenTheProjectHasReservedTokensGtZero {
385
+ // it will mint to the project
386
+
387
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
388
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
389
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
390
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
391
+ pausePay: false,
392
+ pauseCreditTransfers: false,
393
+ allowOwnerMinting: false,
394
+ allowSetCustomToken: false,
395
+ allowTerminalMigration: false,
396
+ allowSetTerminals: false,
397
+ ownerMustSendPayouts: false,
398
+ allowSetController: false,
399
+ allowAddAccountingContext: true,
400
+ allowAddPriceFeed: false,
401
+ holdFees: false,
402
+ useTotalSurplusForCashOuts: true,
403
+ useDataHookForPay: false,
404
+ useDataHookForCashOut: false,
405
+ dataHook: address(0),
406
+ metadata: 0
407
+ });
408
+
409
+ uint256 _packed = _rulesMetadata.packRulesetMetadata();
410
+
411
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
412
+
413
+ // splits
414
+ JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
415
+ JBSplit[] memory _splits = new JBSplit[](1);
416
+
417
+ _splits[0] = JBSplit({
418
+ preferAddToBalance: false,
419
+ percent: JBConstants.SPLITS_TOTAL_PERCENT,
420
+ projectId: 1, // non-zero to execute rest of the function
421
+ beneficiary: payable(address(0xdead)),
422
+ lockedUntil: 0,
423
+ hook: IJBSplitHook(address(0))
424
+ });
425
+
426
+ _splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
427
+
428
+ // Package up the ruleset configuration.
429
+ JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
430
+ _rulesetConfigurations[0].mustStartAtOrAfter = 0;
431
+ _rulesetConfigurations[0].duration = 0;
432
+ _rulesetConfigurations[0].weight = 1e18;
433
+ _rulesetConfigurations[0].weightCutPercent = 0;
434
+ _rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
435
+ _rulesetConfigurations[0].metadata = _rulesMetadata;
436
+ _rulesetConfigurations[0].splitGroups = _splitsGroup;
437
+ _rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
438
+
439
+ // JBRulesets calldata
440
+ JBRuleset memory _returnedRuleset = JBRuleset({
441
+ cycleNumber: uint48(block.timestamp),
442
+ id: uint48(block.timestamp),
443
+ basedOnId: 0,
444
+ start: uint48(block.timestamp),
445
+ duration: _rulesetConfigurations[0].duration,
446
+ weight: _rulesetConfigurations[0].weight,
447
+ weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
448
+ approvalHook: _rulesetConfigurations[0].approvalHook,
449
+ metadata: _packed
450
+ });
451
+
452
+ // mock call to JBRulesets currentOf
453
+ bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
454
+ bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
455
+ mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
456
+
457
+ // mock call to JBProjects ownerOf
458
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
459
+ bytes memory _projectsCallReturn = abi.encode(address(this));
460
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
461
+
462
+ //mock call to JBSplits splitsOf
463
+ bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
464
+ bytes memory _splitsCallReturn = abi.encode(_splits);
465
+ mockExpect(address(splits), _splitsCall, _splitsCallReturn);
466
+
467
+ // mock to JBDirectory primaryTerminalOf
468
+ address terminal = makeAddr("terminal");
469
+ mockExpect(
470
+ address(directory),
471
+ abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, address(_token))),
472
+ abi.encode(terminal)
473
+ );
474
+
475
+ // mock to JBTokens mintFor
476
+ mockExpect(
477
+ address(tokens),
478
+ abi.encodeCall(IJBTokens.mintFor, (address(_controller), 1, _tokenCount)),
479
+ abi.encode(address(_token))
480
+ );
481
+
482
+ // mock token approval
483
+ mockExpect(address(_token), abi.encodeCall(IERC20.approve, (terminal, 1e18)), "");
484
+
485
+ vm.expectEmit();
486
+ emit IJBController.SendReservedTokensToSplit(
487
+ _projectId, block.timestamp, 1, _splits[0], _tokenCount, address(this)
488
+ );
489
+ _controller.sendReservedTokensToSplitsOf(_projectId);
490
+ }
491
+
492
+ function test_GivenSplitIsPayableToAProjectWhichAcceptsTheTokenButTokenIsInvalid()
493
+ external
494
+ whenTheProjectHasReservedTokensGtZero
495
+ {
496
+ // it will revert via OZ Address
497
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
498
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
499
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
500
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
501
+ pausePay: false,
502
+ pauseCreditTransfers: false,
503
+ allowOwnerMinting: false,
504
+ allowSetCustomToken: false,
505
+ allowTerminalMigration: false,
506
+ allowSetTerminals: false,
507
+ ownerMustSendPayouts: false,
508
+ allowSetController: false,
509
+ allowAddAccountingContext: true,
510
+ allowAddPriceFeed: false,
511
+ holdFees: false,
512
+ useTotalSurplusForCashOuts: true,
513
+ useDataHookForPay: false,
514
+ useDataHookForCashOut: false,
515
+ dataHook: address(0),
516
+ metadata: 0
517
+ });
518
+
519
+ uint256 _packed = _rulesMetadata.packRulesetMetadata();
520
+
521
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
522
+
523
+ // splits
524
+ JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
525
+ JBSplit[] memory _splits = new JBSplit[](1);
526
+
527
+ _splits[0] = JBSplit({
528
+ preferAddToBalance: false,
529
+ percent: JBConstants.SPLITS_TOTAL_PERCENT,
530
+ projectId: 1, // non-zero to execute rest of the function
531
+ beneficiary: payable(address(0)),
532
+ lockedUntil: 0,
533
+ hook: IJBSplitHook(address(0))
534
+ });
535
+
536
+ _splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
537
+
538
+ // Package up the ruleset configuration.
539
+ JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
540
+ _rulesetConfigurations[0].mustStartAtOrAfter = 0;
541
+ _rulesetConfigurations[0].duration = 0;
542
+ _rulesetConfigurations[0].weight = 1e18;
543
+ _rulesetConfigurations[0].weightCutPercent = 0;
544
+ _rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
545
+ _rulesetConfigurations[0].metadata = _rulesMetadata;
546
+ _rulesetConfigurations[0].splitGroups = _splitsGroup;
547
+ _rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
548
+
549
+ // JBRulesets calldata
550
+ JBRuleset memory _returnedRuleset = JBRuleset({
551
+ cycleNumber: uint48(block.timestamp),
552
+ id: uint48(block.timestamp),
553
+ basedOnId: 0,
554
+ start: uint48(block.timestamp),
555
+ duration: _rulesetConfigurations[0].duration,
556
+ weight: _rulesetConfigurations[0].weight,
557
+ weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
558
+ approvalHook: _rulesetConfigurations[0].approvalHook,
559
+ metadata: _packed
560
+ });
561
+
562
+ // mock call to JBRulesets currentOf
563
+ bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
564
+ bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
565
+ mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
566
+
567
+ // mock call to JBProjects ownerOf
568
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
569
+ bytes memory _projectsCallReturn = abi.encode(address(this));
570
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
571
+
572
+ //mock call to JBSplits splitsOf
573
+ bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
574
+ bytes memory _splitsCallReturn = abi.encode(_splits);
575
+ mockExpect(address(splits), _splitsCall, _splitsCallReturn);
576
+
577
+ // mock to JBDirectory primaryTerminalOf
578
+ address terminal = makeAddr("terminal");
579
+ mockExpect(
580
+ address(directory),
581
+ abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, address(_token))),
582
+ abi.encode(terminal)
583
+ );
584
+
585
+ // mock to JBTokens mintFor
586
+ mockExpect(
587
+ address(tokens),
588
+ abi.encodeCall(IJBTokens.mintFor, (address(_controller), 1, _tokenCount)),
589
+ abi.encode(address(_token))
590
+ );
591
+
592
+ vm.expectRevert(abi.encodeWithSignature(("SafeERC20FailedOperation(address)"), address(_token)));
593
+ _controller.sendReservedTokensToSplitsOf(_projectId);
594
+ }
595
+ }
@@ -0,0 +1,63 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBControllerSetup} from "./JBControllerSetup.sol";
6
+
7
+ contract TestSetSplitGroupsOf_Local is JBControllerSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _rulesetId = block.timestamp;
10
+
11
+ function setUp() public {
12
+ super.controllerSetup();
13
+ }
14
+
15
+ function test_WhenCallerIsPermissioned() external {
16
+ // it will call JBSplits and "set splits"
17
+
18
+ // data for calls
19
+ JBSplitGroup[] memory _splitGroups = new JBSplitGroup[](0);
20
+
21
+ // mock call to JBProjects ownerOf for permission check
22
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
23
+ bytes memory _ownerOfReturn = abi.encode(address(this));
24
+ mockExpect(address(projects), _ownerOfCall, _ownerOfReturn);
25
+
26
+ // mock call to JBSplits setSplitGroupsOf
27
+ bytes memory _setSplitsCall = abi.encodeCall(IJBSplits.setSplitGroupsOf, (_projectId, _rulesetId, _splitGroups));
28
+ mockExpect(address(splits), _setSplitsCall, "");
29
+
30
+ _controller.setSplitGroupsOf(_projectId, _rulesetId, _splitGroups);
31
+ }
32
+
33
+ function test_WhenCallerIsNotPermissioned() external {
34
+ // it will revert UNAUTHORIZED
35
+
36
+ // data for calls
37
+ JBSplitGroup[] memory _splitGroups = new JBSplitGroup[](0);
38
+
39
+ // mock call to JBProjects ownerOf for permission check
40
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
41
+ address _ownerOfReturn = address(0);
42
+ mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerOfReturn));
43
+
44
+ // mock call to JBPermissions
45
+ bytes memory _permCall = abi.encodeCall(
46
+ IJBPermissions.hasPermission,
47
+ (address(this), address(0), _projectId, JBPermissionIds.SET_SPLIT_GROUPS, true, true)
48
+ );
49
+ bytes memory _permReturn = abi.encode(false);
50
+ mockExpect(address(permissions), _permCall, _permReturn);
51
+
52
+ vm.expectRevert(
53
+ abi.encodeWithSelector(
54
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
55
+ _ownerOfReturn,
56
+ address(this),
57
+ _projectId,
58
+ JBPermissionIds.SET_SPLIT_GROUPS
59
+ )
60
+ );
61
+ _controller.setSplitGroupsOf(_projectId, _rulesetId, _splitGroups);
62
+ }
63
+ }