@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,28 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.17;
3
+
4
+ import {mulDiv} from "@prb/math/src/Common.sol";
5
+
6
+ import {JBConstants} from "./../libraries/JBConstants.sol";
7
+
8
+ /// @notice Fee calculations.
9
+ library JBFees {
10
+ /// @notice Returns the fee amount that, when added to `amountAfterFee`, produces the gross amount needed to yield
11
+ /// `amountAfterFee` after the fee is deducted.
12
+ /// @dev Use this to back-calculate the fee from a desired post-fee payout.
13
+ /// @param amountAfterFee The desired post-fee amount, as a fixed point number.
14
+ /// @param feePercent The fee percent, out of `JBConstants.MAX_FEE`.
15
+ /// @return The fee amount, as a fixed point number with the same number of decimals as the provided `amount`.
16
+ function feeAmountResultingIn(uint256 amountAfterFee, uint256 feePercent) internal pure returns (uint256) {
17
+ return mulDiv(amountAfterFee, JBConstants.MAX_FEE, JBConstants.MAX_FEE - feePercent) - amountAfterFee;
18
+ }
19
+
20
+ /// @notice Returns the fee that would be taken from `amountBeforeFee`.
21
+ /// @dev Use this to forward-calculate the fee from a known pre-fee amount.
22
+ /// @param amountBeforeFee The amount before the fee is applied, as a fixed point number.
23
+ /// @param feePercent The fee percent, out of `JBConstants.MAX_FEE`.
24
+ /// @return The fee amount, as a fixed point number with the same number of decimals as the provided `amount`.
25
+ function feeAmountFrom(uint256 amountBeforeFee, uint256 feePercent) internal pure returns (uint256) {
26
+ return mulDiv(amountBeforeFee, feePercent, JBConstants.MAX_FEE);
27
+ }
28
+ }
@@ -0,0 +1,12 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.17;
3
+
4
+ library JBFixedPointNumber {
5
+ function adjustDecimals(uint256 value, uint256 decimals, uint256 targetDecimals) internal pure returns (uint256) {
6
+ // If decimals need adjusting, multiply or divide the price by the decimal adjuster to get the normalized
7
+ // result.
8
+ if (targetDecimals == decimals) return value;
9
+ else if (targetDecimals > decimals) return value * 10 ** (targetDecimals - decimals);
10
+ else return value / 10 ** (decimals - targetDecimals);
11
+ }
12
+ }
@@ -0,0 +1,306 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.17;
3
+
4
+ /**
5
+ * @notice Library to parse and create metadata to store {id: data} entries.
6
+ *
7
+ * @dev Metadata are built as:
8
+ * - 32B of reserved space for the protocol
9
+ * - a lookup table `Id: offset`, defining the offset of the data for a given 4 bytes id.
10
+ * The offset fits 1 bytes, the ID 4 bytes. This table is padded to 32B.
11
+ * - the data for each id, padded to 32B each
12
+ *
13
+ * +-----------------------+ offset: 0
14
+ * | 32B reserved |
15
+ * +-----------------------+ offset: 1 = end of first 32B
16
+ * | (ID1,offset1) |
17
+ * | (ID2,offset2) |
18
+ * | 0's padding |
19
+ * +-----------------------+ offset: offset1 = 1 + number of words taken by the padded table
20
+ * | id1 data1 |
21
+ * | 0's padding |
22
+ * +-----------------------+ offset: offset2 = offset1 + number of words taken by the data1
23
+ * | id2 data2 |
24
+ * | 0's padding |
25
+ * +-----------------------+
26
+ */
27
+ library JBMetadataResolver {
28
+ error JBMetadataResolver_DataNotPadded();
29
+ error JBMetadataResolver_LengthMismatch();
30
+ error JBMetadataResolver_MetadataTooLong();
31
+ error JBMetadataResolver_MetadataTooShort();
32
+
33
+ // The various sizes used in bytes.
34
+ uint256 constant ID_SIZE = 4;
35
+ uint256 constant ID_OFFSET_SIZE = 1;
36
+ uint256 constant WORD_SIZE = 32;
37
+
38
+ // The size that an ID takes in the lookup table (Identifier + Offset).
39
+ uint256 constant TOTAL_ID_SIZE = 5; // ID_SIZE + ID_OFFSET_SIZE;
40
+
41
+ // The amount of bytes to go forward to get to the offset of the next ID (aka. the end of the offset of the current
42
+ // ID).
43
+ uint256 constant NEXT_ID_OFFSET = 9; // TOTAL_ID_SIZE + ID_SIZE;
44
+
45
+ // 1 word (32B) is reserved for the protocol .
46
+ uint256 constant RESERVED_SIZE = 32; // 1 * WORD_SIZE;
47
+ uint256 constant MIN_METADATA_LENGTH = 37; // RESERVED_SIZE + ID_SIZE + ID_OFFSET_SIZE;
48
+
49
+ /// @notice Add an {id: data} entry to an existing metadata. This is an append-only mechanism.
50
+ /// @param originalMetadata The original metadata
51
+ /// @param idToAdd The id to add
52
+ /// @param dataToAdd The data to add
53
+ /// @return newMetadata The new metadata with the entry added
54
+ function addToMetadata(
55
+ bytes memory originalMetadata,
56
+ bytes4 idToAdd,
57
+ bytes memory dataToAdd
58
+ )
59
+ internal
60
+ pure
61
+ returns (bytes memory newMetadata)
62
+ {
63
+ // Empty original metadata and maybe something in the first 32 bytes: create new metadata
64
+ if (originalMetadata.length <= RESERVED_SIZE) {
65
+ return abi.encodePacked(bytes32(originalMetadata), bytes32(abi.encodePacked(idToAdd, uint8(2))), dataToAdd);
66
+ }
67
+
68
+ // There is something in the table offset, but not a valid entry - avoid overwriting
69
+ if (originalMetadata.length < RESERVED_SIZE + ID_SIZE + 1) revert JBMetadataResolver_MetadataTooShort();
70
+
71
+ // Make sure the data is padded to 32 bytes.
72
+ if (dataToAdd.length < 32) revert JBMetadataResolver_DataNotPadded();
73
+
74
+ // Get the first data offset - upcast to avoid overflow (same for other offset)...
75
+ uint256 firstOffset = uint8(originalMetadata[RESERVED_SIZE + ID_SIZE]);
76
+
77
+ // ...go back to the beginning of the previous word (ie the last word of the table, as it can be padded)
78
+ uint256 lastWordOfTable = firstOffset - 1;
79
+
80
+ // The last offset stored in the table and its index
81
+ uint256 lastOffset;
82
+
83
+ // The number of words taken by the last data stored
84
+ uint256 numberOfWordslastData;
85
+
86
+ // Iterate to find the last entry of the table, lastOffset - we start from the end as the first value
87
+ // encountered
88
+ // will be the last offset
89
+ for (uint256 i = firstOffset * WORD_SIZE - 1; i > lastWordOfTable * WORD_SIZE - 1; i--) {
90
+ // If the byte is not 0, this is the last offset we're looking for
91
+ if (originalMetadata[i] != 0) {
92
+ lastOffset = uint8(originalMetadata[i]);
93
+ uint256 lastOffsetIndex = i;
94
+
95
+ // No rounding as this should be padded to 32B
96
+ numberOfWordslastData = (originalMetadata.length - lastOffset * WORD_SIZE) / WORD_SIZE;
97
+
98
+ // Copy the reserved word and the table and remove the previous padding
99
+ newMetadata = _sliceBytes(originalMetadata, 0, lastOffsetIndex + 1);
100
+
101
+ // Check if the new entry is still fitting in this word
102
+ if (i + TOTAL_ID_SIZE >= firstOffset * WORD_SIZE) {
103
+ // Increment every offset by 1 (as the table now takes one more word)
104
+ for (uint256 j = RESERVED_SIZE + ID_SIZE; j < lastOffsetIndex + 1; j += TOTAL_ID_SIZE) {
105
+ newMetadata[j] = bytes1(uint8(originalMetadata[j]) + 1);
106
+ }
107
+
108
+ // Increment the last offset so the new offset will be properly set too
109
+ lastOffset++;
110
+ }
111
+
112
+ break;
113
+ }
114
+ }
115
+
116
+ // Add the new entry after the last entry of the table, the new offset is the last offset + the number of words
117
+ // taken by the last data
118
+ // M-21: Compute in uint256 first — casting directly to uint8 silently wraps offsets > 255.
119
+ uint256 newOffset = lastOffset + numberOfWordslastData;
120
+ if (newOffset > 255) revert JBMetadataResolver_MetadataTooLong();
121
+ newMetadata = abi.encodePacked(newMetadata, idToAdd, bytes1(uint8(newOffset)));
122
+
123
+ // Pad as needed - inlined for gas saving
124
+ uint256 paddedLength =
125
+ newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;
126
+ assembly {
127
+ mstore(newMetadata, paddedLength)
128
+ }
129
+
130
+ // Add existing data at the end
131
+ newMetadata = abi.encodePacked(
132
+ newMetadata, _sliceBytes(originalMetadata, firstOffset * WORD_SIZE, originalMetadata.length)
133
+ );
134
+
135
+ // Pad as needed
136
+ paddedLength =
137
+ newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;
138
+ assembly {
139
+ mstore(newMetadata, paddedLength)
140
+ }
141
+
142
+ // Append new data at the end
143
+ newMetadata = abi.encodePacked(newMetadata, dataToAdd);
144
+
145
+ // Pad again again as needed
146
+ paddedLength =
147
+ newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;
148
+
149
+ assembly {
150
+ mstore(newMetadata, paddedLength)
151
+ }
152
+ }
153
+
154
+ /// @notice Create the metadata for a list of {id:data}
155
+ /// @dev Intended for offchain use (gas heavy)
156
+ /// @param ids The list of ids
157
+ /// @param datas The list of corresponding datas
158
+ /// @return metadata The resulting metadata
159
+ function createMetadata(bytes4[] memory ids, bytes[] memory datas) internal pure returns (bytes memory metadata) {
160
+ if (ids.length != datas.length) revert JBMetadataResolver_LengthMismatch();
161
+
162
+ // Add a first empty 32B for the protocol reserved word
163
+ metadata = abi.encodePacked(bytes32(0));
164
+
165
+ // First offset for the data is after the first reserved word...
166
+ uint256 offset = 1;
167
+
168
+ // ... and after the id/offset lookup table, rounding up to 32 bytes words if not a multiple
169
+ offset += ((ids.length * JBMetadataResolver.TOTAL_ID_SIZE) - 1) / JBMetadataResolver.WORD_SIZE + 1;
170
+
171
+ // Keep a reference to the number of ids.
172
+ uint256 numberOfIds = ids.length;
173
+
174
+ // For each id, add it to the lookup table with the next free offset, then increment the offset by the data
175
+ // length (rounded up)
176
+ for (uint256 i; i < numberOfIds; ++i) {
177
+ // Set the data being iterated on.
178
+ bytes memory data = datas[i];
179
+
180
+ if (data.length < 32 || data.length % JBMetadataResolver.WORD_SIZE != 0) {
181
+ revert JBMetadataResolver_DataNotPadded();
182
+ }
183
+
184
+ metadata = abi.encodePacked(metadata, ids[i], bytes1(uint8(offset)));
185
+ offset += data.length / JBMetadataResolver.WORD_SIZE;
186
+
187
+ // Overflowing a bytes1?
188
+ if (offset > 255) revert JBMetadataResolver_MetadataTooLong();
189
+ }
190
+
191
+ // Pad the table to a multiple of 32B
192
+ uint256 paddedLength = metadata.length % JBMetadataResolver.WORD_SIZE == 0
193
+ ? metadata.length
194
+ : (metadata.length / JBMetadataResolver.WORD_SIZE + 1) * JBMetadataResolver.WORD_SIZE;
195
+ assembly {
196
+ mstore(metadata, paddedLength)
197
+ }
198
+
199
+ // Keep a reference to the number of datas.
200
+ uint256 numberOfDatas = datas.length;
201
+
202
+ // Add each metadata to the array, each padded to 32 bytes
203
+ for (uint256 i; i < numberOfDatas; i++) {
204
+ metadata = abi.encodePacked(metadata, datas[i]);
205
+ paddedLength = metadata.length % JBMetadataResolver.WORD_SIZE == 0
206
+ ? metadata.length
207
+ : (metadata.length / JBMetadataResolver.WORD_SIZE + 1) * JBMetadataResolver.WORD_SIZE;
208
+
209
+ assembly {
210
+ mstore(metadata, paddedLength)
211
+ }
212
+ }
213
+ }
214
+
215
+ /// @notice Parse the metadata to find the data for a specific ID
216
+ /// @dev Returns false and an empty bytes if no data is found
217
+ /// @param id The ID to find.
218
+ /// @param metadata The metadata to parse.
219
+ /// @return found Whether the {id:data} was found
220
+ /// @return targetData The data for the ID (can be empty)
221
+ function getDataFor(bytes4 id, bytes memory metadata) internal pure returns (bool found, bytes memory targetData) {
222
+ // Either no data or empty one with only one selector (32+4+1)
223
+ if (metadata.length <= MIN_METADATA_LENGTH) return (false, "");
224
+
225
+ // Get the first data offset - upcast to avoid overflow (same for other offset)
226
+ uint256 firstOffset = uint8(metadata[RESERVED_SIZE + ID_SIZE]);
227
+
228
+ // Parse the id's to find id, stop when next offset == 0 or current = first offset
229
+ for (uint256 i = RESERVED_SIZE; metadata[i + ID_SIZE] != bytes1(0) && i < firstOffset * WORD_SIZE;) {
230
+ // Set the current offset.
231
+ uint256 currentOffset = uint256(uint8(metadata[i + ID_SIZE]));
232
+
233
+ bytes4 parsedId;
234
+ assembly {
235
+ parsedId := mload(add(add(metadata, 0x20), i))
236
+ }
237
+
238
+ // _id found?
239
+ if (parsedId == id) {
240
+ // Are we at the end of the lookup table (either at the start of data's or next offset is 0/in the
241
+ // padding)
242
+ // If not, only return until from this offset to the begining of the next offset
243
+ uint256 end = (i + NEXT_ID_OFFSET >= firstOffset * WORD_SIZE || metadata[i + NEXT_ID_OFFSET] == 0)
244
+ ? metadata.length
245
+ : uint256(uint8(metadata[i + NEXT_ID_OFFSET])) * WORD_SIZE;
246
+
247
+ return (true, _sliceBytes(metadata, currentOffset * WORD_SIZE, end));
248
+ }
249
+ unchecked {
250
+ i += TOTAL_ID_SIZE;
251
+ }
252
+ }
253
+ }
254
+
255
+ /// @notice Returns an unique id following a suggested format (`xor(address(this), purpose name)` where purpose name
256
+ /// is a string giving context to the id (Permit2, quoteForSwap, etc)
257
+ /// @param purpose A string describing the purpose associated with the id
258
+ /// @return id The resulting ID.
259
+ function getId(string memory purpose) internal view returns (bytes4) {
260
+ return getId(purpose, address(this));
261
+ }
262
+
263
+ /// @notice Returns an unique id following a suggested format (`xor(address(this), purpose name)` where purpose name
264
+ /// is a string giving context to the id (Permit2, quoteForSwap, etc)
265
+ /// @param purpose A string describing the purpose associated with the id
266
+ /// @param target The target which will use the metadata
267
+ /// @return id The resulting ID.
268
+ function getId(string memory purpose, address target) internal pure returns (bytes4) {
269
+ return bytes4(bytes20(target) ^ bytes20(keccak256(bytes(purpose))));
270
+ }
271
+
272
+ /// @notice Slice bytes from a start index to an end index.
273
+ /// @param data The bytes array to slice
274
+ /// @param start The start index to slice at.
275
+ /// @param end The end index to slice at.
276
+ /// @param slicedBytes The sliced array.
277
+ function _sliceBytes(bytes memory data, uint256 start, uint256 end)
278
+ private
279
+ pure
280
+ returns (bytes memory slicedBytes)
281
+ {
282
+ assembly {
283
+ let length := sub(end, start)
284
+
285
+ // M-20: Allocate memory at freemem — round up to 32-byte boundary so subsequent
286
+ // allocations do not overlap the tail of this buffer.
287
+ slicedBytes := mload(0x40)
288
+ mstore(0x40, and(add(add(add(slicedBytes, length), 0x20), 0x1f), not(0x1f)))
289
+
290
+ // Store the length (first element)
291
+ mstore(slicedBytes, length)
292
+
293
+ // compute the actual data first offset only once
294
+ let startBytes := add(add(data, 0x20), start)
295
+
296
+ // same for the out array
297
+ let sliceBytesStartOfData := add(slicedBytes, 0x20)
298
+
299
+ // M-20: Copy data — bound is `length` not `end`. Using `end` (an absolute source offset)
300
+ // would over-copy by `start` bytes past the allocated buffer.
301
+ for { let i := 0 } lt(i, length) { i := add(i, 0x20) } {
302
+ mstore(add(sliceBytesStartOfData, i), mload(add(startBytes, i)))
303
+ }
304
+ }
305
+ }
306
+ }
@@ -0,0 +1,160 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.17;
3
+
4
+ import {JBRuleset} from "./../structs/JBRuleset.sol";
5
+ import {JBRulesetMetadata} from "./../structs/JBRulesetMetadata.sol";
6
+
7
+ library JBRulesetMetadataResolver {
8
+ function reservedPercent(JBRuleset memory ruleset) internal pure returns (uint16) {
9
+ return uint16(ruleset.metadata >> 4);
10
+ }
11
+
12
+ function cashOutTaxRate(JBRuleset memory ruleset) internal pure returns (uint16) {
13
+ // Cash out tax rate is a number 0-10000.
14
+ return uint16(ruleset.metadata >> 20);
15
+ }
16
+
17
+ function baseCurrency(JBRuleset memory ruleset) internal pure returns (uint32) {
18
+ // Currency is a number 0-4294967295.
19
+ return uint32(ruleset.metadata >> 36);
20
+ }
21
+
22
+ function pausePay(JBRuleset memory ruleset) internal pure returns (bool) {
23
+ return ((ruleset.metadata >> 68) & 1) == 1;
24
+ }
25
+
26
+ function pauseCreditTransfers(JBRuleset memory ruleset) internal pure returns (bool) {
27
+ return ((ruleset.metadata >> 69) & 1) == 1;
28
+ }
29
+
30
+ function allowOwnerMinting(JBRuleset memory ruleset) internal pure returns (bool) {
31
+ return ((ruleset.metadata >> 70) & 1) == 1;
32
+ }
33
+
34
+ function allowSetCustomToken(JBRuleset memory ruleset) internal pure returns (bool) {
35
+ return ((ruleset.metadata >> 71) & 1) == 1;
36
+ }
37
+
38
+ function allowTerminalMigration(JBRuleset memory ruleset) internal pure returns (bool) {
39
+ return ((ruleset.metadata >> 72) & 1) == 1;
40
+ }
41
+
42
+ function allowSetTerminals(JBRuleset memory ruleset) internal pure returns (bool) {
43
+ return ((ruleset.metadata >> 73) & 1) == 1;
44
+ }
45
+
46
+ function allowSetController(JBRuleset memory ruleset) internal pure returns (bool) {
47
+ return ((ruleset.metadata >> 74) & 1) == 1;
48
+ }
49
+
50
+ function allowAddAccountingContext(JBRuleset memory ruleset) internal pure returns (bool) {
51
+ return ((ruleset.metadata >> 75) & 1) == 1;
52
+ }
53
+
54
+ function allowAddPriceFeed(JBRuleset memory ruleset) internal pure returns (bool) {
55
+ return ((ruleset.metadata >> 76) & 1) == 1;
56
+ }
57
+
58
+ function ownerMustSendPayouts(JBRuleset memory ruleset) internal pure returns (bool) {
59
+ return ((ruleset.metadata >> 77) & 1) == 1;
60
+ }
61
+
62
+ function holdFees(JBRuleset memory ruleset) internal pure returns (bool) {
63
+ return ((ruleset.metadata >> 78) & 1) == 1;
64
+ }
65
+
66
+ function useTotalSurplusForCashOuts(JBRuleset memory ruleset) internal pure returns (bool) {
67
+ return ((ruleset.metadata >> 79) & 1) == 1;
68
+ }
69
+
70
+ function useDataHookForPay(JBRuleset memory ruleset) internal pure returns (bool) {
71
+ return (ruleset.metadata >> 80) & 1 == 1;
72
+ }
73
+
74
+ function useDataHookForCashOut(JBRuleset memory ruleset) internal pure returns (bool) {
75
+ return (ruleset.metadata >> 81) & 1 == 1;
76
+ }
77
+
78
+ function dataHook(JBRuleset memory ruleset) internal pure returns (address) {
79
+ return address(uint160(ruleset.metadata >> 82));
80
+ }
81
+
82
+ function metadata(JBRuleset memory ruleset) internal pure returns (uint16) {
83
+ return uint16(ruleset.metadata >> 242);
84
+ }
85
+
86
+ /// @notice Pack the funding cycle metadata.
87
+ /// @param rulesetMetadata The ruleset metadata to validate and pack.
88
+ /// @return packed The packed uint256 of all metadata params. The first 8 bits specify the version.
89
+ function packRulesetMetadata(JBRulesetMetadata memory rulesetMetadata) internal pure returns (uint256 packed) {
90
+ // version 1 in the bits 0-3 (4 bits).
91
+ packed = 1;
92
+ // reserved percent in bits 4-19 (16 bits).
93
+ packed |= uint256(rulesetMetadata.reservedPercent) << 4;
94
+ // cash out tax rate in bits 20-35 (16 bits).
95
+ // cash out tax rate is a number 0-10000.
96
+ packed |= uint256(rulesetMetadata.cashOutTaxRate) << 20;
97
+ // base currency in bits 36-67 (32 bits).
98
+ // base currency is a number 0-4294967295.
99
+ packed |= uint256(rulesetMetadata.baseCurrency) << 36;
100
+ // pause pay in bit 68.
101
+ if (rulesetMetadata.pausePay) packed |= 1 << 68;
102
+ // pause credit transfers in bit 69.
103
+ if (rulesetMetadata.pauseCreditTransfers) packed |= 1 << 69;
104
+ // allow discretionary minting in bit 70.
105
+ if (rulesetMetadata.allowOwnerMinting) packed |= 1 << 70;
106
+ // allow a custom token to be set in bit 71.
107
+ if (rulesetMetadata.allowSetCustomToken) packed |= 1 << 71;
108
+ // allow terminal migration in bit 72.
109
+ if (rulesetMetadata.allowTerminalMigration) packed |= 1 << 72;
110
+ // allow set terminals in bit 73.
111
+ if (rulesetMetadata.allowSetTerminals) packed |= 1 << 73;
112
+ // allow set controller in bit 74.
113
+ if (rulesetMetadata.allowSetController) packed |= 1 << 74;
114
+ // allow add accounting context in bit 75.
115
+ if (rulesetMetadata.allowAddAccountingContext) packed |= 1 << 75;
116
+ // allow add price feed in bit 76.
117
+ if (rulesetMetadata.allowAddPriceFeed) packed |= 1 << 76;
118
+ // owner must send payouts in bit 77.
119
+ if (rulesetMetadata.ownerMustSendPayouts) packed |= 1 << 77;
120
+ // hold fees in bit 78.
121
+ if (rulesetMetadata.holdFees) packed |= 1 << 78;
122
+ // useTotalSurplusForCashOuts in bit 79.
123
+ if (rulesetMetadata.useTotalSurplusForCashOuts) packed |= 1 << 79;
124
+ // use pay data source in bit 80.
125
+ if (rulesetMetadata.useDataHookForPay) packed |= 1 << 80;
126
+ // use cash out data source in bit 81.
127
+ if (rulesetMetadata.useDataHookForCashOut) packed |= 1 << 81;
128
+ // data source address in bits 82-241.
129
+ packed |= uint256(uint160(address(rulesetMetadata.dataHook))) << 82;
130
+ // metadata in bits 242-255 (14 bits).
131
+ packed |= (uint256(rulesetMetadata.metadata) & 0x3FFF) << 242;
132
+ }
133
+
134
+ /// @notice Expand the funding cycle metadata.
135
+ /// @param ruleset The funding cycle having its metadata expanded.
136
+ /// @return rulesetMetadata The ruleset's metadata object.
137
+ function expandMetadata(JBRuleset memory ruleset) internal pure returns (JBRulesetMetadata memory) {
138
+ return JBRulesetMetadata(
139
+ reservedPercent(ruleset),
140
+ cashOutTaxRate(ruleset),
141
+ baseCurrency(ruleset),
142
+ pausePay(ruleset),
143
+ pauseCreditTransfers(ruleset),
144
+ allowOwnerMinting(ruleset),
145
+ allowSetCustomToken(ruleset),
146
+ allowTerminalMigration(ruleset),
147
+ allowSetTerminals(ruleset),
148
+ allowSetController(ruleset),
149
+ allowAddAccountingContext(ruleset),
150
+ allowAddPriceFeed(ruleset),
151
+ ownerMustSendPayouts(ruleset),
152
+ holdFees(ruleset),
153
+ useTotalSurplusForCashOuts(ruleset),
154
+ useDataHookForPay(ruleset),
155
+ useDataHookForCashOut(ruleset),
156
+ dataHook(ruleset),
157
+ metadata(ruleset)
158
+ );
159
+ }
160
+ }
@@ -0,0 +1,7 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @notice Group IDs that categorize splits.
5
+ library JBSplitGroupIds {
6
+ uint256 public constant RESERVED_TOKENS = 1;
7
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.17;
3
+
4
+ import {IJBTerminal} from "../interfaces/IJBTerminal.sol";
5
+ import {JBAccountingContext} from "../structs/JBAccountingContext.sol";
6
+
7
+ /// @notice Surplus calculations.
8
+ library JBSurplus {
9
+ /// @notice Gets the total current surplus amount across all of a project's terminals.
10
+ /// @dev This amount changes as the value of the balances changes in relation to the currency being used to measure
11
+ /// the project's payout limits.
12
+ /// @param projectId The ID of the project to get the total surplus for.
13
+ /// @param terminals The terminals to look for surplus within.
14
+ /// @param accountingContexts The accounting contexts to use to calculate the surplus.
15
+ /// @param decimals The number of decimals that the fixed point surplus result should include.
16
+ /// @param currency The currency that the surplus result should be in terms of.
17
+ /// @return surplus The total surplus of a project's funds in terms of `currency`, as a fixed point number with the
18
+ /// specified number of decimals.
19
+ function currentSurplusOf(
20
+ uint256 projectId,
21
+ IJBTerminal[] memory terminals,
22
+ JBAccountingContext[] memory accountingContexts,
23
+ uint256 decimals,
24
+ uint256 currency
25
+ )
26
+ internal
27
+ view
28
+ returns (uint256 surplus)
29
+ {
30
+ // Keep a reference to the number of terminals.
31
+ uint256 numberOfTerminals = terminals.length;
32
+
33
+ // Add the current surplus for each terminal.
34
+ for (uint256 i; i < numberOfTerminals; i++) {
35
+ surplus += terminals[i].currentSurplusOf({
36
+ projectId: projectId, accountingContexts: accountingContexts, decimals: decimals, currency: currency
37
+ });
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {JBDeadline} from "../JBDeadline.sol";
5
+
6
+ contract JBDeadline1Day is JBDeadline {
7
+ constructor() JBDeadline(1 days) {}
8
+ }
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {JBDeadline} from "../JBDeadline.sol";
5
+
6
+ contract JBDeadline3Days is JBDeadline {
7
+ constructor() JBDeadline(3 days) {}
8
+ }
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {JBDeadline} from "../JBDeadline.sol";
5
+
6
+ contract JBDeadline3Hours is JBDeadline {
7
+ constructor() JBDeadline(3 hours) {}
8
+ }
@@ -0,0 +1,8 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {JBDeadline} from "../JBDeadline.sol";
5
+
6
+ contract JBDeadline7Days is JBDeadline {
7
+ constructor() JBDeadline(7 days) {}
8
+ }
@@ -0,0 +1,13 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {IJBPriceFeed} from "src/interfaces/IJBPriceFeed.sol";
5
+
6
+ contract JBMatchingPriceFeed is IJBPriceFeed {
7
+ constructor() {}
8
+
9
+ /// @inheritdoc IJBPriceFeed
10
+ function currentUnitPrice(uint256 decimals) public view virtual override returns (uint256) {
11
+ return 10 ** decimals;
12
+ }
13
+ }
@@ -0,0 +1,12 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ /// @custom:member token The address of the token that accounting is being done with.
5
+ /// @custom:member decimals The number of decimals expected in that token's fixed point accounting.
6
+ /// @custom:member currency The currency that the token is priced in terms of. By convention, this is
7
+ /// `uint32(uint160(tokenAddress))` for tokens, or a constant ID from e.g. `JBCurrencyIds` for other currencies.
8
+ struct JBAccountingContext {
9
+ address token;
10
+ uint8 decimals;
11
+ uint32 currency;
12
+ }
@@ -0,0 +1,30 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.0;
3
+
4
+ import {JBTokenAmount} from "./JBTokenAmount.sol";
5
+
6
+ /// @custom:member holder The holder of the tokens being cashed out.
7
+ /// @custom:member projectId The ID of the project being cashed out from.
8
+ /// @custom:member rulesetId The ID of the ruleset the cash out is being made during.
9
+ /// @custom:member cashOutCount The number of project tokens being cashed out.
10
+ /// @custom:member cashOutTaxRate The current ruleset's cash out tax rate.
11
+ /// @custom:member reclaimedAmount The token amount being reclaimed from the project's terminal balance. Includes the
12
+ /// token being
13
+ /// reclaimed, the value, the number of decimals included, and the currency of the amount.
14
+ /// @custom:member forwardedAmount The token amount being forwarded to the cash out hook. Includes the token
15
+ /// being forwarded, the value, the number of decimals included, and the currency of the amount.
16
+ /// @custom:member beneficiary The address the reclaimed amount will be sent to.
17
+ /// @custom:member hookMetadata Extra data specified by the data hook, which is sent to the cash out hook.
18
+ /// @custom:member cashOutMetadata Extra data specified by the account cashing out, which is sent to the cash out hook.
19
+ struct JBAfterCashOutRecordedContext {
20
+ address holder;
21
+ uint256 projectId;
22
+ uint256 rulesetId;
23
+ uint256 cashOutCount;
24
+ JBTokenAmount reclaimedAmount;
25
+ JBTokenAmount forwardedAmount;
26
+ uint256 cashOutTaxRate;
27
+ address payable beneficiary;
28
+ bytes hookMetadata;
29
+ bytes cashOutMetadata;
30
+ }