@bananapus/core-v6 0.0.37 → 0.0.38

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 (287) hide show
  1. package/foundry.lock +1 -7
  2. package/foundry.toml +1 -1
  3. package/package.json +19 -7
  4. package/src/JBController.sol +19 -1
  5. package/src/JBMultiTerminal.sol +68 -34
  6. package/src/JBTerminalStore.sol +6 -6
  7. package/src/interfaces/IJBController.sol +4 -1
  8. package/src/libraries/JBFees.sol +47 -9
  9. package/src/libraries/JBPayoutSplitGroupLib.sol +2 -2
  10. package/src/periphery/JBMatchingPriceFeed.sol +1 -1
  11. package/test/mock/MockMaliciousBeneficiary.sol +15 -15
  12. package/ADMINISTRATION.md +0 -103
  13. package/ARCHITECTURE.md +0 -133
  14. package/AUDIT_INSTRUCTIONS.md +0 -139
  15. package/RISKS.md +0 -215
  16. package/SKILLS.md +0 -55
  17. package/STYLE_GUIDE.md +0 -610
  18. package/USER_JOURNEYS.md +0 -215
  19. package/script/Deploy.s.sol +0 -124
  20. package/script/DeployPeriphery.s.sol +0 -354
  21. package/slither-ci.config.json +0 -10
  22. package/test/AuditFixes.t.sol +0 -808
  23. package/test/ComprehensiveInvariant.t.sol +0 -306
  24. package/test/CoreExploitTests.t.sol +0 -2741
  25. package/test/EconomicSimulation.t.sol +0 -348
  26. package/test/EntryPointPermutations.t.sol +0 -684
  27. package/test/FlashLoanAttacks.t.sol +0 -797
  28. package/test/PermissionEscalation.t.sol +0 -711
  29. package/test/PermissionsInvariant.t.sol +0 -403
  30. package/test/RulesetTransitions.t.sol +0 -713
  31. package/test/SplitLoopTests.t.sol +0 -752
  32. package/test/TestAccessToFunds.sol +0 -2683
  33. package/test/TestAuditResponseDesignProofs.sol +0 -434
  34. package/test/TestCashOut.sol +0 -198
  35. package/test/TestCashOutCountFor.sol +0 -271
  36. package/test/TestCashOutHooks.sol +0 -351
  37. package/test/TestCashOutTimingEdge.sol +0 -241
  38. package/test/TestDataHookFuzzing.sol +0 -524
  39. package/test/TestDurationUnderflow.sol +0 -233
  40. package/test/TestFeeFreeCashOutBypass.sol +0 -949
  41. package/test/TestFeeProcessingFailure.sol +0 -218
  42. package/test/TestFees.sol +0 -619
  43. package/test/TestForwardedTokenConsumption.sol +0 -425
  44. package/test/TestInterfaceSupport.sol +0 -81
  45. package/test/TestJBERC20Inheritance.sol +0 -103
  46. package/test/TestL2SequencerPriceFeed.sol +0 -292
  47. package/test/TestLaunchProject.sol +0 -188
  48. package/test/TestMetaTx.sol +0 -217
  49. package/test/TestMetadataOffsetOverflow.sol +0 -179
  50. package/test/TestMetadataParserLib.sol +0 -471
  51. package/test/TestMigrationHeldFees.sol +0 -255
  52. package/test/TestMintTokensOf.sol +0 -185
  53. package/test/TestMultiTerminalSurplus.sol +0 -348
  54. package/test/TestMultiTokenSurplus.sol +0 -202
  55. package/test/TestMultipleAccessLimits.sol +0 -664
  56. package/test/TestPayBurnRedeemFlow.sol +0 -195
  57. package/test/TestPayHooks.sol +0 -209
  58. package/test/TestPermissions.sol +0 -324
  59. package/test/TestPermissionsEdge.sol +0 -290
  60. package/test/TestPermit2DataHook.t.sol +0 -360
  61. package/test/TestPermit2Terminal.sol +0 -372
  62. package/test/TestRulesetQueueing.sol +0 -1025
  63. package/test/TestRulesetQueuingStress.sol +0 -806
  64. package/test/TestRulesetWeightCaching.sol +0 -178
  65. package/test/TestSplits.sol +0 -391
  66. package/test/TestTerminalMigration.sol +0 -274
  67. package/test/TestTerminalPreviewParity.sol +0 -208
  68. package/test/TestTokenFlow.sol +0 -191
  69. package/test/TestWeightCacheStaleAfterRejection.sol +0 -303
  70. package/test/WeirdTokenTests.t.sol +0 -817
  71. package/test/audit/CashOutReenterPay.t.sol +0 -501
  72. package/test/audit/CodexHeldFeeRounding.t.sol +0 -159
  73. package/test/audit/CodexMigrationFeeFailure.t.sol +0 -163
  74. package/test/audit/CrossTerminalSurplusSpoof.t.sol +0 -140
  75. package/test/audit/CycledSurplusAllowanceReset.t.sol +0 -184
  76. package/test/audit/FeeFreeSurplusLifecycle.t.sol +0 -399
  77. package/test/audit/FeeFreeSurplusStale.t.sol +0 -248
  78. package/test/audit/USDTVoidReturnCompat.t.sol +0 -525
  79. package/test/fork/TestChainlinkPriceFeedFork.sol +0 -254
  80. package/test/fork/TestSequencerPriceFeedFork.sol +0 -168
  81. package/test/fork/TestTerminalPreviewParityFork.sol +0 -108
  82. package/test/formal/BondingCurveProperties.t.sol +0 -420
  83. package/test/formal/FeeProperties.t.sol +0 -252
  84. package/test/invariants/Phase3DeepInvariant.t.sol +0 -412
  85. package/test/invariants/RulesetsInvariant.t.sol +0 -125
  86. package/test/invariants/TerminalStoreInvariant.t.sol +0 -227
  87. package/test/invariants/TokensInvariant.t.sol +0 -195
  88. package/test/invariants/handlers/ComprehensiveHandler.sol +0 -303
  89. package/test/invariants/handlers/EconomicHandler.sol +0 -377
  90. package/test/invariants/handlers/Phase3Handler.sol +0 -443
  91. package/test/invariants/handlers/RulesetsHandler.sol +0 -115
  92. package/test/invariants/handlers/TerminalStoreHandler.sol +0 -151
  93. package/test/invariants/handlers/TokensHandler.sol +0 -126
  94. package/test/regression/HoldFeesCashOutReserved.t.sol +0 -415
  95. package/test/regression/WeightCacheBoundary.t.sol +0 -291
  96. package/test/trees/JBController/burnTokensOf.tree +0 -9
  97. package/test/trees/JBController/claimTokensFor.tree +0 -5
  98. package/test/trees/JBController/deployERC20For.tree +0 -5
  99. package/test/trees/JBController/getRulesetOf.tree +0 -5
  100. package/test/trees/JBController/launchProjectFor.tree +0 -12
  101. package/test/trees/JBController/launchRulesetsFor.tree +0 -8
  102. package/test/trees/JBController/migrateController.tree +0 -12
  103. package/test/trees/JBController/mintTokensOf.tree +0 -12
  104. package/test/trees/JBController/payReservedTokenToTerminal.tree +0 -8
  105. package/test/trees/JBController/receiveMigrationFrom.tree +0 -4
  106. package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +0 -12
  107. package/test/trees/JBController/setMetadataOf.tree +0 -5
  108. package/test/trees/JBController/setSplitGroupsOf.tree +0 -5
  109. package/test/trees/JBController/setTokenFor.tree +0 -5
  110. package/test/trees/JBController/transferCreditsFrom.tree +0 -8
  111. package/test/trees/JBDirectory/primaryTerminalOf.tree +0 -8
  112. package/test/trees/JBDirectory/setControllerOf.tree +0 -11
  113. package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +0 -15
  114. package/test/trees/JBDirectory/setTerminalsOf.tree +0 -11
  115. package/test/trees/JBERC20/initialize.tree +0 -7
  116. package/test/trees/JBERC20/name.tree +0 -5
  117. package/test/trees/JBERC20/nonces.tree +0 -5
  118. package/test/trees/JBERC20/symbol.tree +0 -5
  119. package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +0 -5
  120. package/test/trees/JBFeelessAddresses/supportsInterface.tree +0 -5
  121. package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +0 -5
  122. package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +0 -8
  123. package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +0 -18
  124. package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +0 -5
  125. package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +0 -8
  126. package/test/trees/JBMetadataResolver/getDataFor.tree +0 -8
  127. package/test/trees/JBMultiTerminal/accountingContextsOf.tree +0 -5
  128. package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +0 -10
  129. package/test/trees/JBMultiTerminal/addToBalanceOf.tree +0 -23
  130. package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +0 -23
  131. package/test/trees/JBMultiTerminal/executePayout.tree +0 -32
  132. package/test/trees/JBMultiTerminal/executeProcessFee.tree +0 -14
  133. package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +0 -12
  134. package/test/trees/JBMultiTerminal/pay.tree +0 -23
  135. package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +0 -8
  136. package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +0 -34
  137. package/test/trees/JBMultiTerminal/useAllowanceOf.tree +0 -16
  138. package/test/trees/JBPermissions/hasPermission.tree +0 -8
  139. package/test/trees/JBPermissions/hasPermissions.tree +0 -8
  140. package/test/trees/JBPermissions/setPermissionsFor.tree +0 -5
  141. package/test/trees/JBPrices/addPriceFeedFor.tree +0 -14
  142. package/test/trees/JBPrices/pricePerUnitOf.tree +0 -11
  143. package/test/trees/JBProjects/createFor.tree +0 -11
  144. package/test/trees/JBProjects/setTokenUriResolver.tree +0 -5
  145. package/test/trees/JBProjects/supportsInterface.tree +0 -9
  146. package/test/trees/JBProjects/tokenURI.tree +0 -5
  147. package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +0 -8
  148. package/test/trees/JBRulesets/currentOf.tree +0 -12
  149. package/test/trees/JBRulesets/getRulesetOf.tree +0 -5
  150. package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +0 -10
  151. package/test/trees/JBRulesets/rulesetsOf.tree +0 -11
  152. package/test/trees/JBRulesets/upcomingRulesetOf.tree +0 -20
  153. package/test/trees/JBRulesets/updateRulesetWeightCache.tree +0 -5
  154. package/test/trees/JBSplits/setSplitGroupsOf.tree +0 -17
  155. package/test/trees/JBSplits/splitsOf.tree +0 -5
  156. package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +0 -16
  157. package/test/trees/JBTerminalStore/currentSurplusOf.tree +0 -25
  158. package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +0 -5
  159. package/test/trees/JBTerminalStore/recordCashOutsFor.tree +0 -16
  160. package/test/trees/JBTerminalStore/recordPaymentFrom.tree +0 -14
  161. package/test/trees/JBTerminalStore/recordPayoutFor.tree +0 -10
  162. package/test/trees/JBTerminalStore/recordTerminalMigration.tree +0 -5
  163. package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +0 -10
  164. package/test/trees/JBTokens/burnFrom.tree +0 -10
  165. package/test/trees/JBTokens/claimTokensFor.tree +0 -10
  166. package/test/trees/JBTokens/deployERC20For.tree +0 -12
  167. package/test/trees/JBTokens/mintFor.tree +0 -10
  168. package/test/trees/JBTokens/setTokenFor.tree +0 -11
  169. package/test/trees/JBTokens/totalBalanceOf.tree +0 -5
  170. package/test/trees/JBTokens/totalSupplyOf.tree +0 -5
  171. package/test/trees/JBTokens/transferCreditsFrom.tree +0 -8
  172. package/test/trees/mintTokensOf.tree +0 -12
  173. package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +0 -223
  174. package/test/units/static/JBController/JBControllerSetup.sol +0 -50
  175. package/test/units/static/JBController/TestBurnTokensOf.sol +0 -114
  176. package/test/units/static/JBController/TestClaimTokensFor.sol +0 -63
  177. package/test/units/static/JBController/TestDeployErc20For.sol +0 -86
  178. package/test/units/static/JBController/TestLaunchProjectFor.sol +0 -302
  179. package/test/units/static/JBController/TestLaunchRulesetsFor.sol +0 -342
  180. package/test/units/static/JBController/TestMigrateController.sol +0 -157
  181. package/test/units/static/JBController/TestMintTokensOfUnits.sol +0 -111
  182. package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +0 -324
  183. package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +0 -74
  184. package/test/units/static/JBController/TestPreviewMintOf.sol +0 -117
  185. package/test/units/static/JBController/TestReceiveMigrationFrom.sol +0 -99
  186. package/test/units/static/JBController/TestRulesetViews.sol +0 -225
  187. package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +0 -615
  188. package/test/units/static/JBController/TestSetSplitGroupsOf.sol +0 -68
  189. package/test/units/static/JBController/TestSetTokenFor.sol +0 -239
  190. package/test/units/static/JBController/TestSetUriOf.sol +0 -57
  191. package/test/units/static/JBController/TestTransferCreditsFrom.sol +0 -169
  192. package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +0 -211
  193. package/test/units/static/JBDirectory/JBDirectorySetup.sol +0 -26
  194. package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +0 -126
  195. package/test/units/static/JBDirectory/TestSetControllerOf.sol +0 -183
  196. package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +0 -104
  197. package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +0 -179
  198. package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +0 -137
  199. package/test/units/static/JBERC20/JBERC20Setup.sol +0 -34
  200. package/test/units/static/JBERC20/SigUtils.sol +0 -36
  201. package/test/units/static/JBERC20/TestInitialize.sol +0 -60
  202. package/test/units/static/JBERC20/TestName.sol +0 -30
  203. package/test/units/static/JBERC20/TestNonces.sol +0 -62
  204. package/test/units/static/JBERC20/TestSymbol.sol +0 -31
  205. package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +0 -22
  206. package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +0 -30
  207. package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +0 -35
  208. package/test/units/static/JBFees/TestFeesFuzz.sol +0 -79
  209. package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +0 -16
  210. package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +0 -71
  211. package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +0 -24
  212. package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +0 -163
  213. package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +0 -59
  214. package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +0 -101
  215. package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +0 -189
  216. package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +0 -64
  217. package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +0 -102
  218. package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +0 -90
  219. package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +0 -247
  220. package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +0 -229
  221. package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +0 -50
  222. package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +0 -72
  223. package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +0 -289
  224. package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +0 -474
  225. package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +0 -624
  226. package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +0 -578
  227. package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +0 -202
  228. package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +0 -222
  229. package/test/units/static/JBMultiTerminal/TestPay.sol +0 -604
  230. package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +0 -117
  231. package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +0 -114
  232. package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +0 -228
  233. package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +0 -55
  234. package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +0 -257
  235. package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +0 -611
  236. package/test/units/static/JBPermissions/JBPermissionsSetup.sol +0 -20
  237. package/test/units/static/JBPermissions/TestHasPermission.sol +0 -50
  238. package/test/units/static/JBPermissions/TestHasPermissions.sol +0 -93
  239. package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +0 -64
  240. package/test/units/static/JBPrices/JBPricesSetup.sol +0 -32
  241. package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +0 -107
  242. package/test/units/static/JBPrices/TestPricePerUnitOf.sol +0 -132
  243. package/test/units/static/JBPrices/TestPrices.sol +0 -265
  244. package/test/units/static/JBProjects/JBProjectsSetup.sol +0 -22
  245. package/test/units/static/JBProjects/TestCreateFor.sol +0 -71
  246. package/test/units/static/JBProjects/TestInitialProject.sol +0 -21
  247. package/test/units/static/JBProjects/TestInterfaces.sol +0 -26
  248. package/test/units/static/JBProjects/TestSetResolver.sol +0 -37
  249. package/test/units/static/JBProjects/TestTokenUri.sol +0 -40
  250. package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +0 -108
  251. package/test/units/static/JBRulesets/JBRulesetsSetup.sol +0 -24
  252. package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +0 -265
  253. package/test/units/static/JBRulesets/TestCurrentOf.sol +0 -242
  254. package/test/units/static/JBRulesets/TestGetRulesetOf.sol +0 -100
  255. package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +0 -260
  256. package/test/units/static/JBRulesets/TestRulesets.sol +0 -632
  257. package/test/units/static/JBRulesets/TestRulesetsOf.sol +0 -37
  258. package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +0 -522
  259. package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +0 -96
  260. package/test/units/static/JBSplits/JBSplitsSetup.sol +0 -26
  261. package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +0 -552
  262. package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +0 -377
  263. package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +0 -267
  264. package/test/units/static/JBSplits/TestSplitsOf.sol +0 -24
  265. package/test/units/static/JBSplits/TestSplitsPacking.sol +0 -36
  266. package/test/units/static/JBSurplus/TestSurplusFuzz.sol +0 -160
  267. package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +0 -45
  268. package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +0 -536
  269. package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +0 -463
  270. package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +0 -135
  271. package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +0 -476
  272. package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +0 -494
  273. package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +0 -652
  274. package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +0 -744
  275. package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +0 -289
  276. package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +0 -138
  277. package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +0 -415
  278. package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +0 -219
  279. package/test/units/static/JBTokens/JBTokensSetup.sol +0 -32
  280. package/test/units/static/JBTokens/TestBurnFrom.sol +0 -107
  281. package/test/units/static/JBTokens/TestClaimTokensFor.sol +0 -110
  282. package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +0 -92
  283. package/test/units/static/JBTokens/TestMintFor.sol +0 -100
  284. package/test/units/static/JBTokens/TestSetTokenFor.sol +0 -98
  285. package/test/units/static/JBTokens/TestTotalBalanceOf.sol +0 -65
  286. package/test/units/static/JBTokens/TestTotalSupplyOf.sol +0 -56
  287. package/test/units/static/JBTokens/TestTransferCreditsFrom.sol +0 -56
