@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,122 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBDirectorySetup} from "./JBDirectorySetup.sol";
6
+
7
+ contract TestPrimaryTerminalOf_Local is JBDirectorySetup {
8
+ uint256 _projectId = 1;
9
+ address _mockTerminal = makeAddr("mockTerminal");
10
+ address _mockTerminal2 = makeAddr("mockTerminal2");
11
+ address _mockToken = makeAddr("mockToken");
12
+
13
+ function setUp() public {
14
+ super.directorySetup();
15
+ }
16
+
17
+ function test_WhenThereAreNoTerminalsSupportingTheInputToken() external {
18
+ // it will return the zero address
19
+ }
20
+
21
+ modifier whenThereIsAPrimaryTerminal() {
22
+ _;
23
+ }
24
+
25
+ function test_GivenThereIsAPrimaryTerminalForTheToken() external whenThereIsAPrimaryTerminal {
26
+ // it will return the primary terminal
27
+
28
+ // first set the primary terminal
29
+
30
+ // mock call to JBProjects ownerOf which will give permission
31
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
32
+ bytes memory _projectsCallReturn = abi.encode(address(this));
33
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
34
+
35
+ // mock call to the terminal accountingContextForTokenOf
36
+
37
+ // accounting context needed for call
38
+ JBAccountingContext memory _context =
39
+ JBAccountingContext({token: _mockToken, decimals: 18, currency: uint32(1)});
40
+ mockExpect(
41
+ address(_mockTerminal),
42
+ abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, _mockToken)),
43
+ abi.encode(_context)
44
+ );
45
+
46
+ // mock call to "controller" (zero address here) for interface supp
47
+ mockExpect(
48
+ address(0),
49
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
50
+ abi.encode(true)
51
+ );
52
+
53
+ // mock call to "controller" (zero address here) for setTerminalsAllowed
54
+ mockExpect(
55
+ address(0), abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (_projectId)), abi.encode(true)
56
+ );
57
+
58
+ // Set the primary terminal of using the previous mocks
59
+ _directory.setPrimaryTerminalOf(_projectId, _mockToken, IJBTerminal(_mockTerminal));
60
+
61
+ // Make sure it is stored correctly
62
+ IJBTerminal _storedTerminal = _directory.primaryTerminalOf(_projectId, _mockToken);
63
+ assertEq(address(_storedTerminal), _mockTerminal);
64
+ }
65
+
66
+ function test_GivenThereAreMultipleTerminalsWithProperAccountingContextForTokenOf() external {
67
+ // it will check each terminals accountingContextForTokenOf and return the first
68
+ }
69
+
70
+ function test_GivenThereAreMultipleTerminalsButNoneWithTheProperAccountingContextForTokenOf() external {
71
+ // it will return the zero address
72
+
73
+ // first set the terminals
74
+
75
+ // mock call to JBProjects ownerOf which will give permission
76
+ bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
77
+ bytes memory _projectsCallReturn = abi.encode(address(this));
78
+ mockExpect(address(projects), _projectsCall, _projectsCallReturn);
79
+
80
+ // mock call to the terminal accountingContextForTokenOf
81
+
82
+ // accounting context needed for call
83
+ JBAccountingContext memory _context = JBAccountingContext({token: address(0), decimals: 0, currency: uint32(0)});
84
+ mockExpect(
85
+ address(_mockTerminal),
86
+ abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, address(0))),
87
+ abi.encode(_context)
88
+ );
89
+
90
+ // mock call the the 2nd terminal accountingContextForTokenOf
91
+
92
+ // accounting context needed for call
93
+ mockExpect(
94
+ address(_mockTerminal2),
95
+ abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, address(0))),
96
+ abi.encode(_context)
97
+ );
98
+
99
+ // mock call to "controller" (zero address here) for interface supp
100
+ mockExpect(
101
+ address(0),
102
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
103
+ abi.encode(true)
104
+ );
105
+
106
+ // mock call to "controller" (zero address here) for setTerminalsAllowed
107
+ mockExpect(
108
+ address(0), abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (_projectId)), abi.encode(true)
109
+ );
110
+
111
+ // terminals to set
112
+ IJBTerminal[] memory _terminals = new IJBTerminal[](2);
113
+ _terminals[0] = IJBTerminal(_mockTerminal);
114
+ _terminals[1] = IJBTerminal(_mockTerminal2);
115
+
116
+ // Set the primary terminal of using the previous mocks
117
+ _directory.setTerminalsOf(_projectId, _terminals);
118
+
119
+ IJBTerminal returnedTerminal = _directory.primaryTerminalOf(_projectId, address(0));
120
+ assertEq(address(returnedTerminal), address(0));
121
+ }
122
+ }
@@ -0,0 +1,173 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBDirectorySetup} from "./JBDirectorySetup.sol";
6
+
7
+ contract TestSetControllerOf_Local is JBDirectorySetup {
8
+ using stdStorage for StdStorage;
9
+
10
+ function setUp() public {
11
+ super.directorySetup();
12
+ }
13
+
14
+ modifier givenProjectExists() {
15
+ bytes memory _countCall = abi.encodeCall(IJBProjects.count, ());
16
+ bytes memory _countReturn = abi.encode(type(uint256).max);
17
+
18
+ mockExpect(address(projects), _countCall, _countReturn);
19
+ _;
20
+ }
21
+
22
+ modifier whenCallerIsAllowedToSetFirstController() {
23
+ stdstore.target(address(_directory)).sig("isAllowedToSetFirstController(address)").with_key(address(this))
24
+ .depth(0).checked_write(true);
25
+
26
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0).checked_write(address(0));
27
+
28
+ // mock ownerOf call
29
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
30
+ bytes memory _ownerData = abi.encode(address(this));
31
+
32
+ mockExpect(address(projects), _ownerOfCall, _ownerData);
33
+
34
+ _;
35
+ }
36
+
37
+ modifier givenControllerIsAlreadySet() {
38
+ address _bumController = makeAddr("bum");
39
+
40
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
41
+ .checked_write(_bumController);
42
+
43
+ // mock erc165 call
44
+ bytes memory _supportCall =
45
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
46
+ bytes memory _supportReturned = abi.encode(true);
47
+
48
+ mockExpect(address(_bumController), _supportCall, _supportReturned);
49
+
50
+ // mock access control call
51
+ bytes memory _accessCall = abi.encodeCall(IJBDirectoryAccessControl.setControllerAllowed, (1));
52
+ bytes memory _accessReturned = abi.encode(false);
53
+
54
+ mockExpect(address(_bumController), _accessCall, _accessReturned);
55
+
56
+ _;
57
+ }
58
+
59
+ function test_RevertWhenCallerDoesNotHaveAnyPermission() external {
60
+ // it should revert
61
+ // mock ownerOf call
62
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
63
+ address _ownerData = address(1);
64
+
65
+ mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
66
+
67
+ // mock first permissions call
68
+ bytes memory _permissionsCall = abi.encodeCall(
69
+ IJBPermissions.hasPermission, (address(this), address(1), 1, JBPermissionIds.SET_CONTROLLER, true, true)
70
+ );
71
+ bytes memory _permissionsReturned = abi.encode(false);
72
+
73
+ mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
74
+
75
+ vm.expectRevert(
76
+ abi.encodeWithSelector(
77
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
78
+ _ownerData,
79
+ address(this),
80
+ 1,
81
+ JBPermissionIds.SET_CONTROLLER
82
+ )
83
+ );
84
+ _directory.setControllerOf(1, IERC165(address(this)));
85
+ }
86
+
87
+ function test_RevertGivenAProjectDoesntExist() external whenCallerIsAllowedToSetFirstController {
88
+ // it should revert
89
+
90
+ // project count mock call
91
+ bytes memory _countCall = abi.encodeCall(IJBProjects.count, ());
92
+ bytes memory _countReturn = abi.encode(0);
93
+
94
+ mockExpect(address(projects), _countCall, _countReturn);
95
+
96
+ vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_InvalidProjectIdInDirectory.selector, 1, 0));
97
+ _directory.setControllerOf(1, IERC165(address(this)));
98
+ }
99
+
100
+ function test_RevertGivenCurrentControllerIsNotSetControllerAllowed()
101
+ external
102
+ whenCallerIsAllowedToSetFirstController
103
+ givenProjectExists
104
+ givenControllerIsAlreadySet
105
+ {
106
+ // it should revert
107
+ vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetControllerNotAllowed.selector, 1));
108
+ _directory.setControllerOf(1, IERC165(address(this)));
109
+ }
110
+
111
+ function test_GivenCurrentControllerIsSetControllerAllowed()
112
+ external
113
+ whenCallerIsAllowedToSetFirstController
114
+ givenProjectExists
115
+ {
116
+ // it should set controllerOf and emit SetController
117
+ vm.expectEmit();
118
+ emit IJBDirectory.SetController(1, IERC165(address(this)), address(this));
119
+
120
+ _directory.setControllerOf(1, IERC165(address(this)));
121
+ }
122
+
123
+ function test_GivenCurrentControllerIsSetAndMigrating() external givenProjectExists {
124
+ address _bumController = makeAddr("bum");
125
+
126
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
127
+ .checked_write(_bumController);
128
+
129
+ // mock ownerOf call
130
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
131
+ bytes memory _ownerData = abi.encode(address(this));
132
+
133
+ mockExpect(address(projects), _ownerOfCall, _ownerData);
134
+
135
+ // Mock call to bum controller setControllerAllowed
136
+ mockExpect(
137
+ _bumController, abi.encodeCall(IJBDirectoryAccessControl.setControllerAllowed, (1)), abi.encode(true)
138
+ );
139
+
140
+ // Mock call to it's interface support
141
+ mockExpect(
142
+ _bumController,
143
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
144
+ abi.encode(true)
145
+ );
146
+ mockExpect(
147
+ _bumController,
148
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBMigratable).interfaceId)),
149
+ abi.encode(true)
150
+ );
151
+ mockExpect(
152
+ address(this),
153
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBMigratable).interfaceId)),
154
+ abi.encode(true)
155
+ );
156
+ mockExpect(
157
+ address(this),
158
+ abi.encodeCall(IJBMigratable.beforeReceiveMigrationFrom, (IERC165(address(_bumController)), 1)),
159
+ abi.encode("")
160
+ );
161
+ mockExpect(
162
+ address(this),
163
+ abi.encodeCall(IJBMigratable.afterReceiveMigrationFrom, (IERC165(address(_bumController)), 1)),
164
+ abi.encode("")
165
+ );
166
+
167
+ // it should set controllerOf and emit SetController
168
+ vm.expectEmit();
169
+ emit IJBDirectory.SetController(1, IERC165(address(this)), address(this));
170
+
171
+ _directory.setControllerOf(1, IERC165(address(this)));
172
+ }
173
+ }
@@ -0,0 +1,98 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBDirectorySetup} from "./JBDirectorySetup.sol";
6
+
7
+ /// @notice A mock controller that asserts the directory still points to it during migrate().
8
+ /// This validates that controllerOf is NOT updated before migrate() is called.
9
+ contract MockMigratingController is ERC165 {
10
+ IJBDirectory public immutable DIRECTORY;
11
+ uint256 public immutable PROJECT_ID;
12
+ bool public migrateCalled;
13
+ bool public directoryPointedToSelfDuringMigrate;
14
+
15
+ constructor(IJBDirectory directory, uint256 projectId) {
16
+ DIRECTORY = directory;
17
+ PROJECT_ID = projectId;
18
+ }
19
+
20
+ function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
21
+ return interfaceId == type(IJBMigratable).interfaceId
22
+ || interfaceId == type(IJBDirectoryAccessControl).interfaceId || super.supportsInterface(interfaceId);
23
+ }
24
+
25
+ function setControllerAllowed(uint256) external pure returns (bool) {
26
+ return true;
27
+ }
28
+
29
+ function migrate(uint256, IERC165) external {
30
+ migrateCalled = true;
31
+ // The critical assertion: during migrate(), the directory should still point to this controller.
32
+ directoryPointedToSelfDuringMigrate = (address(DIRECTORY.controllerOf(PROJECT_ID)) == address(this));
33
+ }
34
+
35
+ function beforeReceiveMigrationFrom(IERC165, uint256) external {}
36
+
37
+ function afterReceiveMigrationFrom(IERC165, uint256) external {}
38
+ }
39
+
40
+ /// @notice A simple new controller that accepts migration.
41
+ contract MockNewController is ERC165 {
42
+ function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
43
+ return interfaceId == type(IJBMigratable).interfaceId || super.supportsInterface(interfaceId);
44
+ }
45
+
46
+ function migrate(uint256, IERC165) external {}
47
+
48
+ function beforeReceiveMigrationFrom(IERC165, uint256) external {}
49
+
50
+ function afterReceiveMigrationFrom(IERC165, uint256) external {}
51
+ }
52
+
53
+ contract TestSetControllerOfMigrationOrder is JBDirectorySetup {
54
+ using stdStorage for StdStorage;
55
+
56
+ uint256 constant PROJECT_ID = 1;
57
+
58
+ function setUp() public {
59
+ super.directorySetup();
60
+ }
61
+
62
+ /// @notice Verifies that during migrate(), the directory still points to the old controller.
63
+ /// This test PASSES with the correct ordering (migrate before set) and FAILS if set happens before migrate.
64
+ function test_DirectoryPointsToOldControllerDuringMigrate() external {
65
+ // Deploy mock controllers with real code (not mocked addresses).
66
+ MockMigratingController oldController = new MockMigratingController(_directory, PROJECT_ID);
67
+ MockNewController newController = new MockNewController();
68
+
69
+ // Set the old controller in the directory's storage.
70
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(PROJECT_ID).depth(0)
71
+ .checked_write(address(oldController));
72
+
73
+ // Mock ownerOf to return this test contract as the project owner.
74
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (PROJECT_ID)), abi.encode(address(this)));
75
+
76
+ // Mock project count to allow the project to exist.
77
+ mockExpect(address(projects), abi.encodeCall(IJBProjects.count, ()), abi.encode(type(uint256).max));
78
+
79
+ // Perform the migration.
80
+ _directory.setControllerOf(PROJECT_ID, IERC165(address(newController)));
81
+
82
+ // Verify migrate() was called.
83
+ assertTrue(oldController.migrateCalled(), "migrate() should have been called on old controller");
84
+
85
+ // Verify the directory pointed to the old controller during migrate().
86
+ assertTrue(
87
+ oldController.directoryPointedToSelfDuringMigrate(),
88
+ "Directory should point to old controller during migrate()"
89
+ );
90
+
91
+ // Verify the directory now points to the new controller after everything completes.
92
+ assertEq(
93
+ address(_directory.controllerOf(PROJECT_ID)),
94
+ address(newController),
95
+ "Directory should point to new controller after migration"
96
+ );
97
+ }
98
+ }
@@ -0,0 +1,169 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBDirectorySetup} from "./JBDirectorySetup.sol";
6
+
7
+ contract TestSetPrimaryTerminalOf_Local is JBDirectorySetup {
8
+ using stdStorage for StdStorage;
9
+
10
+ IJBTerminal _terminalToAdd = IJBTerminal(makeAddr("newTerminal"));
11
+ address _mockController = makeAddr("controller");
12
+ address _token = makeAddr("newToken");
13
+
14
+ function setUp() public {
15
+ super.directorySetup();
16
+ }
17
+
18
+ modifier givenTerminalHasNotBeenAdded() {
19
+ vm.expectEmit();
20
+ emit IJBDirectory.AddTerminal(1, _terminalToAdd, address(this));
21
+ _;
22
+ }
23
+
24
+ modifier whenCallerHasPermission() {
25
+ // mock ownerOf call
26
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
27
+ bytes memory _ownerData = abi.encode(address(this));
28
+
29
+ mockExpect(address(projects), _ownerOfCall, _ownerData);
30
+ _;
31
+ }
32
+
33
+ modifier givenValidAccountingContext() {
34
+ // accounting context
35
+ JBAccountingContext memory _context = JBAccountingContext({token: _token, decimals: 6, currency: uint32(1)});
36
+
37
+ // mock accountingContext call
38
+ bytes memory _contextCall = abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (1, _token));
39
+ bytes memory _contextReturn = abi.encode(_context);
40
+
41
+ mockExpect(address(_terminalToAdd), _contextCall, _contextReturn);
42
+ _;
43
+ }
44
+
45
+ function test_WhenCallerHasNoMaidens() external {
46
+ // it should revert with UNAUTHORIZED()
47
+ // mock ownerOf call
48
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
49
+ address _ownerData = address(1);
50
+
51
+ mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
52
+
53
+ // mock first permissions call
54
+ bytes memory _permissionsCall = abi.encodeCall(
55
+ IJBPermissions.hasPermission,
56
+ (address(this), address(1), 1, JBPermissionIds.SET_PRIMARY_TERMINAL, true, true)
57
+ );
58
+ bytes memory _permissionsReturned = abi.encode(false);
59
+
60
+ mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
61
+
62
+ vm.expectRevert(
63
+ abi.encodeWithSelector(
64
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
65
+ _ownerData,
66
+ address(this),
67
+ 1,
68
+ JBPermissionIds.SET_PRIMARY_TERMINAL
69
+ )
70
+ );
71
+ _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
72
+ }
73
+
74
+ function test_GivenNoValidAccountingContextForTokenOf() external whenCallerHasPermission {
75
+ // it should revert with TOKEN_NOT_ACCEPTED
76
+ // accounting context
77
+ JBAccountingContext memory _context = JBAccountingContext({token: address(0), decimals: 6, currency: uint32(1)});
78
+
79
+ // mock accountingContext call
80
+ bytes memory _contextCall = abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (1, _token));
81
+ bytes memory _contextReturn = abi.encode(_context);
82
+
83
+ mockExpect(address(_terminalToAdd), _contextCall, _contextReturn);
84
+
85
+ vm.expectRevert(
86
+ abi.encodeWithSelector(JBDirectory.JBDirectory_TokenNotAccepted.selector, 1, _token, _terminalToAdd)
87
+ );
88
+ _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
89
+ }
90
+
91
+ function test_RevertIf_GivenTerminalHasAlreadyBeenAdded()
92
+ external
93
+ whenCallerHasPermission
94
+ givenValidAccountingContext
95
+ {
96
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
97
+ .checked_write(_mockController);
98
+ // mock erc165 call
99
+ bytes memory _supportCall =
100
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
101
+ bytes memory _supportReturned = abi.encode(false);
102
+
103
+ mockExpect(address(_mockController), _supportCall, _supportReturned);
104
+
105
+ // it should not add the terminal, but set it as primary
106
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
107
+ _terminals[0] = _terminalToAdd;
108
+
109
+ vm.expectEmit();
110
+ emit IJBDirectory.SetTerminals(1, _terminals, address(this));
111
+
112
+ _directory.setTerminalsOf(1, _terminals);
113
+
114
+ // prove that the terminal was not added - forces this test to fail as intended
115
+ vm.expectEmit();
116
+ emit IJBDirectory.SetPrimaryTerminal(1, _token, _terminals[0], address(this));
117
+
118
+ // set the primary next and mock whatever calls
119
+ _directory.setPrimaryTerminalOf(1, _token, _terminals[0]);
120
+ }
121
+
122
+ function test_GivenProjectIsNotAllowedToSetTerminals()
123
+ external
124
+ whenCallerHasPermission
125
+ givenValidAccountingContext
126
+ {
127
+ // it should revert with SET_TERMINALS_NOT_ALLOWED
128
+
129
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
130
+ .checked_write(_mockController);
131
+
132
+ // mock erc165 call
133
+ bytes memory _supportCall =
134
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
135
+ bytes memory _supportReturned = abi.encode(true);
136
+
137
+ mockExpect(address(_mockController), _supportCall, _supportReturned);
138
+
139
+ // mock setTerminalsAllowed call
140
+ bytes memory _allowedCall = abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (1));
141
+ bytes memory _allowedReturn = abi.encode(false);
142
+
143
+ mockExpect(address(_mockController), _allowedCall, _allowedReturn);
144
+
145
+ vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetTerminalsNotAllowed.selector, 1));
146
+ _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
147
+ }
148
+
149
+ function test_GivenProjectIsAllowedToSetTerminals()
150
+ external
151
+ whenCallerHasPermission
152
+ givenValidAccountingContext
153
+ givenTerminalHasNotBeenAdded
154
+ {
155
+ // it should set the terminal and emit AddTerminal
156
+ // it should set the terminal as primary and emit SetPrimaryTerminal
157
+
158
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
159
+ .checked_write(_mockController);
160
+ // mock erc165 call
161
+ bytes memory _supportCall =
162
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
163
+ bytes memory _supportReturned = abi.encode(false);
164
+
165
+ mockExpect(address(_mockController), _supportCall, _supportReturned);
166
+
167
+ _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
168
+ }
169
+ }
@@ -0,0 +1,128 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBDirectorySetup} from "./JBDirectorySetup.sol";
6
+
7
+ contract TestSetTerminalsOf_Local is JBDirectorySetup {
8
+ using stdStorage for StdStorage;
9
+
10
+ IJBTerminal _terminalToAdd = IJBTerminal(makeAddr("newTerminal"));
11
+ address _mockController = makeAddr("controller");
12
+ address _token = makeAddr("newToken");
13
+
14
+ function setUp() public {
15
+ super.directorySetup();
16
+ }
17
+
18
+ modifier whenCallerHasPermission() {
19
+ // mock ownerOf call
20
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
21
+ bytes memory _ownerData = abi.encode(address(this));
22
+
23
+ mockExpect(address(projects), _ownerOfCall, _ownerData);
24
+ _;
25
+ }
26
+
27
+ modifier givenSetTerminalsAllowed() {
28
+ // it should revert with revert SET_TERMINALS_NOT_ALLOWED()
29
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
30
+ .checked_write(_mockController);
31
+
32
+ // mock erc165 call
33
+ bytes memory _supportCall =
34
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
35
+ bytes memory _supportReturned = abi.encode(true);
36
+
37
+ mockExpect(address(_mockController), _supportCall, _supportReturned);
38
+
39
+ // mock setTerminalsAllowed call
40
+ bytes memory _allowedCall = abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (1));
41
+ bytes memory _allowedReturn = abi.encode(true);
42
+
43
+ mockExpect(address(_mockController), _allowedCall, _allowedReturn);
44
+ _;
45
+ }
46
+
47
+ function test_GivenNotSetTerminalsAllowed() external whenCallerHasPermission {
48
+ // it should revert with revert SET_TERMINALS_NOT_ALLOWED()
49
+ stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
50
+ .checked_write(_mockController);
51
+
52
+ // mock erc165 call
53
+ bytes memory _supportCall =
54
+ abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
55
+ bytes memory _supportReturned = abi.encode(true);
56
+
57
+ mockExpect(address(_mockController), _supportCall, _supportReturned);
58
+
59
+ // mock setTerminalsAllowed call
60
+ bytes memory _allowedCall = abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (1));
61
+ bytes memory _allowedReturn = abi.encode(false);
62
+
63
+ mockExpect(address(_mockController), _allowedCall, _allowedReturn);
64
+
65
+ // needed for the call
66
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
67
+ _terminals[0] = _terminalToAdd;
68
+
69
+ vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetTerminalsNotAllowed.selector, 1));
70
+ _directory.setTerminalsOf(1, _terminals);
71
+ }
72
+
73
+ function test_WhenCallerHasNoPermission() external {
74
+ // it should revert with UNAUTHORIZED()
75
+ // mock ownerOf call
76
+ bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
77
+ address _ownerData = address(1);
78
+
79
+ mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
80
+
81
+ // mock first permissions call
82
+ bytes memory _permissionsCall = abi.encodeCall(
83
+ IJBPermissions.hasPermission, (address(this), address(1), 1, JBPermissionIds.SET_TERMINALS, true, true)
84
+ );
85
+ bytes memory _permissionsReturned = abi.encode(false);
86
+
87
+ mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
88
+
89
+ // needed for the call
90
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
91
+ _terminals[0] = _terminalToAdd;
92
+
93
+ vm.expectRevert(
94
+ abi.encodeWithSelector(
95
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
96
+ _ownerData,
97
+ address(this),
98
+ 1,
99
+ JBPermissionIds.SET_TERMINALS
100
+ )
101
+ );
102
+ _directory.setTerminalsOf(1, _terminals);
103
+ }
104
+
105
+ function test_GivenDuplicateTerminalsWereAdded() external whenCallerHasPermission givenSetTerminalsAllowed {
106
+ // it should revert with DUPLICATE_TERMINALS()
107
+ // needed for the call
108
+ IJBTerminal[] memory _terminals = new IJBTerminal[](2);
109
+ _terminals[0] = _terminalToAdd;
110
+ _terminals[1] = _terminalToAdd;
111
+
112
+ vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_DuplicateTerminals.selector, _terminalToAdd));
113
+ _directory.setTerminalsOf(1, _terminals);
114
+ }
115
+
116
+ function test_GivenDuplicateTerminalsWereNotAdded() external whenCallerHasPermission givenSetTerminalsAllowed {
117
+ // it should set terminals and emit SetTerminals
118
+
119
+ // needed for the call
120
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
121
+ _terminals[0] = _terminalToAdd;
122
+
123
+ vm.expectEmit();
124
+ emit IJBDirectory.SetTerminals(1, _terminals, address(this));
125
+
126
+ _directory.setTerminalsOf(1, _terminals);
127
+ }
128
+ }