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