@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,148 @@
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 TestMigrateController_Local is JBControllerSetup {
8
+ using stdStorage for StdStorage;
9
+
10
+ function setUp() public {
11
+ super.controllerSetup();
12
+ }
13
+
14
+ modifier whenCallerHasPermission() {
15
+ // mock ownerOf call
16
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
17
+ bytes memory _ownerData = abi.encode(address(this));
18
+
19
+ mockExpect(address(projects), _ownerOfCall, _ownerData);
20
+ _;
21
+ }
22
+
23
+ modifier migrationIsAllowedByRuleset() {
24
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
25
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
26
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
27
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
28
+ pausePay: false,
29
+ pauseCreditTransfers: false,
30
+ allowOwnerMinting: false,
31
+ allowSetCustomToken: false,
32
+ allowTerminalMigration: false,
33
+ allowSetTerminals: false,
34
+ ownerMustSendPayouts: false,
35
+ allowSetController: true,
36
+ allowAddAccountingContext: true,
37
+ allowAddPriceFeed: false,
38
+ holdFees: false,
39
+ useTotalSurplusForCashOuts: true,
40
+ useDataHookForPay: false,
41
+ useDataHookForCashOut: false,
42
+ dataHook: address(0),
43
+ metadata: 0
44
+ });
45
+
46
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
47
+
48
+ // setup: return data
49
+ JBRuleset memory data = JBRuleset({
50
+ cycleNumber: 1,
51
+ id: uint48(block.timestamp),
52
+ basedOnId: 0,
53
+ start: uint48(block.timestamp),
54
+ duration: 0,
55
+ weight: 0,
56
+ weightCutPercent: 0,
57
+ approvalHook: IJBRulesetApprovalHook(address(0)),
58
+ metadata: _packedMetadata
59
+ });
60
+
61
+ // mock currentOf call
62
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (1));
63
+ bytes memory _returned = abi.encode(data);
64
+
65
+ mockExpect(address(rulesets), _currentOfCall, _returned);
66
+ _;
67
+ }
68
+
69
+ modifier migrationIsNotAllowedByRuleset() {
70
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
71
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
72
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
73
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
74
+ pausePay: false,
75
+ pauseCreditTransfers: false,
76
+ allowOwnerMinting: false,
77
+ allowSetCustomToken: false,
78
+ allowTerminalMigration: false,
79
+ allowSetTerminals: false,
80
+ ownerMustSendPayouts: false,
81
+ allowSetController: true,
82
+ allowAddAccountingContext: true,
83
+ allowAddPriceFeed: false,
84
+ holdFees: false,
85
+ useTotalSurplusForCashOuts: true,
86
+ useDataHookForPay: false,
87
+ useDataHookForCashOut: false,
88
+ dataHook: address(0),
89
+ metadata: 0
90
+ });
91
+
92
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
93
+
94
+ // setup: return data
95
+ JBRuleset memory data = JBRuleset({
96
+ cycleNumber: 1,
97
+ id: uint48(block.timestamp),
98
+ basedOnId: 0,
99
+ start: uint48(block.timestamp),
100
+ duration: 0,
101
+ weight: 0,
102
+ weightCutPercent: 0,
103
+ approvalHook: IJBRulesetApprovalHook(address(0)),
104
+ metadata: _packedMetadata
105
+ });
106
+
107
+ // mock currentOf call
108
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (1));
109
+ bytes memory _returned = abi.encode(data);
110
+
111
+ mockExpect(address(rulesets), _currentOfCall, _returned);
112
+ _;
113
+ }
114
+
115
+ function test_Revert_When_Caller_Is_Not_Directory() external {
116
+ // it should revert
117
+
118
+ vm.expectRevert(
119
+ abi.encodeWithSelector(
120
+ JBController.JBController_OnlyDirectory.selector, address(this), _controller.DIRECTORY()
121
+ )
122
+ );
123
+ IJBMigratable(address(_controller)).migrate(1, IJBMigratable(address(this)));
124
+ }
125
+
126
+ function test_Revert_When_GivenReservedTokenBalanceIsPending() external {
127
+ // it should send reserved tokens to splits
128
+ // set storage since we can't mock internal calls
129
+ stdstore.target(address(IJBMigratable(address(_controller)))).sig("pendingReservedTokenBalanceOf(uint256)")
130
+ .with_key(uint256(1)).checked_write(uint256(100));
131
+
132
+ vm.prank(address(directory));
133
+
134
+ // Revert as expected, this functionality is no longer allowed since `JBController4_1`,
135
+ // Pending is send out as part of `beforeReceiveMigrationFrom`.
136
+ vm.expectRevert(abi.encodeWithSelector(JBController.JBController_PendingReservedTokens.selector, 100));
137
+ IJBMigratable(address(_controller)).migrate(1, IJBMigratable(address(this)));
138
+ }
139
+
140
+ function test_GivenNoReservedTokenBalanceIsPending() external {
141
+ // event as expected
142
+ vm.expectEmit();
143
+ emit IJBMigratable.Migrate(1, IJBMigratable(address(this)), address(directory));
144
+
145
+ vm.prank(address(directory));
146
+ IJBMigratable(address(_controller)).migrate(1, IJBMigratable(address(this)));
147
+ }
148
+ }
@@ -0,0 +1,102 @@
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 TestMintTokensOfUnits_Local is JBControllerSetup {
8
+ uint256 _projectId = 1;
9
+
10
+ function setUp() public {
11
+ super.controllerSetup();
12
+ }
13
+
14
+ function test_WhenNoRulesetIsActive() external {
15
+ // it should be able to mint
16
+ }
17
+
18
+ function test_MintNotAllowedSenderNotHookTerminalNorRulesetAllowsMint() external {
19
+ // mock call to JBProjects ownerOf which will give permission
20
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
21
+ bytes memory _projectsCallReturn = abi.encode(address(this));
22
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
23
+
24
+ // setup: return data
25
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
26
+ reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
27
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
28
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
29
+ pausePay: false,
30
+ pauseCreditTransfers: false,
31
+ allowOwnerMinting: false,
32
+ allowSetCustomToken: false,
33
+ allowTerminalMigration: false,
34
+ allowSetTerminals: false,
35
+ ownerMustSendPayouts: false,
36
+ allowSetController: false,
37
+ allowAddAccountingContext: true,
38
+ allowAddPriceFeed: false,
39
+ holdFees: false,
40
+ useTotalSurplusForCashOuts: true,
41
+ useDataHookForPay: false,
42
+ useDataHookForCashOut: false,
43
+ dataHook: address(0),
44
+ metadata: 0
45
+ });
46
+
47
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
48
+
49
+ JBRuleset memory data = JBRuleset({
50
+ cycleNumber: 1,
51
+ id: uint48(block.timestamp),
52
+ basedOnId: 0,
53
+ start: uint48(block.timestamp),
54
+ duration: 8000,
55
+ weight: 5000,
56
+ weightCutPercent: 0,
57
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
58
+ metadata: _packedMetadata
59
+ });
60
+
61
+ // mock call to rulesets
62
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(data));
63
+
64
+ // mock call to isTerminalOf
65
+ mockExpect(
66
+ address(directory),
67
+ abi.encodeCall(IJBDirectory.isTerminalOf, (_projectId, IJBTerminal(address(this)))),
68
+ abi.encode(false)
69
+ );
70
+
71
+ vm.expectRevert(
72
+ abi.encodeWithSelector(JBController.JBController_MintNotAllowedAndNotTerminalOrHook.selector, address(this))
73
+ );
74
+
75
+ _controller.mintTokensOf({
76
+ projectId: _projectId, tokenCount: 1, beneficiary: address(this), memo: "", useReservedPercent: true
77
+ });
78
+ }
79
+
80
+ function test_RevertWhen_MintingIsDisabledInTheFundingCycleRuleset() external {
81
+ // it should revert
82
+ }
83
+
84
+ modifier whenMintingIsEnabledInTheFundingCycleRuleset() {
85
+ _;
86
+ }
87
+
88
+ function test_GivenThatThereAreTokensAvailableToMint() external whenMintingIsEnabledInTheFundingCycleRuleset {
89
+ // it should be possible to mint
90
+ }
91
+
92
+ function test_GivenThatADataSourceIsConfigured() external whenMintingIsEnabledInTheFundingCycleRuleset {
93
+ // it should be able to mint
94
+ }
95
+
96
+ function test_GivenThatADataSourceHasPermissionedAnotherContractToMint()
97
+ external
98
+ whenMintingIsEnabledInTheFundingCycleRuleset
99
+ {
100
+ // it should be able to mint
101
+ }
102
+ }
@@ -0,0 +1,71 @@
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 TestExecutePayReservedTokenToTerminal_Local is JBControllerSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _defaultAmount = 1e18;
10
+ IJBTerminal _terminal = IJBTerminal(makeAddr("someTerminal"));
11
+ IJBToken _token = IJBToken(makeAddr("someToken"));
12
+ address _bene = makeAddr("beneficiary");
13
+
14
+ function setUp() public {
15
+ super.controllerSetup();
16
+ }
17
+
18
+ function test_WhenCallerIsNotItself() external {
19
+ // it will revert
20
+ vm.expectRevert();
21
+ JBController(address(_controller))
22
+ .executePayReservedTokenToTerminal(_terminal, _projectId, _token, _defaultAmount, _bene, "");
23
+ }
24
+
25
+ modifier whenCallerIsItself() {
26
+ // put code at token address for OZ Address check
27
+ vm.etch(address(_token), abi.encode(1));
28
+
29
+ vm.prank(address(_controller));
30
+ _;
31
+ }
32
+
33
+ function test_GivenAllowanceEQZeroAfterPay() external whenCallerIsItself {
34
+ // it will not revert
35
+
36
+ // mock pay call to some terminal
37
+ mockExpect(
38
+ address(_terminal),
39
+ abi.encodeCall(IJBTerminal.pay, (_projectId, address(_token), _defaultAmount, _bene, 0, "", "")),
40
+ abi.encode(0)
41
+ );
42
+
43
+ // mock the allowance assertion
44
+ mockExpect(
45
+ address(_token), abi.encodeCall(IERC20.allowance, (address(_controller), address(_terminal))), abi.encode(0)
46
+ );
47
+
48
+ JBController(address(_controller))
49
+ .executePayReservedTokenToTerminal(_terminal, _projectId, _token, _defaultAmount, _bene, "");
50
+ }
51
+
52
+ function test_GivenAllowanceDNEQZeroAfterPay() external whenCallerIsItself {
53
+ // it will revert
54
+
55
+ // mock pay call to some terminal
56
+ mockExpect(
57
+ address(_terminal),
58
+ abi.encodeCall(IJBTerminal.pay, (_projectId, address(_token), _defaultAmount, _bene, 0, "", "")),
59
+ abi.encode(0)
60
+ );
61
+
62
+ // mock the allowance assertion
63
+ mockExpect(
64
+ address(_token), abi.encodeCall(IERC20.allowance, (address(_controller), address(_terminal))), abi.encode(1)
65
+ );
66
+
67
+ vm.expectRevert();
68
+ JBController(address(_controller))
69
+ .executePayReservedTokenToTerminal(_terminal, _projectId, _token, _defaultAmount, _bene, "");
70
+ }
71
+ }
@@ -0,0 +1,95 @@
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 TestReceiveMigrationFrom_Local is JBControllerSetup {
8
+ uint256 _projectId = 1;
9
+ IERC165 _from = IERC165(makeAddr("from"));
10
+
11
+ function setUp() public {
12
+ super.controllerSetup();
13
+ }
14
+
15
+ function test_GivenThatTheCallerIsAlsoControllerOfProjectId() external {
16
+ vm.expectRevert(
17
+ abi.encodeWithSelector(JBController.JBController_OnlyDirectory.selector, address(this), address(directory))
18
+ );
19
+
20
+ vm.prank(address(this));
21
+ IJBMigratable(address(_controller)).beforeReceiveMigrationFrom(_from, _projectId);
22
+ }
23
+
24
+ function test_GivenThatTheCallerIsDirectory() external {
25
+ // mock supports interface call
26
+ mockExpect(
27
+ address(_from),
28
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBProjectUriRegistry).interfaceId)),
29
+ abi.encode(true)
30
+ );
31
+
32
+ // mock call to from uriOf
33
+ mockExpect(address(_from), abi.encodeCall(IJBProjectUriRegistry.uriOf, (_projectId)), abi.encode("Juicay"));
34
+
35
+ // Mock does not support the controller interface.
36
+ mockExpect(
37
+ address(_from),
38
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBController).interfaceId)),
39
+ abi.encode(false)
40
+ );
41
+
42
+ vm.prank(address(directory));
43
+ IJBMigratable(address(_controller)).beforeReceiveMigrationFrom(_from, _projectId);
44
+ string memory stored = _controller.uriOf(_projectId);
45
+ assertEq(stored, "Juicay");
46
+ }
47
+
48
+ function test_GivenThatTheCallerIsDirectory_FromSupportsControllerInterface(uint8 tokenAmount) external {
49
+ // mock supports interface call
50
+ mockExpect(
51
+ address(_from),
52
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBProjectUriRegistry).interfaceId)),
53
+ abi.encode(true)
54
+ );
55
+
56
+ // mock call to from uriOf
57
+ mockExpect(address(_from), abi.encodeCall(IJBProjectUriRegistry.uriOf, (_projectId)), abi.encode("Juicay"));
58
+
59
+ // Mock does not support the controller interface.
60
+ mockExpect(
61
+ address(_from),
62
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBController).interfaceId)),
63
+ abi.encode(true)
64
+ );
65
+
66
+ mockExpect(
67
+ address(_from),
68
+ abi.encodeCall(IJBController.pendingReservedTokenBalanceOf, (_projectId)),
69
+ abi.encode(uint256(tokenAmount))
70
+ );
71
+
72
+ if (tokenAmount > 0) {
73
+ // mock call to from mintTokensOf
74
+ mockExpect(
75
+ address(_from),
76
+ abi.encodeCall(IJBController.sendReservedTokensToSplitsOf, (_projectId)),
77
+ abi.encode(tokenAmount)
78
+ );
79
+ }
80
+
81
+ vm.prank(address(directory));
82
+ IJBMigratable(address(_controller)).beforeReceiveMigrationFrom(_from, _projectId);
83
+ string memory stored = _controller.uriOf(_projectId);
84
+ assertEq(stored, "Juicay");
85
+ }
86
+
87
+ function test_GivenThatTheCallerIsNotController() external {
88
+ // it will revert
89
+
90
+ vm.expectRevert(
91
+ abi.encodeWithSelector(JBController.JBController_OnlyDirectory.selector, address(this), address(directory))
92
+ );
93
+ IJBMigratable(address(_controller)).beforeReceiveMigrationFrom(_from, _projectId);
94
+ }
95
+ }
@@ -0,0 +1,219 @@
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
+ /**
8
+ * @title
9
+ */
10
+ contract TestRulesetViews_Local is JBControllerSetup {
11
+ // A library that parses packed ruleset metadata into a friendlier format.
12
+ using JBRulesetMetadataResolver for JBRuleset;
13
+
14
+ function setUp() public {
15
+ super.controllerSetup();
16
+ }
17
+
18
+ function genMetadata() public pure returns (uint256) {
19
+ uint256 packed = 1;
20
+ packed |= 5000 << 4;
21
+ packed |= 8000 << 20;
22
+ packed |= 1 << 36;
23
+ packed |= 1 << 69;
24
+ packed |= 1 << 72;
25
+ packed |= 1 << 73;
26
+ packed |= 1 << 74;
27
+ packed |= 1 << 77;
28
+ packed |= uint256(uint160(address(0x1234567890123456789012345678901234567890))) << 80;
29
+ packed |= 65_535 << 240;
30
+
31
+ return packed;
32
+ }
33
+
34
+ function test_getRulesetOf() external {
35
+ // it should call rulesets and access storage (we avoid setting and reading here)
36
+
37
+ // setup: return data
38
+ JBRuleset memory data = JBRuleset({
39
+ cycleNumber: 1,
40
+ id: uint48(block.timestamp),
41
+ basedOnId: 0,
42
+ start: uint48(block.timestamp),
43
+ duration: 8000,
44
+ weight: 5000,
45
+ weightCutPercent: 0,
46
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
47
+ metadata: genMetadata()
48
+ });
49
+
50
+ // setup: mock call
51
+ bytes memory _encodedCall = abi.encodeCall(IJBRulesets.getRulesetOf, (1, block.timestamp));
52
+ bytes memory _willReturn = abi.encode(data);
53
+
54
+ mockExpect(address(rulesets), _encodedCall, _willReturn);
55
+
56
+ // send
57
+ (JBRuleset memory ruleset, JBRulesetMetadata memory metadata) = _controller.getRulesetOf(1, block.timestamp);
58
+
59
+ // check: return makes sense
60
+ assertEq(data.duration, ruleset.duration);
61
+ assertEq(metadata.reservedPercent, data.expandMetadata().reservedPercent);
62
+ }
63
+
64
+ function test_latestQueuedOf() external {
65
+ // setup: return data
66
+ JBRuleset memory data = JBRuleset({
67
+ cycleNumber: 1,
68
+ id: uint48(block.timestamp),
69
+ basedOnId: 0,
70
+ start: uint48(block.timestamp),
71
+ duration: 8000,
72
+ weight: 5000,
73
+ weightCutPercent: 0,
74
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
75
+ metadata: genMetadata()
76
+ });
77
+
78
+ // setup: mock call
79
+ bytes memory _encodedCall = abi.encodeCall(IJBRulesets.latestQueuedOf, (1));
80
+ bytes memory _willReturn = abi.encode(data, JBApprovalStatus.Empty);
81
+
82
+ mockExpect(address(rulesets), _encodedCall, _willReturn);
83
+
84
+ // send
85
+ (JBRuleset memory ruleset, JBRulesetMetadata memory metadata, JBApprovalStatus approvalStatus) =
86
+ _controller.latestQueuedRulesetOf(1);
87
+
88
+ // check: return makes sense
89
+ assertEq(data.duration, ruleset.duration);
90
+ assertEq(metadata.reservedPercent, data.expandMetadata().reservedPercent);
91
+ assertEq(abi.encode(approvalStatus), abi.encode(JBApprovalStatus.Empty));
92
+ }
93
+
94
+ function test_queuedRulesetsOf() external {
95
+ // setup: return data
96
+ JBRuleset memory data = JBRuleset({
97
+ cycleNumber: 1,
98
+ id: uint48(block.timestamp),
99
+ basedOnId: 0,
100
+ start: uint48(block.timestamp),
101
+ duration: 8000,
102
+ weight: 100,
103
+ weightCutPercent: 0,
104
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
105
+ metadata: genMetadata()
106
+ });
107
+
108
+ // setup: return data
109
+ JBRuleset memory data2 = JBRuleset({
110
+ cycleNumber: 1,
111
+ id: uint48(block.timestamp),
112
+ basedOnId: 0,
113
+ start: uint48(block.timestamp),
114
+ duration: 8000,
115
+ weight: 200,
116
+ weightCutPercent: 0,
117
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
118
+ metadata: genMetadata()
119
+ });
120
+
121
+ JBRuleset[] memory rulesetsArray = new JBRuleset[](2);
122
+ rulesetsArray[0] = data;
123
+ rulesetsArray[1] = data2;
124
+
125
+ // setup: mock call
126
+ bytes memory _encodedCall = abi.encodeCall(IJBRulesets.allOf, (1, block.timestamp, 2));
127
+ bytes memory _willReturn = abi.encode(rulesetsArray);
128
+
129
+ mockExpect(address(rulesets), _encodedCall, _willReturn);
130
+
131
+ // send
132
+ (JBRulesetWithMetadata[] memory queuedRulesets) = _controller.allRulesetsOf(1, block.timestamp, 2);
133
+
134
+ // check: return makes sense
135
+ assertEq(rulesetsArray[0].weight, queuedRulesets[0].ruleset.weight);
136
+ }
137
+
138
+ function test_upcomingOf() external {
139
+ // setup: return data
140
+ JBRuleset memory data = JBRuleset({
141
+ cycleNumber: 1,
142
+ id: uint48(block.timestamp),
143
+ basedOnId: 0,
144
+ start: uint48(block.timestamp),
145
+ duration: 8000,
146
+ weight: 5000,
147
+ weightCutPercent: 0,
148
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
149
+ metadata: genMetadata()
150
+ });
151
+
152
+ // setup: mock call
153
+ bytes memory _encodedCall = abi.encodeCall(IJBRulesets.upcomingOf, (1));
154
+ bytes memory _willReturn = abi.encode(data, JBApprovalStatus.Empty);
155
+
156
+ mockExpect(address(rulesets), _encodedCall, _willReturn);
157
+
158
+ // send
159
+ (JBRuleset memory ruleset, JBRulesetMetadata memory metadata) = _controller.upcomingRulesetOf(1);
160
+
161
+ // check: return makes sense
162
+ assertEq(data.duration, ruleset.duration);
163
+ assertEq(metadata.reservedPercent, data.expandMetadata().reservedPercent);
164
+ }
165
+
166
+ function test_SetTerminalAllowed() public {
167
+ // setup: return data
168
+ JBRuleset memory data = JBRuleset({
169
+ cycleNumber: 1,
170
+ id: uint48(block.timestamp),
171
+ basedOnId: 0,
172
+ start: uint48(block.timestamp),
173
+ duration: 8000,
174
+ weight: 5000,
175
+ weightCutPercent: 0,
176
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
177
+ metadata: genMetadata()
178
+ });
179
+
180
+ // setup: mock call
181
+ bytes memory _encodedCall = abi.encodeCall(IJBRulesets.currentOf, (1));
182
+ bytes memory _willReturn = abi.encode(data);
183
+
184
+ mockExpect(address(rulesets), _encodedCall, _willReturn);
185
+
186
+ // send
187
+ (bool allowed) = _controller.setTerminalsAllowed(1);
188
+
189
+ // check: return makes sense
190
+ assertEq(allowed, true);
191
+ }
192
+
193
+ function testSetControllerAllowed() public {
194
+ // setup: return data
195
+ JBRuleset memory data = JBRuleset({
196
+ cycleNumber: 1,
197
+ id: uint48(block.timestamp),
198
+ basedOnId: 0,
199
+ start: uint48(block.timestamp),
200
+ duration: 8000,
201
+ weight: 5000,
202
+ weightCutPercent: 0,
203
+ approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
204
+ metadata: genMetadata()
205
+ });
206
+
207
+ // setup: mock call
208
+ bytes memory _encodedCall = abi.encodeCall(IJBRulesets.currentOf, (1));
209
+ bytes memory _willReturn = abi.encode(data);
210
+
211
+ mockExpect(address(rulesets), _encodedCall, _willReturn);
212
+
213
+ // send
214
+ (bool allowed) = _controller.setControllerAllowed(1);
215
+
216
+ // check: return makes sense
217
+ assertEq(allowed, true);
218
+ }
219
+ }