@bananapus/core-v6 0.0.36 → 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 +26 -5
- package/src/JBMultiTerminal.sol +85 -47
- 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/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,157 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {StdStorage, stdStorage} from "forge-std/StdStorage.sol";
|
|
5
|
-
import {JBController} from "../../../../src/JBController.sol";
|
|
6
|
-
import {IJBMigratable} from "../../../../src/interfaces/IJBMigratable.sol";
|
|
7
|
-
import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
|
|
8
|
-
import {IJBRulesets} from "../../../../src/interfaces/IJBRulesets.sol";
|
|
9
|
-
import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
|
|
10
|
-
import {JBRulesetMetadataResolver} from "../../../../src/libraries/JBRulesetMetadataResolver.sol";
|
|
11
|
-
import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
|
|
12
|
-
import {JBRulesetMetadata} from "../../../../src/structs/JBRulesetMetadata.sol";
|
|
13
|
-
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
|
|
14
|
-
import {JBControllerSetup} from "./JBControllerSetup.sol";
|
|
15
|
-
|
|
16
|
-
contract TestMigrateController_Local is JBControllerSetup {
|
|
17
|
-
using stdStorage for StdStorage;
|
|
18
|
-
|
|
19
|
-
function setUp() public {
|
|
20
|
-
super.controllerSetup();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
modifier whenCallerHasPermission() {
|
|
24
|
-
// mock ownerOf call
|
|
25
|
-
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
26
|
-
bytes memory _ownerData = abi.encode(address(this));
|
|
27
|
-
|
|
28
|
-
mockExpect(address(projects), _ownerOfCall, _ownerData);
|
|
29
|
-
_;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
modifier migrationIsAllowedByRuleset() {
|
|
33
|
-
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
34
|
-
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
|
|
35
|
-
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
|
|
36
|
-
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
37
|
-
pausePay: false,
|
|
38
|
-
pauseCreditTransfers: false,
|
|
39
|
-
allowOwnerMinting: false,
|
|
40
|
-
allowSetCustomToken: false,
|
|
41
|
-
allowTerminalMigration: false,
|
|
42
|
-
allowSetTerminals: false,
|
|
43
|
-
ownerMustSendPayouts: false,
|
|
44
|
-
allowSetController: true,
|
|
45
|
-
allowAddAccountingContext: true,
|
|
46
|
-
allowAddPriceFeed: false,
|
|
47
|
-
holdFees: false,
|
|
48
|
-
useTotalSurplusForCashOuts: true,
|
|
49
|
-
useDataHookForPay: false,
|
|
50
|
-
useDataHookForCashOut: false,
|
|
51
|
-
dataHook: address(0),
|
|
52
|
-
metadata: 0
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
56
|
-
|
|
57
|
-
// setup: return data
|
|
58
|
-
JBRuleset memory data = JBRuleset({
|
|
59
|
-
cycleNumber: 1,
|
|
60
|
-
id: uint48(block.timestamp),
|
|
61
|
-
basedOnId: 0,
|
|
62
|
-
start: uint48(block.timestamp),
|
|
63
|
-
duration: 0,
|
|
64
|
-
weight: 0,
|
|
65
|
-
weightCutPercent: 0,
|
|
66
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
67
|
-
metadata: _packedMetadata
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// mock currentOf call
|
|
71
|
-
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (1));
|
|
72
|
-
bytes memory _returned = abi.encode(data);
|
|
73
|
-
|
|
74
|
-
mockExpect(address(rulesets), _currentOfCall, _returned);
|
|
75
|
-
_;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
modifier migrationIsNotAllowedByRuleset() {
|
|
79
|
-
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
80
|
-
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
|
|
81
|
-
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
|
|
82
|
-
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
83
|
-
pausePay: false,
|
|
84
|
-
pauseCreditTransfers: false,
|
|
85
|
-
allowOwnerMinting: false,
|
|
86
|
-
allowSetCustomToken: false,
|
|
87
|
-
allowTerminalMigration: false,
|
|
88
|
-
allowSetTerminals: false,
|
|
89
|
-
ownerMustSendPayouts: false,
|
|
90
|
-
allowSetController: true,
|
|
91
|
-
allowAddAccountingContext: true,
|
|
92
|
-
allowAddPriceFeed: false,
|
|
93
|
-
holdFees: false,
|
|
94
|
-
useTotalSurplusForCashOuts: true,
|
|
95
|
-
useDataHookForPay: false,
|
|
96
|
-
useDataHookForCashOut: false,
|
|
97
|
-
dataHook: address(0),
|
|
98
|
-
metadata: 0
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
102
|
-
|
|
103
|
-
// setup: return data
|
|
104
|
-
JBRuleset memory data = JBRuleset({
|
|
105
|
-
cycleNumber: 1,
|
|
106
|
-
id: uint48(block.timestamp),
|
|
107
|
-
basedOnId: 0,
|
|
108
|
-
start: uint48(block.timestamp),
|
|
109
|
-
duration: 0,
|
|
110
|
-
weight: 0,
|
|
111
|
-
weightCutPercent: 0,
|
|
112
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
113
|
-
metadata: _packedMetadata
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
// mock currentOf call
|
|
117
|
-
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (1));
|
|
118
|
-
bytes memory _returned = abi.encode(data);
|
|
119
|
-
|
|
120
|
-
mockExpect(address(rulesets), _currentOfCall, _returned);
|
|
121
|
-
_;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function test_Revert_When_Caller_Is_Not_Directory() external {
|
|
125
|
-
// it should revert
|
|
126
|
-
|
|
127
|
-
vm.expectRevert(
|
|
128
|
-
abi.encodeWithSelector(
|
|
129
|
-
JBController.JBController_OnlyDirectory.selector, address(this), _controller.DIRECTORY()
|
|
130
|
-
)
|
|
131
|
-
);
|
|
132
|
-
IJBMigratable(address(_controller)).migrate(1, IJBMigratable(address(this)));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function test_Revert_When_GivenReservedTokenBalanceIsPending() external {
|
|
136
|
-
// it should send reserved tokens to splits
|
|
137
|
-
// set storage since we can't mock internal calls
|
|
138
|
-
stdstore.target(address(IJBMigratable(address(_controller)))).sig("pendingReservedTokenBalanceOf(uint256)")
|
|
139
|
-
.with_key(uint256(1)).checked_write(uint256(100));
|
|
140
|
-
|
|
141
|
-
vm.prank(address(directory));
|
|
142
|
-
|
|
143
|
-
// Revert as expected, this functionality is no longer allowed since `JBController4_1`,
|
|
144
|
-
// Pending is send out as part of `beforeReceiveMigrationFrom`.
|
|
145
|
-
vm.expectRevert(abi.encodeWithSelector(JBController.JBController_PendingReservedTokens.selector, 100));
|
|
146
|
-
IJBMigratable(address(_controller)).migrate(1, IJBMigratable(address(this)));
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function test_GivenNoReservedTokenBalanceIsPending() external {
|
|
150
|
-
// event as expected
|
|
151
|
-
vm.expectEmit();
|
|
152
|
-
emit IJBMigratable.Migrate(1, IJBMigratable(address(this)), address(directory));
|
|
153
|
-
|
|
154
|
-
vm.prank(address(directory));
|
|
155
|
-
IJBMigratable(address(_controller)).migrate(1, IJBMigratable(address(this)));
|
|
156
|
-
}
|
|
157
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {JBController} from "../../../../src/JBController.sol";
|
|
5
|
-
import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
|
|
6
|
-
import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
|
|
7
|
-
import {IJBRulesets} from "../../../../src/interfaces/IJBRulesets.sol";
|
|
8
|
-
import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
|
|
9
|
-
import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
|
|
10
|
-
import {JBRulesetMetadataResolver} from "../../../../src/libraries/JBRulesetMetadataResolver.sol";
|
|
11
|
-
import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
|
|
12
|
-
import {JBRulesetMetadata} from "../../../../src/structs/JBRulesetMetadata.sol";
|
|
13
|
-
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
|
|
14
|
-
import {JBControllerSetup} from "./JBControllerSetup.sol";
|
|
15
|
-
|
|
16
|
-
contract TestMintTokensOfUnits_Local is JBControllerSetup {
|
|
17
|
-
uint256 _projectId = 1;
|
|
18
|
-
|
|
19
|
-
function setUp() public {
|
|
20
|
-
super.controllerSetup();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function test_WhenNoRulesetIsActive() external {
|
|
24
|
-
// it should be able to mint
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function test_MintNotAllowedSenderNotHookTerminalNorRulesetAllowsMint() external {
|
|
28
|
-
// mock call to JBProjects ownerOf which will give permission
|
|
29
|
-
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
30
|
-
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
31
|
-
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
32
|
-
|
|
33
|
-
// setup: return data
|
|
34
|
-
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
35
|
-
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2, //50%
|
|
36
|
-
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2, //50%
|
|
37
|
-
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
38
|
-
pausePay: false,
|
|
39
|
-
pauseCreditTransfers: false,
|
|
40
|
-
allowOwnerMinting: false,
|
|
41
|
-
allowSetCustomToken: false,
|
|
42
|
-
allowTerminalMigration: false,
|
|
43
|
-
allowSetTerminals: false,
|
|
44
|
-
ownerMustSendPayouts: false,
|
|
45
|
-
allowSetController: false,
|
|
46
|
-
allowAddAccountingContext: true,
|
|
47
|
-
allowAddPriceFeed: false,
|
|
48
|
-
holdFees: false,
|
|
49
|
-
useTotalSurplusForCashOuts: true,
|
|
50
|
-
useDataHookForPay: false,
|
|
51
|
-
useDataHookForCashOut: false,
|
|
52
|
-
dataHook: address(0),
|
|
53
|
-
metadata: 0
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
57
|
-
|
|
58
|
-
JBRuleset memory data = JBRuleset({
|
|
59
|
-
cycleNumber: 1,
|
|
60
|
-
id: uint48(block.timestamp),
|
|
61
|
-
basedOnId: 0,
|
|
62
|
-
start: uint48(block.timestamp),
|
|
63
|
-
duration: 8000,
|
|
64
|
-
weight: 5000,
|
|
65
|
-
weightCutPercent: 0,
|
|
66
|
-
approvalHook: IJBRulesetApprovalHook(address(0x1234567890123456789012345678901234567890)),
|
|
67
|
-
metadata: _packedMetadata
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// mock call to rulesets
|
|
71
|
-
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(data));
|
|
72
|
-
|
|
73
|
-
// mock call to isTerminalOf
|
|
74
|
-
mockExpect(
|
|
75
|
-
address(directory),
|
|
76
|
-
abi.encodeCall(IJBDirectory.isTerminalOf, (_projectId, IJBTerminal(address(this)))),
|
|
77
|
-
abi.encode(false)
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
vm.expectRevert(
|
|
81
|
-
abi.encodeWithSelector(JBController.JBController_MintNotAllowedAndNotTerminalOrHook.selector, address(this))
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
_controller.mintTokensOf({
|
|
85
|
-
projectId: _projectId, tokenCount: 1, beneficiary: address(this), memo: "", useReservedPercent: true
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function test_RevertWhen_MintingIsDisabledInTheFundingCycleRuleset() external {
|
|
90
|
-
// it should revert
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
modifier whenMintingIsEnabledInTheFundingCycleRuleset() {
|
|
94
|
-
_;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function test_GivenThatThereAreTokensAvailableToMint() external whenMintingIsEnabledInTheFundingCycleRuleset {
|
|
98
|
-
// it should be possible to mint
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function test_GivenThatADataSourceIsConfigured() external whenMintingIsEnabledInTheFundingCycleRuleset {
|
|
102
|
-
// it should be able to mint
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function test_GivenThatADataSourceHasPermissionedAnotherContractToMint()
|
|
106
|
-
external
|
|
107
|
-
whenMintingIsEnabledInTheFundingCycleRuleset
|
|
108
|
-
{
|
|
109
|
-
// it should be able to mint
|
|
110
|
-
}
|
|
111
|
-
}
|
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {JBController} from "../../../../src/JBController.sol";
|
|
5
|
-
import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
|
|
6
|
-
import {IJBController} from "../../../../src/interfaces/IJBController.sol";
|
|
7
|
-
import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
|
|
8
|
-
import {IJBFundAccessLimits} from "../../../../src/interfaces/IJBFundAccessLimits.sol";
|
|
9
|
-
import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
|
|
10
|
-
import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
|
|
11
|
-
import {IJBRulesets} from "../../../../src/interfaces/IJBRulesets.sol";
|
|
12
|
-
import {IJBPrices} from "../../../../src/interfaces/IJBPrices.sol";
|
|
13
|
-
import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
|
|
14
|
-
import {IJBSplits} from "../../../../src/interfaces/IJBSplits.sol";
|
|
15
|
-
import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
|
|
16
|
-
import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
|
|
17
|
-
import {JBRulesetMetadataResolver} from "../../../../src/libraries/JBRulesetMetadataResolver.sol";
|
|
18
|
-
import {JBCurrencyAmount} from "../../../../src/structs/JBCurrencyAmount.sol";
|
|
19
|
-
import {JBFundAccessLimitGroup} from "../../../../src/structs/JBFundAccessLimitGroup.sol";
|
|
20
|
-
import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
|
|
21
|
-
import {JBRulesetConfig} from "../../../../src/structs/JBRulesetConfig.sol";
|
|
22
|
-
import {JBRulesetMetadata} from "../../../../src/structs/JBRulesetMetadata.sol";
|
|
23
|
-
import {JBSplitGroup} from "../../../../src/structs/JBSplitGroup.sol";
|
|
24
|
-
import {JBTerminalConfig} from "../../../../src/structs/JBTerminalConfig.sol";
|
|
25
|
-
import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
|
|
26
|
-
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
|
|
27
|
-
import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
|
|
28
|
-
import {JBTest} from "../../../helpers/JBTest.sol";
|
|
29
|
-
|
|
30
|
-
/// @notice Tests the OMNICHAIN_RULESET_OPERATOR trust boundary — verifying the operator can bypass
|
|
31
|
-
/// LAUNCH_RULESETS, SET_TERMINALS, and QUEUE_RULESETS permission checks via alsoGrantAccessIf.
|
|
32
|
-
contract TestOmnichainRulesetOperator_Local is JBTest {
|
|
33
|
-
IJBController public _controller;
|
|
34
|
-
|
|
35
|
-
// Mocks
|
|
36
|
-
IJBPermissions public permissions = IJBPermissions(makeAddr("permissions"));
|
|
37
|
-
IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
|
|
38
|
-
IJBRulesets public rulesets = IJBRulesets(makeAddr("rulesets"));
|
|
39
|
-
IJBSplits public splits = IJBSplits(makeAddr("splits"));
|
|
40
|
-
IJBFundAccessLimits public fundAccessLimits = IJBFundAccessLimits(makeAddr("limits"));
|
|
41
|
-
|
|
42
|
-
// Use makeAddr for projects so we can mock ERC721 calls
|
|
43
|
-
address public projectsAddr = makeAddr("projects");
|
|
44
|
-
|
|
45
|
-
address public operator = makeAddr("omnichainOperator");
|
|
46
|
-
address public projectOwner = makeAddr("projectOwner");
|
|
47
|
-
address public randomCaller = makeAddr("randomCaller");
|
|
48
|
-
uint256 public projectId = 1;
|
|
49
|
-
|
|
50
|
-
function setUp() public {
|
|
51
|
-
// Deploy controller with a non-zero OMNICHAIN_RULESET_OPERATOR
|
|
52
|
-
_controller = new JBController(
|
|
53
|
-
directory,
|
|
54
|
-
fundAccessLimits,
|
|
55
|
-
permissions,
|
|
56
|
-
IJBPrices(makeAddr("prices")),
|
|
57
|
-
IJBProjects(projectsAddr),
|
|
58
|
-
rulesets,
|
|
59
|
-
splits,
|
|
60
|
-
IJBTokens(makeAddr("tokens")),
|
|
61
|
-
operator,
|
|
62
|
-
makeAddr("forwarder")
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// ── Helpers
|
|
67
|
-
// ──────────────────────────────────────────────────────────
|
|
68
|
-
|
|
69
|
-
function _genRulesetConfig() internal pure returns (JBTerminalConfig[] memory, JBRulesetConfig[] memory) {
|
|
70
|
-
JBTerminalConfig[] memory terminalConfigs = new JBTerminalConfig[](0);
|
|
71
|
-
JBRulesetConfig[] memory rulesetConfigs = new JBRulesetConfig[](1);
|
|
72
|
-
|
|
73
|
-
JBRulesetMetadata memory metadata = JBRulesetMetadata({
|
|
74
|
-
reservedPercent: 0,
|
|
75
|
-
cashOutTaxRate: 0,
|
|
76
|
-
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
77
|
-
pausePay: false,
|
|
78
|
-
pauseCreditTransfers: false,
|
|
79
|
-
allowOwnerMinting: false,
|
|
80
|
-
allowSetCustomToken: false,
|
|
81
|
-
allowTerminalMigration: false,
|
|
82
|
-
allowSetTerminals: false,
|
|
83
|
-
ownerMustSendPayouts: false,
|
|
84
|
-
allowSetController: false,
|
|
85
|
-
allowAddAccountingContext: true,
|
|
86
|
-
allowAddPriceFeed: false,
|
|
87
|
-
holdFees: false,
|
|
88
|
-
useTotalSurplusForCashOuts: false,
|
|
89
|
-
useDataHookForPay: false,
|
|
90
|
-
useDataHookForCashOut: false,
|
|
91
|
-
dataHook: address(0),
|
|
92
|
-
metadata: 0
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
JBFundAccessLimitGroup[] memory limitGroups = new JBFundAccessLimitGroup[](1);
|
|
96
|
-
JBCurrencyAmount[] memory payoutLimits = new JBCurrencyAmount[](1);
|
|
97
|
-
payoutLimits[0] = JBCurrencyAmount({amount: 0, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
|
|
98
|
-
JBCurrencyAmount[] memory surplusAllowances = new JBCurrencyAmount[](1);
|
|
99
|
-
surplusAllowances[0] = JBCurrencyAmount({amount: 0, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
|
|
100
|
-
limitGroups[0] = JBFundAccessLimitGroup({
|
|
101
|
-
terminal: address(0),
|
|
102
|
-
token: JBConstants.NATIVE_TOKEN,
|
|
103
|
-
payoutLimits: payoutLimits,
|
|
104
|
-
surplusAllowances: surplusAllowances
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
rulesetConfigs[0].mustStartAtOrAfter = 0;
|
|
108
|
-
rulesetConfigs[0].duration = 0;
|
|
109
|
-
rulesetConfigs[0].weight = 0;
|
|
110
|
-
rulesetConfigs[0].weightCutPercent = 0;
|
|
111
|
-
rulesetConfigs[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
112
|
-
rulesetConfigs[0].metadata = metadata;
|
|
113
|
-
rulesetConfigs[0].splitGroups = new JBSplitGroup[](0);
|
|
114
|
-
rulesetConfigs[0].fundAccessLimitGroups = limitGroups;
|
|
115
|
-
|
|
116
|
-
return (terminalConfigs, rulesetConfigs);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/// @dev Mock the full call chain for a successful launchRulesetsFor.
|
|
120
|
-
function _mockLaunchSuccess(JBRulesetConfig[] memory rulesetConfigs) internal {
|
|
121
|
-
uint48 ts = uint48(block.timestamp);
|
|
122
|
-
|
|
123
|
-
// ownerOf
|
|
124
|
-
vm.mockCall(projectsAddr, abi.encodeCall(IERC721.ownerOf, (projectId)), abi.encode(projectOwner));
|
|
125
|
-
|
|
126
|
-
// No existing rulesets
|
|
127
|
-
vm.mockCall(address(rulesets), abi.encodeCall(IJBRulesets.latestRulesetIdOf, (projectId)), abi.encode(0));
|
|
128
|
-
|
|
129
|
-
// setControllerOf
|
|
130
|
-
vm.mockCall(
|
|
131
|
-
address(directory),
|
|
132
|
-
abi.encodeCall(IJBDirectory.setControllerOf, (projectId, IERC165(address(_controller)))),
|
|
133
|
-
""
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
// queueFor
|
|
137
|
-
JBRuleset memory ruleset = JBRuleset({
|
|
138
|
-
cycleNumber: 1,
|
|
139
|
-
id: ts,
|
|
140
|
-
basedOnId: 0,
|
|
141
|
-
start: ts,
|
|
142
|
-
duration: 0,
|
|
143
|
-
weight: 0,
|
|
144
|
-
weightCutPercent: 0,
|
|
145
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
146
|
-
metadata: 0
|
|
147
|
-
});
|
|
148
|
-
vm.mockCall(
|
|
149
|
-
address(rulesets),
|
|
150
|
-
abi.encodeCall(
|
|
151
|
-
IJBRulesets.queueFor,
|
|
152
|
-
(
|
|
153
|
-
projectId,
|
|
154
|
-
0,
|
|
155
|
-
0,
|
|
156
|
-
0,
|
|
157
|
-
rulesetConfigs[0].approvalHook,
|
|
158
|
-
JBRulesetMetadataResolver.packRulesetMetadata(rulesetConfigs[0].metadata),
|
|
159
|
-
0
|
|
160
|
-
)
|
|
161
|
-
),
|
|
162
|
-
abi.encode(ruleset)
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
// setSplitGroupsOf
|
|
166
|
-
vm.mockCall(
|
|
167
|
-
address(splits),
|
|
168
|
-
abi.encodeCall(IJBSplits.setSplitGroupsOf, (projectId, ts, rulesetConfigs[0].splitGroups)),
|
|
169
|
-
""
|
|
170
|
-
);
|
|
171
|
-
|
|
172
|
-
// setFundAccessLimitsFor
|
|
173
|
-
vm.mockCall(
|
|
174
|
-
address(fundAccessLimits),
|
|
175
|
-
abi.encodeCall(
|
|
176
|
-
IJBFundAccessLimits.setFundAccessLimitsFor, (projectId, ts, rulesetConfigs[0].fundAccessLimitGroups)
|
|
177
|
-
),
|
|
178
|
-
""
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/// @dev Mock the full call chain for a successful queueRulesetsOf.
|
|
183
|
-
function _mockQueueSuccess(JBRulesetConfig[] memory rulesetConfigs) internal {
|
|
184
|
-
uint48 ts = uint48(block.timestamp);
|
|
185
|
-
|
|
186
|
-
// ownerOf
|
|
187
|
-
vm.mockCall(projectsAddr, abi.encodeCall(IERC721.ownerOf, (projectId)), abi.encode(projectOwner));
|
|
188
|
-
|
|
189
|
-
// queueFor
|
|
190
|
-
JBRuleset memory ruleset = JBRuleset({
|
|
191
|
-
cycleNumber: 2,
|
|
192
|
-
id: ts,
|
|
193
|
-
basedOnId: 1,
|
|
194
|
-
start: ts,
|
|
195
|
-
duration: 0,
|
|
196
|
-
weight: 0,
|
|
197
|
-
weightCutPercent: 0,
|
|
198
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
199
|
-
metadata: 0
|
|
200
|
-
});
|
|
201
|
-
vm.mockCall(
|
|
202
|
-
address(rulesets),
|
|
203
|
-
abi.encodeCall(
|
|
204
|
-
IJBRulesets.queueFor,
|
|
205
|
-
(
|
|
206
|
-
projectId,
|
|
207
|
-
0,
|
|
208
|
-
0,
|
|
209
|
-
0,
|
|
210
|
-
rulesetConfigs[0].approvalHook,
|
|
211
|
-
JBRulesetMetadataResolver.packRulesetMetadata(rulesetConfigs[0].metadata),
|
|
212
|
-
0
|
|
213
|
-
)
|
|
214
|
-
),
|
|
215
|
-
abi.encode(ruleset)
|
|
216
|
-
);
|
|
217
|
-
|
|
218
|
-
// setSplitGroupsOf
|
|
219
|
-
vm.mockCall(
|
|
220
|
-
address(splits),
|
|
221
|
-
abi.encodeCall(IJBSplits.setSplitGroupsOf, (projectId, ts, rulesetConfigs[0].splitGroups)),
|
|
222
|
-
""
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
// setFundAccessLimitsFor
|
|
226
|
-
vm.mockCall(
|
|
227
|
-
address(fundAccessLimits),
|
|
228
|
-
abi.encodeCall(
|
|
229
|
-
IJBFundAccessLimits.setFundAccessLimitsFor, (projectId, ts, rulesetConfigs[0].fundAccessLimitGroups)
|
|
230
|
-
),
|
|
231
|
-
""
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// ── Tests
|
|
236
|
-
// ────────────────────────────────────────────────────────────
|
|
237
|
-
|
|
238
|
-
function test_operatorCanLaunchRulesetsWithoutPermission() external {
|
|
239
|
-
(JBTerminalConfig[] memory terminalConfigs, JBRulesetConfig[] memory rulesetConfigs) = _genRulesetConfig();
|
|
240
|
-
_mockLaunchSuccess(rulesetConfigs);
|
|
241
|
-
|
|
242
|
-
// Operator calls launchRulesetsFor without owning the project or having any permission grants.
|
|
243
|
-
// The alsoGrantAccessIf bypass should allow this.
|
|
244
|
-
vm.prank(operator);
|
|
245
|
-
_controller.launchRulesetsFor(projectId, rulesetConfigs, terminalConfigs, "");
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
function test_operatorCanQueueRulesetsWithoutPermission() external {
|
|
249
|
-
(, JBRulesetConfig[] memory rulesetConfigs) = _genRulesetConfig();
|
|
250
|
-
_mockQueueSuccess(rulesetConfigs);
|
|
251
|
-
|
|
252
|
-
// Operator calls queueRulesetsOf without owning the project or having any permission grants.
|
|
253
|
-
vm.prank(operator);
|
|
254
|
-
_controller.queueRulesetsOf(projectId, rulesetConfigs, "");
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
function test_nonOperatorCannotBypassPermissions() external {
|
|
258
|
-
(JBTerminalConfig[] memory terminalConfigs, JBRulesetConfig[] memory rulesetConfigs) = _genRulesetConfig();
|
|
259
|
-
|
|
260
|
-
// Mock ownerOf — randomCaller is not the owner
|
|
261
|
-
vm.mockCall(projectsAddr, abi.encodeCall(IERC721.ownerOf, (projectId)), abi.encode(projectOwner));
|
|
262
|
-
|
|
263
|
-
// Mock permission check — randomCaller has no permissions
|
|
264
|
-
vm.mockCall(
|
|
265
|
-
address(permissions),
|
|
266
|
-
abi.encodeCall(
|
|
267
|
-
IJBPermissions.hasPermission,
|
|
268
|
-
(randomCaller, projectOwner, projectId, JBPermissionIds.LAUNCH_RULESETS, true, true)
|
|
269
|
-
),
|
|
270
|
-
abi.encode(false)
|
|
271
|
-
);
|
|
272
|
-
|
|
273
|
-
// Should revert for launchRulesetsFor
|
|
274
|
-
vm.prank(randomCaller);
|
|
275
|
-
vm.expectRevert(
|
|
276
|
-
abi.encodeWithSelector(
|
|
277
|
-
JBPermissioned.JBPermissioned_Unauthorized.selector,
|
|
278
|
-
projectOwner,
|
|
279
|
-
randomCaller,
|
|
280
|
-
projectId,
|
|
281
|
-
JBPermissionIds.LAUNCH_RULESETS
|
|
282
|
-
)
|
|
283
|
-
);
|
|
284
|
-
_controller.launchRulesetsFor(projectId, rulesetConfigs, terminalConfigs, "");
|
|
285
|
-
|
|
286
|
-
// Mock permission check for QUEUE_RULESETS — randomCaller has no permissions
|
|
287
|
-
vm.mockCall(
|
|
288
|
-
address(permissions),
|
|
289
|
-
abi.encodeCall(
|
|
290
|
-
IJBPermissions.hasPermission,
|
|
291
|
-
(randomCaller, projectOwner, projectId, JBPermissionIds.QUEUE_RULESETS, true, true)
|
|
292
|
-
),
|
|
293
|
-
abi.encode(false)
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
// Should revert for queueRulesetsOf
|
|
297
|
-
vm.prank(randomCaller);
|
|
298
|
-
vm.expectRevert(
|
|
299
|
-
abi.encodeWithSelector(
|
|
300
|
-
JBPermissioned.JBPermissioned_Unauthorized.selector,
|
|
301
|
-
projectOwner,
|
|
302
|
-
randomCaller,
|
|
303
|
-
projectId,
|
|
304
|
-
JBPermissionIds.QUEUE_RULESETS
|
|
305
|
-
)
|
|
306
|
-
);
|
|
307
|
-
_controller.queueRulesetsOf(projectId, rulesetConfigs, "");
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
function test_operatorCannotLaunchIfRulesetsExist() external {
|
|
311
|
-
(JBTerminalConfig[] memory terminalConfigs, JBRulesetConfig[] memory rulesetConfigs) = _genRulesetConfig();
|
|
312
|
-
|
|
313
|
-
// Mock ownerOf
|
|
314
|
-
vm.mockCall(projectsAddr, abi.encodeCall(IERC721.ownerOf, (projectId)), abi.encode(projectOwner));
|
|
315
|
-
|
|
316
|
-
// Project already has rulesets
|
|
317
|
-
vm.mockCall(address(rulesets), abi.encodeCall(IJBRulesets.latestRulesetIdOf, (projectId)), abi.encode(1));
|
|
318
|
-
|
|
319
|
-
// Even the operator cannot launch if rulesets already exist
|
|
320
|
-
vm.prank(operator);
|
|
321
|
-
vm.expectRevert(abi.encodeWithSelector(JBController.JBController_RulesetsAlreadyLaunched.selector, projectId));
|
|
322
|
-
_controller.launchRulesetsFor(projectId, rulesetConfigs, terminalConfigs, "");
|
|
323
|
-
}
|
|
324
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {JBController} from "../../../../src/JBController.sol";
|
|
5
|
-
import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
|
|
6
|
-
import {IJBToken} from "../../../../src/interfaces/IJBToken.sol";
|
|
7
|
-
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
8
|
-
import {JBControllerSetup} from "./JBControllerSetup.sol";
|
|
9
|
-
|
|
10
|
-
contract TestExecutePayReservedTokenToTerminal_Local is JBControllerSetup {
|
|
11
|
-
uint256 _projectId = 1;
|
|
12
|
-
uint256 _defaultAmount = 1e18;
|
|
13
|
-
IJBTerminal _terminal = IJBTerminal(makeAddr("someTerminal"));
|
|
14
|
-
IJBToken _token = IJBToken(makeAddr("someToken"));
|
|
15
|
-
address _bene = makeAddr("beneficiary");
|
|
16
|
-
|
|
17
|
-
function setUp() public {
|
|
18
|
-
super.controllerSetup();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function test_WhenCallerIsNotItself() external {
|
|
22
|
-
// it will revert
|
|
23
|
-
vm.expectRevert();
|
|
24
|
-
JBController(address(_controller))
|
|
25
|
-
.executePayReservedTokenToTerminal(_terminal, _projectId, _token, _defaultAmount, _bene, "");
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
modifier whenCallerIsItself() {
|
|
29
|
-
// put code at token address for OZ Address check
|
|
30
|
-
vm.etch(address(_token), abi.encode(1));
|
|
31
|
-
|
|
32
|
-
vm.prank(address(_controller));
|
|
33
|
-
_;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function test_GivenAllowanceEQZeroAfterPay() external whenCallerIsItself {
|
|
37
|
-
// it will not revert
|
|
38
|
-
|
|
39
|
-
// mock pay call to some terminal
|
|
40
|
-
mockExpect(
|
|
41
|
-
address(_terminal),
|
|
42
|
-
abi.encodeCall(IJBTerminal.pay, (_projectId, address(_token), _defaultAmount, _bene, 0, "", "")),
|
|
43
|
-
abi.encode(0)
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
// mock the allowance assertion
|
|
47
|
-
mockExpect(
|
|
48
|
-
address(_token), abi.encodeCall(IERC20.allowance, (address(_controller), address(_terminal))), abi.encode(0)
|
|
49
|
-
);
|
|
50
|
-
|
|
51
|
-
JBController(address(_controller))
|
|
52
|
-
.executePayReservedTokenToTerminal(_terminal, _projectId, _token, _defaultAmount, _bene, "");
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function test_GivenAllowanceDNEQZeroAfterPay() external whenCallerIsItself {
|
|
56
|
-
// it will revert
|
|
57
|
-
|
|
58
|
-
// mock pay call to some terminal
|
|
59
|
-
mockExpect(
|
|
60
|
-
address(_terminal),
|
|
61
|
-
abi.encodeCall(IJBTerminal.pay, (_projectId, address(_token), _defaultAmount, _bene, 0, "", "")),
|
|
62
|
-
abi.encode(0)
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
// mock the allowance assertion
|
|
66
|
-
mockExpect(
|
|
67
|
-
address(_token), abi.encodeCall(IERC20.allowance, (address(_controller), address(_terminal))), abi.encode(1)
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
vm.expectRevert();
|
|
71
|
-
JBController(address(_controller))
|
|
72
|
-
.executePayReservedTokenToTerminal(_terminal, _projectId, _token, _defaultAmount, _bene, "");
|
|
73
|
-
}
|
|
74
|
-
}
|