@bananapus/core-v6 0.0.37 → 0.0.39

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 (324) hide show
  1. package/foundry.lock +1 -7
  2. package/foundry.toml +1 -1
  3. package/package.json +19 -7
  4. package/src/JBChainlinkV3PriceFeed.sol +4 -1
  5. package/src/JBChainlinkV3SequencerPriceFeed.sol +4 -2
  6. package/src/JBController.sol +71 -44
  7. package/src/JBDeadline.sol +4 -4
  8. package/src/JBDirectory.sol +34 -32
  9. package/src/JBERC20.sol +5 -4
  10. package/src/JBFeelessAddresses.sol +6 -3
  11. package/src/JBFundAccessLimits.sol +25 -21
  12. package/src/JBMultiTerminal.sol +121 -84
  13. package/src/JBPermissions.sol +34 -37
  14. package/src/JBPrices.sol +23 -18
  15. package/src/JBProjects.sol +6 -3
  16. package/src/JBRulesets.sol +44 -41
  17. package/src/JBSplits.sol +18 -16
  18. package/src/JBTerminalStore.sol +32 -25
  19. package/src/JBTokens.sol +36 -26
  20. package/src/abstract/JBControlled.sol +3 -1
  21. package/src/abstract/JBPermissioned.sol +3 -1
  22. package/src/enums/JBApprovalStatus.sol +7 -1
  23. package/src/interfaces/IJBController.sol +7 -3
  24. package/src/interfaces/IJBDirectory.sol +3 -1
  25. package/src/interfaces/IJBMultiTerminal.sol +3 -2
  26. package/src/interfaces/IJBPermissions.sol +2 -1
  27. package/src/interfaces/IJBPrices.sol +3 -1
  28. package/src/interfaces/IJBRulesets.sol +2 -1
  29. package/src/interfaces/IJBSplits.sol +2 -1
  30. package/src/interfaces/IJBTerminal.sol +3 -1
  31. package/src/interfaces/IJBTerminalStore.sol +3 -1
  32. package/src/interfaces/IJBTokens.sol +2 -1
  33. package/src/libraries/JBCashOuts.sol +6 -1
  34. package/src/libraries/JBConstants.sol +12 -3
  35. package/src/libraries/JBCurrencyIds.sol +2 -0
  36. package/src/libraries/JBFees.sol +52 -10
  37. package/src/libraries/JBFixedPointNumber.sol +2 -0
  38. package/src/libraries/JBPayoutSplitGroupLib.sol +7 -4
  39. package/src/libraries/JBRulesetMetadataResolver.sol +4 -0
  40. package/src/libraries/JBSplitGroupIds.sol +2 -1
  41. package/src/libraries/JBSurplus.sol +3 -1
  42. package/src/periphery/JBMatchingPriceFeed.sol +3 -1
  43. package/src/structs/JBAccountingContext.sol +7 -4
  44. package/src/structs/JBFundAccessLimitGroup.sol +10 -17
  45. package/src/structs/JBRuleset.sol +18 -26
  46. package/src/structs/JBRulesetConfig.sol +13 -25
  47. package/src/structs/JBRulesetMetadata.sol +25 -32
  48. package/test/mock/MockMaliciousBeneficiary.sol +15 -15
  49. package/ADMINISTRATION.md +0 -103
  50. package/ARCHITECTURE.md +0 -133
  51. package/AUDIT_INSTRUCTIONS.md +0 -139
  52. package/RISKS.md +0 -215
  53. package/SKILLS.md +0 -55
  54. package/STYLE_GUIDE.md +0 -610
  55. package/USER_JOURNEYS.md +0 -215
  56. package/script/Deploy.s.sol +0 -124
  57. package/script/DeployPeriphery.s.sol +0 -354
  58. package/slither-ci.config.json +0 -10
  59. package/test/AuditFixes.t.sol +0 -808
  60. package/test/ComprehensiveInvariant.t.sol +0 -306
  61. package/test/CoreExploitTests.t.sol +0 -2741
  62. package/test/EconomicSimulation.t.sol +0 -348
  63. package/test/EntryPointPermutations.t.sol +0 -684
  64. package/test/FlashLoanAttacks.t.sol +0 -797
  65. package/test/PermissionEscalation.t.sol +0 -711
  66. package/test/PermissionsInvariant.t.sol +0 -403
  67. package/test/RulesetTransitions.t.sol +0 -713
  68. package/test/SplitLoopTests.t.sol +0 -752
  69. package/test/TestAccessToFunds.sol +0 -2683
  70. package/test/TestAuditResponseDesignProofs.sol +0 -434
  71. package/test/TestCashOut.sol +0 -198
  72. package/test/TestCashOutCountFor.sol +0 -271
  73. package/test/TestCashOutHooks.sol +0 -351
  74. package/test/TestCashOutTimingEdge.sol +0 -241
  75. package/test/TestDataHookFuzzing.sol +0 -524
  76. package/test/TestDurationUnderflow.sol +0 -233
  77. package/test/TestFeeFreeCashOutBypass.sol +0 -949
  78. package/test/TestFeeProcessingFailure.sol +0 -218
  79. package/test/TestFees.sol +0 -619
  80. package/test/TestForwardedTokenConsumption.sol +0 -425
  81. package/test/TestInterfaceSupport.sol +0 -81
  82. package/test/TestJBERC20Inheritance.sol +0 -103
  83. package/test/TestL2SequencerPriceFeed.sol +0 -292
  84. package/test/TestLaunchProject.sol +0 -188
  85. package/test/TestMetaTx.sol +0 -217
  86. package/test/TestMetadataOffsetOverflow.sol +0 -179
  87. package/test/TestMetadataParserLib.sol +0 -471
  88. package/test/TestMigrationHeldFees.sol +0 -255
  89. package/test/TestMintTokensOf.sol +0 -185
  90. package/test/TestMultiTerminalSurplus.sol +0 -348
  91. package/test/TestMultiTokenSurplus.sol +0 -202
  92. package/test/TestMultipleAccessLimits.sol +0 -664
  93. package/test/TestPayBurnRedeemFlow.sol +0 -195
  94. package/test/TestPayHooks.sol +0 -209
  95. package/test/TestPermissions.sol +0 -324
  96. package/test/TestPermissionsEdge.sol +0 -290
  97. package/test/TestPermit2DataHook.t.sol +0 -360
  98. package/test/TestPermit2Terminal.sol +0 -372
  99. package/test/TestRulesetQueueing.sol +0 -1025
  100. package/test/TestRulesetQueuingStress.sol +0 -806
  101. package/test/TestRulesetWeightCaching.sol +0 -178
  102. package/test/TestSplits.sol +0 -391
  103. package/test/TestTerminalMigration.sol +0 -274
  104. package/test/TestTerminalPreviewParity.sol +0 -208
  105. package/test/TestTokenFlow.sol +0 -191
  106. package/test/TestWeightCacheStaleAfterRejection.sol +0 -303
  107. package/test/WeirdTokenTests.t.sol +0 -817
  108. package/test/audit/CashOutReenterPay.t.sol +0 -501
  109. package/test/audit/CodexHeldFeeRounding.t.sol +0 -159
  110. package/test/audit/CodexMigrationFeeFailure.t.sol +0 -163
  111. package/test/audit/CrossTerminalSurplusSpoof.t.sol +0 -140
  112. package/test/audit/CycledSurplusAllowanceReset.t.sol +0 -184
  113. package/test/audit/FeeFreeSurplusLifecycle.t.sol +0 -399
  114. package/test/audit/FeeFreeSurplusStale.t.sol +0 -248
  115. package/test/audit/USDTVoidReturnCompat.t.sol +0 -525
  116. package/test/fork/TestChainlinkPriceFeedFork.sol +0 -254
  117. package/test/fork/TestSequencerPriceFeedFork.sol +0 -168
  118. package/test/fork/TestTerminalPreviewParityFork.sol +0 -108
  119. package/test/formal/BondingCurveProperties.t.sol +0 -420
  120. package/test/formal/FeeProperties.t.sol +0 -252
  121. package/test/invariants/Phase3DeepInvariant.t.sol +0 -412
  122. package/test/invariants/RulesetsInvariant.t.sol +0 -125
  123. package/test/invariants/TerminalStoreInvariant.t.sol +0 -227
  124. package/test/invariants/TokensInvariant.t.sol +0 -195
  125. package/test/invariants/handlers/ComprehensiveHandler.sol +0 -303
  126. package/test/invariants/handlers/EconomicHandler.sol +0 -377
  127. package/test/invariants/handlers/Phase3Handler.sol +0 -443
  128. package/test/invariants/handlers/RulesetsHandler.sol +0 -115
  129. package/test/invariants/handlers/TerminalStoreHandler.sol +0 -151
  130. package/test/invariants/handlers/TokensHandler.sol +0 -126
  131. package/test/regression/HoldFeesCashOutReserved.t.sol +0 -415
  132. package/test/regression/WeightCacheBoundary.t.sol +0 -291
  133. package/test/trees/JBController/burnTokensOf.tree +0 -9
  134. package/test/trees/JBController/claimTokensFor.tree +0 -5
  135. package/test/trees/JBController/deployERC20For.tree +0 -5
  136. package/test/trees/JBController/getRulesetOf.tree +0 -5
  137. package/test/trees/JBController/launchProjectFor.tree +0 -12
  138. package/test/trees/JBController/launchRulesetsFor.tree +0 -8
  139. package/test/trees/JBController/migrateController.tree +0 -12
  140. package/test/trees/JBController/mintTokensOf.tree +0 -12
  141. package/test/trees/JBController/payReservedTokenToTerminal.tree +0 -8
  142. package/test/trees/JBController/receiveMigrationFrom.tree +0 -4
  143. package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +0 -12
  144. package/test/trees/JBController/setMetadataOf.tree +0 -5
  145. package/test/trees/JBController/setSplitGroupsOf.tree +0 -5
  146. package/test/trees/JBController/setTokenFor.tree +0 -5
  147. package/test/trees/JBController/transferCreditsFrom.tree +0 -8
  148. package/test/trees/JBDirectory/primaryTerminalOf.tree +0 -8
  149. package/test/trees/JBDirectory/setControllerOf.tree +0 -11
  150. package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +0 -15
  151. package/test/trees/JBDirectory/setTerminalsOf.tree +0 -11
  152. package/test/trees/JBERC20/initialize.tree +0 -7
  153. package/test/trees/JBERC20/name.tree +0 -5
  154. package/test/trees/JBERC20/nonces.tree +0 -5
  155. package/test/trees/JBERC20/symbol.tree +0 -5
  156. package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +0 -5
  157. package/test/trees/JBFeelessAddresses/supportsInterface.tree +0 -5
  158. package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +0 -5
  159. package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +0 -8
  160. package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +0 -18
  161. package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +0 -5
  162. package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +0 -8
  163. package/test/trees/JBMetadataResolver/getDataFor.tree +0 -8
  164. package/test/trees/JBMultiTerminal/accountingContextsOf.tree +0 -5
  165. package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +0 -10
  166. package/test/trees/JBMultiTerminal/addToBalanceOf.tree +0 -23
  167. package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +0 -23
  168. package/test/trees/JBMultiTerminal/executePayout.tree +0 -32
  169. package/test/trees/JBMultiTerminal/executeProcessFee.tree +0 -14
  170. package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +0 -12
  171. package/test/trees/JBMultiTerminal/pay.tree +0 -23
  172. package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +0 -8
  173. package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +0 -34
  174. package/test/trees/JBMultiTerminal/useAllowanceOf.tree +0 -16
  175. package/test/trees/JBPermissions/hasPermission.tree +0 -8
  176. package/test/trees/JBPermissions/hasPermissions.tree +0 -8
  177. package/test/trees/JBPermissions/setPermissionsFor.tree +0 -5
  178. package/test/trees/JBPrices/addPriceFeedFor.tree +0 -14
  179. package/test/trees/JBPrices/pricePerUnitOf.tree +0 -11
  180. package/test/trees/JBProjects/createFor.tree +0 -11
  181. package/test/trees/JBProjects/setTokenUriResolver.tree +0 -5
  182. package/test/trees/JBProjects/supportsInterface.tree +0 -9
  183. package/test/trees/JBProjects/tokenURI.tree +0 -5
  184. package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +0 -8
  185. package/test/trees/JBRulesets/currentOf.tree +0 -12
  186. package/test/trees/JBRulesets/getRulesetOf.tree +0 -5
  187. package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +0 -10
  188. package/test/trees/JBRulesets/rulesetsOf.tree +0 -11
  189. package/test/trees/JBRulesets/upcomingRulesetOf.tree +0 -20
  190. package/test/trees/JBRulesets/updateRulesetWeightCache.tree +0 -5
  191. package/test/trees/JBSplits/setSplitGroupsOf.tree +0 -17
  192. package/test/trees/JBSplits/splitsOf.tree +0 -5
  193. package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +0 -16
  194. package/test/trees/JBTerminalStore/currentSurplusOf.tree +0 -25
  195. package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +0 -5
  196. package/test/trees/JBTerminalStore/recordCashOutsFor.tree +0 -16
  197. package/test/trees/JBTerminalStore/recordPaymentFrom.tree +0 -14
  198. package/test/trees/JBTerminalStore/recordPayoutFor.tree +0 -10
  199. package/test/trees/JBTerminalStore/recordTerminalMigration.tree +0 -5
  200. package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +0 -10
  201. package/test/trees/JBTokens/burnFrom.tree +0 -10
  202. package/test/trees/JBTokens/claimTokensFor.tree +0 -10
  203. package/test/trees/JBTokens/deployERC20For.tree +0 -12
  204. package/test/trees/JBTokens/mintFor.tree +0 -10
  205. package/test/trees/JBTokens/setTokenFor.tree +0 -11
  206. package/test/trees/JBTokens/totalBalanceOf.tree +0 -5
  207. package/test/trees/JBTokens/totalSupplyOf.tree +0 -5
  208. package/test/trees/JBTokens/transferCreditsFrom.tree +0 -8
  209. package/test/trees/mintTokensOf.tree +0 -12
  210. package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +0 -223
  211. package/test/units/static/JBController/JBControllerSetup.sol +0 -50
  212. package/test/units/static/JBController/TestBurnTokensOf.sol +0 -114
  213. package/test/units/static/JBController/TestClaimTokensFor.sol +0 -63
  214. package/test/units/static/JBController/TestDeployErc20For.sol +0 -86
  215. package/test/units/static/JBController/TestLaunchProjectFor.sol +0 -302
  216. package/test/units/static/JBController/TestLaunchRulesetsFor.sol +0 -342
  217. package/test/units/static/JBController/TestMigrateController.sol +0 -157
  218. package/test/units/static/JBController/TestMintTokensOfUnits.sol +0 -111
  219. package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +0 -324
  220. package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +0 -74
  221. package/test/units/static/JBController/TestPreviewMintOf.sol +0 -117
  222. package/test/units/static/JBController/TestReceiveMigrationFrom.sol +0 -99
  223. package/test/units/static/JBController/TestRulesetViews.sol +0 -225
  224. package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +0 -615
  225. package/test/units/static/JBController/TestSetSplitGroupsOf.sol +0 -68
  226. package/test/units/static/JBController/TestSetTokenFor.sol +0 -239
  227. package/test/units/static/JBController/TestSetUriOf.sol +0 -57
  228. package/test/units/static/JBController/TestTransferCreditsFrom.sol +0 -169
  229. package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +0 -211
  230. package/test/units/static/JBDirectory/JBDirectorySetup.sol +0 -26
  231. package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +0 -126
  232. package/test/units/static/JBDirectory/TestSetControllerOf.sol +0 -183
  233. package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +0 -104
  234. package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +0 -179
  235. package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +0 -137
  236. package/test/units/static/JBERC20/JBERC20Setup.sol +0 -34
  237. package/test/units/static/JBERC20/SigUtils.sol +0 -36
  238. package/test/units/static/JBERC20/TestInitialize.sol +0 -60
  239. package/test/units/static/JBERC20/TestName.sol +0 -30
  240. package/test/units/static/JBERC20/TestNonces.sol +0 -62
  241. package/test/units/static/JBERC20/TestSymbol.sol +0 -31
  242. package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +0 -22
  243. package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +0 -30
  244. package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +0 -35
  245. package/test/units/static/JBFees/TestFeesFuzz.sol +0 -79
  246. package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +0 -16
  247. package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +0 -71
  248. package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +0 -24
  249. package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +0 -163
  250. package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +0 -59
  251. package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +0 -101
  252. package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +0 -189
  253. package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +0 -64
  254. package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +0 -102
  255. package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +0 -90
  256. package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +0 -247
  257. package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +0 -229
  258. package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +0 -50
  259. package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +0 -72
  260. package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +0 -289
  261. package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +0 -474
  262. package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +0 -624
  263. package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +0 -578
  264. package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +0 -202
  265. package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +0 -222
  266. package/test/units/static/JBMultiTerminal/TestPay.sol +0 -604
  267. package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +0 -117
  268. package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +0 -114
  269. package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +0 -228
  270. package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +0 -55
  271. package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +0 -257
  272. package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +0 -611
  273. package/test/units/static/JBPermissions/JBPermissionsSetup.sol +0 -20
  274. package/test/units/static/JBPermissions/TestHasPermission.sol +0 -50
  275. package/test/units/static/JBPermissions/TestHasPermissions.sol +0 -93
  276. package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +0 -64
  277. package/test/units/static/JBPrices/JBPricesSetup.sol +0 -32
  278. package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +0 -107
  279. package/test/units/static/JBPrices/TestPricePerUnitOf.sol +0 -132
  280. package/test/units/static/JBPrices/TestPrices.sol +0 -265
  281. package/test/units/static/JBProjects/JBProjectsSetup.sol +0 -22
  282. package/test/units/static/JBProjects/TestCreateFor.sol +0 -71
  283. package/test/units/static/JBProjects/TestInitialProject.sol +0 -21
  284. package/test/units/static/JBProjects/TestInterfaces.sol +0 -26
  285. package/test/units/static/JBProjects/TestSetResolver.sol +0 -37
  286. package/test/units/static/JBProjects/TestTokenUri.sol +0 -40
  287. package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +0 -108
  288. package/test/units/static/JBRulesets/JBRulesetsSetup.sol +0 -24
  289. package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +0 -265
  290. package/test/units/static/JBRulesets/TestCurrentOf.sol +0 -242
  291. package/test/units/static/JBRulesets/TestGetRulesetOf.sol +0 -100
  292. package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +0 -260
  293. package/test/units/static/JBRulesets/TestRulesets.sol +0 -632
  294. package/test/units/static/JBRulesets/TestRulesetsOf.sol +0 -37
  295. package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +0 -522
  296. package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +0 -96
  297. package/test/units/static/JBSplits/JBSplitsSetup.sol +0 -26
  298. package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +0 -552
  299. package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +0 -377
  300. package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +0 -267
  301. package/test/units/static/JBSplits/TestSplitsOf.sol +0 -24
  302. package/test/units/static/JBSplits/TestSplitsPacking.sol +0 -36
  303. package/test/units/static/JBSurplus/TestSurplusFuzz.sol +0 -160
  304. package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +0 -45
  305. package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +0 -536
  306. package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +0 -463
  307. package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +0 -135
  308. package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +0 -476
  309. package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +0 -494
  310. package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +0 -652
  311. package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +0 -744
  312. package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +0 -289
  313. package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +0 -138
  314. package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +0 -415
  315. package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +0 -219
  316. package/test/units/static/JBTokens/JBTokensSetup.sol +0 -32
  317. package/test/units/static/JBTokens/TestBurnFrom.sol +0 -107
  318. package/test/units/static/JBTokens/TestClaimTokensFor.sol +0 -110
  319. package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +0 -92
  320. package/test/units/static/JBTokens/TestMintFor.sol +0 -100
  321. package/test/units/static/JBTokens/TestSetTokenFor.sol +0 -98
  322. package/test/units/static/JBTokens/TestTotalBalanceOf.sol +0 -65
  323. package/test/units/static/JBTokens/TestTotalSupplyOf.sol +0 -56
  324. 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
- }