@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,223 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBTest} from "../../../helpers/JBTest.sol";
5
- import {JBChainlinkV3PriceFeed} from "../../../../src/JBChainlinkV3PriceFeed.sol";
6
- import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
7
- import {JBFixedPointNumber} from "../../../../src/libraries/JBFixedPointNumber.sol";
8
-
9
- /// @notice Mock Chainlink AggregatorV3Interface for testing.
10
- contract MockAggregator {
11
- int256 public price;
12
- uint8 public decimals_;
13
- uint256 public updatedAt_;
14
- uint80 public roundId_;
15
-
16
- function setPrice(int256 _price) external {
17
- price = _price;
18
- }
19
-
20
- function setDecimals(uint8 _decimals) external {
21
- decimals_ = _decimals;
22
- }
23
-
24
- function setUpdatedAt(uint256 _updatedAt) external {
25
- updatedAt_ = _updatedAt;
26
- }
27
-
28
- function setRoundId(uint80 _roundId) external {
29
- roundId_ = _roundId;
30
- }
31
-
32
- function decimals() external view returns (uint8) {
33
- return decimals_;
34
- }
35
-
36
- function latestRoundData()
37
- external
38
- view
39
- returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
40
- {
41
- return (roundId_, price, block.timestamp, updatedAt_, roundId_);
42
- }
43
- }
44
-
45
- /// @notice Tests for JBChainlinkV3PriceFeed.
46
- contract TestPriceFeed_Local is JBTest {
47
- using JBFixedPointNumber for uint256;
48
-
49
- MockAggregator mockFeed;
50
- JBChainlinkV3PriceFeed priceFeed;
51
-
52
- uint256 constant THRESHOLD = 1 hours;
53
-
54
- function setUp() external {
55
- // Foundry defaults block.timestamp to 1, which causes underflow in stale-price tests.
56
- vm.warp(THRESHOLD + 1 days);
57
-
58
- mockFeed = new MockAggregator();
59
- mockFeed.setDecimals(8);
60
- mockFeed.setPrice(200_000_000_000); // $2000 with 8 decimals
61
- mockFeed.setUpdatedAt(block.timestamp);
62
- mockFeed.setRoundId(1);
63
-
64
- priceFeed = new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(mockFeed)), THRESHOLD);
65
- }
66
-
67
- //*********************************************************************//
68
- // --- Normal Operation --------------------------------------------- //
69
- //*********************************************************************//
70
-
71
- /// @notice Price is returned correctly with same decimals as feed.
72
- function test_normalPrice_sameDecimals() external view {
73
- uint256 price = priceFeed.currentUnitPrice(8);
74
- assertEq(price, 200_000_000_000, "price should be 2000e8");
75
- }
76
-
77
- /// @notice Price is adjusted when requesting more decimals than the feed.
78
- function test_normalPrice_scaleUp() external view {
79
- uint256 price = priceFeed.currentUnitPrice(18);
80
- assertEq(price, 2_000_000_000_000_000_000_000, "price should be 2000e18");
81
- }
82
-
83
- /// @notice Price is adjusted when requesting fewer decimals than the feed.
84
- function test_normalPrice_scaleDown() external view {
85
- uint256 price = priceFeed.currentUnitPrice(6);
86
- assertEq(price, 2_000_000_000, "price should be 2000e6");
87
- }
88
-
89
- /// @notice Price of 1 (minimum positive) is returned.
90
- function test_normalPrice_minimumPositive() external {
91
- mockFeed.setPrice(1);
92
- uint256 price = priceFeed.currentUnitPrice(8);
93
- assertEq(price, 1, "minimum positive price should be 1");
94
- }
95
-
96
- //*********************************************************************//
97
- // --- Stale Price -------------------------------------------------- //
98
- //*********************************************************************//
99
-
100
- /// @notice Reverts when price is older than threshold.
101
- function test_stalePrice_reverts() external {
102
- // Set updatedAt to a time older than threshold
103
- mockFeed.setUpdatedAt(block.timestamp - THRESHOLD - 1);
104
-
105
- vm.expectRevert(
106
- abi.encodeWithSelector(
107
- JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_StalePrice.selector,
108
- block.timestamp,
109
- THRESHOLD,
110
- block.timestamp - THRESHOLD - 1
111
- )
112
- );
113
- priceFeed.currentUnitPrice(18);
114
- }
115
-
116
- /// @notice Does not revert when price is exactly at the threshold boundary.
117
- function test_stalePrice_atBoundary_succeeds() external {
118
- // Set updatedAt exactly at the threshold
119
- mockFeed.setUpdatedAt(block.timestamp - THRESHOLD);
120
- uint256 price = priceFeed.currentUnitPrice(8);
121
- assertEq(price, 200_000_000_000, "price at boundary should succeed");
122
- }
123
-
124
- //*********************************************************************//
125
- // --- Incomplete Round --------------------------------------------- //
126
- //*********************************************************************//
127
-
128
- /// @notice Reverts when updatedAt is 0 (incomplete round).
129
- /// @dev Note: the stale check fires first when block.timestamp > THRESHOLD.
130
- /// To test the IncompleteRound path, we use a priceFeed with THRESHOLD > block.timestamp.
131
- function test_incompleteRound_reverts() external {
132
- // Create a price feed with a huge threshold so stale check passes
133
- JBChainlinkV3PriceFeed largeThrPriceFeed =
134
- new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(mockFeed)), type(uint256).max);
135
- mockFeed.setUpdatedAt(0);
136
-
137
- vm.expectRevert(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_IncompleteRound.selector);
138
- largeThrPriceFeed.currentUnitPrice(18);
139
- }
140
-
141
- //*********************************************************************//
142
- // --- Negative / Zero Price ---------------------------------------- //
143
- //*********************************************************************//
144
-
145
- /// @notice Reverts when price is 0.
146
- function test_zeroPrice_reverts() external {
147
- mockFeed.setPrice(0);
148
-
149
- vm.expectRevert(
150
- abi.encodeWithSelector(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_NegativePrice.selector, int256(0))
151
- );
152
- priceFeed.currentUnitPrice(18);
153
- }
154
-
155
- /// @notice Reverts when price is negative.
156
- function test_negativePrice_reverts() external {
157
- mockFeed.setPrice(-100);
158
-
159
- vm.expectRevert(
160
- abi.encodeWithSelector(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_NegativePrice.selector, int256(-100))
161
- );
162
- priceFeed.currentUnitPrice(18);
163
- }
164
-
165
- //*********************************************************************//
166
- // --- Fuzz Tests --------------------------------------------------- //
167
- //*********************************************************************//
168
-
169
- /// @notice Decimal adjustment is consistent with JBFixedPointNumber.
170
- function testFuzz_decimalsAdjustment(uint128 rawPrice, uint8 feedDecimals, uint8 requestedDecimals) external {
171
- rawPrice = uint128(bound(uint256(rawPrice), 1, type(uint128).max));
172
- feedDecimals = uint8(bound(uint256(feedDecimals), 0, 18));
173
- requestedDecimals = uint8(bound(uint256(requestedDecimals), 0, 36));
174
-
175
- MockAggregator fuzzFeed = new MockAggregator();
176
- fuzzFeed.setDecimals(feedDecimals);
177
- fuzzFeed.setPrice(int256(uint256(rawPrice)));
178
- fuzzFeed.setUpdatedAt(block.timestamp);
179
- fuzzFeed.setRoundId(1);
180
-
181
- JBChainlinkV3PriceFeed fuzzPriceFeed =
182
- new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(fuzzFeed)), THRESHOLD);
183
-
184
- uint256 price = fuzzPriceFeed.currentUnitPrice(requestedDecimals);
185
- uint256 expected = uint256(rawPrice).adjustDecimals({decimals: feedDecimals, targetDecimals: requestedDecimals});
186
- assertEq(price, expected, "price should match JBFixedPointNumber.adjustDecimals");
187
- }
188
-
189
- /// @notice Fresh prices never revert (for valid price ranges).
190
- function testFuzz_freshPrice_doesNotRevert(uint128 rawPrice) external {
191
- rawPrice = uint128(bound(uint256(rawPrice), 1, type(uint128).max));
192
-
193
- mockFeed.setPrice(int256(uint256(rawPrice)));
194
- mockFeed.setUpdatedAt(block.timestamp);
195
-
196
- // Should not revert
197
- priceFeed.currentUnitPrice(18);
198
- }
199
-
200
- /// @notice Stale prices always revert.
201
- function testFuzz_stalePrice_alwaysReverts(uint256 delay) external {
202
- delay = bound(delay, THRESHOLD + 1, block.timestamp);
203
-
204
- mockFeed.setUpdatedAt(block.timestamp - delay);
205
-
206
- vm.expectRevert();
207
- priceFeed.currentUnitPrice(18);
208
- }
209
-
210
- //*********************************************************************//
211
- // --- Immutable Properties ----------------------------------------- //
212
- //*********************************************************************//
213
-
214
- /// @notice FEED is set correctly.
215
- function test_feedIsSet() external view {
216
- assertEq(address(priceFeed.FEED()), address(mockFeed), "FEED should match mock");
217
- }
218
-
219
- /// @notice THRESHOLD is set correctly.
220
- function test_thresholdIsSet() external view {
221
- assertEq(priceFeed.THRESHOLD(), THRESHOLD, "THRESHOLD should match");
222
- }
223
- }
@@ -1,50 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBController} from "../../../../src/JBController.sol";
5
- import {IJBController} from "../../../../src/interfaces/IJBController.sol";
6
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
7
- import {IJBFundAccessLimits} from "../../../../src/interfaces/IJBFundAccessLimits.sol";
8
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
9
- import {IJBPrices} from "../../../../src/interfaces/IJBPrices.sol";
10
- import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
11
- import {IJBRulesets} from "../../../../src/interfaces/IJBRulesets.sol";
12
- import {IJBSplits} from "../../../../src/interfaces/IJBSplits.sol";
13
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
14
- import {JBTest} from "../../../helpers/JBTest.sol";
15
-
16
- /*
17
- Contract that deploys a target contract with other mock contracts to satisfy the constructor.
18
- Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
19
- */
20
- contract JBControllerSetup is JBTest {
21
- // Target Contract
22
- IJBController public _controller;
23
-
24
- // Mocks
25
- IJBPermissions public permissions = IJBPermissions(makeAddr("permissions"));
26
- IJBProjects public projects = IJBProjects(makeAddr("projects"));
27
- IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
28
- IJBRulesets public rulesets = IJBRulesets(makeAddr("rulesets"));
29
- IJBTokens public tokens = IJBTokens(makeAddr("tokens"));
30
- IJBPrices public prices = IJBPrices(makeAddr("prices"));
31
- IJBSplits public splits = IJBSplits(makeAddr("splits"));
32
- IJBFundAccessLimits public fundAccessLimits = IJBFundAccessLimits(makeAddr("limits"));
33
- address public trustedForwarder = makeAddr("forwarder");
34
-
35
- function controllerSetup() public virtual {
36
- // Instantiate the contract being tested
37
- _controller = new JBController(
38
- directory,
39
- fundAccessLimits,
40
- permissions,
41
- prices,
42
- projects,
43
- rulesets,
44
- splits,
45
- tokens,
46
- address(0),
47
- trustedForwarder
48
- );
49
- }
50
- }
@@ -1,114 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBController} from "../../../../src/JBController.sol";
5
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
6
- import {IJBController} from "../../../../src/interfaces/IJBController.sol";
7
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
8
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
9
- import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
10
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
11
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
12
- import {JBControllerSetup} from "./JBControllerSetup.sol";
13
-
14
- contract TestBurnTokensOf_Local is JBControllerSetup {
15
- uint256 _projectId = 1;
16
- uint256 _rootProjectId = 0;
17
- uint256 _validCount = 1;
18
- uint256 _invalidCount = 0;
19
- string _memo = "JUICAY";
20
- address _holder = makeAddr("hodl");
21
-
22
- function setUp() public {
23
- super.controllerSetup();
24
- }
25
-
26
- function test_WhenCallerIsNotPermissionedOrTerminal() external {
27
- // it should revert UNAUTHORIZED()
28
-
29
- // it will call directory to check if caller is terminal first
30
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
31
- bytes memory _directoryReturned = abi.encode(false);
32
- mockExpect(address(directory), _directoryCall, _directoryReturned);
33
-
34
- // it will call permissions after to first check permissions over the specific project
35
- bytes memory _permCall = abi.encodeCall(
36
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
37
- );
38
- bytes memory _permReturn = abi.encode(false);
39
- mockExpect(address(permissions), _permCall, _permReturn);
40
-
41
- vm.expectRevert(
42
- abi.encodeWithSelector(
43
- JBPermissioned.JBPermissioned_Unauthorized.selector,
44
- _holder,
45
- address(this),
46
- _projectId,
47
- JBPermissionIds.BURN_TOKENS
48
- )
49
- );
50
- _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
51
- }
52
-
53
- function test_WhenCallerIsTerminalAndTokenCountGtZero() external {
54
- // it should burn and emit BurnTokens
55
-
56
- // it will call directory to check if caller is terminal first
57
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
58
- bytes memory _directoryReturned = abi.encode(true);
59
- mockExpect(address(directory), _directoryCall, _directoryReturned);
60
-
61
- // since we spoofed a terminal it will call JBTokens to burn
62
- bytes memory _burnFromCall = abi.encodeCall(IJBTokens.burnFrom, (_holder, _projectId, _validCount));
63
- bytes memory _burnFromReturn = "";
64
- mockExpect(address(tokens), _burnFromCall, _burnFromReturn);
65
-
66
- vm.expectEmit();
67
- emit IJBController.BurnTokens(_holder, _projectId, _validCount, _memo, address(this));
68
- _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
69
- }
70
-
71
- function test_WhenCallerHasRootPermissionAndTokenCountGtZero() external {
72
- // it should burn and emit BurnTokens
73
-
74
- // it will call directory to check if caller is terminal first
75
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
76
- bytes memory _directoryReturned = abi.encode(false);
77
- mockExpect(address(directory), _directoryCall, _directoryReturned);
78
-
79
- // it will call permissions after to first check permissions over the specific project
80
- bytes memory _permCall = abi.encodeCall(
81
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
82
- );
83
- bytes memory _permReturn = abi.encode(true);
84
- mockExpect(address(permissions), _permCall, _permReturn);
85
-
86
- // it will call JBTokens to burn
87
- bytes memory _burnFromCall = abi.encodeCall(IJBTokens.burnFrom, (_holder, _projectId, _validCount));
88
- bytes memory _burnFromReturn = "";
89
- mockExpect(address(tokens), _burnFromCall, _burnFromReturn);
90
-
91
- vm.expectEmit();
92
- emit IJBController.BurnTokens(_holder, _projectId, _validCount, _memo, address(this));
93
- _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
94
- }
95
-
96
- function test_WhenTokenCountEqZero() external {
97
- // it should revert NO_BURNABLE_TOKENS
98
-
99
- // it will call directory to check if caller is terminal first
100
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
101
- bytes memory _directoryReturned = abi.encode(false);
102
- mockExpect(address(directory), _directoryCall, _directoryReturned);
103
-
104
- // it will call permissions after to first check permissions over the specific project
105
- bytes memory _permCall = abi.encodeCall(
106
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
107
- );
108
- bytes memory _permReturn = abi.encode(true);
109
- mockExpect(address(permissions), _permCall, _permReturn);
110
-
111
- vm.expectRevert(JBController.JBController_ZeroTokensToBurn.selector);
112
- _controller.burnTokensOf(_holder, _projectId, _invalidCount, _memo);
113
- }
114
- }
@@ -1,63 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
5
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
6
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
7
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
8
- import {JBControllerSetup} from "./JBControllerSetup.sol";
9
-
10
- contract TestClaimTokensFor_Local is JBControllerSetup {
11
- address _holder = makeAddr("hodler");
12
- uint256 _projectId = 1;
13
- uint256 _rootId = 0;
14
- uint256 _amount = 1e18;
15
- address _beneficiary = makeAddr("bene");
16
-
17
- function setUp() public {
18
- super.controllerSetup();
19
- }
20
-
21
- function test_WhenCallerIsPermissioned() external {
22
- // it should call JBTokens to claim on behalf of holder
23
-
24
- // it will call permissions
25
- bytes memory _permCall = abi.encodeCall(
26
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.CLAIM_TOKENS, true, true)
27
- );
28
- bytes memory _permReturn = abi.encode(true);
29
- mockExpect(address(permissions), _permCall, _permReturn);
30
-
31
- // it will call JBTokens to claim when permissioned
32
- bytes memory _tokensCall =
33
- abi.encodeCall(IJBTokens.claimTokensFor, (_holder, _projectId, _amount, _beneficiary));
34
- bytes memory _tokensReturn = "";
35
- mockExpect(address(tokens), _tokensCall, _tokensReturn);
36
-
37
- // will succeed
38
- _controller.claimTokensFor(_holder, _projectId, _amount, _beneficiary);
39
- }
40
-
41
- function test_WhenCallerIsNotPermissioned() external {
42
- // it should revert UNAUTHORIZED
43
-
44
- // it will call permissions
45
- bytes memory _permCall = abi.encodeCall(
46
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.CLAIM_TOKENS, true, true)
47
- );
48
- bytes memory _permReturn = abi.encode(false);
49
- mockExpect(address(permissions), _permCall, _permReturn);
50
-
51
- // will revert
52
- vm.expectRevert(
53
- abi.encodeWithSelector(
54
- JBPermissioned.JBPermissioned_Unauthorized.selector,
55
- _holder,
56
- address(this),
57
- _projectId,
58
- JBPermissionIds.CLAIM_TOKENS
59
- )
60
- );
61
- _controller.claimTokensFor(_holder, _projectId, _amount, _beneficiary);
62
- }
63
- }
@@ -1,86 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
5
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
6
- import {IJBToken} from "../../../../src/interfaces/IJBToken.sol";
7
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
8
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
9
- import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
10
- import {JBControllerSetup} from "./JBControllerSetup.sol";
11
-
12
- contract TestDeployERC20For_Local is JBControllerSetup {
13
- uint256 _projectId = 1;
14
- IJBToken _token = IJBToken(makeAddr("token"));
15
- string _name = "Juice";
16
- string _symbol = "JCY";
17
- bytes32 _salt = bytes32(0);
18
-
19
- function setUp() public {
20
- super.controllerSetup();
21
- }
22
-
23
- function test_WhenCallerIsPermissioned() external {
24
- // it will deploy ERC20 and return IJBToken
25
-
26
- // mock call to JBProjects ownerOf which will give permission
27
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
28
- bytes memory _projectsCallReturn = abi.encode(address(this));
29
- mockExpect(address(projects), _projectsCall, _projectsCallReturn);
30
-
31
- // mock the call to JBTokens deployERC20For
32
- bytes memory _deployCall = abi.encodeCall(IJBTokens.deployERC20For, (_projectId, _name, _symbol, _salt));
33
- bytes memory _deployCallReturn = abi.encode(_token);
34
- mockExpect(address(tokens), _deployCall, _deployCallReturn);
35
-
36
- _controller.deployERC20For(_projectId, _name, _symbol, _salt);
37
- }
38
-
39
- function test_WhenCallerIsPermissionedAndSaltIsNonZero() external {
40
- // it will deploy ERC20 and return IJBToken
41
-
42
- // forge-lint: disable-next-line(unsafe-typecast)
43
- bytes32 _nonZeroSalt = bytes32("somesalt");
44
- bytes32 _encodedSalt = keccak256(abi.encodePacked(address(this), _nonZeroSalt));
45
-
46
- // mock call to JBProjects ownerOf which will give permission
47
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
48
- bytes memory _projectsCallReturn = abi.encode(address(this));
49
- mockExpect(address(projects), _projectsCall, _projectsCallReturn);
50
-
51
- // mock the call to JBTokens deployERC20For
52
- bytes memory _deployCall = abi.encodeCall(IJBTokens.deployERC20For, (_projectId, _name, _symbol, _encodedSalt));
53
- bytes memory _deployCallReturn = abi.encode(_token);
54
- mockExpect(address(tokens), _deployCall, _deployCallReturn);
55
-
56
- _controller.deployERC20For(_projectId, _name, _symbol, _nonZeroSalt);
57
- }
58
-
59
- function test_WhenCallerIsNotPermissioned() external {
60
- // it will revert UNAUTHORIZED
61
-
62
- // mock call to JBProjects ownerOf which will give permission
63
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
64
- address _projectsCallReturn = address(0);
65
- mockExpect(address(projects), _projectsCall, abi.encode(_projectsCallReturn));
66
-
67
- // mock call for projects permission
68
- bytes memory _permissionCall1 = abi.encodeCall(
69
- IJBPermissions.hasPermission,
70
- (address(this), address(0), _projectId, JBPermissionIds.DEPLOY_ERC20, true, true)
71
- );
72
- bytes memory _permissionCallReturn1 = abi.encode(false);
73
- mockExpect(address(permissions), _permissionCall1, _permissionCallReturn1);
74
-
75
- vm.expectRevert(
76
- abi.encodeWithSelector(
77
- JBPermissioned.JBPermissioned_Unauthorized.selector,
78
- _projectsCallReturn,
79
- address(this),
80
- _projectId,
81
- JBPermissionIds.DEPLOY_ERC20
82
- )
83
- );
84
- _controller.deployERC20For(_projectId, _name, _symbol, _salt);
85
- }
86
- }