@bananapus/core-v6 0.0.37 → 0.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/foundry.lock +1 -7
- package/foundry.toml +1 -1
- package/package.json +19 -7
- package/src/JBController.sol +19 -1
- package/src/JBMultiTerminal.sol +68 -34
- package/src/JBTerminalStore.sol +6 -6
- package/src/interfaces/IJBController.sol +4 -1
- package/src/libraries/JBFees.sol +47 -9
- package/src/libraries/JBPayoutSplitGroupLib.sol +2 -2
- package/src/periphery/JBMatchingPriceFeed.sol +1 -1
- package/test/mock/MockMaliciousBeneficiary.sol +15 -15
- package/ADMINISTRATION.md +0 -103
- package/ARCHITECTURE.md +0 -133
- package/AUDIT_INSTRUCTIONS.md +0 -139
- package/RISKS.md +0 -215
- package/SKILLS.md +0 -55
- package/STYLE_GUIDE.md +0 -610
- package/USER_JOURNEYS.md +0 -215
- package/script/Deploy.s.sol +0 -124
- package/script/DeployPeriphery.s.sol +0 -354
- package/slither-ci.config.json +0 -10
- package/test/AuditFixes.t.sol +0 -808
- package/test/ComprehensiveInvariant.t.sol +0 -306
- package/test/CoreExploitTests.t.sol +0 -2741
- package/test/EconomicSimulation.t.sol +0 -348
- package/test/EntryPointPermutations.t.sol +0 -684
- package/test/FlashLoanAttacks.t.sol +0 -797
- package/test/PermissionEscalation.t.sol +0 -711
- package/test/PermissionsInvariant.t.sol +0 -403
- package/test/RulesetTransitions.t.sol +0 -713
- package/test/SplitLoopTests.t.sol +0 -752
- package/test/TestAccessToFunds.sol +0 -2683
- package/test/TestAuditResponseDesignProofs.sol +0 -434
- package/test/TestCashOut.sol +0 -198
- package/test/TestCashOutCountFor.sol +0 -271
- package/test/TestCashOutHooks.sol +0 -351
- package/test/TestCashOutTimingEdge.sol +0 -241
- package/test/TestDataHookFuzzing.sol +0 -524
- package/test/TestDurationUnderflow.sol +0 -233
- package/test/TestFeeFreeCashOutBypass.sol +0 -949
- package/test/TestFeeProcessingFailure.sol +0 -218
- package/test/TestFees.sol +0 -619
- package/test/TestForwardedTokenConsumption.sol +0 -425
- package/test/TestInterfaceSupport.sol +0 -81
- package/test/TestJBERC20Inheritance.sol +0 -103
- package/test/TestL2SequencerPriceFeed.sol +0 -292
- package/test/TestLaunchProject.sol +0 -188
- package/test/TestMetaTx.sol +0 -217
- package/test/TestMetadataOffsetOverflow.sol +0 -179
- package/test/TestMetadataParserLib.sol +0 -471
- package/test/TestMigrationHeldFees.sol +0 -255
- package/test/TestMintTokensOf.sol +0 -185
- package/test/TestMultiTerminalSurplus.sol +0 -348
- package/test/TestMultiTokenSurplus.sol +0 -202
- package/test/TestMultipleAccessLimits.sol +0 -664
- package/test/TestPayBurnRedeemFlow.sol +0 -195
- package/test/TestPayHooks.sol +0 -209
- package/test/TestPermissions.sol +0 -324
- package/test/TestPermissionsEdge.sol +0 -290
- package/test/TestPermit2DataHook.t.sol +0 -360
- package/test/TestPermit2Terminal.sol +0 -372
- package/test/TestRulesetQueueing.sol +0 -1025
- package/test/TestRulesetQueuingStress.sol +0 -806
- package/test/TestRulesetWeightCaching.sol +0 -178
- package/test/TestSplits.sol +0 -391
- package/test/TestTerminalMigration.sol +0 -274
- package/test/TestTerminalPreviewParity.sol +0 -208
- package/test/TestTokenFlow.sol +0 -191
- package/test/TestWeightCacheStaleAfterRejection.sol +0 -303
- package/test/WeirdTokenTests.t.sol +0 -817
- package/test/audit/CashOutReenterPay.t.sol +0 -501
- package/test/audit/CodexHeldFeeRounding.t.sol +0 -159
- package/test/audit/CodexMigrationFeeFailure.t.sol +0 -163
- package/test/audit/CrossTerminalSurplusSpoof.t.sol +0 -140
- package/test/audit/CycledSurplusAllowanceReset.t.sol +0 -184
- package/test/audit/FeeFreeSurplusLifecycle.t.sol +0 -399
- package/test/audit/FeeFreeSurplusStale.t.sol +0 -248
- package/test/audit/USDTVoidReturnCompat.t.sol +0 -525
- package/test/fork/TestChainlinkPriceFeedFork.sol +0 -254
- package/test/fork/TestSequencerPriceFeedFork.sol +0 -168
- package/test/fork/TestTerminalPreviewParityFork.sol +0 -108
- package/test/formal/BondingCurveProperties.t.sol +0 -420
- package/test/formal/FeeProperties.t.sol +0 -252
- package/test/invariants/Phase3DeepInvariant.t.sol +0 -412
- package/test/invariants/RulesetsInvariant.t.sol +0 -125
- package/test/invariants/TerminalStoreInvariant.t.sol +0 -227
- package/test/invariants/TokensInvariant.t.sol +0 -195
- package/test/invariants/handlers/ComprehensiveHandler.sol +0 -303
- package/test/invariants/handlers/EconomicHandler.sol +0 -377
- package/test/invariants/handlers/Phase3Handler.sol +0 -443
- package/test/invariants/handlers/RulesetsHandler.sol +0 -115
- package/test/invariants/handlers/TerminalStoreHandler.sol +0 -151
- package/test/invariants/handlers/TokensHandler.sol +0 -126
- package/test/regression/HoldFeesCashOutReserved.t.sol +0 -415
- package/test/regression/WeightCacheBoundary.t.sol +0 -291
- package/test/trees/JBController/burnTokensOf.tree +0 -9
- package/test/trees/JBController/claimTokensFor.tree +0 -5
- package/test/trees/JBController/deployERC20For.tree +0 -5
- package/test/trees/JBController/getRulesetOf.tree +0 -5
- package/test/trees/JBController/launchProjectFor.tree +0 -12
- package/test/trees/JBController/launchRulesetsFor.tree +0 -8
- package/test/trees/JBController/migrateController.tree +0 -12
- package/test/trees/JBController/mintTokensOf.tree +0 -12
- package/test/trees/JBController/payReservedTokenToTerminal.tree +0 -8
- package/test/trees/JBController/receiveMigrationFrom.tree +0 -4
- package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +0 -12
- package/test/trees/JBController/setMetadataOf.tree +0 -5
- package/test/trees/JBController/setSplitGroupsOf.tree +0 -5
- package/test/trees/JBController/setTokenFor.tree +0 -5
- package/test/trees/JBController/transferCreditsFrom.tree +0 -8
- package/test/trees/JBDirectory/primaryTerminalOf.tree +0 -8
- package/test/trees/JBDirectory/setControllerOf.tree +0 -11
- package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +0 -15
- package/test/trees/JBDirectory/setTerminalsOf.tree +0 -11
- package/test/trees/JBERC20/initialize.tree +0 -7
- package/test/trees/JBERC20/name.tree +0 -5
- package/test/trees/JBERC20/nonces.tree +0 -5
- package/test/trees/JBERC20/symbol.tree +0 -5
- package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +0 -5
- package/test/trees/JBFeelessAddresses/supportsInterface.tree +0 -5
- package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +0 -5
- package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +0 -8
- package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +0 -18
- package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +0 -5
- package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +0 -8
- package/test/trees/JBMetadataResolver/getDataFor.tree +0 -8
- package/test/trees/JBMultiTerminal/accountingContextsOf.tree +0 -5
- package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +0 -10
- package/test/trees/JBMultiTerminal/addToBalanceOf.tree +0 -23
- package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +0 -23
- package/test/trees/JBMultiTerminal/executePayout.tree +0 -32
- package/test/trees/JBMultiTerminal/executeProcessFee.tree +0 -14
- package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +0 -12
- package/test/trees/JBMultiTerminal/pay.tree +0 -23
- package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +0 -8
- package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +0 -34
- package/test/trees/JBMultiTerminal/useAllowanceOf.tree +0 -16
- package/test/trees/JBPermissions/hasPermission.tree +0 -8
- package/test/trees/JBPermissions/hasPermissions.tree +0 -8
- package/test/trees/JBPermissions/setPermissionsFor.tree +0 -5
- package/test/trees/JBPrices/addPriceFeedFor.tree +0 -14
- package/test/trees/JBPrices/pricePerUnitOf.tree +0 -11
- package/test/trees/JBProjects/createFor.tree +0 -11
- package/test/trees/JBProjects/setTokenUriResolver.tree +0 -5
- package/test/trees/JBProjects/supportsInterface.tree +0 -9
- package/test/trees/JBProjects/tokenURI.tree +0 -5
- package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +0 -8
- package/test/trees/JBRulesets/currentOf.tree +0 -12
- package/test/trees/JBRulesets/getRulesetOf.tree +0 -5
- package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +0 -10
- package/test/trees/JBRulesets/rulesetsOf.tree +0 -11
- package/test/trees/JBRulesets/upcomingRulesetOf.tree +0 -20
- package/test/trees/JBRulesets/updateRulesetWeightCache.tree +0 -5
- package/test/trees/JBSplits/setSplitGroupsOf.tree +0 -17
- package/test/trees/JBSplits/splitsOf.tree +0 -5
- package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +0 -16
- package/test/trees/JBTerminalStore/currentSurplusOf.tree +0 -25
- package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +0 -5
- package/test/trees/JBTerminalStore/recordCashOutsFor.tree +0 -16
- package/test/trees/JBTerminalStore/recordPaymentFrom.tree +0 -14
- package/test/trees/JBTerminalStore/recordPayoutFor.tree +0 -10
- package/test/trees/JBTerminalStore/recordTerminalMigration.tree +0 -5
- package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +0 -10
- package/test/trees/JBTokens/burnFrom.tree +0 -10
- package/test/trees/JBTokens/claimTokensFor.tree +0 -10
- package/test/trees/JBTokens/deployERC20For.tree +0 -12
- package/test/trees/JBTokens/mintFor.tree +0 -10
- package/test/trees/JBTokens/setTokenFor.tree +0 -11
- package/test/trees/JBTokens/totalBalanceOf.tree +0 -5
- package/test/trees/JBTokens/totalSupplyOf.tree +0 -5
- package/test/trees/JBTokens/transferCreditsFrom.tree +0 -8
- package/test/trees/mintTokensOf.tree +0 -12
- package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +0 -223
- package/test/units/static/JBController/JBControllerSetup.sol +0 -50
- package/test/units/static/JBController/TestBurnTokensOf.sol +0 -114
- package/test/units/static/JBController/TestClaimTokensFor.sol +0 -63
- package/test/units/static/JBController/TestDeployErc20For.sol +0 -86
- package/test/units/static/JBController/TestLaunchProjectFor.sol +0 -302
- package/test/units/static/JBController/TestLaunchRulesetsFor.sol +0 -342
- package/test/units/static/JBController/TestMigrateController.sol +0 -157
- package/test/units/static/JBController/TestMintTokensOfUnits.sol +0 -111
- package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +0 -324
- package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +0 -74
- package/test/units/static/JBController/TestPreviewMintOf.sol +0 -117
- package/test/units/static/JBController/TestReceiveMigrationFrom.sol +0 -99
- package/test/units/static/JBController/TestRulesetViews.sol +0 -225
- package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +0 -615
- package/test/units/static/JBController/TestSetSplitGroupsOf.sol +0 -68
- package/test/units/static/JBController/TestSetTokenFor.sol +0 -239
- package/test/units/static/JBController/TestSetUriOf.sol +0 -57
- package/test/units/static/JBController/TestTransferCreditsFrom.sol +0 -169
- package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +0 -211
- package/test/units/static/JBDirectory/JBDirectorySetup.sol +0 -26
- package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +0 -126
- package/test/units/static/JBDirectory/TestSetControllerOf.sol +0 -183
- package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +0 -104
- package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +0 -179
- package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +0 -137
- package/test/units/static/JBERC20/JBERC20Setup.sol +0 -34
- package/test/units/static/JBERC20/SigUtils.sol +0 -36
- package/test/units/static/JBERC20/TestInitialize.sol +0 -60
- package/test/units/static/JBERC20/TestName.sol +0 -30
- package/test/units/static/JBERC20/TestNonces.sol +0 -62
- package/test/units/static/JBERC20/TestSymbol.sol +0 -31
- package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +0 -22
- package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +0 -30
- package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +0 -35
- package/test/units/static/JBFees/TestFeesFuzz.sol +0 -79
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +0 -16
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +0 -71
- package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +0 -24
- package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +0 -163
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +0 -59
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +0 -101
- package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +0 -189
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +0 -64
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +0 -102
- package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +0 -90
- package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +0 -247
- package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +0 -229
- package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +0 -50
- package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +0 -72
- package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +0 -289
- package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +0 -474
- package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +0 -624
- package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +0 -578
- package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +0 -202
- package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +0 -222
- package/test/units/static/JBMultiTerminal/TestPay.sol +0 -604
- package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +0 -117
- package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +0 -114
- package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +0 -228
- package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +0 -55
- package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +0 -257
- package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +0 -611
- package/test/units/static/JBPermissions/JBPermissionsSetup.sol +0 -20
- package/test/units/static/JBPermissions/TestHasPermission.sol +0 -50
- package/test/units/static/JBPermissions/TestHasPermissions.sol +0 -93
- package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +0 -64
- package/test/units/static/JBPrices/JBPricesSetup.sol +0 -32
- package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +0 -107
- package/test/units/static/JBPrices/TestPricePerUnitOf.sol +0 -132
- package/test/units/static/JBPrices/TestPrices.sol +0 -265
- package/test/units/static/JBProjects/JBProjectsSetup.sol +0 -22
- package/test/units/static/JBProjects/TestCreateFor.sol +0 -71
- package/test/units/static/JBProjects/TestInitialProject.sol +0 -21
- package/test/units/static/JBProjects/TestInterfaces.sol +0 -26
- package/test/units/static/JBProjects/TestSetResolver.sol +0 -37
- package/test/units/static/JBProjects/TestTokenUri.sol +0 -40
- package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +0 -108
- package/test/units/static/JBRulesets/JBRulesetsSetup.sol +0 -24
- package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +0 -265
- package/test/units/static/JBRulesets/TestCurrentOf.sol +0 -242
- package/test/units/static/JBRulesets/TestGetRulesetOf.sol +0 -100
- package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +0 -260
- package/test/units/static/JBRulesets/TestRulesets.sol +0 -632
- package/test/units/static/JBRulesets/TestRulesetsOf.sol +0 -37
- package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +0 -522
- package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +0 -96
- package/test/units/static/JBSplits/JBSplitsSetup.sol +0 -26
- package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +0 -552
- package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +0 -377
- package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +0 -267
- package/test/units/static/JBSplits/TestSplitsOf.sol +0 -24
- package/test/units/static/JBSplits/TestSplitsPacking.sol +0 -36
- package/test/units/static/JBSurplus/TestSurplusFuzz.sol +0 -160
- package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +0 -45
- package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +0 -536
- package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +0 -463
- package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +0 -135
- package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +0 -476
- package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +0 -494
- package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +0 -652
- package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +0 -744
- package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +0 -289
- package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +0 -138
- package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +0 -415
- package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +0 -219
- package/test/units/static/JBTokens/JBTokensSetup.sol +0 -32
- package/test/units/static/JBTokens/TestBurnFrom.sol +0 -107
- package/test/units/static/JBTokens/TestClaimTokensFor.sol +0 -110
- package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +0 -92
- package/test/units/static/JBTokens/TestMintFor.sol +0 -100
- package/test/units/static/JBTokens/TestSetTokenFor.sol +0 -98
- package/test/units/static/JBTokens/TestTotalBalanceOf.sol +0 -65
- package/test/units/static/JBTokens/TestTotalSupplyOf.sol +0 -56
- 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
|
-
}
|