@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,220 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBChainlinkV3PriceFeed} from "../../../../src/JBChainlinkV3PriceFeed.sol";
6
+ import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
7
+ import {JBFixedPointNumber} from "../../../../src/libraries/JBFixedPointNumber.sol";
8
+
9
+ /// @notice Mock Chainlink AggregatorV3Interface for testing.
10
+ contract MockAggregator {
11
+ int256 public price;
12
+ uint8 public decimals_;
13
+ uint256 public updatedAt_;
14
+ uint80 public roundId_;
15
+
16
+ function setPrice(int256 _price) external {
17
+ price = _price;
18
+ }
19
+
20
+ function setDecimals(uint8 _decimals) external {
21
+ decimals_ = _decimals;
22
+ }
23
+
24
+ function setUpdatedAt(uint256 _updatedAt) external {
25
+ updatedAt_ = _updatedAt;
26
+ }
27
+
28
+ function setRoundId(uint80 _roundId) external {
29
+ roundId_ = _roundId;
30
+ }
31
+
32
+ function decimals() external view returns (uint8) {
33
+ return decimals_;
34
+ }
35
+
36
+ function latestRoundData()
37
+ external
38
+ view
39
+ returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
40
+ {
41
+ return (roundId_, price, block.timestamp, updatedAt_, roundId_);
42
+ }
43
+ }
44
+
45
+ /// @notice Tests for JBChainlinkV3PriceFeed.
46
+ contract TestPriceFeed_Local is JBTest {
47
+ using JBFixedPointNumber for uint256;
48
+
49
+ MockAggregator mockFeed;
50
+ JBChainlinkV3PriceFeed priceFeed;
51
+
52
+ uint256 constant THRESHOLD = 1 hours;
53
+
54
+ function setUp() external {
55
+ mockFeed = new MockAggregator();
56
+ mockFeed.setDecimals(8);
57
+ mockFeed.setPrice(200_000_000_000); // $2000 with 8 decimals
58
+ mockFeed.setUpdatedAt(block.timestamp);
59
+ mockFeed.setRoundId(1);
60
+
61
+ priceFeed = new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(mockFeed)), THRESHOLD);
62
+ }
63
+
64
+ //*********************************************************************//
65
+ // --- Normal Operation --------------------------------------------- //
66
+ //*********************************************************************//
67
+
68
+ /// @notice Price is returned correctly with same decimals as feed.
69
+ function test_normalPrice_sameDecimals() external view {
70
+ uint256 price = priceFeed.currentUnitPrice(8);
71
+ assertEq(price, 200_000_000_000, "price should be 2000e8");
72
+ }
73
+
74
+ /// @notice Price is adjusted when requesting more decimals than the feed.
75
+ function test_normalPrice_scaleUp() external view {
76
+ uint256 price = priceFeed.currentUnitPrice(18);
77
+ assertEq(price, 2_000_000_000_000_000_000_000, "price should be 2000e18");
78
+ }
79
+
80
+ /// @notice Price is adjusted when requesting fewer decimals than the feed.
81
+ function test_normalPrice_scaleDown() external view {
82
+ uint256 price = priceFeed.currentUnitPrice(6);
83
+ assertEq(price, 2_000_000_000, "price should be 2000e6");
84
+ }
85
+
86
+ /// @notice Price of 1 (minimum positive) is returned.
87
+ function test_normalPrice_minimumPositive() external {
88
+ mockFeed.setPrice(1);
89
+ uint256 price = priceFeed.currentUnitPrice(8);
90
+ assertEq(price, 1, "minimum positive price should be 1");
91
+ }
92
+
93
+ //*********************************************************************//
94
+ // --- Stale Price -------------------------------------------------- //
95
+ //*********************************************************************//
96
+
97
+ /// @notice Reverts when price is older than threshold.
98
+ function test_stalePrice_reverts() external {
99
+ // Set updatedAt to a time older than threshold
100
+ mockFeed.setUpdatedAt(block.timestamp - THRESHOLD - 1);
101
+
102
+ vm.expectRevert(
103
+ abi.encodeWithSelector(
104
+ JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_StalePrice.selector,
105
+ block.timestamp,
106
+ THRESHOLD,
107
+ block.timestamp - THRESHOLD - 1
108
+ )
109
+ );
110
+ priceFeed.currentUnitPrice(18);
111
+ }
112
+
113
+ /// @notice Does not revert when price is exactly at the threshold boundary.
114
+ function test_stalePrice_atBoundary_succeeds() external {
115
+ // Set updatedAt exactly at the threshold
116
+ mockFeed.setUpdatedAt(block.timestamp - THRESHOLD);
117
+ uint256 price = priceFeed.currentUnitPrice(8);
118
+ assertEq(price, 200_000_000_000, "price at boundary should succeed");
119
+ }
120
+
121
+ //*********************************************************************//
122
+ // --- Incomplete Round --------------------------------------------- //
123
+ //*********************************************************************//
124
+
125
+ /// @notice Reverts when updatedAt is 0 (incomplete round).
126
+ /// @dev Note: the stale check fires first when block.timestamp > THRESHOLD.
127
+ /// To test the IncompleteRound path, we use a priceFeed with THRESHOLD > block.timestamp.
128
+ function test_incompleteRound_reverts() external {
129
+ // Create a price feed with a huge threshold so stale check passes
130
+ JBChainlinkV3PriceFeed largeThrPriceFeed =
131
+ new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(mockFeed)), type(uint256).max);
132
+ mockFeed.setUpdatedAt(0);
133
+
134
+ vm.expectRevert(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_IncompleteRound.selector);
135
+ largeThrPriceFeed.currentUnitPrice(18);
136
+ }
137
+
138
+ //*********************************************************************//
139
+ // --- Negative / Zero Price ---------------------------------------- //
140
+ //*********************************************************************//
141
+
142
+ /// @notice Reverts when price is 0.
143
+ function test_zeroPrice_reverts() external {
144
+ mockFeed.setPrice(0);
145
+
146
+ vm.expectRevert(
147
+ abi.encodeWithSelector(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_NegativePrice.selector, int256(0))
148
+ );
149
+ priceFeed.currentUnitPrice(18);
150
+ }
151
+
152
+ /// @notice Reverts when price is negative.
153
+ function test_negativePrice_reverts() external {
154
+ mockFeed.setPrice(-100);
155
+
156
+ vm.expectRevert(
157
+ abi.encodeWithSelector(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_NegativePrice.selector, int256(-100))
158
+ );
159
+ priceFeed.currentUnitPrice(18);
160
+ }
161
+
162
+ //*********************************************************************//
163
+ // --- Fuzz Tests --------------------------------------------------- //
164
+ //*********************************************************************//
165
+
166
+ /// @notice Decimal adjustment is consistent with JBFixedPointNumber.
167
+ function testFuzz_decimalsAdjustment(uint128 rawPrice, uint8 feedDecimals, uint8 requestedDecimals) external {
168
+ rawPrice = uint128(bound(uint256(rawPrice), 1, type(uint128).max));
169
+ feedDecimals = uint8(bound(uint256(feedDecimals), 0, 18));
170
+ requestedDecimals = uint8(bound(uint256(requestedDecimals), 0, 36));
171
+
172
+ MockAggregator fuzzFeed = new MockAggregator();
173
+ fuzzFeed.setDecimals(feedDecimals);
174
+ fuzzFeed.setPrice(int256(uint256(rawPrice)));
175
+ fuzzFeed.setUpdatedAt(block.timestamp);
176
+ fuzzFeed.setRoundId(1);
177
+
178
+ JBChainlinkV3PriceFeed fuzzPriceFeed =
179
+ new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(fuzzFeed)), THRESHOLD);
180
+
181
+ uint256 price = fuzzPriceFeed.currentUnitPrice(requestedDecimals);
182
+ uint256 expected = uint256(rawPrice).adjustDecimals({decimals: feedDecimals, targetDecimals: requestedDecimals});
183
+ assertEq(price, expected, "price should match JBFixedPointNumber.adjustDecimals");
184
+ }
185
+
186
+ /// @notice Fresh prices never revert (for valid price ranges).
187
+ function testFuzz_freshPrice_doesNotRevert(uint128 rawPrice) external {
188
+ rawPrice = uint128(bound(uint256(rawPrice), 1, type(uint128).max));
189
+
190
+ mockFeed.setPrice(int256(uint256(rawPrice)));
191
+ mockFeed.setUpdatedAt(block.timestamp);
192
+
193
+ // Should not revert
194
+ priceFeed.currentUnitPrice(18);
195
+ }
196
+
197
+ /// @notice Stale prices always revert.
198
+ function testFuzz_stalePrice_alwaysReverts(uint256 delay) external {
199
+ delay = bound(delay, THRESHOLD + 1, block.timestamp);
200
+
201
+ mockFeed.setUpdatedAt(block.timestamp - delay);
202
+
203
+ vm.expectRevert();
204
+ priceFeed.currentUnitPrice(18);
205
+ }
206
+
207
+ //*********************************************************************//
208
+ // --- Immutable Properties ----------------------------------------- //
209
+ //*********************************************************************//
210
+
211
+ /// @notice FEED is set correctly.
212
+ function test_feedIsSet() external view {
213
+ assertEq(address(priceFeed.FEED()), address(mockFeed), "FEED should match mock");
214
+ }
215
+
216
+ /// @notice THRESHOLD is set correctly.
217
+ function test_thresholdIsSet() external view {
218
+ assertEq(priceFeed.THRESHOLD(), THRESHOLD, "THRESHOLD should match");
219
+ }
220
+ }
@@ -0,0 +1,40 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+
6
+ /*
7
+ Contract that deploys a target contract with other mock contracts to satisfy the constructor.
8
+ Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
9
+ */
10
+ contract JBControllerSetup is JBTest {
11
+ // Target Contract
12
+ IJBController public _controller;
13
+
14
+ // Mocks
15
+ IJBPermissions public permissions = IJBPermissions(makeAddr("permissions"));
16
+ IJBProjects public projects = IJBProjects(makeAddr("projects"));
17
+ IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
18
+ IJBRulesets public rulesets = IJBRulesets(makeAddr("rulesets"));
19
+ IJBTokens public tokens = IJBTokens(makeAddr("tokens"));
20
+ IJBPrices public prices = IJBPrices(makeAddr("prices"));
21
+ IJBSplits public splits = IJBSplits(makeAddr("splits"));
22
+ IJBFundAccessLimits public fundAccessLimits = IJBFundAccessLimits(makeAddr("limits"));
23
+ address public trustedForwarder = makeAddr("forwarder");
24
+
25
+ function controllerSetup() public virtual {
26
+ // Instantiate the contract being tested
27
+ _controller = new JBController(
28
+ directory,
29
+ fundAccessLimits,
30
+ permissions,
31
+ prices,
32
+ projects,
33
+ rulesets,
34
+ splits,
35
+ tokens,
36
+ address(0),
37
+ trustedForwarder
38
+ );
39
+ }
40
+ }
@@ -0,0 +1,107 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBControllerSetup} from "./JBControllerSetup.sol";
6
+
7
+ contract TestBurnTokensOf_Local is JBControllerSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _rootProjectId = 0;
10
+ uint256 _validCount = 1;
11
+ uint256 _invalidCount = 0;
12
+ string _memo = "JUICAY";
13
+ address _holder = makeAddr("hodl");
14
+
15
+ function setUp() public {
16
+ super.controllerSetup();
17
+ }
18
+
19
+ function test_WhenCallerIsNotPermissionedOrTerminal() external {
20
+ // it should revert UNAUTHORIZED()
21
+
22
+ // it will call directory to check if caller is terminal first
23
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
24
+ bytes memory _directoryReturned = abi.encode(false);
25
+ mockExpect(address(directory), _directoryCall, _directoryReturned);
26
+
27
+ // it will call permissions after to first check permissions over the specific project
28
+ bytes memory _permCall = abi.encodeCall(
29
+ IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
30
+ );
31
+ bytes memory _permReturn = abi.encode(false);
32
+ mockExpect(address(permissions), _permCall, _permReturn);
33
+
34
+ vm.expectRevert(
35
+ abi.encodeWithSelector(
36
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
37
+ _holder,
38
+ address(this),
39
+ _projectId,
40
+ JBPermissionIds.BURN_TOKENS
41
+ )
42
+ );
43
+ _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
44
+ }
45
+
46
+ function test_WhenCallerIsTerminalAndTokenCountGtZero() external {
47
+ // it should burn and emit BurnTokens
48
+
49
+ // it will call directory to check if caller is terminal first
50
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
51
+ bytes memory _directoryReturned = abi.encode(true);
52
+ mockExpect(address(directory), _directoryCall, _directoryReturned);
53
+
54
+ // since we spoofed a terminal it will call JBTokens to burn
55
+ bytes memory _burnFromCall = abi.encodeCall(IJBTokens.burnFrom, (_holder, _projectId, _validCount));
56
+ bytes memory _burnFromReturn = "";
57
+ mockExpect(address(tokens), _burnFromCall, _burnFromReturn);
58
+
59
+ vm.expectEmit();
60
+ emit IJBController.BurnTokens(_holder, _projectId, _validCount, _memo, address(this));
61
+ _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
62
+ }
63
+
64
+ function test_WhenCallerHasRootPermissionAndTokenCountGtZero() external {
65
+ // it should burn and emit BurnTokens
66
+
67
+ // it will call directory to check if caller is terminal first
68
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
69
+ bytes memory _directoryReturned = abi.encode(false);
70
+ mockExpect(address(directory), _directoryCall, _directoryReturned);
71
+
72
+ // it will call permissions after to first check permissions over the specific project
73
+ bytes memory _permCall = abi.encodeCall(
74
+ IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
75
+ );
76
+ bytes memory _permReturn = abi.encode(true);
77
+ mockExpect(address(permissions), _permCall, _permReturn);
78
+
79
+ // it will call JBTokens to burn
80
+ bytes memory _burnFromCall = abi.encodeCall(IJBTokens.burnFrom, (_holder, _projectId, _validCount));
81
+ bytes memory _burnFromReturn = "";
82
+ mockExpect(address(tokens), _burnFromCall, _burnFromReturn);
83
+
84
+ vm.expectEmit();
85
+ emit IJBController.BurnTokens(_holder, _projectId, _validCount, _memo, address(this));
86
+ _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
87
+ }
88
+
89
+ function test_WhenTokenCountEqZero() external {
90
+ // it should revert NO_BURNABLE_TOKENS
91
+
92
+ // it will call directory to check if caller is terminal first
93
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
94
+ bytes memory _directoryReturned = abi.encode(false);
95
+ mockExpect(address(directory), _directoryCall, _directoryReturned);
96
+
97
+ // it will call permissions after to first check permissions over the specific project
98
+ bytes memory _permCall = abi.encodeCall(
99
+ IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
100
+ );
101
+ bytes memory _permReturn = abi.encode(true);
102
+ mockExpect(address(permissions), _permCall, _permReturn);
103
+
104
+ vm.expectRevert(JBController.JBController_ZeroTokensToBurn.selector);
105
+ _controller.burnTokensOf(_holder, _projectId, _invalidCount, _memo);
106
+ }
107
+ }
@@ -0,0 +1,60 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBControllerSetup} from "./JBControllerSetup.sol";
6
+
7
+ contract TestClaimTokensFor_Local is JBControllerSetup {
8
+ address _holder = makeAddr("hodler");
9
+ uint256 _projectId = 1;
10
+ uint256 _rootId = 0;
11
+ uint256 _amount = 1e18;
12
+ address _beneficiary = makeAddr("bene");
13
+
14
+ function setUp() public {
15
+ super.controllerSetup();
16
+ }
17
+
18
+ function test_WhenCallerIsPermissioned() external {
19
+ // it should call JBTokens to claim on behalf of holder
20
+
21
+ // it will call permissions
22
+ bytes memory _permCall = abi.encodeCall(
23
+ IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.CLAIM_TOKENS, true, true)
24
+ );
25
+ bytes memory _permReturn = abi.encode(true);
26
+ mockExpect(address(permissions), _permCall, _permReturn);
27
+
28
+ // it will call JBTokens to claim when permissioned
29
+ bytes memory _tokensCall =
30
+ abi.encodeCall(IJBTokens.claimTokensFor, (_holder, _projectId, _amount, _beneficiary));
31
+ bytes memory _tokensReturn = "";
32
+ mockExpect(address(tokens), _tokensCall, _tokensReturn);
33
+
34
+ // will succeed
35
+ _controller.claimTokensFor(_holder, _projectId, _amount, _beneficiary);
36
+ }
37
+
38
+ function test_WhenCallerIsNotPermissioned() external {
39
+ // it should revert UNAUTHORIZED
40
+
41
+ // it will call permissions
42
+ bytes memory _permCall = abi.encodeCall(
43
+ IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.CLAIM_TOKENS, true, true)
44
+ );
45
+ bytes memory _permReturn = abi.encode(false);
46
+ mockExpect(address(permissions), _permCall, _permReturn);
47
+
48
+ // will revert
49
+ vm.expectRevert(
50
+ abi.encodeWithSelector(
51
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
52
+ _holder,
53
+ address(this),
54
+ _projectId,
55
+ JBPermissionIds.CLAIM_TOKENS
56
+ )
57
+ );
58
+ _controller.claimTokensFor(_holder, _projectId, _amount, _beneficiary);
59
+ }
60
+ }
@@ -0,0 +1,80 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBControllerSetup} from "./JBControllerSetup.sol";
6
+
7
+ contract TestDeployERC20For_Local is JBControllerSetup {
8
+ uint256 _projectId = 1;
9
+ IJBToken _token = IJBToken(makeAddr("token"));
10
+ string _name = "Juice";
11
+ string _symbol = "JCY";
12
+ bytes32 _salt = bytes32(0);
13
+
14
+ function setUp() public {
15
+ super.controllerSetup();
16
+ }
17
+
18
+ function test_WhenCallerIsPermissioned() external {
19
+ // it will deploy ERC20 and return IJBToken
20
+
21
+ // mock call to JBProjects ownerOf which will give permission
22
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
23
+ bytes memory _projectsCallReturn = abi.encode(address(this));
24
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
25
+
26
+ // mock the call to JBTokens deployERC20For
27
+ bytes memory _deployCall = abi.encodeCall(IJBTokens.deployERC20For, (_projectId, _name, _symbol, _salt));
28
+ bytes memory _deployCallReturn = abi.encode(_token);
29
+ mockExpect(address(tokens), _deployCall, _deployCallReturn);
30
+
31
+ _controller.deployERC20For(_projectId, _name, _symbol, _salt);
32
+ }
33
+
34
+ function test_WhenCallerIsPermissionedAndSaltIsNonZero() external {
35
+ // it will deploy ERC20 and return IJBToken
36
+
37
+ bytes32 _nonZeroSalt = bytes32("somesalt");
38
+ bytes32 _encodedSalt = keccak256(abi.encodePacked(address(this), _nonZeroSalt));
39
+
40
+ // mock call to JBProjects ownerOf which will give permission
41
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
42
+ bytes memory _projectsCallReturn = abi.encode(address(this));
43
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
44
+
45
+ // mock the call to JBTokens deployERC20For
46
+ bytes memory _deployCall = abi.encodeCall(IJBTokens.deployERC20For, (_projectId, _name, _symbol, _encodedSalt));
47
+ bytes memory _deployCallReturn = abi.encode(_token);
48
+ mockExpect(address(tokens), _deployCall, _deployCallReturn);
49
+
50
+ _controller.deployERC20For(_projectId, _name, _symbol, _nonZeroSalt);
51
+ }
52
+
53
+ function test_WhenCallerIsNotPermissioned() external {
54
+ // it will revert UNAUTHORIZED
55
+
56
+ // mock call to JBProjects ownerOf which will give permission
57
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
58
+ address _projectsCallReturn = address(0);
59
+ mockExpect(address(projects), _projectsCall, abi.encode(_projectsCallReturn));
60
+
61
+ // mock call for projects permission
62
+ bytes memory _permissionCall1 = abi.encodeCall(
63
+ IJBPermissions.hasPermission,
64
+ (address(this), address(0), _projectId, JBPermissionIds.DEPLOY_ERC20, true, true)
65
+ );
66
+ bytes memory _permissionCallReturn1 = abi.encode(false);
67
+ mockExpect(address(permissions), _permissionCall1, _permissionCallReturn1);
68
+
69
+ vm.expectRevert(
70
+ abi.encodeWithSelector(
71
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
72
+ _projectsCallReturn,
73
+ address(this),
74
+ _projectId,
75
+ JBPermissionIds.DEPLOY_ERC20
76
+ )
77
+ );
78
+ _controller.deployERC20For(_projectId, _name, _symbol, _salt);
79
+ }
80
+ }