@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,129 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {JBRuleset} from "src/structs/JBRuleset.sol";
5
+ import {JBRulesetMetadata} from "src/structs/JBRulesetMetadata.sol";
6
+ import {JBRulesetMetadataResolver} from "src/libraries/JBRulesetMetadataResolver.sol";
7
+ import {JBConstants} from "src/libraries/JBConstants.sol";
8
+ import {IJBRulesetApprovalHook} from "src/interfaces/IJBRulesetApprovalHook.sol";
9
+ import "lib/forge-std/src/Test.sol";
10
+
11
+ contract JBTest is Test {
12
+ using JBRulesetMetadataResolver for JBRulesetMetadata;
13
+
14
+ function mockExpect(address _where, bytes memory _encodedCall, bytes memory _returns) public {
15
+ vm.mockCall(_where, _encodedCall, _returns);
16
+ vm.expectCall(_where, _encodedCall);
17
+ }
18
+
19
+ // Multiple calls with different return values
20
+ function mockExpectSubsequent(address _where, bytes memory _encodedCall, bytes[] memory _returns) public {
21
+ // Mocks calls with different return values
22
+ vm.mockCalls(_where, _encodedCall, _returns);
23
+
24
+ // Will check that multiple calls are made
25
+ for (uint256 i = 0; i < _returns.length; i++) {
26
+ vm.expectCall(_where, _encodedCall);
27
+ }
28
+ }
29
+
30
+ function generateFriendlyRuleset() public view returns (JBRuleset memory) {
31
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
32
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT,
33
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
34
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
35
+ pausePay: false,
36
+ pauseCreditTransfers: false,
37
+ allowOwnerMinting: true,
38
+ allowSetCustomToken: true,
39
+ allowTerminalMigration: true,
40
+ allowSetTerminals: true,
41
+ ownerMustSendPayouts: false,
42
+ allowSetController: true,
43
+ allowAddAccountingContext: true,
44
+ allowAddPriceFeed: true,
45
+ holdFees: false,
46
+ useTotalSurplusForCashOuts: true,
47
+ useDataHookForPay: false,
48
+ useDataHookForCashOut: false,
49
+ dataHook: address(0),
50
+ metadata: 0
51
+ });
52
+
53
+ uint256 packed = _rulesMetadata.packRulesetMetadata();
54
+
55
+ return JBRuleset({
56
+ cycleNumber: 1,
57
+ id: 1,
58
+ basedOnId: 0,
59
+ start: uint48(block.timestamp),
60
+ duration: 10 days,
61
+ weight: 0,
62
+ weightCutPercent: 0,
63
+ approvalHook: IJBRulesetApprovalHook(address(0)),
64
+ metadata: packed
65
+ });
66
+ }
67
+
68
+ function generateEmptyMetadata() public view returns (JBRulesetMetadata memory) {
69
+ return JBRulesetMetadata({
70
+ reservedPercent: 0,
71
+ cashOutTaxRate: 0,
72
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
73
+ pausePay: false,
74
+ pauseCreditTransfers: false,
75
+ allowOwnerMinting: false,
76
+ allowSetCustomToken: false,
77
+ allowTerminalMigration: false,
78
+ allowSetTerminals: false,
79
+ ownerMustSendPayouts: false,
80
+ allowSetController: false,
81
+ allowAddAccountingContext: true,
82
+ allowAddPriceFeed: false,
83
+ holdFees: false,
84
+ useTotalSurplusForCashOuts: false,
85
+ useDataHookForPay: false,
86
+ useDataHookForCashOut: false,
87
+ dataHook: address(0),
88
+ metadata: 0
89
+ });
90
+ }
91
+
92
+ function generateUnfriendlyRuleset() public view returns (JBRuleset memory) {
93
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
94
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT,
95
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
96
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
97
+ pausePay: true,
98
+ pauseCreditTransfers: true,
99
+ allowOwnerMinting: false,
100
+ allowSetCustomToken: false,
101
+ allowTerminalMigration: false,
102
+ allowSetTerminals: false,
103
+ ownerMustSendPayouts: true,
104
+ allowSetController: false,
105
+ allowAddAccountingContext: false,
106
+ allowAddPriceFeed: false,
107
+ holdFees: true,
108
+ useTotalSurplusForCashOuts: true,
109
+ useDataHookForPay: false,
110
+ useDataHookForCashOut: false,
111
+ dataHook: address(0),
112
+ metadata: 0
113
+ });
114
+
115
+ uint256 packed = _rulesMetadata.packRulesetMetadata();
116
+
117
+ return JBRuleset({
118
+ cycleNumber: 1,
119
+ id: 1,
120
+ basedOnId: 0,
121
+ start: uint48(block.timestamp),
122
+ duration: 10 days,
123
+ weight: 0,
124
+ weightCutPercent: 0,
125
+ approvalHook: IJBRulesetApprovalHook(address(0)),
126
+ metadata: packed
127
+ });
128
+ }
129
+ }
@@ -0,0 +1,116 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {JBMetadataResolver} from "../../src/libraries/JBMetadataResolver.sol";
5
+
6
+ /**
7
+ * @notice Contract to create structured metadata, storing {id: data} entries.
8
+ *
9
+ * @dev Metadata are built as:
10
+ * - 32B of reserved space for the protocol
11
+ * - a lookup table `Id: offset`, defining the offset of the data for a given 4 bytes id.
12
+ * The offset fits 1 bytes, the ID 4 bytes. This table is padded to 32B.
13
+ * - the data for each id, padded to 32B each
14
+ *
15
+ * +-----------------------+ offset: 0
16
+ * | 32B reserved |
17
+ * +-----------------------+ offset: 1 = end of first 32B
18
+ * | (ID1,offset1) |
19
+ * | (ID2,offset2) |
20
+ * | 0's padding |
21
+ * +-----------------------+ offset: offset1 = 1 + number of words taken by the padded table
22
+ * | id1 data1 |
23
+ * | 0's padding |
24
+ * +-----------------------+ offset: offset2 = offset1 + number of words taken by the data1
25
+ * | id2 data2 |
26
+ * | 0's padding |
27
+ * +-----------------------+
28
+ *
29
+ * This contract is intended to expose the library functions as a helper for frontends.
30
+ */
31
+ contract MetadataResolverHelper {
32
+ //*********************************************************************//
33
+ // --------------------------- custom errors ------------------------- //
34
+ //*********************************************************************//
35
+
36
+ /**
37
+ * @notice Parse the metadata to find the data for a specific ID
38
+ *
39
+ * @dev Returns false and an empty bytes if no data is found
40
+ *
41
+ * @param _id The ID to find
42
+ * @param _metadata The metadata to parse
43
+ *
44
+ * @return _found Whether the {id:data} was found
45
+ * @return _targetData The data for the ID (can be empty)
46
+ */
47
+ function getDataFor(
48
+ bytes4 _id,
49
+ bytes calldata _metadata
50
+ )
51
+ public
52
+ pure
53
+ returns (bool _found, bytes memory _targetData)
54
+ {
55
+ return JBMetadataResolver.getDataFor(_id, _metadata);
56
+ }
57
+
58
+ /**
59
+ * @notice Create the metadata for a list of {id:data}
60
+ *
61
+ * @dev Intended for offchain use (gas heavy)
62
+ *
63
+ * @param _ids The list of ids
64
+ * @param _datas The list of corresponding datas
65
+ *
66
+ * @return metadata The resulting metadata
67
+ */
68
+ function createMetadata(
69
+ bytes4[] calldata _ids,
70
+ bytes[] calldata _datas
71
+ )
72
+ public
73
+ pure
74
+ returns (bytes memory metadata)
75
+ {
76
+ return JBMetadataResolver.createMetadata(_ids, _datas);
77
+ }
78
+
79
+ /**
80
+ * @notice Add a data entry to an existing metadata
81
+ *
82
+ * @param originalMetadata The original metadata
83
+ * @param idToAdd The id of the hook to add
84
+ * @param dataToAdd The metadata of the hook to add
85
+ *
86
+ * @return _newMetadata The new metadata with the hook added
87
+ */
88
+ function addDataToMetadata(
89
+ bytes calldata originalMetadata,
90
+ bytes4 idToAdd,
91
+ bytes calldata dataToAdd
92
+ )
93
+ public
94
+ pure
95
+ returns (bytes memory)
96
+ {
97
+ return JBMetadataResolver.addToMetadata(originalMetadata, idToAdd, dataToAdd);
98
+ }
99
+
100
+ /**
101
+ * @notice Returns an unique id following a suggested format
102
+ * (`xor(address(this), functionality name)` where functionality name is a string
103
+ * giving context to the id (Permit2, quoteForSwap, etc)
104
+ *
105
+ * @param functionality A string describing the functionality associated with the id
106
+ *
107
+ * @return id The resulting id
108
+ */
109
+ function getId(string memory functionality) public view returns (bytes4) {
110
+ return JBMetadataResolver.getId(functionality);
111
+ }
112
+
113
+ function getId(string memory functionality, address target) public pure returns (bytes4) {
114
+ return JBMetadataResolver.getId(functionality, target);
115
+ }
116
+ }
@@ -0,0 +1,317 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.6;
3
+
4
+ import "forge-std/Test.sol";
5
+
6
+ import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
7
+ import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
8
+ import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
9
+ import {IERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
10
+ import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
11
+ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
12
+ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
13
+ import {ERC165, IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
14
+ import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
15
+ import {JBControlled} from "../../src/abstract/JBControlled.sol";
16
+ import {JBPermissioned} from "../../src/abstract/JBPermissioned.sol";
17
+ import {JBController} from "../../src/JBController.sol";
18
+ import {JBDirectory} from "../../src/JBDirectory.sol";
19
+ import {JBTerminalStore} from "../../src/JBTerminalStore.sol";
20
+ import {JBFeelessAddresses} from "../../src/JBFeelessAddresses.sol";
21
+ import {JBFundAccessLimits} from "../../src/JBFundAccessLimits.sol";
22
+ import {JBRulesets} from "../../src/JBRulesets.sol";
23
+ import {JBPermissions} from "../../src/JBPermissions.sol";
24
+ import {JBPrices} from "../../src/JBPrices.sol";
25
+ import {JBProjects} from "../../src/JBProjects.sol";
26
+ import {JBSplits} from "../../src/JBSplits.sol";
27
+ import {JBERC20} from "../../src/JBERC20.sol";
28
+ import {JBTokens} from "../../src/JBTokens.sol";
29
+ import {JBDeadline} from "../../src/JBDeadline.sol";
30
+ import {JBApprovalStatus} from "../../src/enums/JBApprovalStatus.sol";
31
+ import {JBMultiTerminal} from "../../src/JBMultiTerminal.sol";
32
+ import {JBAccountingContext} from "../../src/structs/JBAccountingContext.sol";
33
+ import {JBCurrencyAmount} from "../../src/structs/JBCurrencyAmount.sol";
34
+ import {JBAfterPayRecordedContext} from "../../src/structs/JBAfterPayRecordedContext.sol";
35
+ import {JBAfterCashOutRecordedContext} from "../../src/structs/JBAfterCashOutRecordedContext.sol";
36
+ import {JBFee} from "../../src/structs/JBFee.sol";
37
+ import {JBFees} from "../../src/libraries/JBFees.sol";
38
+ import {JBMetadataResolver} from "../../src/libraries/JBMetadataResolver.sol";
39
+ import {JBCashOuts} from "../../src/libraries/JBCashOuts.sol";
40
+ import {JBFundAccessLimitGroup} from "../../src/structs/JBFundAccessLimitGroup.sol";
41
+ import {JBRuleset} from "../../src/structs/JBRuleset.sol";
42
+ import {JBRulesetWithMetadata} from "../../src/structs/JBRulesetWithMetadata.sol";
43
+ import {JBRulesetMetadata} from "../../src/structs/JBRulesetMetadata.sol";
44
+ import {JBRulesetConfig} from "../../src/structs/JBRulesetConfig.sol";
45
+ import {JBSplitGroup} from "../../src/structs/JBSplitGroup.sol";
46
+ import {JBPermissionsData} from "../../src/structs/JBPermissionsData.sol";
47
+ import {JBBeforePayRecordedContext} from "../../src/structs/JBBeforePayRecordedContext.sol";
48
+ import {JBBeforeCashOutRecordedContext} from "../../src/structs/JBBeforeCashOutRecordedContext.sol";
49
+ import {JBSplit} from "../../src/structs/JBSplit.sol";
50
+ import {JBTerminalConfig} from "../../src/structs/JBTerminalConfig.sol";
51
+ import {JBPayHookSpecification} from "../../src/structs/JBPayHookSpecification.sol";
52
+ import {JBCashOutHookSpecification} from "../../src/structs/JBCashOutHookSpecification.sol";
53
+ import {JBTokenAmount} from "../../src/structs/JBTokenAmount.sol";
54
+ import {JBSplitHookContext} from "../../src/structs/JBSplitHookContext.sol";
55
+ import {IJBToken} from "../../src/interfaces/IJBToken.sol";
56
+ import {JBSingleAllowance} from "../../src/structs/JBSingleAllowance.sol";
57
+ import {IJBController} from "../../src/interfaces/IJBController.sol";
58
+ import {IJBFeelessAddresses} from "../../src/interfaces/IJBFeelessAddresses.sol";
59
+ import {IJBFundAccessLimits} from "../../src/interfaces/IJBFundAccessLimits.sol";
60
+ import {IJBMigratable} from "../../src/interfaces/IJBMigratable.sol";
61
+ import {IJBPermissions} from "../../src/interfaces/IJBPermissions.sol";
62
+ import {IJBDirectoryAccessControl} from "../../src/interfaces/IJBDirectoryAccessControl.sol";
63
+ import {IJBTerminalStore} from "../../src/interfaces/IJBTerminalStore.sol";
64
+ import {IJBProjects} from "../../src/interfaces/IJBProjects.sol";
65
+ import {IJBRulesetApprovalHook} from "../../src/interfaces/IJBRulesetApprovalHook.sol";
66
+ import {IJBDirectory} from "../../src/interfaces/IJBDirectory.sol";
67
+ import {IJBRulesets} from "../../src/interfaces/IJBRulesets.sol";
68
+ import {IJBSplits} from "../../src/interfaces/IJBSplits.sol";
69
+ import {IJBTokenUriResolver} from "../../src/interfaces/IJBTokenUriResolver.sol";
70
+ import {IJBTokens} from "../../src/interfaces/IJBTokens.sol";
71
+ import {IJBSplitHook} from "../../src/interfaces/IJBSplitHook.sol";
72
+ import {IJBPayHook} from "../../src/interfaces/IJBPayHook.sol";
73
+ import {IJBRulesetDataHook} from "../../src/interfaces/IJBRulesetDataHook.sol";
74
+ import {IJBCashOutHook} from "../../src/interfaces/IJBCashOutHook.sol";
75
+ import {IJBRulesetDataHook} from "../../src/interfaces/IJBRulesetDataHook.sol";
76
+ import {IJBMultiTerminal} from "../../src/interfaces/IJBMultiTerminal.sol";
77
+ import {IJBCashOutTerminal} from "../../src/interfaces/IJBCashOutTerminal.sol";
78
+ import {IJBPayoutTerminal} from "../../src/interfaces/IJBPayoutTerminal.sol";
79
+ import {IJBPermitTerminal} from "../../src/interfaces/IJBPermitTerminal.sol";
80
+ import {IJBFeeTerminal} from "../../src/interfaces/IJBFeeTerminal.sol";
81
+ import {IJBTerminal} from "../../src/interfaces/IJBTerminal.sol";
82
+ import {IJBPriceFeed} from "../../src/interfaces/IJBPriceFeed.sol";
83
+ import {IJBPermissioned} from "../../src/interfaces/IJBPermissioned.sol";
84
+ import {IJBProjectUriRegistry} from "../../src/interfaces/IJBProjectUriRegistry.sol";
85
+ import {IJBRulesetApprovalHook} from "../../src/interfaces/IJBRulesetApprovalHook.sol";
86
+ import {IJBPrices} from "../../src/interfaces/IJBPrices.sol";
87
+
88
+ import {JBConstants} from "../../src/libraries/JBConstants.sol";
89
+ import {JBCurrencyIds} from "../../src/libraries/JBCurrencyIds.sol";
90
+ import {JBRulesetMetadataResolver} from "../../src/libraries/JBRulesetMetadataResolver.sol";
91
+ import {JBSplitGroupIds} from "../../src/libraries/JBSplitGroupIds.sol";
92
+
93
+ import {IPermit2, IAllowanceTransfer} from "@uniswap/permit2/src/interfaces/IPermit2.sol";
94
+ import {DeployPermit2} from "@uniswap/permit2/test/utils/DeployPermit2.sol";
95
+
96
+ import {JBTest} from "./JBTest.sol";
97
+ import {MetadataResolverHelper} from "./MetadataResolverHelper.sol";
98
+
99
+ import {MockERC20} from "./../mock/MockERC20.sol";
100
+
101
+ import {mulDiv} from "@prb/math/src/Common.sol";
102
+ import {mul as UD60x18mul, wrap as UD60x18wrap, unwrap as UD60x18unwrap} from "@prb/math/src/UD60x18.sol";
103
+
104
+ // Base contract for Juicebox system tests.
105
+ // Provides common functionality, such as deploying contracts on test setup.
106
+ contract TestBaseWorkflow is Test, DeployPermit2 {
107
+ // Multisig address used for testing.
108
+ address private _multisig = address(123);
109
+ address private _beneficiary = address(69_420);
110
+ address private _trustedForwarder = address(123_456);
111
+ MockERC20 private _usdcToken;
112
+ address private _permit2;
113
+ JBPermissions private _jbPermissions;
114
+ JBProjects private _jbProjects;
115
+ JBPrices private _jbPrices;
116
+ JBDirectory private _jbDirectory;
117
+ JBRulesets private _jbRulesets;
118
+ JBERC20 private _jbErc20;
119
+ JBTokens private _jbTokens;
120
+ JBSplits private _jbSplits;
121
+ JBController private _jbController;
122
+ JBFeelessAddresses private _jbFeelessAddresses;
123
+ JBFundAccessLimits private _jbFundAccessLimits;
124
+ JBTerminalStore private _jbTerminalStore;
125
+ JBMultiTerminal private _jbMultiTerminal;
126
+ MetadataResolverHelper private _metadataHelper;
127
+ JBMultiTerminal private _jbMultiTerminal2;
128
+
129
+ function multisig() internal view returns (address) {
130
+ return _multisig;
131
+ }
132
+
133
+ function beneficiary() internal view returns (address) {
134
+ return _beneficiary;
135
+ }
136
+
137
+ function usdcToken() internal view returns (MockERC20) {
138
+ return _usdcToken;
139
+ }
140
+
141
+ function permit2() internal view returns (IPermit2) {
142
+ return IPermit2(_permit2);
143
+ }
144
+
145
+ function jbPermissions() internal view returns (JBPermissions) {
146
+ return _jbPermissions;
147
+ }
148
+
149
+ function jbProjects() internal view returns (JBProjects) {
150
+ return _jbProjects;
151
+ }
152
+
153
+ function jbPrices() internal view returns (JBPrices) {
154
+ return _jbPrices;
155
+ }
156
+
157
+ function jbDirectory() internal view returns (JBDirectory) {
158
+ return _jbDirectory;
159
+ }
160
+
161
+ function jbRulesets() internal view returns (JBRulesets) {
162
+ return _jbRulesets;
163
+ }
164
+
165
+ function jbErc20() internal view returns (JBERC20) {
166
+ return _jbErc20;
167
+ }
168
+
169
+ function jbTokens() internal view returns (JBTokens) {
170
+ return _jbTokens;
171
+ }
172
+
173
+ function jbSplits() internal view returns (JBSplits) {
174
+ return _jbSplits;
175
+ }
176
+
177
+ function jbController() internal view returns (JBController) {
178
+ return _jbController;
179
+ }
180
+
181
+ function jbFeelessAddresses() internal view returns (JBFeelessAddresses) {
182
+ return _jbFeelessAddresses;
183
+ }
184
+
185
+ function jbAccessConstraintStore() internal view returns (JBFundAccessLimits) {
186
+ return _jbFundAccessLimits;
187
+ }
188
+
189
+ function jbTerminalStore() internal view returns (JBTerminalStore) {
190
+ return _jbTerminalStore;
191
+ }
192
+
193
+ function jbMultiTerminal() internal view returns (JBMultiTerminal) {
194
+ return _jbMultiTerminal;
195
+ }
196
+
197
+ function jbMultiTerminal2() internal view returns (JBMultiTerminal) {
198
+ return _jbMultiTerminal2;
199
+ }
200
+
201
+ function trustedForwarder() internal view returns (address) {
202
+ return _trustedForwarder;
203
+ }
204
+
205
+ function metadataHelper() internal view returns (MetadataResolverHelper) {
206
+ return _metadataHelper;
207
+ }
208
+
209
+ //*********************************************************************//
210
+ // --------------------------- test setup ---------------------------- //
211
+ //*********************************************************************//
212
+
213
+ // Deploys and initializes contracts for testing.
214
+ function setUp() public virtual {
215
+ _jbPermissions = new JBPermissions(_trustedForwarder);
216
+ _jbProjects = new JBProjects(_multisig, address(0), _trustedForwarder);
217
+ _jbDirectory = new JBDirectory(_jbPermissions, _jbProjects, _multisig);
218
+ _jbErc20 = new JBERC20();
219
+ _jbTokens = new JBTokens(_jbDirectory, _jbErc20);
220
+ _jbRulesets = new JBRulesets(_jbDirectory);
221
+ _jbPrices = new JBPrices(_jbDirectory, _jbPermissions, _jbProjects, _multisig, _trustedForwarder);
222
+ _jbSplits = new JBSplits(_jbDirectory);
223
+ _jbFundAccessLimits = new JBFundAccessLimits(_jbDirectory);
224
+ _jbFeelessAddresses = new JBFeelessAddresses(_multisig);
225
+
226
+ _usdcToken = new MockERC20("USDC", "USDC");
227
+
228
+ _jbController = new JBController(
229
+ _jbDirectory,
230
+ _jbFundAccessLimits,
231
+ _jbPermissions,
232
+ _jbPrices,
233
+ _jbProjects,
234
+ _jbRulesets,
235
+ _jbSplits,
236
+ _jbTokens,
237
+ address(0), // omnichainRulesetOperator
238
+ _trustedForwarder
239
+ );
240
+
241
+ _metadataHelper = new MetadataResolverHelper();
242
+
243
+ vm.prank(_multisig);
244
+ _jbDirectory.setIsAllowedToSetFirstController(address(_jbController), true);
245
+
246
+ _jbTerminalStore = new JBTerminalStore(_jbDirectory, _jbPrices, _jbRulesets);
247
+
248
+ vm.prank(_multisig);
249
+ _permit2 = deployPermit2();
250
+
251
+ _jbMultiTerminal = new JBMultiTerminal(
252
+ _jbFeelessAddresses,
253
+ _jbPermissions,
254
+ _jbProjects,
255
+ _jbSplits,
256
+ _jbTerminalStore,
257
+ _jbTokens,
258
+ IPermit2(_permit2),
259
+ _trustedForwarder
260
+ );
261
+
262
+ _jbMultiTerminal2 = new JBMultiTerminal(
263
+ _jbFeelessAddresses,
264
+ _jbPermissions,
265
+ _jbProjects,
266
+ _jbSplits,
267
+ _jbTerminalStore,
268
+ _jbTokens,
269
+ IPermit2(_permit2),
270
+ _trustedForwarder
271
+ );
272
+
273
+ vm.label(_multisig, "projectOwner");
274
+ vm.label(_beneficiary, "beneficiary");
275
+ vm.label(address(_jbPrices), "JBPrices");
276
+ vm.label(address(_jbProjects), "JBProjects");
277
+ vm.label(address(_jbRulesets), "JBRulesets");
278
+ vm.label(address(_jbDirectory), "JBDirectory");
279
+ vm.label(address(_usdcToken), "ERC20");
280
+ vm.label(address(_jbPermissions), "JBPermissions");
281
+ vm.label(address(_jbTokens), "JBTokens");
282
+ vm.label(address(_jbFeelessAddresses), "JBFeelessAddresses");
283
+ vm.label(address(_jbFundAccessLimits), "JBFundAccessLimits");
284
+ vm.label(address(_jbSplits), "JBSplits");
285
+ vm.label(address(_jbController), "JBController");
286
+ vm.label(address(_jbTerminalStore), "JBTerminalStore");
287
+ vm.label(address(_jbMultiTerminal2), "JBMultiTerminal2");
288
+ vm.label(address(_jbMultiTerminal), "JBMultiTerminal");
289
+ }
290
+
291
+ //https://ethereum.stackexchange.com/questions/24248/how-to-calculate-an-ethereum-contracts-address-during-its-creation-using-the-so
292
+ function addressFrom(address _origin, uint256 _nonce) internal pure returns (address _address) {
293
+ bytes memory data;
294
+ if (_nonce == 0x00) {
295
+ data = abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, bytes1(0x80));
296
+ } else if (_nonce <= 0x7f) {
297
+ data = abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, uint8(_nonce));
298
+ } else if (_nonce <= 0xff) {
299
+ data = abi.encodePacked(bytes1(0xd7), bytes1(0x94), _origin, bytes1(0x81), uint8(_nonce));
300
+ } else if (_nonce <= 0xffff) {
301
+ data = abi.encodePacked(bytes1(0xd8), bytes1(0x94), _origin, bytes1(0x82), uint16(_nonce));
302
+ } else if (_nonce <= 0xffffff) {
303
+ data = abi.encodePacked(bytes1(0xd9), bytes1(0x94), _origin, bytes1(0x83), uint24(_nonce));
304
+ } else {
305
+ data = abi.encodePacked(bytes1(0xda), bytes1(0x94), _origin, bytes1(0x84), uint32(_nonce));
306
+ }
307
+ bytes32 hash = keccak256(data);
308
+ assembly {
309
+ mstore(0, hash)
310
+ _address := mload(0)
311
+ }
312
+ }
313
+
314
+ function strEqual(string memory a, string memory b) internal pure returns (bool) {
315
+ return keccak256(abi.encode(a)) == keccak256(abi.encode(b));
316
+ }
317
+ }