@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,303 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity ^0.8.6;
|
|
3
|
-
|
|
4
|
-
import {Test} from "forge-std/Test.sol";
|
|
5
|
-
import {JBConstants} from "../../../src/libraries/JBConstants.sol";
|
|
6
|
-
import {IJBMultiTerminal} from "../../../src/interfaces/IJBMultiTerminal.sol";
|
|
7
|
-
import {IJBTerminalStore} from "../../../src/interfaces/IJBTerminalStore.sol";
|
|
8
|
-
import {IJBController} from "../../../src/interfaces/IJBController.sol";
|
|
9
|
-
import {IJBTokens} from "../../../src/interfaces/IJBTokens.sol";
|
|
10
|
-
|
|
11
|
-
/// @notice Comprehensive handler for JBTerminalStore invariant testing.
|
|
12
|
-
/// @dev Extends the basic handler with 10 operations including reserves, allowance, burns, claims, time, and fees.
|
|
13
|
-
contract ComprehensiveHandler is Test {
|
|
14
|
-
IJBMultiTerminal public terminal;
|
|
15
|
-
IJBTerminalStore public store;
|
|
16
|
-
IJBController public controller;
|
|
17
|
-
IJBTokens public tokens;
|
|
18
|
-
|
|
19
|
-
uint256 public projectId;
|
|
20
|
-
address public projectOwner;
|
|
21
|
-
|
|
22
|
-
// Ghost variables for fund tracking
|
|
23
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
24
|
-
uint256 public ghost_totalPaidIn;
|
|
25
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
26
|
-
uint256 public ghost_totalCashedOut;
|
|
27
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
28
|
-
uint256 public ghost_totalPaidOut;
|
|
29
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
30
|
-
uint256 public ghost_totalAddedToBalance;
|
|
31
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
32
|
-
uint256 public ghost_totalAllowanceUsed;
|
|
33
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
34
|
-
uint256 public ghost_feeProjectBalanceLast;
|
|
35
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
36
|
-
uint256 public ghost_feeProjectBalanceDecreased; // should always be 0
|
|
37
|
-
|
|
38
|
-
// Track actors
|
|
39
|
-
address[] public actors;
|
|
40
|
-
mapping(address => bool) public isActor;
|
|
41
|
-
uint256 public constant NUM_ACTORS = 5;
|
|
42
|
-
|
|
43
|
-
// Operation counters for debugging
|
|
44
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
45
|
-
uint256 public callCount_pay;
|
|
46
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
47
|
-
uint256 public callCount_cashOut;
|
|
48
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
49
|
-
uint256 public callCount_sendPayouts;
|
|
50
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
51
|
-
uint256 public callCount_addToBalance;
|
|
52
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
53
|
-
uint256 public callCount_sendReservedTokens;
|
|
54
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
55
|
-
uint256 public callCount_useAllowance;
|
|
56
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
57
|
-
uint256 public callCount_burnTokens;
|
|
58
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
59
|
-
uint256 public callCount_claimCredits;
|
|
60
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
61
|
-
uint256 public callCount_advanceTime;
|
|
62
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
63
|
-
uint256 public callCount_processHeldFees;
|
|
64
|
-
|
|
65
|
-
constructor(
|
|
66
|
-
IJBMultiTerminal _terminal,
|
|
67
|
-
IJBTerminalStore _store,
|
|
68
|
-
IJBController _controller,
|
|
69
|
-
IJBTokens _tokens,
|
|
70
|
-
uint256 _projectId,
|
|
71
|
-
address _projectOwner
|
|
72
|
-
) {
|
|
73
|
-
terminal = _terminal;
|
|
74
|
-
store = _store;
|
|
75
|
-
controller = _controller;
|
|
76
|
-
tokens = _tokens;
|
|
77
|
-
projectId = _projectId;
|
|
78
|
-
projectOwner = _projectOwner;
|
|
79
|
-
|
|
80
|
-
// Create actor addresses
|
|
81
|
-
for (uint256 i = 0; i < NUM_ACTORS; i++) {
|
|
82
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
83
|
-
address actor = address(uint160(0x2000 + i));
|
|
84
|
-
actors.push(actor);
|
|
85
|
-
isActor[actor] = true;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Initialize fee project balance tracking
|
|
89
|
-
ghost_feeProjectBalanceLast = store.balanceOf(address(terminal), 1, JBConstants.NATIVE_TOKEN);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/// @notice Selects an actor based on a seed.
|
|
93
|
-
function _getActor(uint256 seed) internal view returns (address) {
|
|
94
|
-
return actors[seed % actors.length];
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/// @notice Track fee project balance monotonicity.
|
|
98
|
-
function _trackFeeProjectBalance() internal {
|
|
99
|
-
uint256 currentFeeBalance = store.balanceOf(address(terminal), 1, JBConstants.NATIVE_TOKEN);
|
|
100
|
-
if (currentFeeBalance < ghost_feeProjectBalanceLast) {
|
|
101
|
-
ghost_feeProjectBalanceDecreased++;
|
|
102
|
-
}
|
|
103
|
-
ghost_feeProjectBalanceLast = currentFeeBalance;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// ─── Operation 1: Pay
|
|
107
|
-
// ─────────────────────────────────────────────
|
|
108
|
-
|
|
109
|
-
function payProject(uint256 actorSeed, uint256 amount) public {
|
|
110
|
-
amount = bound(amount, 0.01 ether, 100 ether);
|
|
111
|
-
address actor = _getActor(actorSeed);
|
|
112
|
-
|
|
113
|
-
vm.deal(actor, amount);
|
|
114
|
-
vm.prank(actor);
|
|
115
|
-
terminal.pay{value: amount}({
|
|
116
|
-
projectId: projectId,
|
|
117
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
118
|
-
amount: amount,
|
|
119
|
-
beneficiary: actor,
|
|
120
|
-
minReturnedTokens: 0,
|
|
121
|
-
memo: "",
|
|
122
|
-
metadata: new bytes(0)
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
ghost_totalPaidIn += amount;
|
|
126
|
-
callCount_pay++;
|
|
127
|
-
_trackFeeProjectBalance();
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// ─── Operation 2: Cash Out
|
|
131
|
-
// ────────────────────────────────────────
|
|
132
|
-
|
|
133
|
-
function cashOutTokens(uint256 actorSeed, uint256 cashOutPercent) public {
|
|
134
|
-
address actor = _getActor(actorSeed);
|
|
135
|
-
uint256 tokenBalance = tokens.totalBalanceOf(actor, projectId);
|
|
136
|
-
if (tokenBalance == 0) return;
|
|
137
|
-
|
|
138
|
-
cashOutPercent = bound(cashOutPercent, 1, 100);
|
|
139
|
-
uint256 cashOutCount = (tokenBalance * cashOutPercent) / 100;
|
|
140
|
-
if (cashOutCount == 0) return;
|
|
141
|
-
|
|
142
|
-
vm.prank(actor);
|
|
143
|
-
uint256 reclaimAmount = terminal.cashOutTokensOf({
|
|
144
|
-
holder: actor,
|
|
145
|
-
projectId: projectId,
|
|
146
|
-
cashOutCount: cashOutCount,
|
|
147
|
-
tokenToReclaim: JBConstants.NATIVE_TOKEN,
|
|
148
|
-
minTokensReclaimed: 0,
|
|
149
|
-
beneficiary: payable(actor),
|
|
150
|
-
metadata: new bytes(0)
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
ghost_totalCashedOut += reclaimAmount;
|
|
154
|
-
callCount_cashOut++;
|
|
155
|
-
_trackFeeProjectBalance();
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// ─── Operation 3: Send Payouts
|
|
159
|
-
// ────────────────────────────────────
|
|
160
|
-
|
|
161
|
-
function sendPayouts(uint256 amount) public {
|
|
162
|
-
uint256 balance = store.balanceOf(address(terminal), projectId, JBConstants.NATIVE_TOKEN);
|
|
163
|
-
if (balance == 0) return;
|
|
164
|
-
|
|
165
|
-
amount = bound(amount, 1, balance);
|
|
166
|
-
|
|
167
|
-
vm.prank(projectOwner);
|
|
168
|
-
try terminal.sendPayoutsOf({
|
|
169
|
-
projectId: projectId,
|
|
170
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
171
|
-
amount: amount,
|
|
172
|
-
currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
173
|
-
minTokensPaidOut: 0
|
|
174
|
-
}) returns (
|
|
175
|
-
uint256 amountPaidOut
|
|
176
|
-
) {
|
|
177
|
-
ghost_totalPaidOut += amountPaidOut;
|
|
178
|
-
} catch {}
|
|
179
|
-
|
|
180
|
-
callCount_sendPayouts++;
|
|
181
|
-
_trackFeeProjectBalance();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// ─── Operation 4: Add to Balance
|
|
185
|
-
// ──────────────────────────────────
|
|
186
|
-
|
|
187
|
-
function addToBalance(uint256 amount) public {
|
|
188
|
-
amount = bound(amount, 0.01 ether, 50 ether);
|
|
189
|
-
|
|
190
|
-
vm.deal(address(this), amount);
|
|
191
|
-
terminal.addToBalanceOf{value: amount}({
|
|
192
|
-
projectId: projectId,
|
|
193
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
194
|
-
amount: amount,
|
|
195
|
-
shouldReturnHeldFees: false,
|
|
196
|
-
memo: "",
|
|
197
|
-
metadata: new bytes(0)
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
ghost_totalAddedToBalance += amount;
|
|
201
|
-
callCount_addToBalance++;
|
|
202
|
-
_trackFeeProjectBalance();
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// ─── Operation 5: Send Reserved Tokens
|
|
206
|
-
// ────────────────────────────
|
|
207
|
-
|
|
208
|
-
function sendReservedTokens() public {
|
|
209
|
-
try controller.sendReservedTokensToSplitsOf(projectId) {} catch {}
|
|
210
|
-
callCount_sendReservedTokens++;
|
|
211
|
-
_trackFeeProjectBalance();
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// ─── Operation 6: Use Allowance
|
|
215
|
-
// ───────────────────────────────────
|
|
216
|
-
|
|
217
|
-
function useAllowance(uint256 amount) public {
|
|
218
|
-
uint256 balance = store.balanceOf(address(terminal), projectId, JBConstants.NATIVE_TOKEN);
|
|
219
|
-
if (balance == 0) return;
|
|
220
|
-
|
|
221
|
-
amount = bound(amount, 0.001 ether, 3 ether);
|
|
222
|
-
|
|
223
|
-
vm.prank(projectOwner);
|
|
224
|
-
try terminal.useAllowanceOf({
|
|
225
|
-
projectId: projectId,
|
|
226
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
227
|
-
amount: amount,
|
|
228
|
-
currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
229
|
-
minTokensPaidOut: 0,
|
|
230
|
-
beneficiary: payable(projectOwner),
|
|
231
|
-
feeBeneficiary: payable(projectOwner),
|
|
232
|
-
memo: "allowance"
|
|
233
|
-
}) returns (
|
|
234
|
-
uint256 netAmountPaidOut
|
|
235
|
-
) {
|
|
236
|
-
ghost_totalAllowanceUsed += netAmountPaidOut;
|
|
237
|
-
} catch {}
|
|
238
|
-
|
|
239
|
-
callCount_useAllowance++;
|
|
240
|
-
_trackFeeProjectBalance();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// ─── Operation 7: Burn Tokens
|
|
244
|
-
// ─────────────────────────────────────
|
|
245
|
-
|
|
246
|
-
function burnTokens(uint256 actorSeed, uint256 burnPercent) public {
|
|
247
|
-
address actor = _getActor(actorSeed);
|
|
248
|
-
uint256 tokenBalance = tokens.totalBalanceOf(actor, projectId);
|
|
249
|
-
if (tokenBalance == 0) return;
|
|
250
|
-
|
|
251
|
-
burnPercent = bound(burnPercent, 1, 100);
|
|
252
|
-
uint256 burnCount = (tokenBalance * burnPercent) / 100;
|
|
253
|
-
if (burnCount == 0) return;
|
|
254
|
-
|
|
255
|
-
vm.prank(actor);
|
|
256
|
-
try controller.burnTokensOf({holder: actor, projectId: projectId, tokenCount: burnCount, memo: "burn"}) {}
|
|
257
|
-
catch {}
|
|
258
|
-
|
|
259
|
-
callCount_burnTokens++;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// ─── Operation 8: Claim Credits as ERC20
|
|
263
|
-
// ──────────────────────────
|
|
264
|
-
|
|
265
|
-
function claimCredits(uint256 actorSeed, uint256 claimPercent) public {
|
|
266
|
-
address actor = _getActor(actorSeed);
|
|
267
|
-
uint256 creditBalance = tokens.creditBalanceOf(actor, projectId);
|
|
268
|
-
if (creditBalance == 0) return;
|
|
269
|
-
|
|
270
|
-
claimPercent = bound(claimPercent, 1, 100);
|
|
271
|
-
uint256 claimCount = (creditBalance * claimPercent) / 100;
|
|
272
|
-
if (claimCount == 0) return;
|
|
273
|
-
|
|
274
|
-
vm.prank(actor);
|
|
275
|
-
try controller.claimTokensFor({
|
|
276
|
-
holder: actor, projectId: projectId, tokenCount: claimCount, beneficiary: actor
|
|
277
|
-
}) {}
|
|
278
|
-
catch {}
|
|
279
|
-
|
|
280
|
-
callCount_claimCredits++;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// ─── Operation 9: Advance Time
|
|
284
|
-
// ────────────────────────────────────
|
|
285
|
-
|
|
286
|
-
function advanceTime(uint256 timeSeed) public {
|
|
287
|
-
uint256 timeJump = bound(timeSeed, 1 hours, 90 days);
|
|
288
|
-
vm.warp(block.timestamp + timeJump);
|
|
289
|
-
callCount_advanceTime++;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// ─── Operation 10: Process Held Fees
|
|
293
|
-
// ──────────────────────────────
|
|
294
|
-
|
|
295
|
-
function processHeldFees(uint256 count) public {
|
|
296
|
-
count = bound(count, 1, 10);
|
|
297
|
-
try terminal.processHeldFeesOf(projectId, JBConstants.NATIVE_TOKEN, count) {} catch {}
|
|
298
|
-
callCount_processHeldFees++;
|
|
299
|
-
_trackFeeProjectBalance();
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
receive() external payable {}
|
|
303
|
-
}
|
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity ^0.8.6;
|
|
3
|
-
|
|
4
|
-
import {Test} from "forge-std/Test.sol";
|
|
5
|
-
import {JBConstants} from "../../../src/libraries/JBConstants.sol";
|
|
6
|
-
import {IJBMultiTerminal} from "../../../src/interfaces/IJBMultiTerminal.sol";
|
|
7
|
-
import {IJBTerminalStore} from "../../../src/interfaces/IJBTerminalStore.sol";
|
|
8
|
-
import {IJBController} from "../../../src/interfaces/IJBController.sol";
|
|
9
|
-
import {IJBTokens} from "../../../src/interfaces/IJBTokens.sol";
|
|
10
|
-
|
|
11
|
-
/// @notice Multi-project economic handler for invariant testing.
|
|
12
|
-
/// @dev Manages 3 projects with distinct configurations and 10 actors.
|
|
13
|
-
/// Project A: 20% reserved, 60% cash out tax, splits 50% to B
|
|
14
|
-
/// Project B: 0% reserved, 0% cash out tax, splits 50% to C
|
|
15
|
-
/// Project C: 50% reserved, 80% cash out tax
|
|
16
|
-
contract EconomicHandler is Test {
|
|
17
|
-
IJBMultiTerminal public terminal;
|
|
18
|
-
IJBTerminalStore public store;
|
|
19
|
-
IJBController public controller;
|
|
20
|
-
IJBTokens public tokens;
|
|
21
|
-
|
|
22
|
-
uint256 public projectA;
|
|
23
|
-
uint256 public projectB;
|
|
24
|
-
uint256 public projectC;
|
|
25
|
-
address public projectOwner;
|
|
26
|
-
|
|
27
|
-
// Ghost variables for conservation tracking
|
|
28
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
29
|
-
uint256 public ghost_totalPaidInA;
|
|
30
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
31
|
-
uint256 public ghost_totalPaidInB;
|
|
32
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
33
|
-
uint256 public ghost_totalPaidInC;
|
|
34
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
35
|
-
uint256 public ghost_totalCashedOutA;
|
|
36
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
37
|
-
uint256 public ghost_totalCashedOutB;
|
|
38
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
39
|
-
uint256 public ghost_totalCashedOutC;
|
|
40
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
41
|
-
uint256 public ghost_totalPaidOutA;
|
|
42
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
43
|
-
uint256 public ghost_totalPaidOutB;
|
|
44
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
45
|
-
uint256 public ghost_totalPaidOutC;
|
|
46
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
47
|
-
uint256 public ghost_totalAddedToBalanceA;
|
|
48
|
-
|
|
49
|
-
// Fee project tracking
|
|
50
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
51
|
-
uint256 public ghost_feeProjectBalance;
|
|
52
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
53
|
-
uint256 public ghost_feeProjectBalancePrev;
|
|
54
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
55
|
-
bool public ghost_feeProjectBalanceDecreased;
|
|
56
|
-
|
|
57
|
-
// Cross-project split tracking
|
|
58
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
59
|
-
bool public ghost_splitCascadeOccurred;
|
|
60
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
61
|
-
uint256 public ghost_projectBBalanceBeforeSplit;
|
|
62
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
63
|
-
uint256 public ghost_projectBBalanceAfterSplit;
|
|
64
|
-
|
|
65
|
-
// Track actors
|
|
66
|
-
address[] public actors;
|
|
67
|
-
mapping(address => bool) public isActor;
|
|
68
|
-
uint256 public constant NUM_ACTORS = 10;
|
|
69
|
-
|
|
70
|
-
// Operation counters
|
|
71
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
72
|
-
uint256 public callCount_payA;
|
|
73
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
74
|
-
uint256 public callCount_payB;
|
|
75
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
76
|
-
uint256 public callCount_payC;
|
|
77
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
78
|
-
uint256 public callCount_cashOutA;
|
|
79
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
80
|
-
uint256 public callCount_cashOutB;
|
|
81
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
82
|
-
uint256 public callCount_cashOutC;
|
|
83
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
84
|
-
uint256 public callCount_sendPayoutsA;
|
|
85
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
86
|
-
uint256 public callCount_sendPayoutsB;
|
|
87
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
88
|
-
uint256 public callCount_sendPayoutsC;
|
|
89
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
90
|
-
uint256 public callCount_addToBalanceA;
|
|
91
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
92
|
-
uint256 public callCount_sendReservedA;
|
|
93
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
94
|
-
uint256 public callCount_sendReservedC;
|
|
95
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
96
|
-
uint256 public callCount_advanceTime;
|
|
97
|
-
|
|
98
|
-
// Per-actor tracking
|
|
99
|
-
mapping(address => uint256) public actorPaidInA;
|
|
100
|
-
mapping(address => uint256) public actorCashedOutA;
|
|
101
|
-
|
|
102
|
-
constructor(
|
|
103
|
-
IJBMultiTerminal _terminal,
|
|
104
|
-
IJBTerminalStore _store,
|
|
105
|
-
IJBController _controller,
|
|
106
|
-
IJBTokens _tokens,
|
|
107
|
-
uint256 _projectA,
|
|
108
|
-
uint256 _projectB,
|
|
109
|
-
uint256 _projectC,
|
|
110
|
-
address _projectOwner
|
|
111
|
-
) {
|
|
112
|
-
terminal = _terminal;
|
|
113
|
-
store = _store;
|
|
114
|
-
controller = _controller;
|
|
115
|
-
tokens = _tokens;
|
|
116
|
-
projectA = _projectA;
|
|
117
|
-
projectB = _projectB;
|
|
118
|
-
projectC = _projectC;
|
|
119
|
-
projectOwner = _projectOwner;
|
|
120
|
-
|
|
121
|
-
for (uint256 i = 0; i < NUM_ACTORS; i++) {
|
|
122
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
123
|
-
address actor = address(uint160(0x3000 + i));
|
|
124
|
-
actors.push(actor);
|
|
125
|
-
isActor[actor] = true;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
ghost_feeProjectBalance = store.balanceOf(address(terminal), 1, JBConstants.NATIVE_TOKEN);
|
|
129
|
-
ghost_feeProjectBalancePrev = ghost_feeProjectBalance;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function _getActor(uint256 seed) internal view returns (address) {
|
|
133
|
-
return actors[seed % actors.length];
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
function _trackFeeProjectBalance() internal {
|
|
137
|
-
ghost_feeProjectBalancePrev = ghost_feeProjectBalance;
|
|
138
|
-
ghost_feeProjectBalance = store.balanceOf(address(terminal), 1, JBConstants.NATIVE_TOKEN);
|
|
139
|
-
if (ghost_feeProjectBalance < ghost_feeProjectBalancePrev) {
|
|
140
|
-
ghost_feeProjectBalanceDecreased = true;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// =========================================================================
|
|
145
|
-
// Operations
|
|
146
|
-
// =========================================================================
|
|
147
|
-
|
|
148
|
-
function payProjectA(uint256 seed) external {
|
|
149
|
-
uint256 amount = bound(seed, 0.001 ether, 5 ether);
|
|
150
|
-
address actor = _getActor(seed);
|
|
151
|
-
vm.deal(actor, amount);
|
|
152
|
-
|
|
153
|
-
vm.prank(actor);
|
|
154
|
-
try terminal.pay{value: amount}(projectA, JBConstants.NATIVE_TOKEN, amount, actor, 0, "", "") {
|
|
155
|
-
ghost_totalPaidInA += amount;
|
|
156
|
-
actorPaidInA[actor] += amount;
|
|
157
|
-
callCount_payA++;
|
|
158
|
-
} catch {}
|
|
159
|
-
_trackFeeProjectBalance();
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function payProjectB(uint256 seed) external {
|
|
163
|
-
uint256 amount = bound(seed, 0.001 ether, 5 ether);
|
|
164
|
-
address actor = _getActor(seed);
|
|
165
|
-
vm.deal(actor, amount);
|
|
166
|
-
|
|
167
|
-
vm.prank(actor);
|
|
168
|
-
try terminal.pay{value: amount}(projectB, JBConstants.NATIVE_TOKEN, amount, actor, 0, "", "") {
|
|
169
|
-
ghost_totalPaidInB += amount;
|
|
170
|
-
callCount_payB++;
|
|
171
|
-
} catch {}
|
|
172
|
-
_trackFeeProjectBalance();
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
function payProjectC(uint256 seed) external {
|
|
176
|
-
uint256 amount = bound(seed, 0.001 ether, 5 ether);
|
|
177
|
-
address actor = _getActor(seed);
|
|
178
|
-
vm.deal(actor, amount);
|
|
179
|
-
|
|
180
|
-
vm.prank(actor);
|
|
181
|
-
try terminal.pay{value: amount}(projectC, JBConstants.NATIVE_TOKEN, amount, actor, 0, "", "") {
|
|
182
|
-
ghost_totalPaidInC += amount;
|
|
183
|
-
callCount_payC++;
|
|
184
|
-
} catch {}
|
|
185
|
-
_trackFeeProjectBalance();
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function cashOutA(uint256 seed) external {
|
|
189
|
-
address actor = _getActor(seed);
|
|
190
|
-
// Use the actor's actual token balance (credits + ERC20), not total supply
|
|
191
|
-
uint256 actorBalance = tokens.totalBalanceOf(actor, projectA);
|
|
192
|
-
if (actorBalance == 0) return;
|
|
193
|
-
|
|
194
|
-
uint256 cashOutAmount = bound(seed, 1, actorBalance);
|
|
195
|
-
if (cashOutAmount == 0) return;
|
|
196
|
-
|
|
197
|
-
vm.prank(actor);
|
|
198
|
-
try terminal.cashOutTokensOf({
|
|
199
|
-
holder: actor,
|
|
200
|
-
projectId: projectA,
|
|
201
|
-
cashOutCount: cashOutAmount,
|
|
202
|
-
tokenToReclaim: JBConstants.NATIVE_TOKEN,
|
|
203
|
-
minTokensReclaimed: 0,
|
|
204
|
-
beneficiary: payable(actor),
|
|
205
|
-
metadata: ""
|
|
206
|
-
}) returns (
|
|
207
|
-
uint256 reclaimAmount
|
|
208
|
-
) {
|
|
209
|
-
ghost_totalCashedOutA += reclaimAmount;
|
|
210
|
-
actorCashedOutA[actor] += reclaimAmount;
|
|
211
|
-
callCount_cashOutA++;
|
|
212
|
-
} catch {}
|
|
213
|
-
_trackFeeProjectBalance();
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
function cashOutB(uint256 seed) external {
|
|
217
|
-
address actor = _getActor(seed);
|
|
218
|
-
uint256 actorBalance = tokens.totalBalanceOf(actor, projectB);
|
|
219
|
-
if (actorBalance == 0) return;
|
|
220
|
-
|
|
221
|
-
uint256 cashOutAmount = bound(seed, 1, actorBalance);
|
|
222
|
-
if (cashOutAmount == 0) return;
|
|
223
|
-
|
|
224
|
-
vm.prank(actor);
|
|
225
|
-
try terminal.cashOutTokensOf({
|
|
226
|
-
holder: actor,
|
|
227
|
-
projectId: projectB,
|
|
228
|
-
cashOutCount: cashOutAmount,
|
|
229
|
-
tokenToReclaim: JBConstants.NATIVE_TOKEN,
|
|
230
|
-
minTokensReclaimed: 0,
|
|
231
|
-
beneficiary: payable(actor),
|
|
232
|
-
metadata: ""
|
|
233
|
-
}) returns (
|
|
234
|
-
uint256 reclaimAmount
|
|
235
|
-
) {
|
|
236
|
-
ghost_totalCashedOutB += reclaimAmount;
|
|
237
|
-
callCount_cashOutB++;
|
|
238
|
-
} catch {}
|
|
239
|
-
_trackFeeProjectBalance();
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
function cashOutC(uint256 seed) external {
|
|
243
|
-
address actor = _getActor(seed);
|
|
244
|
-
uint256 actorBalance = tokens.totalBalanceOf(actor, projectC);
|
|
245
|
-
if (actorBalance == 0) return;
|
|
246
|
-
|
|
247
|
-
uint256 cashOutAmount = bound(seed, 1, actorBalance);
|
|
248
|
-
if (cashOutAmount == 0) return;
|
|
249
|
-
|
|
250
|
-
vm.prank(actor);
|
|
251
|
-
try terminal.cashOutTokensOf({
|
|
252
|
-
holder: actor,
|
|
253
|
-
projectId: projectC,
|
|
254
|
-
cashOutCount: cashOutAmount,
|
|
255
|
-
tokenToReclaim: JBConstants.NATIVE_TOKEN,
|
|
256
|
-
minTokensReclaimed: 0,
|
|
257
|
-
beneficiary: payable(actor),
|
|
258
|
-
metadata: ""
|
|
259
|
-
}) returns (
|
|
260
|
-
uint256 reclaimAmount
|
|
261
|
-
) {
|
|
262
|
-
ghost_totalCashedOutC += reclaimAmount;
|
|
263
|
-
callCount_cashOutC++;
|
|
264
|
-
} catch {}
|
|
265
|
-
_trackFeeProjectBalance();
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
function sendPayoutsA(uint256 seed) external {
|
|
269
|
-
uint256 balance = store.balanceOf(address(terminal), projectA, JBConstants.NATIVE_TOKEN);
|
|
270
|
-
if (balance == 0) return;
|
|
271
|
-
|
|
272
|
-
uint256 amount = bound(seed, 1, balance);
|
|
273
|
-
|
|
274
|
-
// Track B's balance before payout (for cross-project split cascade)
|
|
275
|
-
ghost_projectBBalanceBeforeSplit = store.balanceOf(address(terminal), projectB, JBConstants.NATIVE_TOKEN);
|
|
276
|
-
|
|
277
|
-
vm.prank(projectOwner);
|
|
278
|
-
try terminal.sendPayoutsOf({
|
|
279
|
-
projectId: projectA,
|
|
280
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
281
|
-
amount: amount,
|
|
282
|
-
currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
283
|
-
minTokensPaidOut: 0
|
|
284
|
-
}) returns (
|
|
285
|
-
uint256 amountPaidOut
|
|
286
|
-
) {
|
|
287
|
-
ghost_totalPaidOutA += amountPaidOut;
|
|
288
|
-
callCount_sendPayoutsA++;
|
|
289
|
-
|
|
290
|
-
// Track B's balance after payout
|
|
291
|
-
ghost_projectBBalanceAfterSplit = store.balanceOf(address(terminal), projectB, JBConstants.NATIVE_TOKEN);
|
|
292
|
-
if (ghost_projectBBalanceAfterSplit > ghost_projectBBalanceBeforeSplit) {
|
|
293
|
-
ghost_splitCascadeOccurred = true;
|
|
294
|
-
}
|
|
295
|
-
} catch {}
|
|
296
|
-
_trackFeeProjectBalance();
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
function sendPayoutsB(uint256 seed) external {
|
|
300
|
-
uint256 balance = store.balanceOf(address(terminal), projectB, JBConstants.NATIVE_TOKEN);
|
|
301
|
-
if (balance == 0) return;
|
|
302
|
-
|
|
303
|
-
uint256 amount = bound(seed, 1, balance);
|
|
304
|
-
|
|
305
|
-
vm.prank(projectOwner);
|
|
306
|
-
try terminal.sendPayoutsOf({
|
|
307
|
-
projectId: projectB,
|
|
308
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
309
|
-
amount: amount,
|
|
310
|
-
currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
311
|
-
minTokensPaidOut: 0
|
|
312
|
-
}) returns (
|
|
313
|
-
uint256 amountPaidOut
|
|
314
|
-
) {
|
|
315
|
-
ghost_totalPaidOutB += amountPaidOut;
|
|
316
|
-
callCount_sendPayoutsB++;
|
|
317
|
-
} catch {}
|
|
318
|
-
_trackFeeProjectBalance();
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
function sendPayoutsC(uint256 seed) external {
|
|
322
|
-
uint256 balance = store.balanceOf(address(terminal), projectC, JBConstants.NATIVE_TOKEN);
|
|
323
|
-
if (balance == 0) return;
|
|
324
|
-
|
|
325
|
-
uint256 amount = bound(seed, 1, balance);
|
|
326
|
-
|
|
327
|
-
vm.prank(projectOwner);
|
|
328
|
-
try terminal.sendPayoutsOf({
|
|
329
|
-
projectId: projectC,
|
|
330
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
331
|
-
amount: amount,
|
|
332
|
-
currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
333
|
-
minTokensPaidOut: 0
|
|
334
|
-
}) returns (
|
|
335
|
-
uint256 amountPaidOut
|
|
336
|
-
) {
|
|
337
|
-
ghost_totalPaidOutC += amountPaidOut;
|
|
338
|
-
callCount_sendPayoutsC++;
|
|
339
|
-
} catch {}
|
|
340
|
-
_trackFeeProjectBalance();
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
function addToBalanceA(uint256 seed) external {
|
|
344
|
-
uint256 amount = bound(seed, 0.001 ether, 1 ether);
|
|
345
|
-
address actor = _getActor(seed);
|
|
346
|
-
vm.deal(actor, amount);
|
|
347
|
-
|
|
348
|
-
vm.prank(actor);
|
|
349
|
-
try terminal.addToBalanceOf{value: amount}(projectA, JBConstants.NATIVE_TOKEN, amount, false, "", "") {
|
|
350
|
-
ghost_totalAddedToBalanceA += amount;
|
|
351
|
-
callCount_addToBalanceA++;
|
|
352
|
-
} catch {}
|
|
353
|
-
_trackFeeProjectBalance();
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
function sendReservedTokensA(uint256 seed) external {
|
|
357
|
-
seed; // unused but needed for handler interface
|
|
358
|
-
vm.prank(projectOwner);
|
|
359
|
-
try controller.sendReservedTokensToSplitsOf(projectA) {
|
|
360
|
-
callCount_sendReservedA++;
|
|
361
|
-
} catch {}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
function sendReservedTokensC(uint256 seed) external {
|
|
365
|
-
seed;
|
|
366
|
-
vm.prank(projectOwner);
|
|
367
|
-
try controller.sendReservedTokensToSplitsOf(projectC) {
|
|
368
|
-
callCount_sendReservedC++;
|
|
369
|
-
} catch {}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
function advanceTime(uint256 seed) external {
|
|
373
|
-
uint256 delta = bound(seed, 1 hours, 30 days);
|
|
374
|
-
vm.warp(block.timestamp + delta);
|
|
375
|
-
callCount_advanceTime++;
|
|
376
|
-
}
|
|
377
|
-
}
|