@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,73 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
5
+
6
+ import {JBRuleset} from "./structs/JBRuleset.sol";
7
+ import {JBApprovalStatus} from "./enums/JBApprovalStatus.sol";
8
+ import {IJBRulesetApprovalHook} from "./interfaces/IJBRulesetApprovalHook.sol";
9
+
10
+ /// @notice `JBDeadline` is a ruleset approval hook which rejects rulesets if they are not queued at least `duration`
11
+ /// seconds before the current ruleset ends. In other words, rulesets must be queued before the deadline to take effect.
12
+ /// @dev Project rulesets are stored in a queue. Rulesets take effect after the previous ruleset in the queue ends, and
13
+ /// only if they are approved by the previous ruleset's approval hook.
14
+ contract JBDeadline is IJBRulesetApprovalHook {
15
+ //*********************************************************************//
16
+ // ---------------- public immutable stored properties --------------- //
17
+ //*********************************************************************//
18
+
19
+ /// @notice The minimum number of seconds between the time a ruleset is queued and the time it starts. If the
20
+ /// difference is greater than this number, the ruleset is `Approved`.
21
+ uint256 public immutable override DURATION;
22
+
23
+ //*********************************************************************//
24
+ // -------------------------- constructor ---------------------------- //
25
+ //*********************************************************************//
26
+
27
+ /// @param duration The minimum number of seconds between the time a ruleset is queued and the time it starts for it
28
+ /// to be `Approved`.
29
+ constructor(uint256 duration) {
30
+ DURATION = duration;
31
+ }
32
+
33
+ //*********************************************************************//
34
+ // -------------------------- public views --------------------------- //
35
+ //*********************************************************************//
36
+
37
+ /// @notice The approval status of a given ruleset.
38
+ /// @param ruleset ruleset to check the status of.
39
+ /// @return The ruleset's approval status.
40
+ function approvalStatusOf(
41
+ uint256, /* projectId */
42
+ JBRuleset memory ruleset
43
+ )
44
+ public
45
+ view
46
+ override
47
+ returns (JBApprovalStatus)
48
+ {
49
+ // The ruleset ID is the timestamp at which the ruleset was queued.
50
+ // If the provided `rulesetId` timestamp is after the start timestamp, the ruleset has `Failed`.
51
+ if (ruleset.id > ruleset.start) return JBApprovalStatus.Failed;
52
+
53
+ unchecked {
54
+ // If there aren't enough seconds between the time the ruleset was queued and the time it starts, it has
55
+ // `Failed`.
56
+ // Otherwise, if there is still time before the deadline, the ruleset's status is `ApprovalExpected`.
57
+ // If we've already passed the deadline, the ruleset is `Approved`.
58
+ return (ruleset.start - ruleset.id < DURATION)
59
+ ? JBApprovalStatus.Failed
60
+ : (block.timestamp + DURATION < ruleset.start)
61
+ ? JBApprovalStatus.ApprovalExpected
62
+ : JBApprovalStatus.Approved;
63
+ }
64
+ }
65
+
66
+ /// @notice Indicates whether this contract adheres to the specified interface.
67
+ /// @dev See {IERC165-supportsInterface}.
68
+ /// @param interfaceId The ID of the interface to check for adherence to.
69
+ /// @return A flag indicating if this contract adheres to the specified interface.
70
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
71
+ return interfaceId == type(IJBRulesetApprovalHook).interfaceId || interfaceId == type(IERC165).interfaceId;
72
+ }
73
+ }
@@ -0,0 +1,343 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
5
+ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
6
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
7
+
8
+ import {JBPermissioned} from "./abstract/JBPermissioned.sol";
9
+ import {IJBDirectory} from "./interfaces/IJBDirectory.sol";
10
+ import {IJBDirectoryAccessControl} from "./interfaces/IJBDirectoryAccessControl.sol";
11
+ import {IJBMigratable} from "./interfaces/IJBMigratable.sol";
12
+ import {IJBPermissions} from "./interfaces/IJBPermissions.sol";
13
+ import {IJBProjects} from "./interfaces/IJBProjects.sol";
14
+ import {IJBTerminal} from "./interfaces/IJBTerminal.sol";
15
+
16
+ /// @notice `JBDirectory` tracks the terminals and the controller used by each project.
17
+ /// @dev Tracks which `IJBTerminal`s each project is currently accepting funds through, and which `IJBController` is
18
+ /// managing each project's tokens and rulesets.
19
+ contract JBDirectory is JBPermissioned, Ownable, IJBDirectory {
20
+ //*********************************************************************//
21
+ // --------------------------- custom errors ------------------------- //
22
+ //*********************************************************************//
23
+
24
+ error JBDirectory_DuplicateTerminals(IJBTerminal terminal);
25
+ error JBDirectory_InvalidProjectIdInDirectory(uint256 projectId, uint256 limit);
26
+ error JBDirectory_SetControllerNotAllowed(uint256 projectId);
27
+ error JBDirectory_SetTerminalsNotAllowed(uint256 projectId);
28
+ error JBDirectory_TokenNotAccepted(uint256 projectId, address token, IJBTerminal terminal);
29
+
30
+ //*********************************************************************//
31
+ // ---------------- public immutable stored properties --------------- //
32
+ //*********************************************************************//
33
+
34
+ /// @notice Mints ERC-721s that represent project ownership and transfers.
35
+ IJBProjects public immutable override PROJECTS;
36
+
37
+ //*********************************************************************//
38
+ // --------------------- public stored properties -------------------- //
39
+ //*********************************************************************//
40
+
41
+ /// @notice The specified project's controller, which dictates how its terminals interact with its tokens and
42
+ /// rulesets.
43
+ /// @custom:param projectId The ID of the project to get the controller of.
44
+ mapping(uint256 projectId => IERC165) public override controllerOf;
45
+
46
+ /// @notice Whether the specified address is allowed to set a project's first controller on their behalf.
47
+ /// @dev These addresses/contracts have been vetted by this contract's owner.
48
+ /// @custom:param addr The address to check.
49
+ mapping(address addr => bool) public override isAllowedToSetFirstController;
50
+
51
+ //*********************************************************************//
52
+ // --------------------- internal stored properties ------------------ //
53
+ //*********************************************************************//
54
+
55
+ /// @notice The primary terminal that a project uses for the specified token.
56
+ /// @custom:param projectId The ID of the project to get the primary terminal of.
57
+ /// @custom:param token The token that the terminal accepts.
58
+ mapping(uint256 projectId => mapping(address token => IJBTerminal)) internal _primaryTerminalOf;
59
+
60
+ /// @notice The specified project's terminals.
61
+ /// @custom:param projectId The ID of the project to get the terminals of.
62
+ mapping(uint256 projectId => IJBTerminal[]) internal _terminalsOf;
63
+
64
+ //*********************************************************************//
65
+ // -------------------------- constructor ---------------------------- //
66
+ //*********************************************************************//
67
+
68
+ /// @param permissions A contract storing permissions.
69
+ /// @param projects A contract which mints ERC-721s that represent project ownership and transfers.
70
+ /// @param owner The address that will own the contract.
71
+ constructor(
72
+ IJBPermissions permissions,
73
+ IJBProjects projects,
74
+ address owner
75
+ )
76
+ JBPermissioned(permissions)
77
+ Ownable(owner)
78
+ {
79
+ PROJECTS = projects;
80
+ }
81
+
82
+ //*********************************************************************//
83
+ // ------------------------- external views -------------------------- //
84
+ //*********************************************************************//
85
+
86
+ /// @notice The primary terminal that a project uses for the specified token.
87
+ /// @dev Returns the first terminal that accepts the token if the project hasn't explicitly set a primary terminal
88
+ /// for it.
89
+ /// @dev Returns the zero address if no terminal accepts the token.
90
+ /// @param projectId The ID of the project to get the primary terminal of.
91
+ /// @param token The token that the terminal accepts.
92
+ /// @return The primary terminal's address.
93
+ function primaryTerminalOf(uint256 projectId, address token) external view override returns (IJBTerminal) {
94
+ // Keep a reference to the primary terminal for the provided project ID and token.
95
+ IJBTerminal primaryTerminal = _primaryTerminalOf[projectId][token];
96
+
97
+ // If a primary terminal for the token was explicitly set and it's one of the project's terminals, return it.
98
+ if (
99
+ primaryTerminal != IJBTerminal(address(0))
100
+ && isTerminalOf({projectId: projectId, terminal: primaryTerminal})
101
+ ) {
102
+ return primaryTerminal;
103
+ }
104
+
105
+ // Keep a reference to the project's terminals.
106
+ IJBTerminal[] memory terminals = _terminalsOf[projectId];
107
+
108
+ // Keep a reference to the number of terminals the project has.
109
+ uint256 numberOfTerminals = terminals.length;
110
+
111
+ // Return the first terminal which accepts the specified token.
112
+ for (uint256 i; i < numberOfTerminals; i++) {
113
+ // Keep a reference to the terminal being iterated on.
114
+ IJBTerminal terminal = terminals[i];
115
+
116
+ // If the terminal accepts the specified token, return it.
117
+ // slither-disable-next-line calls-loop
118
+ if (terminal.accountingContextForTokenOf({projectId: projectId, token: token}).token != address(0)) {
119
+ return terminal;
120
+ }
121
+ }
122
+
123
+ // Not found.
124
+ return IJBTerminal(address(0));
125
+ }
126
+
127
+ /// @notice The specified project's terminals.
128
+ /// @param projectId The ID of the project to get the terminals of.
129
+ /// @return An array of the project's terminal addresses.
130
+ function terminalsOf(uint256 projectId) external view override returns (IJBTerminal[] memory) {
131
+ return _terminalsOf[projectId];
132
+ }
133
+
134
+ //*********************************************************************//
135
+ // -------------------------- public views --------------------------- //
136
+ //*********************************************************************//
137
+
138
+ /// @notice Check if a project uses a specific terminal.
139
+ /// @param projectId The ID of the project to check.
140
+ /// @param terminal The terminal to check for.
141
+ /// @return A flag indicating whether the project uses the terminal.
142
+ function isTerminalOf(uint256 projectId, IJBTerminal terminal) public view override returns (bool) {
143
+ // Keep a reference to the project's terminals.
144
+ IJBTerminal[] memory terminals = _terminalsOf[projectId];
145
+
146
+ // Keep a reference to the number of terminals the project has.
147
+ uint256 numberOfTerminals = terminals.length;
148
+
149
+ // Loop through and return true if the terminal is found.
150
+ for (uint256 i; i < numberOfTerminals; i++) {
151
+ if (terminals[i] == terminal) return true;
152
+ }
153
+
154
+ // Otherwise, return false.
155
+ return false;
156
+ }
157
+
158
+ //*********************************************************************//
159
+ // ---------------------- external transactions ---------------------- //
160
+ //*********************************************************************//
161
+
162
+ /// @notice Add or remove an address/contract from a list of trusted addresses which are allowed to set a first
163
+ /// controller for projects.
164
+ /// @dev Only this contract's owner can call this function.
165
+ /// @dev These addresses are vetted controllers as well as contracts designed to launch new projects.
166
+ /// @dev A project can set its own controller without being on this list.
167
+ /// @dev If you would like to add an address/contract to this list, please reach out to this contract's owner.
168
+ /// @param addr The address to allow or not allow.
169
+ /// @param flag Whether the address is allowed to set first controllers for projects. Use `true` to allow and
170
+ /// `false` to not allow.
171
+ function setIsAllowedToSetFirstController(address addr, bool flag) external override onlyOwner {
172
+ // Set the flag in the allowlist.
173
+ isAllowedToSetFirstController[addr] = flag;
174
+
175
+ emit SetIsAllowedToSetFirstController({addr: addr, isAllowed: flag, caller: msg.sender});
176
+ }
177
+
178
+ /// @notice Set a project's controller. Controllers manage how terminals interact with tokens and rulesets.
179
+ /// @dev Can only be called if:
180
+ /// - The ruleset's metadata has `allowSetController` enabled, and the message's sender is the project's owner or an
181
+ /// address with the owner's permission to `SET_CONTROLLER`.
182
+ /// - OR the message's sender is the project's current controller.
183
+ /// - OR an address which `isAllowedToSetFirstController` is setting a project's first controller.
184
+ /// @param projectId The ID of the project whose controller is being set.
185
+ /// @param controller The address of the controller to set.
186
+ function setControllerOf(uint256 projectId, IERC165 controller) external override {
187
+ // Keep a reference to the current controller.
188
+ IERC165 currentController = controllerOf[projectId];
189
+
190
+ // Enforce permissions.
191
+ _requirePermissionAllowingOverrideFrom({
192
+ account: PROJECTS.ownerOf(projectId),
193
+ projectId: projectId,
194
+ permissionId: JBPermissionIds.SET_CONTROLLER,
195
+ alsoGrantAccessIf: (isAllowedToSetFirstController[msg.sender] && address(currentController) == address(0))
196
+ });
197
+
198
+ // The project must exist.
199
+ if (projectId > PROJECTS.count()) revert JBDirectory_InvalidProjectIdInDirectory(projectId, PROJECTS.count());
200
+
201
+ // Get a reference to a flag indicating whether the project is allowed to set its controller.
202
+ // Setting the controller is allowed if the project doesn't have a controller,
203
+ // OR if the caller is the current controller,
204
+ // OR if the project's ruleset allows setting the controller.
205
+ bool allowSetController = address(currentController) == address(0)
206
+ || !currentController.supportsInterface(type(IJBDirectoryAccessControl).interfaceId)
207
+ ? true
208
+ : IJBDirectoryAccessControl(address(currentController)).setControllerAllowed(projectId);
209
+
210
+ // If setting the controller is not allowed, revert.
211
+ if (!allowSetController) {
212
+ revert JBDirectory_SetControllerNotAllowed(projectId);
213
+ }
214
+
215
+ // Prepare the new controller to receive the project.
216
+ if (address(currentController) != address(0) && controller.supportsInterface(type(IJBMigratable).interfaceId)) {
217
+ IJBMigratable(address(controller))
218
+ .beforeReceiveMigrationFrom({from: currentController, projectId: projectId});
219
+ }
220
+
221
+ // Migrate if needed. The old controller's migrate() runs while the directory still points to it,
222
+ // closing the reentrancy window where the directory would point to the new controller during migration.
223
+ if (
224
+ address(currentController) != address(0)
225
+ && currentController.supportsInterface(type(IJBMigratable).interfaceId)
226
+ ) {
227
+ IJBMigratable(address(currentController)).migrate({projectId: projectId, to: controller});
228
+ }
229
+
230
+ // Set the new controller after migration completes.
231
+ // slither-disable-next-line reentrancy-no-eth
232
+ controllerOf[projectId] = controller;
233
+
234
+ emit SetController({projectId: projectId, controller: controller, caller: msg.sender});
235
+
236
+ // Notify the new controller that migration is complete and it is now the active controller.
237
+ if (address(currentController) != address(0) && controller.supportsInterface(type(IJBMigratable).interfaceId)) {
238
+ IJBMigratable(address(controller))
239
+ .afterReceiveMigrationFrom({from: currentController, projectId: projectId});
240
+ }
241
+ }
242
+
243
+ /// @notice Set a project's primary terminal for a token.
244
+ /// @dev The primary terminal for a token is where payments in that token are routed to by default.
245
+ /// @dev This is useful in cases where a project has multiple terminals which accept the same token.
246
+ /// @dev Can only be called by the project's owner, or an address with the owner's permission to
247
+ /// `SET_PRIMARY_TERMINAL`.
248
+ /// @param projectId The ID of the project whose primary terminal is being set.
249
+ /// @param token The token to set the primary terminal for.
250
+ /// @param terminal The terminal being set as the primary terminal.
251
+ function setPrimaryTerminalOf(uint256 projectId, address token, IJBTerminal terminal) external override {
252
+ // Enforce permissions.
253
+ _requirePermissionFrom({
254
+ account: PROJECTS.ownerOf(projectId),
255
+ projectId: projectId,
256
+ permissionId: JBPermissionIds.SET_PRIMARY_TERMINAL
257
+ });
258
+
259
+ // If the terminal doesn't accept the token, revert.
260
+ if (terminal.accountingContextForTokenOf({projectId: projectId, token: token}).token == address(0)) {
261
+ revert JBDirectory_TokenNotAccepted(projectId, token, terminal);
262
+ }
263
+
264
+ // If the terminal hasn't already been added to the project, add it.
265
+ _addTerminalIfNeeded({projectId: projectId, terminal: terminal});
266
+
267
+ // Store the terminal as the project's primary terminal for the token.
268
+ _primaryTerminalOf[projectId][token] = terminal;
269
+
270
+ emit SetPrimaryTerminal({projectId: projectId, token: token, terminal: terminal, caller: msg.sender});
271
+ }
272
+
273
+ /// @notice Set a project's terminals.
274
+ /// @dev Can only be called by the project's owner, an address with the owner's permission to `SET_TERMINALS`, or
275
+ /// the project's controller.
276
+ /// @dev Unless the caller is the project's controller, the project's ruleset must allow setting terminals.
277
+ /// @param projectId The ID of the project whose terminals are being set.
278
+ /// @param terminals An array of terminal addresses to set for the project.
279
+ function setTerminalsOf(uint256 projectId, IJBTerminal[] calldata terminals) external override {
280
+ // Enforce permissions.
281
+ _requirePermissionAllowingOverrideFrom({
282
+ account: PROJECTS.ownerOf(projectId),
283
+ projectId: projectId,
284
+ permissionId: JBPermissionIds.SET_TERMINALS,
285
+ alsoGrantAccessIf: msg.sender == address(controllerOf[projectId])
286
+ });
287
+
288
+ // Keep a reference to the project's controller.
289
+ IERC165 controller = controllerOf[projectId];
290
+
291
+ // Get a reference to the flag indicating whether the project is allowed to set its terminals.
292
+ bool allowSetTerminals = !controller.supportsInterface(type(IJBDirectoryAccessControl).interfaceId)
293
+ || IJBDirectoryAccessControl(address(controller)).setTerminalsAllowed(projectId);
294
+
295
+ // If the caller is not the project's controller, the project's ruleset must allow setting terminals.
296
+ if (msg.sender != address(controllerOf[projectId]) && !allowSetTerminals) {
297
+ revert JBDirectory_SetTerminalsNotAllowed(projectId);
298
+ }
299
+
300
+ // Set the stored terminals for the project.
301
+ _terminalsOf[projectId] = terminals;
302
+
303
+ // If there are any duplicates, revert.
304
+ if (terminals.length > 1) {
305
+ for (uint256 i; i < terminals.length; i++) {
306
+ for (uint256 j = i + 1; j < terminals.length; j++) {
307
+ if (terminals[i] == terminals[j]) revert JBDirectory_DuplicateTerminals(terminals[i]);
308
+ }
309
+ }
310
+ }
311
+ emit SetTerminals({projectId: projectId, terminals: terminals, caller: msg.sender});
312
+ }
313
+
314
+ //*********************************************************************//
315
+ // ------------------------ internal functions ----------------------- //
316
+ //*********************************************************************//
317
+
318
+ /// @notice If a terminal hasn't already been added to a project's list of terminals, add it.
319
+ /// @dev The project's ruleset must have `allowSetTerminals` set to `true`.
320
+ /// @param projectId The ID of the project to add the terminal to.
321
+ /// @param terminal The terminal to add.
322
+ function _addTerminalIfNeeded(uint256 projectId, IJBTerminal terminal) internal {
323
+ // Ensure that the terminal has not already been added.
324
+ if (isTerminalOf({projectId: projectId, terminal: terminal})) return;
325
+
326
+ // Keep a reference to the current controller.
327
+ IERC165 controller = controllerOf[projectId];
328
+
329
+ // Get a reference to a flag indicating whether the project is allowed to set its terminals.
330
+ bool allowSetTerminals = !controller.supportsInterface(type(IJBDirectoryAccessControl).interfaceId)
331
+ || IJBDirectoryAccessControl(address(controller)).setTerminalsAllowed(projectId);
332
+
333
+ // The project's ruleset must allow setting terminals.
334
+ if (!allowSetTerminals) {
335
+ revert JBDirectory_SetTerminalsNotAllowed(projectId);
336
+ }
337
+
338
+ // Add the new terminal.
339
+ _terminalsOf[projectId].push(terminal);
340
+
341
+ emit AddTerminal({projectId: projectId, terminal: terminal, caller: msg.sender});
342
+ }
343
+ }
@@ -0,0 +1,131 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
5
+ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
6
+ import {ERC20Permit, Nonces} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
7
+ import {ERC20Votes} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
8
+ import {Nonces} from "@openzeppelin/contracts/utils/Nonces.sol";
9
+
10
+ import {IJBToken} from "./interfaces/IJBToken.sol";
11
+
12
+ /// @notice An ERC-20 token that can be used by a project in `JBTokens` and `JBController`.
13
+ /// @dev By default, a project uses "credits" to track balances. Once a project sets their `IJBToken` using
14
+ /// `JBController.deployERC20For(...)` or `JBController.setTokenFor(...)`, credits can be redeemed to claim tokens.
15
+ /// @dev `JBController.deployERC20For(...)` deploys a `JBERC20` contract and sets it as the project's token.
16
+ contract JBERC20 is ERC20Votes, ERC20Permit, Ownable, IJBToken {
17
+ //*********************************************************************//
18
+ // --------------------------- custom errors ------------------------- //
19
+ //*********************************************************************//
20
+
21
+ error JBERC20_AlreadyInitialized();
22
+
23
+ //*********************************************************************//
24
+ // --------------------- internal stored properties ------------------ //
25
+ //*********************************************************************//
26
+
27
+ /// @notice The token's name.
28
+ // slither-disable-next-line shadowing-state
29
+ string private _name;
30
+
31
+ /// @notice The token's symbol.
32
+ // slither-disable-next-line shadowing-state
33
+ string private _symbol;
34
+
35
+ //*********************************************************************//
36
+ // -------------------------- constructor ---------------------------- //
37
+ //*********************************************************************//
38
+
39
+ constructor() Ownable(address(this)) ERC20("invalid", "invalid") ERC20Permit("JBToken") {}
40
+
41
+ //*********************************************************************//
42
+ // -------------------------- public views --------------------------- //
43
+ //*********************************************************************//
44
+
45
+ /// @notice The balance of the given address.
46
+ /// @param account The account to get the balance of.
47
+ /// @return The number of tokens owned by the `account`, as a fixed point number with 18 decimals.
48
+ function balanceOf(address account) public view override(ERC20, IJBToken) returns (uint256) {
49
+ return super.balanceOf(account);
50
+ }
51
+
52
+ /// @notice This token can only be added to a project when its created by the `JBTokens` contract.
53
+ function canBeAddedTo(uint256) external pure override returns (bool) {
54
+ return false;
55
+ }
56
+
57
+ /// @notice The number of decimals used for this token's fixed point accounting.
58
+ /// @return The number of decimals.
59
+ function decimals() public view override(ERC20, IJBToken) returns (uint8) {
60
+ return super.decimals();
61
+ }
62
+
63
+ /// @notice The token's name.
64
+ function name() public view virtual override returns (string memory) {
65
+ return _name;
66
+ }
67
+
68
+ /// @notice The token's symbol.
69
+ function symbol() public view virtual override returns (string memory) {
70
+ return _symbol;
71
+ }
72
+
73
+ /// @notice The total supply of this ERC20 i.e. the total number of tokens in existence.
74
+ /// @return The total supply of this ERC20, as a fixed point number.
75
+ function totalSupply() public view override(ERC20, IJBToken) returns (uint256) {
76
+ return super.totalSupply();
77
+ }
78
+
79
+ //*********************************************************************//
80
+ // ---------------------- external transactions ---------------------- //
81
+ //*********************************************************************//
82
+
83
+ /// @notice Burn some outstanding tokens.
84
+ /// @dev Can only be called by this contract's owner.
85
+ /// @param account The address to burn tokens from.
86
+ /// @param amount The amount of tokens to burn, as a fixed point number with 18 decimals.
87
+ function burn(address account, uint256 amount) external override onlyOwner {
88
+ return _burn(account, amount);
89
+ }
90
+
91
+ /// @notice Mints more of this token.
92
+ /// @dev Can only be called by this contract's owner.
93
+ /// @param account The address to mint the new tokens to.
94
+ /// @param amount The amount of tokens to mint, as a fixed point number with 18 decimals.
95
+ function mint(address account, uint256 amount) external override onlyOwner {
96
+ return _mint(account, amount);
97
+ }
98
+
99
+ //*********************************************************************//
100
+ // ----------------------- public transactions ----------------------- //
101
+ //*********************************************************************//
102
+
103
+ /// @notice Initializes the token.
104
+ /// @param name_ The token's name.
105
+ /// @param symbol_ The token's symbol.
106
+ /// @param owner The token contract's owner.
107
+ function initialize(string memory name_, string memory symbol_, address owner) public override {
108
+ // Prevent re-initialization by reverting if a name is already set or if the provided name is empty.
109
+ if (bytes(_name).length != 0 || bytes(name_).length == 0) revert JBERC20_AlreadyInitialized();
110
+
111
+ _name = name_;
112
+ _symbol = symbol_;
113
+
114
+ // Transfer ownership to the owner.
115
+ _transferOwnership(owner);
116
+ }
117
+
118
+ /// @notice Required override.
119
+ function nonces(address owner) public view virtual override(ERC20Permit, Nonces) returns (uint256) {
120
+ return super.nonces(owner);
121
+ }
122
+
123
+ //*********************************************************************//
124
+ // ------------------------ internal functions ----------------------- //
125
+ //*********************************************************************//
126
+
127
+ /// @notice Required override.
128
+ function _update(address from, address to, uint256 value) internal virtual override(ERC20, ERC20Votes) {
129
+ super._update(from, to, value);
130
+ }
131
+ }
@@ -0,0 +1,54 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
5
+ import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
6
+
7
+ import {IJBFeelessAddresses} from "./interfaces/IJBFeelessAddresses.sol";
8
+
9
+ /// @notice Stores a list of addresses that shouldn't incur fees when sending or receiving payments.
10
+ contract JBFeelessAddresses is Ownable, IJBFeelessAddresses, IERC165 {
11
+ //*********************************************************************//
12
+ // --------------------- public stored properties -------------------- //
13
+ //*********************************************************************//
14
+
15
+ /// @notice Check if the specified address is feeless.
16
+ /// @dev Feeless addresses can receive payouts without incurring a fee.
17
+ /// @dev Feeless addresses can use the surplus allowance without incurring a fee.
18
+ /// @dev Feeless addresses can be the beneficiary of cash outs without incurring a fee.
19
+ /// @custom:param addr The address to check.
20
+ mapping(address addr => bool) public override isFeeless;
21
+
22
+ //*********************************************************************//
23
+ // -------------------------- constructor ---------------------------- //
24
+ //*********************************************************************//
25
+
26
+ /// @param owner This contract's owner.
27
+ constructor(address owner) Ownable(owner) {}
28
+
29
+ //*********************************************************************//
30
+ // -------------------------- public views --------------------------- //
31
+ //*********************************************************************//
32
+
33
+ /// @notice Indicates whether this contract adheres to the specified interface.
34
+ /// @dev See {IERC165-supportsInterface}.
35
+ /// @param interfaceId The ID of the interface to check for adherence to.
36
+ /// @return A flag indicating if the provided interface ID is supported.
37
+ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
38
+ return interfaceId == type(IJBFeelessAddresses).interfaceId || interfaceId == type(IERC165).interfaceId;
39
+ }
40
+
41
+ //*********************************************************************//
42
+ // ---------------------- external transactions ---------------------- //
43
+ //*********************************************************************//
44
+
45
+ /// @notice Sets whether an address is feeless.
46
+ /// @dev Can only be called by this contract's owner.
47
+ /// @param addr The address to set as feeless or not feeless.
48
+ /// @param flag Whether the address should be feeless (`true`) or not feeless (`false`).
49
+ function setFeelessAddress(address addr, bool flag) external virtual override onlyOwner {
50
+ isFeeless[addr] = flag;
51
+
52
+ emit SetFeelessAddress({addr: addr, isFeeless: flag, caller: _msgSender()});
53
+ }
54
+ }