@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,611 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
- import {IJBController} from "../../../../src/interfaces/IJBController.sol";
6
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
7
- import {IJBFeeTerminal} from "../../../../src/interfaces/IJBFeeTerminal.sol";
8
- import {IJBFeelessAddresses} from "../../../../src/interfaces/IJBFeelessAddresses.sol";
9
- import {IJBPayoutTerminal} from "../../../../src/interfaces/IJBPayoutTerminal.sol";
10
- import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
11
- import {IJBTerminalStore} from "../../../../src/interfaces/IJBTerminalStore.sol";
12
- import {JBAccountingContext} from "../../../../src/structs/JBAccountingContext.sol";
13
- import {JBPayHookSpecification} from "../../../../src/structs/JBPayHookSpecification.sol";
14
- import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
15
- import {JBRulesetMetadata} from "../../../../src/structs/JBRulesetMetadata.sol";
16
- import {JBRulesetMetadataResolver} from "../../../../src/libraries/JBRulesetMetadataResolver.sol";
17
- import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
18
- import {JBTokenAmount} from "../../../../src/structs/JBTokenAmount.sol";
19
- import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
20
- import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
21
- import {JBMultiTerminalSetup} from "./JBMultiTerminalSetup.sol";
22
-
23
- contract TestUseAllowanceOf_Local is JBMultiTerminalSetup {
24
- using JBRulesetMetadataResolver for JBRulesetMetadata;
25
-
26
- uint256 _projectId = 1;
27
-
28
- function setUp() public {
29
- super.multiTerminalSetup();
30
- }
31
-
32
- function test_WhenAmountPaidOutLTMinTokensPaidOut() external {
33
- // it will revert UNDER_MIN_TOKENS_PAID_OUT
34
-
35
- // mock owner call
36
- mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
37
-
38
- // needed for terminal store mock call
39
- JBRuleset memory returnedRuleset = JBRuleset({
40
- cycleNumber: 1,
41
- id: 1,
42
- basedOnId: 0,
43
- start: 0,
44
- duration: 0,
45
- weight: 0,
46
- weightCutPercent: 0,
47
- approvalHook: IJBRulesetApprovalHook(address(0)),
48
- metadata: 0
49
- });
50
-
51
- JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
52
-
53
- // recordUsedAllowance
54
- mockExpect(
55
- address(store),
56
- abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, mockTokenContext.token, 0, 0)),
57
- abi.encode(returnedRuleset, 0)
58
- );
59
-
60
- // feeless check
61
- mockExpect(
62
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(true)
63
- );
64
-
65
- vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_UnderMin.selector, 0, 1));
66
- _terminal.useAllowanceOf(_projectId, address(0), 0, 0, 1, payable(address(this)), payable(address(this)), "");
67
- }
68
-
69
- function test_WhenOwnerEQFeeless() external {
70
- // it will not incur fees
71
- address mockToken = makeAddr("token");
72
-
73
- // mock owner call
74
- mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
75
-
76
- // needed for terminal store mock call
77
- JBRuleset memory returnedRuleset = JBRuleset({
78
- cycleNumber: 1,
79
- id: 1,
80
- basedOnId: 0,
81
- start: 0,
82
- duration: 0,
83
- weight: 0,
84
- weightCutPercent: 0,
85
- approvalHook: IJBRulesetApprovalHook(address(0)),
86
- metadata: 0
87
- });
88
-
89
- // recordUsedAllowance — terminal now passes token address directly.
90
- mockExpect(
91
- address(store),
92
- abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, mockToken, 100, 0)),
93
- abi.encode(returnedRuleset, 100)
94
- );
95
-
96
- // feeless check
97
- mockExpect(
98
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(true)
99
- );
100
-
101
- mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (address(this), 100)), abi.encode(true));
102
-
103
- vm.expectEmit();
104
- emit IJBPayoutTerminal.UseAllowance({
105
- rulesetId: returnedRuleset.id,
106
- rulesetCycleNumber: returnedRuleset.cycleNumber,
107
- projectId: _projectId,
108
- beneficiary: address(this),
109
- feeBeneficiary: address(this),
110
- amount: 100,
111
- amountPaidOut: 100,
112
- netAmountPaidOut: 100,
113
- memo: "",
114
- caller: address(this)
115
- });
116
- _terminal.useAllowanceOf(_projectId, mockToken, 100, 0, 0, payable(address(this)), payable(address(this)), "");
117
- }
118
-
119
- function test_WhenBeneficiaryIsFeeless() external {
120
- address mockToken = makeAddr("token");
121
- address beneficiary = makeAddr("bene");
122
-
123
- // mock owner call
124
- mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
125
-
126
- // needed for terminal store mock call
127
- JBRuleset memory returnedRuleset = JBRuleset({
128
- cycleNumber: 1,
129
- id: 1,
130
- basedOnId: 0,
131
- start: 0,
132
- duration: 0,
133
- weight: 0,
134
- weightCutPercent: 0,
135
- approvalHook: IJBRulesetApprovalHook(address(0)),
136
- metadata: 0
137
- });
138
-
139
- // recordUsedAllowance — terminal now passes token address directly
140
- mockExpect(
141
- address(store),
142
- abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, mockToken, 100, 0)),
143
- abi.encode(returnedRuleset, 100)
144
- );
145
-
146
- // first feeless check which will return false.
147
- mockExpect(
148
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(false)
149
- );
150
-
151
- // second which is true for beneficiary.
152
- mockExpect(
153
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (beneficiary)), abi.encode(true)
154
- );
155
-
156
- mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (beneficiary, 100)), abi.encode(true));
157
-
158
- vm.expectEmit();
159
- emit IJBPayoutTerminal.UseAllowance({
160
- rulesetId: returnedRuleset.id,
161
- rulesetCycleNumber: returnedRuleset.cycleNumber,
162
- projectId: _projectId,
163
- beneficiary: beneficiary,
164
- feeBeneficiary: address(this),
165
- amount: 100,
166
- amountPaidOut: 100,
167
- netAmountPaidOut: 100,
168
- memo: "",
169
- caller: address(this)
170
- });
171
-
172
- _terminal.useAllowanceOf({
173
- projectId: _projectId,
174
- token: mockToken,
175
- amount: 100,
176
- currency: 0,
177
- minTokensPaidOut: 100,
178
- beneficiary: payable(beneficiary),
179
- feeBeneficiary: payable(address(this)),
180
- memo: ""
181
- });
182
- }
183
-
184
- function test_WhenNotFeeless() external {
185
- address mockToken = makeAddr("token");
186
- address beneficiary = makeAddr("bene");
187
-
188
- // Mock controller for mint call on fee payments
189
- address controller = makeAddr("controller");
190
-
191
- // Weight for a fee calculation that would take place in terminal store
192
- uint112 weight = 1000 * 10 ** 18;
193
-
194
- // forge-lint: disable-next-line(unsafe-typecast)
195
- uint32 currencyId = uint32(uint160(mockToken));
196
-
197
- // Start the cascade of issuing project tokens to the fee beneficiary. (recieving platform tokens for paying a
198
- // fee, or being designated as such).
199
- mockExpect(
200
- address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(controller))
201
- );
202
-
203
- // mock owner call
204
- mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
205
-
206
- // needed for terminal store mock call
207
- JBRuleset memory returnedRuleset = JBRuleset({
208
- cycleNumber: 1,
209
- id: 0,
210
- basedOnId: 0,
211
- start: 0,
212
- duration: 0,
213
- weight: weight,
214
- weightCutPercent: 0,
215
- approvalHook: IJBRulesetApprovalHook(address(0)),
216
- metadata: 0
217
- });
218
-
219
- // call params
220
- JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
221
- _tokens[0] = JBAccountingContext({token: mockToken, decimals: 18, currency: currencyId});
222
-
223
- // Mock recordAccountingContextOf in the store (validation now happens there)
224
- mockExpect(
225
- address(store), abi.encodeCall(IJBTerminalStore.recordAccountingContextOf, (_projectId, _tokens)), ""
226
- );
227
-
228
- _terminal.addAccountingContextsFor(_projectId, _tokens);
229
-
230
- // Mock accountingContextOf for subsequent reads (used by _tokenAmountOf during fee processing)
231
- mockExpect(
232
- address(store),
233
- abi.encodeCall(IJBTerminalStore.accountingContextOf, (address(_terminal), _projectId, mockToken)),
234
- abi.encode(_tokens[0])
235
- );
236
-
237
- _terminal.accountingContextForTokenOf(_projectId, mockToken);
238
-
239
- // recordUsedAllowance
240
- mockExpect(
241
- address(store),
242
- abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, _tokens[0].token, 100, 0)),
243
- abi.encode(returnedRuleset, 100)
244
- );
245
-
246
- // first feeless check which will return false.
247
- mockExpect(
248
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(false)
249
- );
250
-
251
- // second which is also false.
252
- mockExpect(
253
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (beneficiary)), abi.encode(false)
254
- );
255
-
256
- mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (beneficiary, 98)), abi.encode(true));
257
-
258
- // call to find the primary terminal for fee processing
259
- mockExpect(
260
- address(directory),
261
- abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, mockToken)),
262
- abi.encode(address(_terminal))
263
- );
264
-
265
- JBTokenAmount memory tokenContext =
266
- JBTokenAmount({token: mockToken, decimals: 18, currency: currencyId, value: 2});
267
-
268
- // mock call to jbterminalstore
269
- mockExpect(
270
- address(store),
271
- abi.encodeCall(
272
- IJBTerminalStore.recordPaymentFrom,
273
- // feeBeneficiary will receive platform tokens for paying a fee, project id is encoded for memo
274
- (address(_terminal), tokenContext, _projectId, address(this), bytes(abi.encodePacked(_projectId)))
275
- ),
276
- abi.encode(returnedRuleset, 1, new JBPayHookSpecification[](0))
277
- );
278
-
279
- // Return the mint of call as minting one project token for paying a fee.
280
- mockExpect(
281
- address(controller),
282
- abi.encodeCall(IJBController.mintTokensOf, (_projectId, 1, address(this), "", true)),
283
- abi.encode(2)
284
- );
285
-
286
- vm.expectEmit();
287
- emit IJBPayoutTerminal.UseAllowance({
288
- rulesetId: returnedRuleset.id,
289
- rulesetCycleNumber: returnedRuleset.cycleNumber,
290
- projectId: _projectId,
291
- beneficiary: beneficiary,
292
- feeBeneficiary: address(this),
293
- amount: 100,
294
- amountPaidOut: 100,
295
- netAmountPaidOut: 98,
296
- memo: "",
297
- caller: address(this)
298
- });
299
-
300
- _terminal.useAllowanceOf({
301
- projectId: _projectId,
302
- token: mockToken,
303
- amount: 100,
304
- currency: 0,
305
- minTokensPaidOut: 97,
306
- beneficiary: payable(beneficiary),
307
- feeBeneficiary: payable(address(this)),
308
- memo: ""
309
- });
310
- }
311
-
312
- // forge-lint: disable-next-line(mixed-case-function)
313
- modifier whenMsgSenderDNEQFeeless() {
314
- _;
315
- }
316
-
317
- function test_GivenRulesetHoldFeesEQTrue() external whenMsgSenderDNEQFeeless {
318
- // it will hold fees and emit HoldFee
319
- address mockToken = makeAddr("token");
320
- address beneficiary = makeAddr("bene");
321
-
322
- // Mock controller (needed for addAccountingContextsFor permission check)
323
- address controller = makeAddr("controller");
324
-
325
- // forge-lint: disable-next-line(unsafe-typecast)
326
- uint32 currencyId = uint32(uint160(mockToken));
327
-
328
- // Mock controllerOf for addAccountingContextsFor permission check
329
- mockExpect(
330
- address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(controller))
331
- );
332
-
333
- // mock owner call
334
- mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
335
-
336
- // Build a ruleset with holdFees=true via packed metadata
337
- JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
338
- reservedPercent: 0,
339
- cashOutTaxRate: 0,
340
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
341
- pausePay: false,
342
- pauseCreditTransfers: false,
343
- allowOwnerMinting: false,
344
- allowSetCustomToken: false,
345
- allowTerminalMigration: false,
346
- allowSetTerminals: false,
347
- ownerMustSendPayouts: false,
348
- allowSetController: false,
349
- allowAddAccountingContext: true,
350
- allowAddPriceFeed: false,
351
- holdFees: true,
352
- useTotalSurplusForCashOuts: false,
353
- useDataHookForPay: false,
354
- useDataHookForCashOut: false,
355
- dataHook: address(0),
356
- metadata: 0
357
- });
358
-
359
- uint256 packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_rulesMetadata);
360
-
361
- JBRuleset memory returnedRuleset = JBRuleset({
362
- cycleNumber: 1,
363
- id: 1,
364
- basedOnId: 0,
365
- start: 0,
366
- duration: 0,
367
- weight: 0,
368
- weightCutPercent: 0,
369
- approvalHook: IJBRulesetApprovalHook(address(0)),
370
- metadata: packedMetadata
371
- });
372
-
373
- // Set up accounting context so the token is recognized
374
- JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
375
- _tokens[0] = JBAccountingContext({token: mockToken, decimals: 18, currency: currencyId});
376
-
377
- // Mock recordAccountingContextOf in the store (validation now happens there)
378
- mockExpect(
379
- address(store), abi.encodeCall(IJBTerminalStore.recordAccountingContextOf, (_projectId, _tokens)), ""
380
- );
381
-
382
- _terminal.addAccountingContextsFor(_projectId, _tokens);
383
-
384
- // recordUsedAllowance
385
- mockExpect(
386
- address(store),
387
- abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, _tokens[0].token, 100, 0)),
388
- abi.encode(returnedRuleset, 100)
389
- );
390
-
391
- // first feeless check: owner is NOT feeless
392
- mockExpect(
393
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(false)
394
- );
395
-
396
- // second feeless check: beneficiary is NOT feeless
397
- mockExpect(
398
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (beneficiary)), abi.encode(false)
399
- );
400
-
401
- // Fee is 2.5% of 100 = 2, so net = 98
402
- mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (beneficiary, 98)), abi.encode(true));
403
-
404
- // Expect HoldFee event (fee is held, not processed)
405
- vm.expectEmit(true, true, true, true);
406
- emit IJBFeeTerminal.HoldFee({
407
- projectId: _projectId,
408
- token: mockToken,
409
- amount: 100,
410
- fee: 25,
411
- beneficiary: address(this),
412
- caller: address(this)
413
- });
414
-
415
- // Expect UseAllowance event
416
- vm.expectEmit();
417
- emit IJBPayoutTerminal.UseAllowance({
418
- rulesetId: returnedRuleset.id,
419
- rulesetCycleNumber: returnedRuleset.cycleNumber,
420
- projectId: _projectId,
421
- beneficiary: beneficiary,
422
- feeBeneficiary: address(this),
423
- amount: 100,
424
- amountPaidOut: 100,
425
- netAmountPaidOut: 98,
426
- memo: "",
427
- caller: address(this)
428
- });
429
-
430
- _terminal.useAllowanceOf({
431
- projectId: _projectId,
432
- token: mockToken,
433
- amount: 100,
434
- currency: 0,
435
- minTokensPaidOut: 97,
436
- beneficiary: payable(beneficiary),
437
- feeBeneficiary: payable(address(this)),
438
- memo: ""
439
- });
440
- }
441
-
442
- function test_GivenRulesetHoldFeesDNEQTrue() external whenMsgSenderDNEQFeeless {
443
- // it will not hold fees and emit ProcessFee
444
- address mockToken = makeAddr("token2");
445
- address beneficiary = makeAddr("bene2");
446
-
447
- // Mock controller for mint call on fee payments
448
- address controller = makeAddr("controller2");
449
-
450
- // Weight for a fee calculation that would take place in terminal store
451
- uint112 weight = 1000 * 10 ** 18;
452
-
453
- // forge-lint: disable-next-line(unsafe-typecast)
454
- uint32 currencyId = uint32(uint160(mockToken));
455
-
456
- // Build a ruleset with holdFees=false explicitly via packed metadata
457
- JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
458
- reservedPercent: 0,
459
- cashOutTaxRate: 0,
460
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
461
- pausePay: false,
462
- pauseCreditTransfers: false,
463
- allowOwnerMinting: false,
464
- allowSetCustomToken: false,
465
- allowTerminalMigration: false,
466
- allowSetTerminals: false,
467
- ownerMustSendPayouts: false,
468
- allowSetController: false,
469
- allowAddAccountingContext: true,
470
- allowAddPriceFeed: false,
471
- holdFees: false,
472
- useTotalSurplusForCashOuts: false,
473
- useDataHookForPay: false,
474
- useDataHookForCashOut: false,
475
- dataHook: address(0),
476
- metadata: 0
477
- });
478
-
479
- uint256 packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_rulesMetadata);
480
-
481
- // Start the cascade of issuing project tokens to the fee beneficiary.
482
- mockExpect(
483
- address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(controller))
484
- );
485
-
486
- // mock owner call
487
- mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
488
-
489
- JBRuleset memory returnedRuleset = JBRuleset({
490
- cycleNumber: 1,
491
- id: 1,
492
- basedOnId: 0,
493
- start: 0,
494
- duration: 0,
495
- weight: weight,
496
- weightCutPercent: 0,
497
- approvalHook: IJBRulesetApprovalHook(address(0)),
498
- metadata: packedMetadata
499
- });
500
-
501
- // Set up accounting context
502
- JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
503
- _tokens[0] = JBAccountingContext({token: mockToken, decimals: 18, currency: currencyId});
504
-
505
- // Mock recordAccountingContextOf in the store (validation now happens there)
506
- mockExpect(
507
- address(store), abi.encodeCall(IJBTerminalStore.recordAccountingContextOf, (_projectId, _tokens)), ""
508
- );
509
-
510
- _terminal.addAccountingContextsFor(_projectId, _tokens);
511
-
512
- // Mock accountingContextOf for subsequent reads (used by _tokenAmountOf during fee processing)
513
- mockExpect(
514
- address(store),
515
- abi.encodeCall(IJBTerminalStore.accountingContextOf, (address(_terminal), _projectId, mockToken)),
516
- abi.encode(_tokens[0])
517
- );
518
-
519
- // recordUsedAllowance
520
- mockExpect(
521
- address(store),
522
- abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, _tokens[0].token, 100, 0)),
523
- abi.encode(returnedRuleset, 100)
524
- );
525
-
526
- // first feeless check: false
527
- mockExpect(
528
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(false)
529
- );
530
-
531
- // second feeless check: false
532
- mockExpect(
533
- address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (beneficiary)), abi.encode(false)
534
- );
535
-
536
- // Fee = 2.5% of 100 = 2, net = 98
537
- mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (beneficiary, 98)), abi.encode(true));
538
-
539
- // call to find the primary terminal for fee processing
540
- mockExpect(
541
- address(directory),
542
- abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, mockToken)),
543
- abi.encode(address(_terminal))
544
- );
545
-
546
- JBTokenAmount memory tokenContext =
547
- JBTokenAmount({token: mockToken, decimals: 18, currency: currencyId, value: 2});
548
-
549
- // mock call to jbterminalstore recordPaymentFrom for the fee payment
550
- mockExpect(
551
- address(store),
552
- abi.encodeCall(
553
- IJBTerminalStore.recordPaymentFrom,
554
- (address(_terminal), tokenContext, _projectId, address(this), bytes(abi.encodePacked(_projectId)))
555
- ),
556
- abi.encode(returnedRuleset, 1, new JBPayHookSpecification[](0))
557
- );
558
-
559
- // Return the mint call as minting one project token for paying a fee.
560
- mockExpect(
561
- address(controller),
562
- abi.encodeCall(IJBController.mintTokensOf, (_projectId, 1, address(this), "", true)),
563
- abi.encode(2)
564
- );
565
-
566
- // Expect ProcessFee event (fee is processed immediately, not held)
567
- vm.expectEmit(true, true, true, true);
568
- emit IJBFeeTerminal.ProcessFee({
569
- projectId: _projectId,
570
- token: mockToken,
571
- amount: 2,
572
- wasHeld: false,
573
- beneficiary: address(this),
574
- caller: address(this)
575
- });
576
-
577
- // Expect UseAllowance event
578
- vm.expectEmit();
579
- emit IJBPayoutTerminal.UseAllowance({
580
- rulesetId: returnedRuleset.id,
581
- rulesetCycleNumber: returnedRuleset.cycleNumber,
582
- projectId: _projectId,
583
- beneficiary: beneficiary,
584
- feeBeneficiary: address(this),
585
- amount: 100,
586
- amountPaidOut: 100,
587
- netAmountPaidOut: 98,
588
- memo: "",
589
- caller: address(this)
590
- });
591
-
592
- _terminal.useAllowanceOf({
593
- projectId: _projectId,
594
- token: mockToken,
595
- amount: 100,
596
- currency: 0,
597
- minTokensPaidOut: 97,
598
- beneficiary: payable(beneficiary),
599
- feeBeneficiary: payable(address(this)),
600
- memo: ""
601
- });
602
- }
603
-
604
- function test_WhenTokenEQNATIVE_TOKEN() external {
605
- // it will send ETH via sendValue
606
- }
607
-
608
- function test_WhenTokenEQERC20() external {
609
- // it will call safeTransfer
610
- }
611
- }
@@ -1,20 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBPermissions} from "../../../../src/JBPermissions.sol";
5
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
6
- import {JBTest} from "../../../helpers/JBTest.sol";
7
-
8
- /*
9
- Contract that deploys a target contract with other mock contracts to satisfy the constructor.
10
- Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
11
- */
12
- contract JBPermissionsSetup is JBTest {
13
- // Target Contract
14
- IJBPermissions public _permissions;
15
-
16
- function permissionsSetup() public virtual {
17
- // Instantiate the contract being tested
18
- _permissions = new JBPermissions(address(0));
19
- }
20
- }
@@ -1,50 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBPermissions} from "../../../../src/JBPermissions.sol";
5
- import {JBPermissionsSetup} from "./JBPermissionsSetup.sol";
6
-
7
- contract TestHasPermissions_Local is JBPermissionsSetup {
8
- address _op = makeAddr("operator");
9
- address _account = makeAddr("account");
10
- uint256 _projectId = 1;
11
- uint256 _permission = 256;
12
-
13
- function setUp() public {
14
- super.permissionsSetup();
15
- }
16
-
17
- function test_WhenPermissionIdGt255() external {
18
- // it will revert with PERMISSION_ID_OUT_OF_BOUNDS
19
-
20
- vm.expectRevert(abi.encodeWithSelector(JBPermissions.JBPermissions_PermissionIdOutOfBounds.selector, 256));
21
- _permissions.hasPermission(_op, _account, _projectId, _permission, true, true);
22
- }
23
-
24
- modifier whenPermissionIdLt255() {
25
- _permission = 1;
26
- _;
27
- }
28
-
29
- function test_GivenOperatorHasPermissionForAccountOfProject() external whenPermissionIdLt255 {
30
- // it will return true
31
- uint256 permissions = 1 << 1;
32
-
33
- // Find the storage slot
34
- bytes32 permissionsOfSlot = keccak256(abi.encode(_op, uint256(0)));
35
- bytes32 accountSlot = keccak256(abi.encode(_account, uint256(permissionsOfSlot)));
36
- bytes32 slot = keccak256(abi.encode(_projectId, accountSlot));
37
-
38
- // Set storage
39
- vm.store(address(_permissions), slot, bytes32(permissions));
40
-
41
- bool has = _permissions.hasPermission(_op, _account, _projectId, 1, true, true);
42
- assertEq(has, true);
43
- }
44
-
45
- function test_GivenOperatorDoesntHavePermissionForAccountOfProject() external whenPermissionIdLt255 {
46
- // it will return false
47
- bool has = _permissions.hasPermission(_op, _account, _projectId, 1, true, true);
48
- assertEq(has, false);
49
- }
50
- }