@@ -1,26 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBDirectory} from "../../../../src/JBDirectory.sol";
5
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
6
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
7
- import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
8
- import {JBTest} from "../../../helpers/JBTest.sol";
9
-
10
- /*
11
- Contract that deploys a target contract with other mock contracts to satisfy the constructor.
12
- Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
13
- */
14
- contract JBDirectorySetup is JBTest {
15
- // Target Contract
16
- IJBDirectory public _directory;
17
-
18
- // Mocks
19
- IJBPermissions public permissions = IJBPermissions(makeAddr("permissions"));
20
- IJBProjects public projects = IJBProjects(makeAddr("projects"));
21
-
22
- function directorySetup() public virtual {
23
- // Instantiate the contract being tested
24
- _directory = new JBDirectory(permissions, projects, makeAddr("Juicer"));
25
- }
26
- }
@@ -1,126 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {IJBDirectoryAccessControl} from "../../../../src/interfaces/IJBDirectoryAccessControl.sol";
5
- import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
6
- import {JBAccountingContext} from "../../../../src/structs/JBAccountingContext.sol";
7
- import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
8
- import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
9
- import {JBDirectorySetup} from "./JBDirectorySetup.sol";
10
-
11
- contract TestPrimaryTerminalOf_Local is JBDirectorySetup {
12
- uint256 _projectId = 1;
13
- address _mockTerminal = makeAddr("mockTerminal");
14
- address _mockTerminal2 = makeAddr("mockTerminal2");
15
- address _mockToken = makeAddr("mockToken");
16
-
17
- function setUp() public {
18
- super.directorySetup();
19
- }
20
-
21
- function test_WhenThereAreNoTerminalsSupportingTheInputToken() external {
22
- // it will return the zero address
23
- }
24
-
25
- modifier whenThereIsAPrimaryTerminal() {
26
- _;
27
- }
28
-
29
- function test_GivenThereIsAPrimaryTerminalForTheToken() external whenThereIsAPrimaryTerminal {
30
- // it will return the primary terminal
31
-
32
- // first set the primary terminal
33
-
34
- // mock call to JBProjects ownerOf which will give permission
35
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
36
- bytes memory _projectsCallReturn = abi.encode(address(this));
37
- mockExpect(address(projects), _projectsCall, _projectsCallReturn);
38
-
39
- // mock call to the terminal accountingContextForTokenOf
40
-
41
- // accounting context needed for call
42
- JBAccountingContext memory _context =
43
- JBAccountingContext({token: _mockToken, decimals: 18, currency: uint32(1)});
44
- mockExpect(
45
- address(_mockTerminal),
46
- abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, _mockToken)),
47
- abi.encode(_context)
48
- );
49
-
50
- // mock call to "controller" (zero address here) for interface supp
51
- mockExpect(
52
- address(0),
53
- abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
54
- abi.encode(true)
55
- );
56
-
57
- // mock call to "controller" (zero address here) for setTerminalsAllowed
58
- mockExpect(
59
- address(0), abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (_projectId)), abi.encode(true)
60
- );
61
-
62
- // Set the primary terminal of using the previous mocks
63
- _directory.setPrimaryTerminalOf(_projectId, _mockToken, IJBTerminal(_mockTerminal));
64
-
65
- // Make sure it is stored correctly
66
- IJBTerminal _storedTerminal = _directory.primaryTerminalOf(_projectId, _mockToken);
67
- assertEq(address(_storedTerminal), _mockTerminal);
68
- }
69
-
70
- function test_GivenThereAreMultipleTerminalsWithProperAccountingContextForTokenOf() external {
71
- // it will check each terminals accountingContextForTokenOf and return the first
72
- }
73
-
74
- function test_GivenThereAreMultipleTerminalsButNoneWithTheProperAccountingContextForTokenOf() external {
75
- // it will return the zero address
76
-
77
- // first set the terminals
78
-
79
- // mock call to JBProjects ownerOf which will give permission
80
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
81
- bytes memory _projectsCallReturn = abi.encode(address(this));
82
- mockExpect(address(projects), _projectsCall, _projectsCallReturn);
83
-
84
- // mock call to the terminal accountingContextForTokenOf
85
-
86
- // accounting context needed for call
87
- JBAccountingContext memory _context = JBAccountingContext({token: address(0), decimals: 0, currency: uint32(0)});
88
- mockExpect(
89
- address(_mockTerminal),
90
- abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, address(0))),
91
- abi.encode(_context)
92
- );
93
-
94
- // mock call the the 2nd terminal accountingContextForTokenOf
95
-
96
- // accounting context needed for call
97
- mockExpect(
98
- address(_mockTerminal2),
99
- abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, address(0))),
100
- abi.encode(_context)
101
- );
102
-
103
- // mock call to "controller" (zero address here) for interface supp
104
- mockExpect(
105
- address(0),
106
- abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
107
- abi.encode(true)
108
- );
109
-
110
- // mock call to "controller" (zero address here) for setTerminalsAllowed
111
- mockExpect(
112
- address(0), abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (_projectId)), abi.encode(true)
113
- );
114
-
115
- // terminals to set
116
- IJBTerminal[] memory _terminals = new IJBTerminal[](2);
117
- _terminals[0] = IJBTerminal(_mockTerminal);
118
- _terminals[1] = IJBTerminal(_mockTerminal2);
119
-
120
- // Set the primary terminal of using the previous mocks
121
- _directory.setTerminalsOf(_projectId, _terminals);
122
-
123
- IJBTerminal returnedTerminal = _directory.primaryTerminalOf(_projectId, address(0));
124
- assertEq(address(returnedTerminal), address(0));
125
- }
126
- }
@@ -1,183 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {StdStorage, stdStorage} from "forge-std/StdStorage.sol";
5
- import {JBDirectory} from "../../../../src/JBDirectory.sol";
6
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
7
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
8
- import {IJBDirectoryAccessControl} from "../../../../src/interfaces/IJBDirectoryAccessControl.sol";
9
- import {IJBMigratable} from "../../../../src/interfaces/IJBMigratable.sol";
10
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
11
- import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
12
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
13
- import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
14
- import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
15
- import {JBDirectorySetup} from "./JBDirectorySetup.sol";
16
-
17
- contract TestSetControllerOf_Local is JBDirectorySetup {
18
- using stdStorage for StdStorage;
19
-
20
- function setUp() public {
21
- super.directorySetup();
22
- }
23
-
24
- modifier givenProjectExists() {
25
- bytes memory _countCall = abi.encodeCall(IJBProjects.count, ());
26
- bytes memory _countReturn = abi.encode(type(uint256).max);
27
-
28
- mockExpect(address(projects), _countCall, _countReturn);
29
- _;
30
- }
31
-
32
- modifier whenCallerIsAllowedToSetFirstController() {
33
- stdstore.target(address(_directory)).sig("isAllowedToSetFirstController(address)").with_key(address(this))
34
- .depth(0).checked_write(true);
35
-
36
- stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0).checked_write(address(0));
37
-
38
- // mock ownerOf call
39
- bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
40
- bytes memory _ownerData = abi.encode(address(this));
41
-
42
- mockExpect(address(projects), _ownerOfCall, _ownerData);
43
-
44
- _;
45
- }
46
-
47
- modifier givenControllerIsAlreadySet() {
48
- address _bumController = makeAddr("bum");
49
-
50
- stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
51
- .checked_write(_bumController);
52
-
53
- // mock erc165 call
54
- bytes memory _supportCall =
55
- abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
56
- bytes memory _supportReturned = abi.encode(true);
57
-
58
- mockExpect(address(_bumController), _supportCall, _supportReturned);
59
-
60
- // mock access control call
61
- bytes memory _accessCall = abi.encodeCall(IJBDirectoryAccessControl.setControllerAllowed, (1));
62
- bytes memory _accessReturned = abi.encode(false);
63
-
64
- mockExpect(address(_bumController), _accessCall, _accessReturned);
65
-
66
- _;
67
- }
68
-
69
- function test_RevertWhenCallerDoesNotHaveAnyPermission() external {
70
- // it should revert
71
- // mock ownerOf call
72
- bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
73
- address _ownerData = address(1);
74
-
75
- mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
76
-
77
- // mock first permissions call
78
- bytes memory _permissionsCall = abi.encodeCall(
79
- IJBPermissions.hasPermission, (address(this), address(1), 1, JBPermissionIds.SET_CONTROLLER, true, true)
80
- );
81
- bytes memory _permissionsReturned = abi.encode(false);
82
-
83
- mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
84
-
85
- vm.expectRevert(
86
- abi.encodeWithSelector(
87
- JBPermissioned.JBPermissioned_Unauthorized.selector,
88
- _ownerData,
89
- address(this),
90
- 1,
91
- JBPermissionIds.SET_CONTROLLER
92
- )
93
- );
94
- _directory.setControllerOf(1, IERC165(address(this)));
95
- }
96
-
97
- function test_RevertGivenAProjectDoesntExist() external whenCallerIsAllowedToSetFirstController {
98
- // it should revert
99
-
100
- // project count mock call
101
- bytes memory _countCall = abi.encodeCall(IJBProjects.count, ());
102
- bytes memory _countReturn = abi.encode(0);
103
-
104
- mockExpect(address(projects), _countCall, _countReturn);
105
-
106
- vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_InvalidProjectIdInDirectory.selector, 1, 0));
107
- _directory.setControllerOf(1, IERC165(address(this)));
108
- }
109
-
110
- function test_RevertGivenCurrentControllerIsNotSetControllerAllowed()
111
- external
112
- whenCallerIsAllowedToSetFirstController
113
- givenProjectExists
114
- givenControllerIsAlreadySet
115
- {
116
- // it should revert
117
- vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetControllerNotAllowed.selector, 1));
118
- _directory.setControllerOf(1, IERC165(address(this)));
119
- }
120
-
121
- function test_GivenCurrentControllerIsSetControllerAllowed()
122
- external
123
- whenCallerIsAllowedToSetFirstController
124
- givenProjectExists
125
- {
126
- // it should set controllerOf and emit SetController
127
- vm.expectEmit();
128
- emit IJBDirectory.SetController(1, IERC165(address(this)), address(this));
129
-
130
- _directory.setControllerOf(1, IERC165(address(this)));
131
- }
132
-
133
- function test_GivenCurrentControllerIsSetAndMigrating() external givenProjectExists {
134
- address _bumController = makeAddr("bum");
135
-
136
- stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
137
- .checked_write(_bumController);
138
-
139
- // mock ownerOf call
140
- bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
141
- bytes memory _ownerData = abi.encode(address(this));
142
-
143
- mockExpect(address(projects), _ownerOfCall, _ownerData);
144
-
145
- // Mock call to bum controller setControllerAllowed
146
- mockExpect(
147
- _bumController, abi.encodeCall(IJBDirectoryAccessControl.setControllerAllowed, (1)), abi.encode(true)
148
- );
149
-
150
- // Mock call to it's interface support
151
- mockExpect(
152
- _bumController,
153
- abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
154
- abi.encode(true)
155
- );
156
- mockExpect(
157
- _bumController,
158
- abi.encodeCall(IERC165.supportsInterface, (type(IJBMigratable).interfaceId)),
159
- abi.encode(true)
160
- );
161
- mockExpect(
162
- address(this),
163
- abi.encodeCall(IERC165.supportsInterface, (type(IJBMigratable).interfaceId)),
164
- abi.encode(true)
165
- );
166
- mockExpect(
167
- address(this),
168
- abi.encodeCall(IJBMigratable.beforeReceiveMigrationFrom, (IERC165(address(_bumController)), 1)),
169
- abi.encode("")
170
- );
171
- mockExpect(
172
- address(this),
173
- abi.encodeCall(IJBMigratable.afterReceiveMigrationFrom, (IERC165(address(_bumController)), 1)),
174
- abi.encode("")
175
- );
176
-
177
- // it should set controllerOf and emit SetController
178
- vm.expectEmit();
179
- emit IJBDirectory.SetController(1, IERC165(address(this)), address(this));
180
-
181
- _directory.setControllerOf(1, IERC165(address(this)));
182
- }
183
- }
@@ -1,104 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {StdStorage, stdStorage} from "forge-std/StdStorage.sol";
5
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
6
- import {IJBDirectoryAccessControl} from "../../../../src/interfaces/IJBDirectoryAccessControl.sol";
7
- import {IJBMigratable} from "../../../../src/interfaces/IJBMigratable.sol";
8
- import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
9
- import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
10
- import {ERC165, IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
11
- import {JBDirectorySetup} from "./JBDirectorySetup.sol";
12
-
13
- /// @notice A mock controller that asserts the directory still points to it during migrate().
14
- /// This validates that controllerOf is NOT updated before migrate() is called.
15
- contract MockMigratingController is ERC165 {
16
- IJBDirectory public immutable DIRECTORY;
17
- uint256 public immutable PROJECT_ID;
18
- bool public migrateCalled;
19
- bool public directoryPointedToSelfDuringMigrate;
20
-
21
- constructor(IJBDirectory directory, uint256 projectId) {
22
- DIRECTORY = directory;
23
- PROJECT_ID = projectId;
24
- }
25
-
26
- function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
27
- return interfaceId == type(IJBMigratable).interfaceId
28
- || interfaceId == type(IJBDirectoryAccessControl).interfaceId || super.supportsInterface(interfaceId);
29
- }
30
-
31
- function setControllerAllowed(uint256) external pure returns (bool) {
32
- return true;
33
- }
34
-
35
- function migrate(uint256, IERC165) external {
36
- migrateCalled = true;
37
- // The critical assertion: during migrate(), the directory should still point to this controller.
38
- directoryPointedToSelfDuringMigrate = (address(DIRECTORY.controllerOf(PROJECT_ID)) == address(this));
39
- }
40
-
41
- function beforeReceiveMigrationFrom(IERC165, uint256) external {}
42
-
43
- function afterReceiveMigrationFrom(IERC165, uint256) external {}
44
- }
45
-
46
- /// @notice A simple new controller that accepts migration.
47
- contract MockNewController is ERC165 {
48
- function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
49
- return interfaceId == type(IJBMigratable).interfaceId || super.supportsInterface(interfaceId);
50
- }
51
-
52
- function migrate(uint256, IERC165) external {}
53
-
54
- function beforeReceiveMigrationFrom(IERC165, uint256) external {}
55
-
56
- function afterReceiveMigrationFrom(IERC165, uint256) external {}
57
- }
58
-
59
- contract TestSetControllerOfMigrationOrder is JBDirectorySetup {
60
- using stdStorage for StdStorage;
61
-
62
- uint256 constant PROJECT_ID = 1;
63
-
64
- function setUp() public {
65
- super.directorySetup();
66
- }
67
-
68
- /// @notice Verifies that during migrate(), the directory still points to the old controller.
69
- /// This test PASSES with the correct ordering (migrate before set) and FAILS if set happens before migrate.
70
- function test_DirectoryPointsToOldControllerDuringMigrate() external {
71
- // Deploy mock controllers with real code (not mocked addresses).
72
- MockMigratingController oldController = new MockMigratingController(_directory, PROJECT_ID);
73
- MockNewController newController = new MockNewController();
74
-
75
- // Set the old controller in the directory's storage.
76
- stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(PROJECT_ID).depth(0)
77
- .checked_write(address(oldController));
78
-
79
- // Mock ownerOf to return this test contract as the project owner.
80
- mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (PROJECT_ID)), abi.encode(address(this)));
81
-
82
- // Mock project count to allow the project to exist.
83
- mockExpect(address(projects), abi.encodeCall(IJBProjects.count, ()), abi.encode(type(uint256).max));
84
-
85
- // Perform the migration.
86
- _directory.setControllerOf(PROJECT_ID, IERC165(address(newController)));
87
-
88
- // Verify migrate() was called.
89
- assertTrue(oldController.migrateCalled(), "migrate() should have been called on old controller");
90
-
91
- // Verify the directory pointed to the old controller during migrate().
92
- assertTrue(
93
- oldController.directoryPointedToSelfDuringMigrate(),
94
- "Directory should point to old controller during migrate()"
95
- );
96
-
97
- // Verify the directory now points to the new controller after everything completes.
98
- assertEq(
99
- address(_directory.controllerOf(PROJECT_ID)),
100
- address(newController),
101
- "Directory should point to new controller after migration"
102
- );
103
- }
104
- }
@@ -1,179 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {StdStorage, stdStorage} from "forge-std/StdStorage.sol";
5
- import {JBDirectory} from "../../../../src/JBDirectory.sol";
6
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
7
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
8
- import {IJBDirectoryAccessControl} from "../../../../src/interfaces/IJBDirectoryAccessControl.sol";
9
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
10
- import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
11
- import {JBAccountingContext} from "../../../../src/structs/JBAccountingContext.sol";
12
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
13
- import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
14
- import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
15
- import {JBDirectorySetup} from "./JBDirectorySetup.sol";
16
-
17
- contract TestSetPrimaryTerminalOf_Local is JBDirectorySetup {
18
- using stdStorage for StdStorage;
19
-
20
- IJBTerminal _terminalToAdd = IJBTerminal(makeAddr("newTerminal"));
21
- address _mockController = makeAddr("controller");
22
- address _token = makeAddr("newToken");
23
-
24
- function setUp() public {
25
- super.directorySetup();
26
- }
27
-
28
- modifier givenTerminalHasNotBeenAdded() {
29
- vm.expectEmit();
30
- emit IJBDirectory.AddTerminal(1, _terminalToAdd, address(this));
31
- _;
32
- }
33
-
34
- modifier whenCallerHasPermission() {
35
- // mock ownerOf call
36
- bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
37
- bytes memory _ownerData = abi.encode(address(this));
38
-
39
- mockExpect(address(projects), _ownerOfCall, _ownerData);
40
- _;
41
- }
42
-
43
- modifier givenValidAccountingContext() {
44
- // accounting context
45
- JBAccountingContext memory _context = JBAccountingContext({token: _token, decimals: 6, currency: uint32(1)});
46
-
47
- // mock accountingContext call
48
- bytes memory _contextCall = abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (1, _token));
49
- bytes memory _contextReturn = abi.encode(_context);
50
-
51
- mockExpect(address(_terminalToAdd), _contextCall, _contextReturn);
52
- _;
53
- }
54
-
55
- function test_WhenCallerHasNoMaidens() external {
56
- // it should revert with UNAUTHORIZED()
57
- // mock ownerOf call
58
- bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
59
- address _ownerData = address(1);
60
-
61
- mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
62
-
63
- // mock first permissions call
64
- bytes memory _permissionsCall = abi.encodeCall(
65
- IJBPermissions.hasPermission,
66
- (address(this), address(1), 1, JBPermissionIds.SET_PRIMARY_TERMINAL, true, true)
67
- );
68
- bytes memory _permissionsReturned = abi.encode(false);
69
-
70
- mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
71
-
72
- vm.expectRevert(
73
- abi.encodeWithSelector(
74
- JBPermissioned.JBPermissioned_Unauthorized.selector,
75
- _ownerData,
76
- address(this),
77
- 1,
78
- JBPermissionIds.SET_PRIMARY_TERMINAL
79
- )
80
- );
81
- _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
82
- }
83
-
84
- function test_GivenNoValidAccountingContextForTokenOf() external whenCallerHasPermission {
85
- // it should revert with TOKEN_NOT_ACCEPTED
86
- // accounting context
87
- JBAccountingContext memory _context = JBAccountingContext({token: address(0), decimals: 6, currency: uint32(1)});
88
-
89
- // mock accountingContext call
90
- bytes memory _contextCall = abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (1, _token));
91
- bytes memory _contextReturn = abi.encode(_context);
92
-
93
- mockExpect(address(_terminalToAdd), _contextCall, _contextReturn);
94
-
95
- vm.expectRevert(
96
- abi.encodeWithSelector(JBDirectory.JBDirectory_TokenNotAccepted.selector, 1, _token, _terminalToAdd)
97
- );
98
- _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
99
- }
100
-
101
- function test_RevertIf_GivenTerminalHasAlreadyBeenAdded()
102
- external
103
- whenCallerHasPermission
104
- givenValidAccountingContext
105
- {
106
- stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
107
- .checked_write(_mockController);
108
- // mock erc165 call
109
- bytes memory _supportCall =
110
- abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
111
- bytes memory _supportReturned = abi.encode(false);
112
-
113
- mockExpect(address(_mockController), _supportCall, _supportReturned);
114
-
115
- // it should not add the terminal, but set it as primary
116
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
117
- _terminals[0] = _terminalToAdd;
118
-
119
- vm.expectEmit();
120
- emit IJBDirectory.SetTerminals(1, _terminals, address(this));
121
-
122
- _directory.setTerminalsOf(1, _terminals);
123
-
124
- // prove that the terminal was not added - forces this test to fail as intended
125
- vm.expectEmit();
126
- emit IJBDirectory.SetPrimaryTerminal(1, _token, _terminals[0], address(this));
127
-
128
- // set the primary next and mock whatever calls
129
- _directory.setPrimaryTerminalOf(1, _token, _terminals[0]);
130
- }
131
-
132
- function test_GivenProjectIsNotAllowedToSetTerminals()
133
- external
134
- whenCallerHasPermission
135
- givenValidAccountingContext
136
- {
137
- // it should revert with SET_TERMINALS_NOT_ALLOWED
138
-
139
- stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
140
- .checked_write(_mockController);
141
-
142
- // mock erc165 call
143
- bytes memory _supportCall =
144
- abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
145
- bytes memory _supportReturned = abi.encode(true);
146
-
147
- mockExpect(address(_mockController), _supportCall, _supportReturned);
148
-
149
- // mock setTerminalsAllowed call
150
- bytes memory _allowedCall = abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (1));
151
- bytes memory _allowedReturn = abi.encode(false);
152
-
153
- mockExpect(address(_mockController), _allowedCall, _allowedReturn);
154
-
155
- vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetTerminalsNotAllowed.selector, 1));
156
- _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
157
- }
158
-
159
- function test_GivenProjectIsAllowedToSetTerminals()
160
- external
161
- whenCallerHasPermission
162
- givenValidAccountingContext
163
- givenTerminalHasNotBeenAdded
164
- {
165
- // it should set the terminal and emit AddTerminal
166
- // it should set the terminal as primary and emit SetPrimaryTerminal
167
-
168
- stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
169
- .checked_write(_mockController);
170
- // mock erc165 call
171
- bytes memory _supportCall =
172
- abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
173
- bytes memory _supportReturned = abi.encode(false);
174
-
175
- mockExpect(address(_mockController), _supportCall, _supportReturned);
176
-
177
- _directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
178
- }
179
- }