@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,536 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {IJBController} from "../../../../src/interfaces/IJBController.sol";
5
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
6
- import {IJBFundAccessLimits} from "../../../../src/interfaces/IJBFundAccessLimits.sol";
7
- import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
8
- import {IJBRulesets} from "../../../../src/interfaces/IJBRulesets.sol";
9
- import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
10
- import {IJBToken} from "../../../../src/interfaces/IJBToken.sol";
11
- import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
12
- import {JBRulesetMetadataResolver} from "../../../../src/libraries/JBRulesetMetadataResolver.sol";
13
- import {JBAccountingContext} from "../../../../src/structs/JBAccountingContext.sol";
14
- import {JBCurrencyAmount} from "../../../../src/structs/JBCurrencyAmount.sol";
15
- import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
16
- import {JBRulesetMetadata} from "../../../../src/structs/JBRulesetMetadata.sol";
17
- import {mulDiv} from "@prb/math/src/Common.sol";
18
- import {JBTerminalStoreSetup} from "./JBTerminalStoreSetup.sol";
19
- import {JBCashOuts} from "../../../../src/libraries/JBCashOuts.sol";
20
-
21
- contract TestCurrentReclaimableSurplusOf_Local is JBTerminalStoreSetup {
22
- using JBRulesetMetadataResolver for JBRulesetMetadata;
23
-
24
- uint256 _projectId = 1;
25
- uint256 _balance = 1e18;
26
-
27
- // Mocks
28
- IJBTerminal _terminal = IJBTerminal(makeAddr("terminal"));
29
- IJBToken _token = IJBToken(makeAddr("token"));
30
- IJBController _controller = IJBController(makeAddr("controller"));
31
- IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
32
-
33
- uint32 _currency = uint32(uint160(address(_token)));
34
- uint256 _tokenCount = 1e18;
35
-
36
- function setUp() public {
37
- super.terminalStoreSetup();
38
- }
39
-
40
- /// @notice Helper to register an accounting context with the store (pranks as the terminal).
41
- function _registerContext(JBAccountingContext memory ctx) internal {
42
- JBAccountingContext[] memory ctxs = new JBAccountingContext[](1);
43
- ctxs[0] = ctx;
44
- vm.prank(address(_terminal));
45
- _store.recordAccountingContextOf(_projectId, ctxs);
46
- }
47
-
48
- /// @notice Helper to set balance for the terminal/project/token via vm.store.
49
- function _setBalance(uint256 balance) internal {
50
- bytes32 balanceOfSlot = keccak256(abi.encode(address(_terminal), uint256(0)));
51
- bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
52
- bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
53
- vm.store(address(_store), slot, bytes32(balance));
54
- }
55
-
56
- /// @notice Helper to set up common mocks for surplus computation.
57
- /// @param packedMetadata The packed ruleset metadata.
58
- /// @param payoutLimits The payout limits to mock.
59
- function _mockSurplusInfra(uint256 packedMetadata, JBCurrencyAmount[] memory payoutLimits) internal {
60
- JBRuleset memory _returnedRuleset = JBRuleset({
61
- cycleNumber: uint48(block.timestamp),
62
- id: uint48(block.timestamp),
63
- basedOnId: 0,
64
- start: uint48(block.timestamp),
65
- duration: uint32(block.timestamp + 1000),
66
- weight: 1e18,
67
- weightCutPercent: 0,
68
- approvalHook: IJBRulesetApprovalHook(address(0)),
69
- metadata: packedMetadata
70
- });
71
-
72
- mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
73
- mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
74
- mockExpect(
75
- address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
76
- );
77
- mockExpect(
78
- address(_accessLimits),
79
- abi.encodeCall(
80
- IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
81
- ),
82
- abi.encode(payoutLimits)
83
- );
84
- }
85
-
86
- function test_GivenCurrentSurplusEqZero() external {
87
- // it will return zero
88
-
89
- // Register accounting context so the store can resolve it.
90
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
91
-
92
- // No balance set — surplus is 0.
93
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
94
- _mockSurplusInfra(0, _emptyLimits);
95
-
96
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
97
- _terminals[0] = _terminal;
98
- uint256 reclaimable =
99
- _store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, new address[](0), 18, _currency);
100
- assertEq(0, reclaimable);
101
- }
102
-
103
- function test_GivenCurrentSurplusGtZero() external {
104
- // it will get the number of outstanding tokens and return the reclaimable surplus
105
-
106
- // Register accounting context.
107
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
108
-
109
- JBRulesetMetadata memory _metadata = JBRulesetMetadata({
110
- reservedPercent: 0,
111
- cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
112
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
113
- pausePay: false,
114
- pauseCreditTransfers: false,
115
- allowOwnerMinting: false,
116
- allowSetCustomToken: false,
117
- allowTerminalMigration: false,
118
- allowSetTerminals: false,
119
- ownerMustSendPayouts: false,
120
- allowSetController: false,
121
- allowAddAccountingContext: true,
122
- allowAddPriceFeed: false,
123
- holdFees: false,
124
- useTotalSurplusForCashOuts: false,
125
- useDataHookForPay: false,
126
- useDataHookForCashOut: false,
127
- dataHook: address(0),
128
- metadata: 0
129
- });
130
-
131
- uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
132
-
133
- uint224 _payout = 1e17;
134
- uint256 _supply = 1e19;
135
- uint256 _cashoutAmount = 1e18;
136
- uint256 _surplus = _supply - _payout;
137
-
138
- // Set balance = surplus + payout limit to get the desired surplus after deducting limits.
139
- // balance - payoutLimit = surplus => balance = surplus + payoutLimit
140
- // But we want surplus = _supply - _payout = 9.9e18. So set balance = surplus (with zero limits).
141
- _setBalance(_surplus);
142
-
143
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
144
- _mockSurplusInfra(_packedMetadata, _emptyLimits);
145
-
146
- // mock JBController totalTokenSupplyWithReservedTokensOf
147
- mockExpect(
148
- address(_controller),
149
- abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
150
- abi.encode(_supply)
151
- );
152
-
153
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
154
- _terminals[0] = _terminal;
155
- uint256 reclaimable =
156
- _store.currentReclaimableSurplusOf(_projectId, _cashoutAmount, _terminals, new address[](0), 18, _currency);
157
-
158
- // The above call should be calculating the reclaimable amount as we are here, so they will be congruent.
159
- uint256 assumed =
160
- JBCashOuts.cashOutFrom(_surplus, _cashoutAmount, _supply, JBConstants.MAX_CASH_OUT_TAX_RATE / 2);
161
-
162
- assertEq(assumed, reclaimable);
163
- }
164
-
165
- function test_GivenTokenCountIsEqToTotalSupply() external {
166
- // it will return the rest of the surplus
167
-
168
- // Register accounting context.
169
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
170
-
171
- JBRulesetMetadata memory _metadata = JBRulesetMetadata({
172
- reservedPercent: 0,
173
- cashOutTaxRate: 0,
174
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
175
- pausePay: false,
176
- pauseCreditTransfers: false,
177
- allowOwnerMinting: false,
178
- allowSetCustomToken: false,
179
- allowTerminalMigration: false,
180
- allowSetTerminals: false,
181
- ownerMustSendPayouts: false,
182
- allowSetController: false,
183
- allowAddAccountingContext: true,
184
- allowAddPriceFeed: false,
185
- holdFees: false,
186
- useTotalSurplusForCashOuts: false,
187
- useDataHookForPay: false,
188
- useDataHookForCashOut: false,
189
- dataHook: address(0),
190
- metadata: 0
191
- });
192
-
193
- uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
194
-
195
- // Set balance = tokenCount so surplus = tokenCount (with zero payout limits).
196
- _setBalance(_tokenCount);
197
-
198
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
199
- _mockSurplusInfra(_packedMetadata, _emptyLimits);
200
-
201
- // mock JBController totalTokenSupplyWithReservedTokensOf
202
- mockExpect(
203
- address(_controller),
204
- abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
205
- abi.encode(_tokenCount)
206
- );
207
-
208
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
209
- _terminals[0] = _terminal;
210
- uint256 reclaimable =
211
- _store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, new address[](0), 18, _currency);
212
-
213
- // The tokenCount is equal to the total supply, so the reclaimable amount will be the same as the supply. We
214
- // couldn't reclaim more.
215
- assertEq(_tokenCount, reclaimable);
216
- }
217
-
218
- function test_GivenCashOutTaxRateEqZero() external {
219
- // it will return zero (cashOutTaxRate = MAX means no surplus can be reclaimed)
220
-
221
- // Register accounting context.
222
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
223
-
224
- JBRulesetMetadata memory _metadata = JBRulesetMetadata({
225
- reservedPercent: 0,
226
- cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE, // no surplus can be reclaimed.
227
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
228
- pausePay: false,
229
- pauseCreditTransfers: false,
230
- allowOwnerMinting: false,
231
- allowSetCustomToken: false,
232
- allowTerminalMigration: false,
233
- allowSetTerminals: false,
234
- ownerMustSendPayouts: false,
235
- allowSetController: false,
236
- allowAddAccountingContext: true,
237
- allowAddPriceFeed: false,
238
- holdFees: false,
239
- useTotalSurplusForCashOuts: false,
240
- useDataHookForPay: false,
241
- useDataHookForCashOut: false,
242
- dataHook: address(0),
243
- metadata: 0
244
- });
245
-
246
- uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
247
-
248
- // Set balance = 1e18 so surplus = 1e18 (with zero payout limits).
249
- _setBalance(1e18);
250
-
251
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
252
- _mockSurplusInfra(_packedMetadata, _emptyLimits);
253
-
254
- // mock JBController totalTokenSupplyWithReservedTokensOf
255
- mockExpect(
256
- address(_controller),
257
- abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
258
- abi.encode(1e18)
259
- );
260
-
261
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
262
- _terminals[0] = _terminal;
263
- uint256 reclaimable =
264
- _store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, new address[](0), 18, _currency);
265
-
266
- // No surplus can be reclaimed.
267
- assertEq(0, reclaimable);
268
- }
269
-
270
- function test_GivenCashOutRateDneqMAX_CASH_OUT_RATE() external {
271
- // it will return the calculated proportion
272
-
273
- // Register accounting context.
274
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
275
-
276
- JBRulesetMetadata memory _metadata = JBRulesetMetadata({
277
- reservedPercent: 0,
278
- cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
279
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
280
- pausePay: false,
281
- pauseCreditTransfers: false,
282
- allowOwnerMinting: false,
283
- allowSetCustomToken: false,
284
- allowTerminalMigration: false,
285
- allowSetTerminals: false,
286
- ownerMustSendPayouts: false,
287
- allowSetController: false,
288
- allowAddAccountingContext: true,
289
- allowAddPriceFeed: false,
290
- holdFees: false,
291
- useTotalSurplusForCashOuts: false,
292
- useDataHookForPay: false,
293
- useDataHookForCashOut: false,
294
- dataHook: address(0),
295
- metadata: 0
296
- });
297
-
298
- uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
299
-
300
- // Set balance = 1e18 so surplus = 1e18 (with zero payout limits).
301
- _setBalance(1e18);
302
-
303
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
304
- _mockSurplusInfra(_packedMetadata, _emptyLimits);
305
-
306
- // mock JBController totalTokenSupplyWithReservedTokensOf
307
- mockExpect(
308
- address(_controller),
309
- abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
310
- abi.encode(1e18)
311
- );
312
-
313
- uint256 reclaimable;
314
- {
315
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
316
- _terminals[0] = _terminal;
317
- reclaimable = _store.currentReclaimableSurplusOf(
318
- _projectId, _tokenCount, _terminals, new address[](0), 18, _currency
319
- );
320
- }
321
-
322
- uint256 assumed = mulDiv(
323
- 1e18,
324
- 5000 + mulDiv(_tokenCount, JBConstants.MAX_CASH_OUT_TAX_RATE - 5000, 1e18),
325
- JBConstants.MAX_CASH_OUT_TAX_RATE
326
- );
327
-
328
- assertEq(assumed, reclaimable);
329
- }
330
-
331
- function test_GivenNotOverloaded() external {
332
- // it will get the current ruleset and proceed to return reclaimable as above
333
-
334
- // This test uses the 4-param overload (projectId, cashOutCount, totalSupply, surplus)
335
- // which does not go through the store's currentSurplusOf — it takes surplus directly.
336
- JBRulesetMetadata memory _metadata = JBRulesetMetadata({
337
- reservedPercent: 0,
338
- cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
339
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
340
- pausePay: false,
341
- pauseCreditTransfers: false,
342
- allowOwnerMinting: false,
343
- allowSetCustomToken: false,
344
- allowTerminalMigration: false,
345
- allowSetTerminals: false,
346
- ownerMustSendPayouts: false,
347
- allowSetController: false,
348
- allowAddAccountingContext: true,
349
- allowAddPriceFeed: false,
350
- holdFees: false,
351
- useTotalSurplusForCashOuts: false,
352
- useDataHookForPay: false,
353
- useDataHookForCashOut: false,
354
- dataHook: address(0),
355
- metadata: 0
356
- });
357
-
358
- uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
359
-
360
- JBRuleset memory _returnedRuleset = JBRuleset({
361
- cycleNumber: uint48(block.timestamp),
362
- id: uint48(block.timestamp),
363
- basedOnId: 0,
364
- start: uint48(block.timestamp),
365
- duration: uint32(block.timestamp + 1000),
366
- weight: 1e18,
367
- weightCutPercent: 0,
368
- approvalHook: IJBRulesetApprovalHook(address(0)),
369
- metadata: _packedMetadata
370
- });
371
-
372
- mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
373
-
374
- uint256 reclaimable = _store.currentReclaimableSurplusOf(_projectId, _tokenCount, 1e18, 1e18);
375
- assertEq(1e18, reclaimable);
376
- }
377
-
378
- function test_GivenTotalReclaimableWithSurplus() external {
379
- // it will default to all terminals and all accounting contexts and return the reclaimable surplus
380
-
381
- // Register accounting context.
382
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
383
-
384
- JBRulesetMetadata memory _metadata = JBRulesetMetadata({
385
- reservedPercent: 0,
386
- cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
387
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
388
- pausePay: false,
389
- pauseCreditTransfers: false,
390
- allowOwnerMinting: false,
391
- allowSetCustomToken: false,
392
- allowTerminalMigration: false,
393
- allowSetTerminals: false,
394
- ownerMustSendPayouts: false,
395
- allowSetController: false,
396
- allowAddAccountingContext: true,
397
- allowAddPriceFeed: false,
398
- holdFees: false,
399
- useTotalSurplusForCashOuts: false,
400
- useDataHookForPay: false,
401
- useDataHookForCashOut: false,
402
- dataHook: address(0),
403
- metadata: 0
404
- });
405
-
406
- uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
407
-
408
- uint256 _supply = 1e19;
409
- uint256 _surplus = 1e18;
410
- uint256 _cashoutAmount = 1e18;
411
-
412
- // Set balance = surplus (with zero payout limits, surplus = balance).
413
- _setBalance(_surplus);
414
-
415
- // Mock terminalsOf to return our terminal (for currentTotalReclaimableSurplusOf which uses empty terminals).
416
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
417
- _terminals[0] = _terminal;
418
- mockExpect(address(directory), abi.encodeCall(IJBDirectory.terminalsOf, (_projectId)), abi.encode(_terminals));
419
-
420
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
421
- _mockSurplusInfra(_packedMetadata, _emptyLimits);
422
-
423
- // mock JBController totalTokenSupplyWithReservedTokensOf
424
- mockExpect(
425
- address(_controller),
426
- abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
427
- abi.encode(_supply)
428
- );
429
-
430
- // Call the new convenience function (no terminals, no accounting contexts).
431
- uint256 reclaimable = _store.currentTotalReclaimableSurplusOf(_projectId, _cashoutAmount, 18, _currency);
432
-
433
- // Should match the 6-param overload result.
434
- uint256 assumed =
435
- JBCashOuts.cashOutFrom(_surplus, _cashoutAmount, _supply, JBConstants.MAX_CASH_OUT_TAX_RATE / 2);
436
-
437
- assertEq(assumed, reclaimable);
438
- }
439
-
440
- function test_GivenTotalReclaimableWithZeroSurplus() external {
441
- // it will return zero when there is no surplus
442
-
443
- // Register accounting context.
444
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
445
-
446
- // No balance set — surplus is 0.
447
-
448
- // Mock terminalsOf to return our terminal.
449
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
450
- _terminals[0] = _terminal;
451
- mockExpect(address(directory), abi.encodeCall(IJBDirectory.terminalsOf, (_projectId)), abi.encode(_terminals));
452
-
453
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
454
- _mockSurplusInfra(0, _emptyLimits);
455
-
456
- uint256 reclaimable = _store.currentTotalReclaimableSurplusOf(_projectId, _tokenCount, 18, _currency);
457
- assertEq(0, reclaimable);
458
- }
459
-
460
- function test_GivenTotalReclaimableMatchesSixParamOverload() external {
461
- // it will produce the same result as calling the 6-param overload with empty arrays
462
-
463
- // Register accounting context.
464
- _registerContext(JBAccountingContext({token: address(_token), decimals: 18, currency: _currency}));
465
-
466
- JBRulesetMetadata memory _metadata = JBRulesetMetadata({
467
- reservedPercent: 0,
468
- cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
469
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
470
- pausePay: false,
471
- pauseCreditTransfers: false,
472
- allowOwnerMinting: false,
473
- allowSetCustomToken: false,
474
- allowTerminalMigration: false,
475
- allowSetTerminals: false,
476
- ownerMustSendPayouts: false,
477
- allowSetController: false,
478
- allowAddAccountingContext: true,
479
- allowAddPriceFeed: false,
480
- holdFees: false,
481
- useTotalSurplusForCashOuts: false,
482
- useDataHookForPay: false,
483
- useDataHookForCashOut: false,
484
- dataHook: address(0),
485
- metadata: 0
486
- });
487
-
488
- uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
489
-
490
- uint256 _supply = 1e19;
491
- uint256 _surplus = 5e17;
492
- uint256 _cashoutAmount = 1e18;
493
-
494
- // Set balance = surplus (with zero payout limits).
495
- _setBalance(_surplus);
496
-
497
- IJBTerminal[] memory _terminals = new IJBTerminal[](1);
498
- _terminals[0] = _terminal;
499
-
500
- JBCurrencyAmount[] memory _emptyLimits = new JBCurrencyAmount[](0);
501
-
502
- // --- Call 1: currentTotalReclaimableSurplusOf (uses empty terminals -> resolves from directory) ---
503
-
504
- // Mock terminalsOf for the total reclaimable call.
505
- mockExpect(address(directory), abi.encodeCall(IJBDirectory.terminalsOf, (_projectId)), abi.encode(_terminals));
506
-
507
- _mockSurplusInfra(_packedMetadata, _emptyLimits);
508
-
509
- mockExpect(
510
- address(_controller),
511
- abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
512
- abi.encode(_supply)
513
- );
514
-
515
- uint256 reclaimableDefault = _store.currentTotalReclaimableSurplusOf(_projectId, _cashoutAmount, 18, _currency);
516
-
517
- // --- Call 2: 6-param overload with empty arrays ---
518
-
519
- // Re-mock for the 6-param call (mocks are consumed by the first call).
520
- mockExpect(address(directory), abi.encodeCall(IJBDirectory.terminalsOf, (_projectId)), abi.encode(_terminals));
521
-
522
- _mockSurplusInfra(_packedMetadata, _emptyLimits);
523
-
524
- mockExpect(
525
- address(_controller),
526
- abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
527
- abi.encode(_supply)
528
- );
529
-
530
- uint256 reclaimableExplicit = _store.currentReclaimableSurplusOf(
531
- _projectId, _cashoutAmount, new IJBTerminal[](0), new address[](0), 18, _currency
532
- );
533
-
534
- assertEq(reclaimableDefault, reclaimableExplicit);
535
- }
536
- }