@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,127 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity ^0.8.6;
3
+
4
+ import "forge-std/Test.sol";
5
+ import {JBConstants} from "../../../src/libraries/JBConstants.sol";
6
+ import {IJBMultiTerminal} from "../../../src/interfaces/IJBMultiTerminal.sol";
7
+ import {IJBController} from "../../../src/interfaces/IJBController.sol";
8
+ import {IJBTokens} from "../../../src/interfaces/IJBTokens.sol";
9
+ import {IJBToken} from "../../../src/interfaces/IJBToken.sol";
10
+
11
+ /// @notice Handler contract for JBTokens invariant testing.
12
+ /// @dev Drives mint, burn, claim, and transfer operations; tracks holders for sum-of-balances checks.
13
+ contract TokensHandler is Test {
14
+ IJBMultiTerminal public terminal;
15
+ IJBController public controller;
16
+ IJBTokens public tokens;
17
+
18
+ uint256 public projectId;
19
+ address public projectOwner;
20
+
21
+ // Track all unique holders for sum-of-balances invariant
22
+ address[] public holders;
23
+ mapping(address => bool) public isHolder;
24
+
25
+ uint256 public constant NUM_ACTORS = 5;
26
+
27
+ constructor(
28
+ IJBMultiTerminal _terminal,
29
+ IJBController _controller,
30
+ IJBTokens _tokens,
31
+ uint256 _projectId,
32
+ address _projectOwner
33
+ ) {
34
+ terminal = _terminal;
35
+ controller = _controller;
36
+ tokens = _tokens;
37
+ projectId = _projectId;
38
+ projectOwner = _projectOwner;
39
+ }
40
+
41
+ function _getActor(uint256 seed) internal pure returns (address) {
42
+ return address(uint160(0x2000 + (seed % NUM_ACTORS)));
43
+ }
44
+
45
+ function _trackHolder(address holder) internal {
46
+ if (!isHolder[holder]) {
47
+ isHolder[holder] = true;
48
+ holders.push(holder);
49
+ }
50
+ }
51
+
52
+ function holderCount() external view returns (uint256) {
53
+ return holders.length;
54
+ }
55
+
56
+ function holderAt(uint256 i) external view returns (address) {
57
+ return holders[i];
58
+ }
59
+
60
+ /// @notice Pay the project to mint tokens for an actor.
61
+ function mintTokens(uint256 actorSeed, uint256 amount) public {
62
+ amount = bound(amount, 0.01 ether, 50 ether);
63
+ address actor = _getActor(actorSeed);
64
+ _trackHolder(actor);
65
+
66
+ vm.deal(actor, amount);
67
+ vm.prank(actor);
68
+ terminal.pay{value: amount}({
69
+ projectId: projectId,
70
+ amount: amount,
71
+ token: JBConstants.NATIVE_TOKEN,
72
+ beneficiary: actor,
73
+ minReturnedTokens: 0,
74
+ memo: "",
75
+ metadata: new bytes(0)
76
+ });
77
+ }
78
+
79
+ /// @notice Burn tokens from an actor.
80
+ function burnTokens(uint256 actorSeed, uint256 burnPercent) public {
81
+ address actor = _getActor(actorSeed);
82
+ uint256 balance = tokens.totalBalanceOf(actor, projectId);
83
+ if (balance == 0) return;
84
+
85
+ burnPercent = bound(burnPercent, 1, 100);
86
+ uint256 burnCount = (balance * burnPercent) / 100;
87
+ if (burnCount == 0) return;
88
+
89
+ vm.prank(actor);
90
+ controller.burnTokensOf({holder: actor, projectId: projectId, tokenCount: burnCount, memo: ""});
91
+ }
92
+
93
+ /// @notice Claim credits as ERC20 tokens.
94
+ function claimCredits(uint256 actorSeed, uint256 claimPercent) public {
95
+ address actor = _getActor(actorSeed);
96
+ uint256 creditBalance = tokens.creditBalanceOf(actor, projectId);
97
+ if (creditBalance == 0) return;
98
+
99
+ claimPercent = bound(claimPercent, 1, 100);
100
+ uint256 claimCount = (creditBalance * claimPercent) / 100;
101
+ if (claimCount == 0) return;
102
+
103
+ vm.prank(actor);
104
+ controller.claimTokensFor({holder: actor, projectId: projectId, tokenCount: claimCount, beneficiary: actor});
105
+ }
106
+
107
+ /// @notice Transfer credits between actors.
108
+ function transferCredits(uint256 fromSeed, uint256 toSeed, uint256 transferPercent) public {
109
+ address from = _getActor(fromSeed);
110
+ address to = _getActor(toSeed);
111
+ if (from == to) return;
112
+
113
+ uint256 creditBalance = tokens.creditBalanceOf(from, projectId);
114
+ if (creditBalance == 0) return;
115
+
116
+ transferPercent = bound(transferPercent, 1, 100);
117
+ uint256 transferCount = (creditBalance * transferPercent) / 100;
118
+ if (transferCount == 0) return;
119
+
120
+ _trackHolder(to);
121
+
122
+ vm.prank(from);
123
+ controller.transferCreditsFrom({holder: from, projectId: projectId, recipient: to, creditCount: transferCount});
124
+ }
125
+
126
+ receive() external payable {}
127
+ }
@@ -0,0 +1,37 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity >=0.8.6;
3
+
4
+ import {ERC2771Forwarder} from "@openzeppelin/contracts/metatx/ERC2771Forwarder.sol";
5
+
6
+ struct ForwardRequest {
7
+ address from;
8
+ address to;
9
+ uint256 value;
10
+ uint256 gas;
11
+ uint256 nonce;
12
+ uint48 deadline;
13
+ bytes data;
14
+ }
15
+
16
+ contract ERC2771ForwarderMock is ERC2771Forwarder {
17
+ bool public deployed = true;
18
+
19
+ constructor(string memory name) ERC2771Forwarder(name) {}
20
+
21
+ function structHash(ForwardRequest calldata request) external view returns (bytes32) {
22
+ return _hashTypedDataV4(
23
+ keccak256(
24
+ abi.encode(
25
+ _FORWARD_REQUEST_TYPEHASH,
26
+ request.from,
27
+ request.to,
28
+ request.value,
29
+ request.gas,
30
+ request.nonce,
31
+ request.deadline,
32
+ keccak256(request.data)
33
+ )
34
+ )
35
+ );
36
+ }
37
+ }
@@ -0,0 +1,18 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../helpers/TestBaseWorkflow.sol";
5
+
6
+ import {ERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
7
+
8
+ contract MockERC20 is ERC20 {
9
+ function decimals() public view virtual override returns (uint8) {
10
+ return 6;
11
+ }
12
+
13
+ constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {}
14
+
15
+ function mint(address _to, uint256 _amount) external {
16
+ _mint(_to, _amount);
17
+ }
18
+ }
@@ -0,0 +1,67 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../helpers/TestBaseWorkflow.sol";
5
+ import {IJBMultiTerminal} from "../../src/interfaces/IJBMultiTerminal.sol";
6
+ import {JBMultiTerminal} from "../../src/JBMultiTerminal.sol";
7
+ import {JBConstants} from "../../src/libraries/JBConstants.sol";
8
+ import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
9
+
10
+ /// @notice Used for tests in TestAccessToFunds.sol
11
+ /// @dev Attempts to re-enter sendPayoutsOf after receiving control-flow.
12
+ contract MaliciousPayoutBeneficiary is IERC721Receiver, Test {
13
+ function reEnter(address _terminal) internal {
14
+ vm.expectRevert(
15
+ abi.encodeWithSelector(
16
+ JBTerminalStore.JBTerminalStore_InadequateControllerPayoutLimit.selector, 1.5e19, 10 * 10 ** 18
17
+ )
18
+ );
19
+
20
+ IJBMultiTerminal(_terminal)
21
+ .sendPayoutsOf({
22
+ projectId: 2,
23
+ amount: 5 * 10 ** 18,
24
+ currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
25
+ token: JBConstants.NATIVE_TOKEN,
26
+ minTokensPaidOut: 0
27
+ });
28
+ }
29
+
30
+ receive() external payable {
31
+ if (msg.value > 0) reEnter(address(msg.sender));
32
+ }
33
+
34
+ function onERC721Received(address, address, uint256, bytes calldata) external pure override returns (bytes4) {
35
+ return IERC721Receiver.onERC721Received.selector;
36
+ }
37
+ }
38
+
39
+ /// @notice Used for tests in TestAccessToFunds.sol
40
+ /// @dev Attempts to re-enter useAllowanceOf after receiving control-flow.
41
+ contract MaliciousAllowanceBeneficiary is IERC721Receiver, Test {
42
+ function reEnter(address _terminal) internal {
43
+ vm.expectRevert(
44
+ abi.encodeWithSelector(JBTerminalStore.JBTerminalStore_InadequateControllerAllowance.selector, 1e19, 5e18)
45
+ );
46
+
47
+ IJBMultiTerminal(_terminal)
48
+ .useAllowanceOf({
49
+ projectId: 2,
50
+ amount: 5 * 10 ** 18,
51
+ currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
52
+ token: JBConstants.NATIVE_TOKEN,
53
+ minTokensPaidOut: 0,
54
+ beneficiary: payable(address(this)),
55
+ feeBeneficiary: payable(0x000000000000000000000000000000000000007B),
56
+ memo: "MEMO"
57
+ });
58
+ }
59
+
60
+ receive() external payable {
61
+ if (msg.value > 0) reEnter(address(msg.sender));
62
+ }
63
+
64
+ function onERC721Received(address, address, uint256, bytes calldata) external pure override returns (bytes4) {
65
+ return IERC721Receiver.onERC721Received.selector;
66
+ }
67
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../helpers/TestBaseWorkflow.sol";
5
+
6
+ import {ERC165, IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
7
+
8
+ contract MockMaliciousSplitHook is ERC165, IJBSplitHook {
9
+ error NopeNotGonnaDoIt();
10
+
11
+ uint256 revertMode;
12
+
13
+ function processSplitWith(JBSplitHookContext calldata _context) external payable override {
14
+ _context;
15
+ if (revertMode == 0) {
16
+ revert();
17
+ } else if (revertMode == 1) {
18
+ revert NopeNotGonnaDoIt();
19
+ } else if (revertMode == 2) {
20
+ require(false, "thanks no thanks");
21
+ } else {
22
+ uint256 a = 3;
23
+ uint256 b = 6;
24
+ uint256 c = a - b;
25
+ c;
26
+ }
27
+ }
28
+
29
+ function setRevertMode(uint256 _newMode) external {
30
+ revertMode = _newMode;
31
+ }
32
+
33
+ function supportsInterface(bytes4 _interfaceId) public view override(IERC165, ERC165) returns (bool) {
34
+ return _interfaceId == type(IJBSplitHook).interfaceId || super.supportsInterface(_interfaceId);
35
+ }
36
+ }
37
+
38
+ contract GasGussler {
39
+ fallback() external payable {
40
+ while (true) {}
41
+ }
42
+ }
@@ -0,0 +1,20 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../helpers/TestBaseWorkflow.sol";
5
+
6
+ contract MockPriceFeed is IJBPriceFeed {
7
+ uint256 public fakePrice;
8
+ uint256 public fakeDecimals;
9
+
10
+ constructor(uint256 _fakePrice, uint256 _fakeDecimals) {
11
+ fakePrice = _fakePrice;
12
+ fakeDecimals = _fakeDecimals;
13
+ }
14
+
15
+ function currentUnitPrice(uint256 _decimals) external view override returns (uint256 _quote) {
16
+ if (_decimals == fakeDecimals) return fakePrice;
17
+ else if (_decimals > fakeDecimals) return fakePrice * 10 ** (_decimals - fakeDecimals);
18
+ else return fakePrice / 10 ** (fakeDecimals - _decimals);
19
+ }
20
+ }
@@ -0,0 +1,9 @@
1
+ TestBurnTokensOf_Local
2
+ ├── when caller is not permissioned or terminal
3
+ │ └── it should revert UNAUTHORIZED()
4
+ ├── when caller is terminal and tokenCount gt zero
5
+ │ └── it should burn and emit BurnTokens
6
+ ├── when caller has permission and tokenCount gt zero
7
+ │ └── it should burn and emit BurnTokens
8
+ └── when tokenCount eq zero
9
+ └── it should revert NO_BURNABLE_TOKENS
@@ -0,0 +1,5 @@
1
+ TestClaimTokensFor_Local
2
+ ├── when caller is permissioned
3
+ │ └── it should call JBTokens to claim on behalf of holder
4
+ └── when caller is not permissioned
5
+ └── it should revert UNAUTHORIZED
@@ -0,0 +1,5 @@
1
+ TestDeployERC20For_Local
2
+ ├── when caller is permissioned
3
+ │ └── it will deploy ERC20 and return IJBToken
4
+ └── when caller is not permissioned
5
+ └── it will revert UNAUTHORIZED
@@ -0,0 +1,5 @@
1
+ TestGetRulesetOf
2
+ ├── when rulesetId is zero
3
+ │ └── it should return empty ruleset and metadata
4
+ └── when rulesetID is non-zero
5
+ └── it should return populated ruleset and metadata
@@ -0,0 +1,12 @@
1
+ TestLaunchProjectFor_Local
2
+ └── when called
3
+ ├── given metadata is provided
4
+ │ └── it will set metadata
5
+ ├── given rulesets are provided
6
+ │ └── it will set rulesets
7
+ ├── given terminals are provided
8
+ │ └── it will set terminals
9
+ ├── given memo is provided
10
+ │ └── it will be included in the emit
11
+ └── given Directory exists
12
+ └── it will setControllerOf to itself
@@ -0,0 +1,8 @@
1
+ TestLaunchRulesetsFor
2
+ ├── when caller does not have permission
3
+ │ └── it should revert
4
+ └── when caller has permission
5
+ ├── given the project already has rulesets
6
+ │ └── it should revert
7
+ └── given the project does not yet have rulesets
8
+ └── it should set the controller, queue the rulesets, configure terminals, and emit LaunchRulesets
@@ -0,0 +1,12 @@
1
+ TestMigrateController
2
+ ├── when caller does not have MIGRATE_CONTROLLER permission
3
+ │ └── it should revert
4
+ └── when caller has MIGRATE_CONTROLLER permission
5
+ ├── given migration is not allowed by ruleset
6
+ │ └── it should revert
7
+ └── given migration is allowed by ruleset
8
+ ├── given reserved token balance is pending
9
+ │ └── it should send reserved tokens to splits
10
+ └── given no reserved token balance is pending
11
+ ├── it should prepare new controller for migration
12
+ └── it should emit MigrateController event
@@ -0,0 +1,12 @@
1
+ TestMintTokensOf_Local
2
+ ├── when no ruleset is active
3
+ │ └── it should be able to mint
4
+ ├── when minting is disabled in the funding cycle ruleset
5
+ │ └── it should revert
6
+ └── when minting is enabled in the funding cycle ruleset
7
+ ├── given that there are tokens available to mint
8
+ │ └── it should be possible to mint
9
+ ├── given that a data source is configured
10
+ │ └── it should be able to mint
11
+ └── given that a data source has permissioned another contract to mint
12
+ └── it should be able to mint
@@ -0,0 +1,8 @@
1
+ TestExecutePayReservedTokenToTerminal_Local
2
+ ├── when caller is not itself
3
+ │ └── it will revert
4
+ └── when caller is itself
5
+ ├── given allowance EQ zero after pay
6
+ │ └── it will not revert
7
+ └── given allowance DNEQ zero after pay
8
+ └── it will revert
@@ -0,0 +1,4 @@
1
+ TestReceiveMigrationFrom
2
+ └── when caller supports the correct interface
3
+ └── given that the caller is also controllerOf projectId
4
+ └── it should set metadata
@@ -0,0 +1,12 @@
1
+ TestSendReservedTokensToSplitsOf_Local
2
+ ├── when the project has no reserved token splits
3
+ │ └── it will mint to the project owner
4
+ └── when the project has reserved token splits
5
+ ├── given a hook is configured
6
+ │ └── it will mint to hook and call its processSplitWith function
7
+ ├── given a beneficiary is configured
8
+ │ └── it will mint for the beneficiary
9
+ ├── given the projectId of split is nonzero and a beneficiary and hook are not configured
10
+ │ └── it will mint to the owner of the project
11
+ └── given projectId is zero and nothing is configured
12
+ └── it will mint to whoever called sendReservedTokens
@@ -0,0 +1,5 @@
1
+ TestSetMetadataOf_Local
2
+ ├── when caller is owner or has permission
3
+ │ └── it should set metadata and emit SetMetadata
4
+ └── when caller is not owner or has permission
5
+ └── it should revert
@@ -0,0 +1,5 @@
1
+ TestSetSplitGroupsOf_Local
2
+ ├── when caller is permissioned
3
+ │ └── it will set splits
4
+ └── when caller is not permissioned
5
+ └── it will revert UNAUTHORIZED
@@ -0,0 +1,5 @@
1
+ TestSetTokenFor_Local
2
+ ├── when caller is permissioned
3
+ │ └── it will set token
4
+ └── when caller is not permissioned
5
+ └── it will revert UNAUTHORIZED
@@ -0,0 +1,8 @@
1
+ TestTransferCreditsFrom_Local
2
+ ├── when caller is permissioned
3
+ │ ├── given ruleset allows credit transfers
4
+ │ │ └── it will call JBTokens to transfer the credits
5
+ │ └── given ruleset does not allow credit transfers
6
+ │ └── it will revert CREDIT_TRANSFERS_PAUSED
7
+ └── when caller is not permissioned
8
+ └── it will revert UNAUTHORIZED
@@ -0,0 +1,8 @@
1
+ TestPrimaryTerminalOf_Local
2
+ ├── when there are no terminals supporting the input token
3
+ │ └── it will return the zero address
4
+ └── when there is at least one supporting terminal
5
+ ├── given there are multiple terminals with proper accountingContextForTokenOf
6
+ │ └── it will check each terminals accountingContextForTokenOf and return the first
7
+ └── given there are multiple terminals but none with the proper accountingContextForTokenOf
8
+ └── it will return the zero address
@@ -0,0 +1,11 @@
1
+ TestSetControllerOf_Local
2
+ ├── when caller does not have any permission
3
+ │ └── it should revert
4
+ └── when caller isAllowedToSetFirstController or has permission
5
+ ├── given that a project doesn't exist
6
+ │ └── it should revert
7
+ └── given that the project exists
8
+ ├── given that the current controller is not setControllerAllowed
9
+ │ └── it should revert
10
+ └── given that the current controller is setControllerAllowed
11
+ └── it should set controllerOf and emit SetController
@@ -0,0 +1,15 @@
1
+ TestSetPrimaryTerminalOf_Local
2
+ ├── when caller has no permission
3
+ │ └── it should revert with UNAUTHORIZED()
4
+ └── when caller has permission
5
+ ├── given that there is no accountingContextForTokenOf
6
+ │ └── it should revert with TOKEN_NOT_ACCEPTED
7
+ └── given that there is an accountingContextForTokenOf
8
+ ├── given that the terminal has already been added
9
+ │ └── it should not add the terminal
10
+ └── given that the terminal has not been added
11
+ ├── given that the project is not allowed to set terminals
12
+ │ └── it should revert with SET_TERMINALS_NOT_ALLOWED
13
+ └── given that the project is allowed to set terminals
14
+ ├── it should set the terminal and emit AddTerminal
15
+ └── it should set the terminal as primary and emit SetPrimaryTerminal
@@ -0,0 +1,11 @@
1
+ TestSetTerminalsOf_Local
2
+ ├── when caller has no permission
3
+ │ └── it should revert with UNAUTHORIZED()
4
+ └── when caller has permission
5
+ ├── given that not setTerminalsAllowed
6
+ │ └── it should revert with revert SET_TERMINALS_NOT_ALLOWED()
7
+ └── given that setTerminalsAllowed
8
+ ├── given that duplicate terminals were added
9
+ │ └── it should revert with DUPLICATE_TERMINALS()
10
+ └── given that duplicate terminals were not added
11
+ └── it should set terminals and emit SetTerminals
@@ -0,0 +1,7 @@
1
+ TestInitialize_Local
2
+ ├── when a name is already set
3
+ │ └── it will revert
4
+ ├── when name_ EQ nothing
5
+ │ └── it will revert
6
+ └── when name is valid and not already set
7
+ └── it will set the name and symbol and transfer ownership
@@ -0,0 +1,5 @@
1
+ TestName_Local
2
+ ├── When a name is set
3
+ │ └── it will return the name
4
+ └── When a name is not set
5
+ └── it will return an empty string
@@ -0,0 +1,5 @@
1
+ TestNonces_Local
2
+ ├── When a user has not called permit
3
+ │ └── it will return zero
4
+ └── When a user has called permit
5
+ └── it will return a nonce GT zero
@@ -0,0 +1,5 @@
1
+ TestSymbol_Local
2
+ ├── When a symbol is set
3
+ │ └── it will return a non-empty string
4
+ └── When a symbol is not set
5
+ └── it will return an empty string
@@ -0,0 +1,5 @@
1
+ TestSetFeelessAddress_Local
2
+ ├── when caller is owner
3
+ │ └── it should set isFeeless and emit SetFeelessAddress
4
+ └── when caller is not owner
5
+ └── it should revert
@@ -0,0 +1,5 @@
1
+ TestSupportsInterface_Local
2
+ ├── when it supports either IJBFeelessAddresses or IERC165
3
+ │ └── it should return true
4
+ └── when it doesnt support either IJBFeelessAddresses or IERC165
5
+ └── it should return false
@@ -0,0 +1,5 @@
1
+ TestPayoutLimitOf_Local
2
+ ├── when the project has the specific payout limit
3
+ │ └── it will return the uint256 payoutLimit
4
+ └── when the project doesnt have the specific payout limit
5
+ └── it will return 0
@@ -0,0 +1,8 @@
1
+ TestPayoutLimitsOf_Local
2
+ └── when a project has payout limits
3
+ ├── given they are configured for a specific token
4
+ │ └── it will return them
5
+ ├── given they are configured for a specific terminal
6
+ │ └── it will return them
7
+ └── given they are configured for a specific rulesetId
8
+ └── it will return them
@@ -0,0 +1,18 @@
1
+ TestSetFundAccessLimitsFor_Local
2
+ ├── when caller is not controller
3
+ │ └── it will revert
4
+ └── when caller is controller of project
5
+ ├── given payoutLimit amount is gt uint224
6
+ │ └── it will revert INVALID_PAYOUT_LIMIT
7
+ ├── given payoutLimit currency is gt uint32
8
+ │ └── it will revert INVALID_PAYOUT_LIMIT_CURRENCY
9
+ ├── given payoutLimit currency is not given in ascending order
10
+ │ └── it will revert INVALID_PAYOUT_LIMIT_CURRENCY_ORDERING
11
+ ├── given surplusAllowance amount gt uint224
12
+ │ └── it will revert INVALID_SURPLUS_ALLOWANCE
13
+ ├── given surplusAllowance currency gt uint32
14
+ │ └── it will revert INVALID_PAYOUT_LIMIT_CURRENCY
15
+ ├── given surplus allowance currencies are not ascending order
16
+ │ └── it will revert INVALID_SURPLUS_ALLOWANCE_CURRENCY_ORDERING
17
+ └── given valid config
18
+ └── it will set packed properties and emit SetFundAccessLimits
@@ -0,0 +1,5 @@
1
+ TestSurplusAllowanceOf_Local
2
+ ├── when a project has the specific surplus configured
3
+ │ └── it will return uin256 surplusAllowance
4
+ └── when it doesnt have the specific surplus configured
5
+ └── it will return 0
@@ -0,0 +1,8 @@
1
+ TestSurplusAllowancesOf_Local
2
+ └── when a project has specified surplus allowances
3
+ ├── given they are specified for a specific ruleset
4
+ │ └── it will return them
5
+ ├── given they are specified for a specific terminal
6
+ │ └── it will return them
7
+ └── given they are specified for a specific token
8
+ └── it will return them
@@ -0,0 +1,8 @@
1
+ TestGetDataFor_Local
2
+ ├── when metadata length LTEQ MIN_METADATA_LENGTH
3
+ │ └── it will return false and empty bytes
4
+ └── when metadata length GT MIN_METADATA_LENGTH
5
+ ├── given id is found
6
+ │ └── it will return found EQ true and targetData
7
+ └── given id is not found
8
+ └── it will return found EQ false and empty bytes targetData
@@ -0,0 +1,5 @@
1
+ TestAccountingContextsFor_Local
2
+ ├── when accounting contexts are set
3
+ │ └── it will return contexts
4
+ └── when accounting contexts are not set
5
+ └── it will return an empty array
@@ -0,0 +1,10 @@
1
+ TestAddAccountingContextsFor_Local
2
+ ├── when caller is not permissioned
3
+ │ └── it will revert UNAUTHORIZED
4
+ ├── when caller is permissioned
5
+ │ ├── given the context is already set
6
+ │ │ └── it will revert ACCOUNTING_CONTEXT_ALREADY_SET
7
+ │ └── given happypath
8
+ │ └── it will set the context and emit SetAccountingContext
9
+ └── when caller is controller
10
+ └── it will alsoGrantAccess