@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,227 @@
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 TestSetTokenFor_Local is JBControllerSetup {
8
+ IJBToken _token = IJBToken(makeAddr("token"));
9
+ uint256 _projectId = 1;
10
+
11
+ function setUp() public {
12
+ super.controllerSetup();
13
+ }
14
+
15
+ function test_WhenCallerIsPermissionedAndCurrentRuleset() external {
16
+ // it will set token
17
+
18
+ // mock ownerOf call to auth this contract (caller)
19
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
20
+ bytes memory _ownerOfReturn = abi.encode(address(this));
21
+ mockExpect(address(projects), _ownerOfCall, _ownerOfReturn);
22
+
23
+ // mock call to JBTokens
24
+ bytes memory _tokensCall = abi.encodeCall(IJBTokens.setTokenFor, (_projectId, _token));
25
+ mockExpect(address(tokens), _tokensCall, "");
26
+
27
+ // mock call to JBRulesets
28
+
29
+ // setup: return data
30
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
31
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
32
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
33
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
34
+ pausePay: false,
35
+ pauseCreditTransfers: false,
36
+ allowOwnerMinting: true,
37
+ allowSetCustomToken: true, // Allows authorized to set a token or mint tokens
38
+ allowTerminalMigration: false,
39
+ allowSetTerminals: false,
40
+ ownerMustSendPayouts: false,
41
+ allowSetController: false,
42
+ allowAddAccountingContext: true,
43
+ allowAddPriceFeed: false,
44
+ holdFees: false,
45
+ useTotalSurplusForCashOuts: true,
46
+ useDataHookForPay: false,
47
+ useDataHookForCashOut: false,
48
+ dataHook: address(0),
49
+ metadata: 0
50
+ });
51
+
52
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
53
+
54
+ JBRuleset memory ruleset = JBRuleset({
55
+ cycleNumber: 1,
56
+ id: uint48(block.timestamp),
57
+ basedOnId: 0,
58
+ start: uint48(block.timestamp),
59
+ duration: 8000,
60
+ weight: 5000,
61
+ weightCutPercent: 0,
62
+ approvalHook: IJBRulesetApprovalHook(address(0)),
63
+ metadata: _packedMetadata
64
+ });
65
+
66
+ bytes memory _currentRulesetCall = abi.encodeCall(IJBRulesets.currentOf, (1));
67
+ mockExpect(address(rulesets), _currentRulesetCall, abi.encode(ruleset));
68
+
69
+ _controller.setTokenFor(_projectId, _token);
70
+ }
71
+
72
+ function test_WhenCallerIsPermissionedAndNoCurrentRulesetButUpcomingCompatible() external {
73
+ // it will set token
74
+
75
+ // mock ownerOf call to auth this contract (caller)
76
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
77
+ bytes memory _ownerOfReturn = abi.encode(address(this));
78
+ mockExpect(address(projects), _ownerOfCall, _ownerOfReturn);
79
+
80
+ // mock call to JBTokens
81
+ bytes memory _tokensCall = abi.encodeCall(IJBTokens.setTokenFor, (_projectId, _token));
82
+ mockExpect(address(tokens), _tokensCall, "");
83
+
84
+ // mock call to JBRulesets
85
+
86
+ // setup: return data
87
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
88
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
89
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
90
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
91
+ pausePay: false,
92
+ pauseCreditTransfers: false,
93
+ allowOwnerMinting: true,
94
+ allowSetCustomToken: true, // Allows authorized to set a token or mint tokens
95
+ allowTerminalMigration: false,
96
+ allowSetTerminals: false,
97
+ ownerMustSendPayouts: false,
98
+ allowSetController: false,
99
+ allowAddAccountingContext: true,
100
+ allowAddPriceFeed: false,
101
+ holdFees: false,
102
+ useTotalSurplusForCashOuts: true,
103
+ useDataHookForPay: false,
104
+ useDataHookForCashOut: false,
105
+ dataHook: address(0),
106
+ metadata: 0
107
+ });
108
+
109
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
110
+
111
+ JBRuleset memory ruleset = JBRuleset({
112
+ cycleNumber: 0,
113
+ id: 0,
114
+ basedOnId: 0,
115
+ start: 0,
116
+ duration: 0,
117
+ weight: 0,
118
+ weightCutPercent: 0,
119
+ approvalHook: IJBRulesetApprovalHook(address(0)),
120
+ metadata: 0
121
+ });
122
+
123
+ JBRuleset memory upcoming = JBRuleset({
124
+ cycleNumber: 1,
125
+ id: uint48(block.timestamp),
126
+ basedOnId: 0,
127
+ start: uint48(block.timestamp),
128
+ duration: 8000,
129
+ weight: 5000,
130
+ weightCutPercent: 0,
131
+ approvalHook: IJBRulesetApprovalHook(address(0)),
132
+ metadata: _packedMetadata
133
+ });
134
+
135
+ // Will check the current ruleset
136
+ bytes memory _currentRulesetCall = abi.encodeCall(IJBRulesets.currentOf, (1));
137
+ mockExpect(address(rulesets), _currentRulesetCall, abi.encode(ruleset));
138
+
139
+ // Will check the upcoming ruleset
140
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.upcomingOf, (1)), abi.encode(upcoming));
141
+
142
+ _controller.setTokenFor(_projectId, _token);
143
+ }
144
+
145
+ function test_WhenCallerIsPermissionedAndAllowSetTokensEQFalse() external {
146
+ // it will set token
147
+
148
+ // mock ownerOf call to auth this contract (caller)
149
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
150
+ bytes memory _ownerOfReturn = abi.encode(address(this));
151
+ mockExpect(address(projects), _ownerOfCall, _ownerOfReturn);
152
+
153
+ // mock call to JBRulesets
154
+
155
+ // setup: return data
156
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
157
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
158
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
159
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
160
+ pausePay: false,
161
+ pauseCreditTransfers: false,
162
+ allowOwnerMinting: true,
163
+ allowSetCustomToken: false, // Allows authorized to set a token or mint tokens
164
+ allowTerminalMigration: false,
165
+ allowSetTerminals: false,
166
+ ownerMustSendPayouts: false,
167
+ allowSetController: false,
168
+ allowAddAccountingContext: true,
169
+ allowAddPriceFeed: false,
170
+ holdFees: false,
171
+ useTotalSurplusForCashOuts: true,
172
+ useDataHookForPay: false,
173
+ useDataHookForCashOut: false,
174
+ dataHook: address(0),
175
+ metadata: 0
176
+ });
177
+
178
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
179
+
180
+ JBRuleset memory ruleset = JBRuleset({
181
+ cycleNumber: 1,
182
+ id: uint48(block.timestamp),
183
+ basedOnId: 0,
184
+ start: uint48(block.timestamp),
185
+ duration: 8000,
186
+ weight: 5000,
187
+ weightCutPercent: 0,
188
+ approvalHook: IJBRulesetApprovalHook(address(0)),
189
+ metadata: _packedMetadata
190
+ });
191
+
192
+ bytes memory _currentRulesetCall = abi.encodeCall(IJBRulesets.currentOf, (1));
193
+ mockExpect(address(rulesets), _currentRulesetCall, abi.encode(ruleset));
194
+
195
+ vm.expectRevert(
196
+ abi.encodeWithSelector(JBController.JBController_RulesetSetTokenNotAllowed.selector, _projectId)
197
+ );
198
+ _controller.setTokenFor(_projectId, _token);
199
+ }
200
+
201
+ function test_WhenCallerIsNotPermissioned() external {
202
+ // it will revert UNAUTHORIZED
203
+
204
+ // mock ownerOf call as not this address (unauth)
205
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
206
+ address _ownerOfReturn = address(0);
207
+ mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerOfReturn));
208
+
209
+ // mock permissions call as unauth
210
+ bytes memory _permsCall1 = abi.encodeCall(
211
+ IJBPermissions.hasPermission, (address(this), address(0), 1, JBPermissionIds.SET_TOKEN, true, true)
212
+ );
213
+ bytes memory _permsCallReturn1 = abi.encode(false);
214
+ mockExpect(address(permissions), _permsCall1, _permsCallReturn1);
215
+
216
+ vm.expectRevert(
217
+ abi.encodeWithSelector(
218
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
219
+ _ownerOfReturn,
220
+ address(this),
221
+ _projectId,
222
+ JBPermissionIds.SET_TOKEN
223
+ )
224
+ );
225
+ _controller.setTokenFor(_projectId, _token);
226
+ }
227
+ }
@@ -0,0 +1,53 @@
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 TestSetUriOf_Local is JBControllerSetup {
8
+ function setUp() public {
9
+ super.controllerSetup();
10
+ }
11
+
12
+ function test_WhenCallerIsOwnerOrHasPermission() external {
13
+ // it should set metadata and emit SetMetadata
14
+ // mock ownerOf call
15
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
16
+ bytes memory _ownerData = abi.encode(address(this));
17
+
18
+ mockExpect(address(projects), _ownerOfCall, _ownerData);
19
+
20
+ vm.expectEmit();
21
+ emit IJBController.SetUri(1, "Juicay", address(this));
22
+
23
+ _controller.setUriOf(1, "Juicay");
24
+ }
25
+
26
+ function test_RevertWhenCallerIsNotOwnerOrHasPermission() external {
27
+ // it should revert
28
+ // mock ownerOf call
29
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
30
+ address _ownerData = address(1);
31
+
32
+ mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
33
+
34
+ // mock first permissions call
35
+ bytes memory _permissionsCall = abi.encodeCall(
36
+ IJBPermissions.hasPermission, (address(this), address(1), 1, JBPermissionIds.SET_PROJECT_URI, true, true)
37
+ );
38
+ bytes memory _permissionsReturned = abi.encode(false);
39
+
40
+ mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
41
+
42
+ vm.expectRevert(
43
+ abi.encodeWithSelector(
44
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
45
+ _ownerData,
46
+ address(this),
47
+ 1,
48
+ JBPermissionIds.SET_PROJECT_URI
49
+ )
50
+ );
51
+ _controller.setUriOf(1, "Not Juicay");
52
+ }
53
+ }
@@ -0,0 +1,159 @@
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 TestTransferCreditsFrom_Local is JBControllerSetup {
8
+ using JBRulesetMetadataResolver for JBRulesetMetadata;
9
+
10
+ address _holder = makeAddr("hodler");
11
+ uint256 _projectId = 1;
12
+ uint256 _rootId = 0;
13
+ uint256 _amount = 1e18;
14
+ address _beneficiary = makeAddr("bene");
15
+
16
+ function setUp() public {
17
+ super.controllerSetup();
18
+ }
19
+
20
+ modifier whenCallerIsPermissioned() {
21
+ // it will call permissions
22
+ bytes memory _permCall = abi.encodeCall(
23
+ IJBPermissions.hasPermission,
24
+ (address(this), _holder, _projectId, JBPermissionIds.TRANSFER_CREDITS, true, true)
25
+ );
26
+ bytes memory _permReturn = abi.encode(true);
27
+ mockExpect(address(permissions), _permCall, _permReturn);
28
+ _;
29
+ }
30
+
31
+ function test_GivenRulesetAllowsCreditTransfers() external whenCallerIsPermissioned {
32
+ // it will call JBTokens to transfer the credits
33
+
34
+ // data for JBRulesets currentOf call
35
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
36
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
37
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
38
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
39
+ pausePay: false,
40
+ pauseCreditTransfers: false,
41
+ allowOwnerMinting: false,
42
+ allowSetCustomToken: false,
43
+ allowTerminalMigration: false,
44
+ allowSetTerminals: false,
45
+ ownerMustSendPayouts: false,
46
+ allowSetController: false,
47
+ allowAddAccountingContext: true,
48
+ allowAddPriceFeed: false,
49
+ holdFees: false,
50
+ useTotalSurplusForCashOuts: true,
51
+ useDataHookForPay: false,
52
+ useDataHookForCashOut: false,
53
+ dataHook: address(0),
54
+ metadata: 0
55
+ });
56
+
57
+ uint256 _packed = _rulesMetadata.packRulesetMetadata();
58
+
59
+ // mocked ruleset that allows credit transfer
60
+ JBRuleset memory _returnedRuleset = JBRuleset({
61
+ cycleNumber: 1,
62
+ id: uint48(block.timestamp),
63
+ basedOnId: 0,
64
+ start: uint48(block.timestamp),
65
+ duration: 100,
66
+ weight: 1e18,
67
+ weightCutPercent: 0,
68
+ approvalHook: IJBRulesetApprovalHook(address(0)),
69
+ metadata: _packed
70
+ });
71
+
72
+ // mock the call to JBRulesets currentOf
73
+ bytes memory _rulesetCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
74
+ bytes memory _rulesetCallReturn = abi.encode(_returnedRuleset);
75
+ mockExpect(address(rulesets), _rulesetCall, _rulesetCallReturn);
76
+
77
+ // mock the subsequent call to JBTokens transferCreditsFrom
78
+ bytes memory _transferCall =
79
+ abi.encodeCall(IJBTokens.transferCreditsFrom, (_holder, _projectId, _beneficiary, _amount));
80
+ bytes memory _transferCallReturn = "";
81
+ mockExpect(address(tokens), _transferCall, _transferCallReturn);
82
+
83
+ _controller.transferCreditsFrom(_holder, _projectId, _beneficiary, _amount);
84
+ }
85
+
86
+ function test_GivenRulesetDoesNotAllowCreditTransfers() external whenCallerIsPermissioned {
87
+ // it will revert CREDIT_TRANSFERS_PAUSED
88
+
89
+ // data for JBRulesets currentOf call
90
+ JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
91
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
92
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
93
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
94
+ pausePay: false,
95
+ // will revert in this case
96
+ pauseCreditTransfers: true,
97
+ allowOwnerMinting: false,
98
+ allowSetCustomToken: false,
99
+ allowTerminalMigration: false,
100
+ allowSetTerminals: false,
101
+ ownerMustSendPayouts: false,
102
+ allowSetController: false,
103
+ allowAddAccountingContext: true,
104
+ allowAddPriceFeed: false,
105
+ holdFees: false,
106
+ useTotalSurplusForCashOuts: true,
107
+ useDataHookForPay: false,
108
+ useDataHookForCashOut: false,
109
+ dataHook: address(0),
110
+ metadata: 0
111
+ });
112
+
113
+ uint256 _packed = _rulesMetadata.packRulesetMetadata();
114
+
115
+ // mocked ruleset that allows credit transfer
116
+ JBRuleset memory _returnedRuleset = JBRuleset({
117
+ cycleNumber: 1,
118
+ id: uint48(block.timestamp),
119
+ basedOnId: 0,
120
+ start: uint48(block.timestamp),
121
+ duration: 100,
122
+ weight: 1e18,
123
+ weightCutPercent: 0,
124
+ approvalHook: IJBRulesetApprovalHook(address(0)),
125
+ metadata: _packed
126
+ });
127
+
128
+ // mock the call to JBRulesets currentOf
129
+ bytes memory _rulesetCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
130
+ bytes memory _rulesetCallReturn = abi.encode(_returnedRuleset);
131
+ mockExpect(address(rulesets), _rulesetCall, _rulesetCallReturn);
132
+
133
+ vm.expectRevert(JBController.JBController_CreditTransfersPaused.selector);
134
+ _controller.transferCreditsFrom(_holder, _projectId, _beneficiary, _amount);
135
+ }
136
+
137
+ function test_WhenCallerIsNotPermissioned() external {
138
+ // it will revert UNAUTHORIZED
139
+ // it will call permissions
140
+ bytes memory _permCall = abi.encodeCall(
141
+ IJBPermissions.hasPermission,
142
+ (address(this), _holder, _projectId, JBPermissionIds.TRANSFER_CREDITS, true, true)
143
+ );
144
+ bytes memory _permReturn = abi.encode(false);
145
+ mockExpect(address(permissions), _permCall, _permReturn);
146
+
147
+ // will revert
148
+ vm.expectRevert(
149
+ abi.encodeWithSelector(
150
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
151
+ _holder,
152
+ address(this),
153
+ _projectId,
154
+ JBPermissionIds.TRANSFER_CREDITS
155
+ )
156
+ );
157
+ _controller.transferCreditsFrom(_holder, _projectId, _beneficiary, _amount);
158
+ }
159
+ }
@@ -0,0 +1,194 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBDeadline} from "../../../../src/JBDeadline.sol";
6
+ import {JBApprovalStatus} from "../../../../src/enums/JBApprovalStatus.sol";
7
+ import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
8
+
9
+ /// @notice Fuzz tests for JBDeadline approval hook.
10
+ contract TestDeadlineFuzz_Local is JBTest {
11
+ JBDeadline deadline;
12
+
13
+ uint256 constant DURATION = 3 days;
14
+
15
+ function setUp() external {
16
+ deadline = new JBDeadline(DURATION);
17
+ }
18
+
19
+ /// @notice DURATION is set correctly.
20
+ function test_durationIsSet() external view {
21
+ assertEq(deadline.DURATION(), DURATION, "DURATION should match");
22
+ }
23
+
24
+ /// @notice ERC165 support for IJBRulesetApprovalHook.
25
+ function test_supportsInterface() external view {
26
+ assertTrue(
27
+ deadline.supportsInterface(type(IJBRulesetApprovalHook).interfaceId),
28
+ "should support IJBRulesetApprovalHook"
29
+ );
30
+ assertTrue(deadline.supportsInterface(type(IERC165).interfaceId), "should support IERC165");
31
+ }
32
+
33
+ //*********************************************************************//
34
+ // --- Deterministic Status Tests ----------------------------------- //
35
+ //*********************************************************************//
36
+
37
+ /// @notice Ruleset queued after start time returns Failed.
38
+ function test_queuedAfterStart_isFailed() external view {
39
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: 200, start: 100});
40
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
41
+ assertEq(uint256(status), uint256(JBApprovalStatus.Failed), "queued after start should be Failed");
42
+ }
43
+
44
+ /// @notice Ruleset queued too close to start returns Failed.
45
+ function test_insufficientGap_isFailed() external {
46
+ uint48 start = uint48(block.timestamp + 1 days);
47
+ uint48 queued = start - uint48(DURATION) + 1; // 1 second short of required gap
48
+
49
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queued, start: start});
50
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
51
+ assertEq(uint256(status), uint256(JBApprovalStatus.Failed), "insufficient gap should be Failed");
52
+ }
53
+
54
+ /// @notice Ruleset with exactly enough gap and deadline not yet passed returns ApprovalExpected.
55
+ function test_exactGap_deadlineNotPassed_isApprovalExpected() external {
56
+ // queue far enough in advance, and start is still far in the future
57
+ uint48 start = uint48(block.timestamp + 2 * DURATION + 100);
58
+ uint48 queued = start - uint48(DURATION);
59
+
60
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queued, start: start});
61
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
62
+ assertEq(uint256(status), uint256(JBApprovalStatus.ApprovalExpected), "should be ApprovalExpected");
63
+ }
64
+
65
+ /// @notice Ruleset with enough gap and deadline passed returns Approved.
66
+ function test_gapSufficient_deadlinePassed_isApproved() external {
67
+ uint48 start = uint48(block.timestamp + 1); // start is very soon
68
+ uint48 queued = start - uint48(DURATION) - 1; // plenty of gap
69
+
70
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queued, start: start});
71
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
72
+ assertEq(uint256(status), uint256(JBApprovalStatus.Approved), "should be Approved");
73
+ }
74
+
75
+ //*********************************************************************//
76
+ // --- Fuzz Tests --------------------------------------------------- //
77
+ //*********************************************************************//
78
+
79
+ /// @notice Status is always one of: Failed, ApprovalExpected, or Approved.
80
+ function testFuzz_statusIsValid(uint48 queuedAt, uint48 start) external view {
81
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queuedAt, start: start});
82
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
83
+
84
+ assertTrue(
85
+ status == JBApprovalStatus.Failed || status == JBApprovalStatus.ApprovalExpected
86
+ || status == JBApprovalStatus.Approved,
87
+ "status must be Failed, ApprovalExpected, or Approved"
88
+ );
89
+ }
90
+
91
+ /// @notice If queued after start, always Failed.
92
+ function testFuzz_queuedAfterStart_alwaysFailed(uint48 start) external view {
93
+ // Ensure start is small enough that start+1 doesn't overflow uint48
94
+ start = uint48(bound(uint256(start), 1, type(uint48).max - 1));
95
+ uint48 queuedAt = start + 1; // queued AFTER start
96
+
97
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queuedAt, start: start});
98
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
99
+ assertEq(uint256(status), uint256(JBApprovalStatus.Failed), "queued after start always Failed");
100
+ }
101
+
102
+ /// @notice If gap is less than DURATION, always Failed.
103
+ function testFuzz_gapTooSmall_alwaysFailed(uint48 start, uint48 gap) external view {
104
+ gap = uint48(bound(uint256(gap), 0, DURATION - 1));
105
+ // Ensure start >= gap to avoid underflow
106
+ start = uint48(bound(uint256(start), gap, type(uint48).max));
107
+ uint48 queuedAt = start - gap;
108
+
109
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queuedAt, start: start});
110
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
111
+ assertEq(uint256(status), uint256(JBApprovalStatus.Failed), "gap < DURATION always Failed");
112
+ }
113
+
114
+ /// @notice If gap >= DURATION and deadline passed, always Approved.
115
+ function testFuzz_sufficientGap_deadlinePassed_approved(uint256 gapExtra) external view {
116
+ // gap = DURATION + gapExtra (always >= DURATION)
117
+ gapExtra = bound(gapExtra, 0, 365 days);
118
+ uint256 gap = DURATION + gapExtra;
119
+
120
+ // start = block.timestamp (deadline already passed since block.timestamp + DURATION >= start)
121
+ uint48 start = uint48(block.timestamp);
122
+ // Ensure queuedAt doesn't underflow
123
+ vm.assume(start >= gap);
124
+ uint48 queuedAt = start - uint48(gap);
125
+
126
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queuedAt, start: start});
127
+ JBApprovalStatus status = deadline.approvalStatusOf(1, ruleset);
128
+ assertEq(uint256(status), uint256(JBApprovalStatus.Approved), "sufficient gap + deadline passed -> Approved");
129
+ }
130
+
131
+ /// @notice Status monotonically transitions: ApprovalExpected -> Approved as time advances.
132
+ function testFuzz_statusMonotonic(uint48 gap) external {
133
+ gap = uint48(bound(uint256(gap), DURATION, type(uint32).max));
134
+ // Ensure arithmetic doesn't overflow uint48
135
+ uint48 start = uint48(bound(uint256(block.timestamp) + 2 * DURATION + 100, gap, type(uint48).max));
136
+ uint48 queuedAt = start - gap;
137
+
138
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queuedAt, start: start});
139
+
140
+ // At this point, start is far in the future -> ApprovalExpected
141
+ JBApprovalStatus status1 = deadline.approvalStatusOf(1, ruleset);
142
+ assertTrue(
143
+ status1 == JBApprovalStatus.ApprovalExpected || status1 == JBApprovalStatus.Approved,
144
+ "initial status should be ApprovalExpected or Approved"
145
+ );
146
+
147
+ // Warp to just past the deadline
148
+ vm.warp(start - DURATION);
149
+ JBApprovalStatus status2 = deadline.approvalStatusOf(1, ruleset);
150
+ assertEq(uint256(status2), uint256(JBApprovalStatus.Approved), "after deadline should be Approved");
151
+
152
+ // Once Approved, stays Approved
153
+ vm.warp(start + 1000);
154
+ JBApprovalStatus status3 = deadline.approvalStatusOf(1, ruleset);
155
+ assertEq(uint256(status3), uint256(JBApprovalStatus.Approved), "should remain Approved");
156
+ }
157
+
158
+ /// @notice Different durations produce consistent results.
159
+ function testFuzz_differentDurations(uint256 duration) external {
160
+ duration = bound(duration, 1, 365 days);
161
+ JBDeadline d = new JBDeadline(duration);
162
+
163
+ uint48 start = uint48(block.timestamp + 1);
164
+ uint48 queuedAt = uint48(block.timestamp - duration);
165
+
166
+ JBRuleset memory ruleset = _makeRuleset({queuedAt: queuedAt, start: start});
167
+ JBApprovalStatus status = d.approvalStatusOf(1, ruleset);
168
+
169
+ // With gap = duration + block.timestamp + 1 - (block.timestamp - duration) = 2*duration + 1
170
+ // This is always >= duration, so status depends on whether deadline passed
171
+ assertTrue(
172
+ status == JBApprovalStatus.Approved || status == JBApprovalStatus.ApprovalExpected,
173
+ "sufficient gap should be Approved or ApprovalExpected"
174
+ );
175
+ }
176
+
177
+ //*********************************************************************//
178
+ // --- Helpers ------------------------------------------------------ //
179
+ //*********************************************************************//
180
+
181
+ function _makeRuleset(uint48 queuedAt, uint48 start) internal pure returns (JBRuleset memory) {
182
+ return JBRuleset({
183
+ cycleNumber: 1,
184
+ id: queuedAt,
185
+ basedOnId: 0,
186
+ start: start,
187
+ duration: 0,
188
+ weight: 0,
189
+ weightCutPercent: 0,
190
+ approvalHook: IJBRulesetApprovalHook(address(0)),
191
+ metadata: 0
192
+ });
193
+ }
194
+ }
@@ -0,0 +1,22 @@
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 JBDirectorySetup is JBTest {
11
+ // Target Contract
12
+ IJBDirectory public _directory;
13
+
14
+ // Mocks
15
+ IJBPermissions public permissions = IJBPermissions(makeAddr("permissions"));
16
+ IJBProjects public projects = IJBProjects(makeAddr("projects"));
17
+
18
+ function directorySetup() public virtual {
19
+ // Instantiate the contract being tested
20
+ _directory = new JBDirectory(permissions, projects, makeAddr("Juicer"));
21
+ }
22
+ }