@bananapus/core-v6 0.0.37 → 0.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/foundry.lock +1 -7
- package/foundry.toml +1 -1
- package/package.json +19 -7
- package/src/JBChainlinkV3PriceFeed.sol +4 -1
- package/src/JBChainlinkV3SequencerPriceFeed.sol +4 -2
- package/src/JBController.sol +71 -44
- package/src/JBDeadline.sol +4 -4
- package/src/JBDirectory.sol +34 -32
- package/src/JBERC20.sol +5 -4
- package/src/JBFeelessAddresses.sol +6 -3
- package/src/JBFundAccessLimits.sol +25 -21
- package/src/JBMultiTerminal.sol +121 -84
- package/src/JBPermissions.sol +34 -37
- package/src/JBPrices.sol +23 -18
- package/src/JBProjects.sol +6 -3
- package/src/JBRulesets.sol +44 -41
- package/src/JBSplits.sol +18 -16
- package/src/JBTerminalStore.sol +32 -25
- package/src/JBTokens.sol +36 -26
- package/src/abstract/JBControlled.sol +3 -1
- package/src/abstract/JBPermissioned.sol +3 -1
- package/src/enums/JBApprovalStatus.sol +7 -1
- package/src/interfaces/IJBController.sol +7 -3
- package/src/interfaces/IJBDirectory.sol +3 -1
- package/src/interfaces/IJBMultiTerminal.sol +3 -2
- package/src/interfaces/IJBPermissions.sol +2 -1
- package/src/interfaces/IJBPrices.sol +3 -1
- package/src/interfaces/IJBRulesets.sol +2 -1
- package/src/interfaces/IJBSplits.sol +2 -1
- package/src/interfaces/IJBTerminal.sol +3 -1
- package/src/interfaces/IJBTerminalStore.sol +3 -1
- package/src/interfaces/IJBTokens.sol +2 -1
- package/src/libraries/JBCashOuts.sol +6 -1
- package/src/libraries/JBConstants.sol +12 -3
- package/src/libraries/JBCurrencyIds.sol +2 -0
- package/src/libraries/JBFees.sol +52 -10
- package/src/libraries/JBFixedPointNumber.sol +2 -0
- package/src/libraries/JBPayoutSplitGroupLib.sol +7 -4
- package/src/libraries/JBRulesetMetadataResolver.sol +4 -0
- package/src/libraries/JBSplitGroupIds.sol +2 -1
- package/src/libraries/JBSurplus.sol +3 -1
- package/src/periphery/JBMatchingPriceFeed.sol +3 -1
- package/src/structs/JBAccountingContext.sol +7 -4
- package/src/structs/JBFundAccessLimitGroup.sol +10 -17
- package/src/structs/JBRuleset.sol +18 -26
- package/src/structs/JBRulesetConfig.sol +13 -25
- package/src/structs/JBRulesetMetadata.sol +25 -32
- package/test/mock/MockMaliciousBeneficiary.sol +15 -15
- package/ADMINISTRATION.md +0 -103
- package/ARCHITECTURE.md +0 -133
- package/AUDIT_INSTRUCTIONS.md +0 -139
- package/RISKS.md +0 -215
- package/SKILLS.md +0 -55
- package/STYLE_GUIDE.md +0 -610
- package/USER_JOURNEYS.md +0 -215
- package/script/Deploy.s.sol +0 -124
- package/script/DeployPeriphery.s.sol +0 -354
- package/slither-ci.config.json +0 -10
- package/test/AuditFixes.t.sol +0 -808
- package/test/ComprehensiveInvariant.t.sol +0 -306
- package/test/CoreExploitTests.t.sol +0 -2741
- package/test/EconomicSimulation.t.sol +0 -348
- package/test/EntryPointPermutations.t.sol +0 -684
- package/test/FlashLoanAttacks.t.sol +0 -797
- package/test/PermissionEscalation.t.sol +0 -711
- package/test/PermissionsInvariant.t.sol +0 -403
- package/test/RulesetTransitions.t.sol +0 -713
- package/test/SplitLoopTests.t.sol +0 -752
- package/test/TestAccessToFunds.sol +0 -2683
- package/test/TestAuditResponseDesignProofs.sol +0 -434
- package/test/TestCashOut.sol +0 -198
- package/test/TestCashOutCountFor.sol +0 -271
- package/test/TestCashOutHooks.sol +0 -351
- package/test/TestCashOutTimingEdge.sol +0 -241
- package/test/TestDataHookFuzzing.sol +0 -524
- package/test/TestDurationUnderflow.sol +0 -233
- package/test/TestFeeFreeCashOutBypass.sol +0 -949
- package/test/TestFeeProcessingFailure.sol +0 -218
- package/test/TestFees.sol +0 -619
- package/test/TestForwardedTokenConsumption.sol +0 -425
- package/test/TestInterfaceSupport.sol +0 -81
- package/test/TestJBERC20Inheritance.sol +0 -103
- package/test/TestL2SequencerPriceFeed.sol +0 -292
- package/test/TestLaunchProject.sol +0 -188
- package/test/TestMetaTx.sol +0 -217
- package/test/TestMetadataOffsetOverflow.sol +0 -179
- package/test/TestMetadataParserLib.sol +0 -471
- package/test/TestMigrationHeldFees.sol +0 -255
- package/test/TestMintTokensOf.sol +0 -185
- package/test/TestMultiTerminalSurplus.sol +0 -348
- package/test/TestMultiTokenSurplus.sol +0 -202
- package/test/TestMultipleAccessLimits.sol +0 -664
- package/test/TestPayBurnRedeemFlow.sol +0 -195
- package/test/TestPayHooks.sol +0 -209
- package/test/TestPermissions.sol +0 -324
- package/test/TestPermissionsEdge.sol +0 -290
- package/test/TestPermit2DataHook.t.sol +0 -360
- package/test/TestPermit2Terminal.sol +0 -372
- package/test/TestRulesetQueueing.sol +0 -1025
- package/test/TestRulesetQueuingStress.sol +0 -806
- package/test/TestRulesetWeightCaching.sol +0 -178
- package/test/TestSplits.sol +0 -391
- package/test/TestTerminalMigration.sol +0 -274
- package/test/TestTerminalPreviewParity.sol +0 -208
- package/test/TestTokenFlow.sol +0 -191
- package/test/TestWeightCacheStaleAfterRejection.sol +0 -303
- package/test/WeirdTokenTests.t.sol +0 -817
- package/test/audit/CashOutReenterPay.t.sol +0 -501
- package/test/audit/CodexHeldFeeRounding.t.sol +0 -159
- package/test/audit/CodexMigrationFeeFailure.t.sol +0 -163
- package/test/audit/CrossTerminalSurplusSpoof.t.sol +0 -140
- package/test/audit/CycledSurplusAllowanceReset.t.sol +0 -184
- package/test/audit/FeeFreeSurplusLifecycle.t.sol +0 -399
- package/test/audit/FeeFreeSurplusStale.t.sol +0 -248
- package/test/audit/USDTVoidReturnCompat.t.sol +0 -525
- package/test/fork/TestChainlinkPriceFeedFork.sol +0 -254
- package/test/fork/TestSequencerPriceFeedFork.sol +0 -168
- package/test/fork/TestTerminalPreviewParityFork.sol +0 -108
- package/test/formal/BondingCurveProperties.t.sol +0 -420
- package/test/formal/FeeProperties.t.sol +0 -252
- package/test/invariants/Phase3DeepInvariant.t.sol +0 -412
- package/test/invariants/RulesetsInvariant.t.sol +0 -125
- package/test/invariants/TerminalStoreInvariant.t.sol +0 -227
- package/test/invariants/TokensInvariant.t.sol +0 -195
- package/test/invariants/handlers/ComprehensiveHandler.sol +0 -303
- package/test/invariants/handlers/EconomicHandler.sol +0 -377
- package/test/invariants/handlers/Phase3Handler.sol +0 -443
- package/test/invariants/handlers/RulesetsHandler.sol +0 -115
- package/test/invariants/handlers/TerminalStoreHandler.sol +0 -151
- package/test/invariants/handlers/TokensHandler.sol +0 -126
- package/test/regression/HoldFeesCashOutReserved.t.sol +0 -415
- package/test/regression/WeightCacheBoundary.t.sol +0 -291
- package/test/trees/JBController/burnTokensOf.tree +0 -9
- package/test/trees/JBController/claimTokensFor.tree +0 -5
- package/test/trees/JBController/deployERC20For.tree +0 -5
- package/test/trees/JBController/getRulesetOf.tree +0 -5
- package/test/trees/JBController/launchProjectFor.tree +0 -12
- package/test/trees/JBController/launchRulesetsFor.tree +0 -8
- package/test/trees/JBController/migrateController.tree +0 -12
- package/test/trees/JBController/mintTokensOf.tree +0 -12
- package/test/trees/JBController/payReservedTokenToTerminal.tree +0 -8
- package/test/trees/JBController/receiveMigrationFrom.tree +0 -4
- package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +0 -12
- package/test/trees/JBController/setMetadataOf.tree +0 -5
- package/test/trees/JBController/setSplitGroupsOf.tree +0 -5
- package/test/trees/JBController/setTokenFor.tree +0 -5
- package/test/trees/JBController/transferCreditsFrom.tree +0 -8
- package/test/trees/JBDirectory/primaryTerminalOf.tree +0 -8
- package/test/trees/JBDirectory/setControllerOf.tree +0 -11
- package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +0 -15
- package/test/trees/JBDirectory/setTerminalsOf.tree +0 -11
- package/test/trees/JBERC20/initialize.tree +0 -7
- package/test/trees/JBERC20/name.tree +0 -5
- package/test/trees/JBERC20/nonces.tree +0 -5
- package/test/trees/JBERC20/symbol.tree +0 -5
- package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +0 -5
- package/test/trees/JBFeelessAddresses/supportsInterface.tree +0 -5
- package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +0 -5
- package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +0 -8
- package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +0 -18
- package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +0 -5
- package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +0 -8
- package/test/trees/JBMetadataResolver/getDataFor.tree +0 -8
- package/test/trees/JBMultiTerminal/accountingContextsOf.tree +0 -5
- package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +0 -10
- package/test/trees/JBMultiTerminal/addToBalanceOf.tree +0 -23
- package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +0 -23
- package/test/trees/JBMultiTerminal/executePayout.tree +0 -32
- package/test/trees/JBMultiTerminal/executeProcessFee.tree +0 -14
- package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +0 -12
- package/test/trees/JBMultiTerminal/pay.tree +0 -23
- package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +0 -8
- package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +0 -34
- package/test/trees/JBMultiTerminal/useAllowanceOf.tree +0 -16
- package/test/trees/JBPermissions/hasPermission.tree +0 -8
- package/test/trees/JBPermissions/hasPermissions.tree +0 -8
- package/test/trees/JBPermissions/setPermissionsFor.tree +0 -5
- package/test/trees/JBPrices/addPriceFeedFor.tree +0 -14
- package/test/trees/JBPrices/pricePerUnitOf.tree +0 -11
- package/test/trees/JBProjects/createFor.tree +0 -11
- package/test/trees/JBProjects/setTokenUriResolver.tree +0 -5
- package/test/trees/JBProjects/supportsInterface.tree +0 -9
- package/test/trees/JBProjects/tokenURI.tree +0 -5
- package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +0 -8
- package/test/trees/JBRulesets/currentOf.tree +0 -12
- package/test/trees/JBRulesets/getRulesetOf.tree +0 -5
- package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +0 -10
- package/test/trees/JBRulesets/rulesetsOf.tree +0 -11
- package/test/trees/JBRulesets/upcomingRulesetOf.tree +0 -20
- package/test/trees/JBRulesets/updateRulesetWeightCache.tree +0 -5
- package/test/trees/JBSplits/setSplitGroupsOf.tree +0 -17
- package/test/trees/JBSplits/splitsOf.tree +0 -5
- package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +0 -16
- package/test/trees/JBTerminalStore/currentSurplusOf.tree +0 -25
- package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +0 -5
- package/test/trees/JBTerminalStore/recordCashOutsFor.tree +0 -16
- package/test/trees/JBTerminalStore/recordPaymentFrom.tree +0 -14
- package/test/trees/JBTerminalStore/recordPayoutFor.tree +0 -10
- package/test/trees/JBTerminalStore/recordTerminalMigration.tree +0 -5
- package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +0 -10
- package/test/trees/JBTokens/burnFrom.tree +0 -10
- package/test/trees/JBTokens/claimTokensFor.tree +0 -10
- package/test/trees/JBTokens/deployERC20For.tree +0 -12
- package/test/trees/JBTokens/mintFor.tree +0 -10
- package/test/trees/JBTokens/setTokenFor.tree +0 -11
- package/test/trees/JBTokens/totalBalanceOf.tree +0 -5
- package/test/trees/JBTokens/totalSupplyOf.tree +0 -5
- package/test/trees/JBTokens/transferCreditsFrom.tree +0 -8
- package/test/trees/mintTokensOf.tree +0 -12
- package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +0 -223
- package/test/units/static/JBController/JBControllerSetup.sol +0 -50
- package/test/units/static/JBController/TestBurnTokensOf.sol +0 -114
- package/test/units/static/JBController/TestClaimTokensFor.sol +0 -63
- package/test/units/static/JBController/TestDeployErc20For.sol +0 -86
- package/test/units/static/JBController/TestLaunchProjectFor.sol +0 -302
- package/test/units/static/JBController/TestLaunchRulesetsFor.sol +0 -342
- package/test/units/static/JBController/TestMigrateController.sol +0 -157
- package/test/units/static/JBController/TestMintTokensOfUnits.sol +0 -111
- package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +0 -324
- package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +0 -74
- package/test/units/static/JBController/TestPreviewMintOf.sol +0 -117
- package/test/units/static/JBController/TestReceiveMigrationFrom.sol +0 -99
- package/test/units/static/JBController/TestRulesetViews.sol +0 -225
- package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +0 -615
- package/test/units/static/JBController/TestSetSplitGroupsOf.sol +0 -68
- package/test/units/static/JBController/TestSetTokenFor.sol +0 -239
- package/test/units/static/JBController/TestSetUriOf.sol +0 -57
- package/test/units/static/JBController/TestTransferCreditsFrom.sol +0 -169
- package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +0 -211
- package/test/units/static/JBDirectory/JBDirectorySetup.sol +0 -26
- package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +0 -126
- package/test/units/static/JBDirectory/TestSetControllerOf.sol +0 -183
- package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +0 -104
- package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +0 -179
- package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +0 -137
- package/test/units/static/JBERC20/JBERC20Setup.sol +0 -34
- package/test/units/static/JBERC20/SigUtils.sol +0 -36
- package/test/units/static/JBERC20/TestInitialize.sol +0 -60
- package/test/units/static/JBERC20/TestName.sol +0 -30
- package/test/units/static/JBERC20/TestNonces.sol +0 -62
- package/test/units/static/JBERC20/TestSymbol.sol +0 -31
- package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +0 -22
- package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +0 -30
- package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +0 -35
- package/test/units/static/JBFees/TestFeesFuzz.sol +0 -79
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +0 -16
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +0 -71
- package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +0 -24
- package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +0 -163
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +0 -59
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +0 -101
- package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +0 -189
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +0 -64
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +0 -102
- package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +0 -90
- package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +0 -247
- package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +0 -229
- package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +0 -50
- package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +0 -72
- package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +0 -289
- package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +0 -474
- package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +0 -624
- package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +0 -578
- package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +0 -202
- package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +0 -222
- package/test/units/static/JBMultiTerminal/TestPay.sol +0 -604
- package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +0 -117
- package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +0 -114
- package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +0 -228
- package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +0 -55
- package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +0 -257
- package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +0 -611
- package/test/units/static/JBPermissions/JBPermissionsSetup.sol +0 -20
- package/test/units/static/JBPermissions/TestHasPermission.sol +0 -50
- package/test/units/static/JBPermissions/TestHasPermissions.sol +0 -93
- package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +0 -64
- package/test/units/static/JBPrices/JBPricesSetup.sol +0 -32
- package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +0 -107
- package/test/units/static/JBPrices/TestPricePerUnitOf.sol +0 -132
- package/test/units/static/JBPrices/TestPrices.sol +0 -265
- package/test/units/static/JBProjects/JBProjectsSetup.sol +0 -22
- package/test/units/static/JBProjects/TestCreateFor.sol +0 -71
- package/test/units/static/JBProjects/TestInitialProject.sol +0 -21
- package/test/units/static/JBProjects/TestInterfaces.sol +0 -26
- package/test/units/static/JBProjects/TestSetResolver.sol +0 -37
- package/test/units/static/JBProjects/TestTokenUri.sol +0 -40
- package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +0 -108
- package/test/units/static/JBRulesets/JBRulesetsSetup.sol +0 -24
- package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +0 -265
- package/test/units/static/JBRulesets/TestCurrentOf.sol +0 -242
- package/test/units/static/JBRulesets/TestGetRulesetOf.sol +0 -100
- package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +0 -260
- package/test/units/static/JBRulesets/TestRulesets.sol +0 -632
- package/test/units/static/JBRulesets/TestRulesetsOf.sol +0 -37
- package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +0 -522
- package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +0 -96
- package/test/units/static/JBSplits/JBSplitsSetup.sol +0 -26
- package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +0 -552
- package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +0 -377
- package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +0 -267
- package/test/units/static/JBSplits/TestSplitsOf.sol +0 -24
- package/test/units/static/JBSplits/TestSplitsPacking.sol +0 -36
- package/test/units/static/JBSurplus/TestSurplusFuzz.sol +0 -160
- package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +0 -45
- package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +0 -536
- package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +0 -463
- package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +0 -135
- package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +0 -476
- package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +0 -494
- package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +0 -652
- package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +0 -744
- package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +0 -289
- package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +0 -138
- package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +0 -415
- package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +0 -219
- package/test/units/static/JBTokens/JBTokensSetup.sol +0 -32
- package/test/units/static/JBTokens/TestBurnFrom.sol +0 -107
- package/test/units/static/JBTokens/TestClaimTokensFor.sol +0 -110
- package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +0 -92
- package/test/units/static/JBTokens/TestMintFor.sol +0 -100
- package/test/units/static/JBTokens/TestSetTokenFor.sol +0 -98
- package/test/units/static/JBTokens/TestTotalBalanceOf.sol +0 -65
- package/test/units/static/JBTokens/TestTotalSupplyOf.sol +0 -56
- package/test/units/static/JBTokens/TestTransferCreditsFrom.sol +0 -56
|
@@ -1,604 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {MockERC20} from "../../../mock/MockERC20.sol";
|
|
5
|
-
import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
|
|
6
|
-
import {IJBController} from "../../../../src/interfaces/IJBController.sol";
|
|
7
|
-
import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
|
|
8
|
-
import {IJBPayHook} from "../../../../src/interfaces/IJBPayHook.sol";
|
|
9
|
-
import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
|
|
10
|
-
import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
|
|
11
|
-
import {IJBTerminalStore} from "../../../../src/interfaces/IJBTerminalStore.sol";
|
|
12
|
-
import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
|
|
13
|
-
import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
|
|
14
|
-
import {JBAccountingContext} from "../../../../src/structs/JBAccountingContext.sol";
|
|
15
|
-
import {JBAfterPayRecordedContext} from "../../../../src/structs/JBAfterPayRecordedContext.sol";
|
|
16
|
-
import {JBPayHookSpecification} from "../../../../src/structs/JBPayHookSpecification.sol";
|
|
17
|
-
import {JBRuleset} from "../../../../src/structs/JBRuleset.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 TestPay_Local is JBMultiTerminalSetup {
|
|
24
|
-
uint64 _projectId = 1;
|
|
25
|
-
uint256 _defaultAmount = 1e18;
|
|
26
|
-
address _bene = makeAddr("beneficiary");
|
|
27
|
-
address _native = JBConstants.NATIVE_TOKEN;
|
|
28
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
29
|
-
uint32 _nativeCurrency = uint32(uint160(_native));
|
|
30
|
-
address _usdc = makeAddr("USDC");
|
|
31
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
32
|
-
uint32 _usdcCurrency = uint32(uint160(_usdc));
|
|
33
|
-
|
|
34
|
-
address _mockController = makeAddr("mc");
|
|
35
|
-
IJBPayHook _mockHook = IJBPayHook(makeAddr("hook"));
|
|
36
|
-
|
|
37
|
-
// mock erc20 necessary for balance checks
|
|
38
|
-
MockERC20 _mockToken;
|
|
39
|
-
uint256 _mockTokenCurrency;
|
|
40
|
-
|
|
41
|
-
function setUp() public {
|
|
42
|
-
super.multiTerminalSetup();
|
|
43
|
-
|
|
44
|
-
_mockToken = new MockERC20("testToken", "TT");
|
|
45
|
-
_mockTokenCurrency = uint32(uint160(address(_mockToken)));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
modifier whenNativeTokenIsAccepted() {
|
|
49
|
-
// mock call to JBProjects ownerOf
|
|
50
|
-
mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(0)));
|
|
51
|
-
|
|
52
|
-
// mock call to JBDirectory controllerOf
|
|
53
|
-
mockExpect(
|
|
54
|
-
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
|
|
58
|
-
_tokens[0] = JBAccountingContext({
|
|
59
|
-
token: JBConstants.NATIVE_TOKEN, decimals: 18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
// Mock recordAccountingContextOf in the store (validation now happens there)
|
|
63
|
-
mockExpect(
|
|
64
|
-
address(store), abi.encodeCall(IJBTerminalStore.recordAccountingContextOf, (_projectId, _tokens)), ""
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
_terminal.addAccountingContextsFor(_projectId, _tokens);
|
|
68
|
-
|
|
69
|
-
// Mock accountingContextOf for subsequent reads
|
|
70
|
-
mockExpect(
|
|
71
|
-
address(store),
|
|
72
|
-
abi.encodeCall(
|
|
73
|
-
IJBTerminalStore.accountingContextOf, (address(_terminal), _projectId, JBConstants.NATIVE_TOKEN)
|
|
74
|
-
),
|
|
75
|
-
abi.encode(_tokens[0])
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
_;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
modifier whenERC20IsAccepted() {
|
|
82
|
-
// mock call to JBProjects ownerOf
|
|
83
|
-
mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(0)));
|
|
84
|
-
|
|
85
|
-
// mock call to JBDirectory controllerOf
|
|
86
|
-
mockExpect(
|
|
87
|
-
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
|
|
91
|
-
_tokens[0] = JBAccountingContext({
|
|
92
|
-
token: address(_mockToken), decimals: 6, currency: uint32(uint160(address(_mockToken)))
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
// Mock recordAccountingContextOf in the store (validation now happens there)
|
|
96
|
-
mockExpect(
|
|
97
|
-
address(store), abi.encodeCall(IJBTerminalStore.recordAccountingContextOf, (_projectId, _tokens)), ""
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
_terminal.addAccountingContextsFor(_projectId, _tokens);
|
|
101
|
-
|
|
102
|
-
// Mock accountingContextOf for subsequent reads
|
|
103
|
-
mockExpect(
|
|
104
|
-
address(store),
|
|
105
|
-
abi.encodeCall(IJBTerminalStore.accountingContextOf, (address(_terminal), _projectId, address(_mockToken))),
|
|
106
|
-
abi.encode(_tokens[0])
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
_;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function test_WhenTokensReturnedLTMinReturnedTokens() external whenNativeTokenIsAccepted {
|
|
113
|
-
// it will revert UNDER_MIN_RETURNED_TOKENS
|
|
114
|
-
|
|
115
|
-
// needed for next mock call returns
|
|
116
|
-
JBTokenAmount memory tokenAmount =
|
|
117
|
-
JBTokenAmount({token: _native, decimals: 18, currency: uint32(_nativeCurrency), value: _defaultAmount});
|
|
118
|
-
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](0);
|
|
119
|
-
JBRuleset memory returnedRuleset = JBRuleset({
|
|
120
|
-
cycleNumber: 1,
|
|
121
|
-
id: 1,
|
|
122
|
-
basedOnId: 0,
|
|
123
|
-
start: 0,
|
|
124
|
-
duration: 0,
|
|
125
|
-
weight: 0,
|
|
126
|
-
weightCutPercent: 0,
|
|
127
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
128
|
-
metadata: 0
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
// mock call to JBTerminalStore recordPaymentFrom
|
|
132
|
-
mockExpect(
|
|
133
|
-
address(store),
|
|
134
|
-
abi.encodeCall(
|
|
135
|
-
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
136
|
-
),
|
|
137
|
-
abi.encode(returnedRuleset, 0, hookSpecifications)
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
mockExpect(address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), abi.encode(0));
|
|
141
|
-
|
|
142
|
-
vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_UnderMin.selector, 0, 1));
|
|
143
|
-
_terminal.pay{value: 1e18}({
|
|
144
|
-
projectId: _projectId,
|
|
145
|
-
token: _native,
|
|
146
|
-
amount: _defaultAmount,
|
|
147
|
-
beneficiary: _bene,
|
|
148
|
-
minReturnedTokens: 1,
|
|
149
|
-
memo: "",
|
|
150
|
-
metadata: ""
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function test_WhenTerminalStoreReturnsTokenCountGTZeroAndHappypath() external whenNativeTokenIsAccepted {
|
|
155
|
-
// it will mint tokens and emit Pay
|
|
156
|
-
|
|
157
|
-
// needed for next mock call returns
|
|
158
|
-
JBTokenAmount memory tokenAmount =
|
|
159
|
-
JBTokenAmount({token: _native, decimals: 18, currency: uint32(_nativeCurrency), value: _defaultAmount});
|
|
160
|
-
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](0);
|
|
161
|
-
JBRuleset memory returnedRuleset = JBRuleset({
|
|
162
|
-
cycleNumber: 1,
|
|
163
|
-
id: 1,
|
|
164
|
-
basedOnId: 0,
|
|
165
|
-
start: 0,
|
|
166
|
-
duration: 0,
|
|
167
|
-
weight: 0,
|
|
168
|
-
weightCutPercent: 0,
|
|
169
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
170
|
-
metadata: 0
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
uint256 _mintAmount = 1e9;
|
|
174
|
-
|
|
175
|
-
// mock call to JBTerminalStore recordPaymentFrom
|
|
176
|
-
mockExpect(
|
|
177
|
-
address(store),
|
|
178
|
-
abi.encodeCall(
|
|
179
|
-
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
180
|
-
),
|
|
181
|
-
abi.encode(returnedRuleset, _mintAmount, hookSpecifications)
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
// mock call to controller (this contract per modifier mock call) mintTokensOf
|
|
185
|
-
mockExpect(
|
|
186
|
-
address(this),
|
|
187
|
-
abi.encodeCall(IJBController.mintTokensOf, (_projectId, _mintAmount, _bene, "", true)),
|
|
188
|
-
abi.encode(_mintAmount)
|
|
189
|
-
);
|
|
190
|
-
|
|
191
|
-
// Data for subsequent calls made for balance checks
|
|
192
|
-
bytes[] memory subsequentReturns = new bytes[](2);
|
|
193
|
-
subsequentReturns[0] = abi.encode(0);
|
|
194
|
-
subsequentReturns[1] = abi.encode(_mintAmount);
|
|
195
|
-
|
|
196
|
-
// Mock subsequent calls made for balance checks
|
|
197
|
-
mockExpectSubsequent(
|
|
198
|
-
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
199
|
-
);
|
|
200
|
-
|
|
201
|
-
vm.expectEmit();
|
|
202
|
-
emit IJBTerminal.Pay(
|
|
203
|
-
returnedRuleset.id,
|
|
204
|
-
returnedRuleset.cycleNumber,
|
|
205
|
-
_projectId,
|
|
206
|
-
address(this),
|
|
207
|
-
_bene,
|
|
208
|
-
_defaultAmount,
|
|
209
|
-
_mintAmount,
|
|
210
|
-
"",
|
|
211
|
-
bytes(""),
|
|
212
|
-
address(this)
|
|
213
|
-
);
|
|
214
|
-
_terminal.pay{value: 1e18}({
|
|
215
|
-
projectId: _projectId,
|
|
216
|
-
token: _native,
|
|
217
|
-
amount: _defaultAmount,
|
|
218
|
-
beneficiary: _bene,
|
|
219
|
-
minReturnedTokens: 0,
|
|
220
|
-
memo: "",
|
|
221
|
-
metadata: ""
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
modifier whenAPayHookIsConfiguredAndHappypath() {
|
|
226
|
-
_;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
function test_GivenThePaidTokenIsAnERC20AndPayHookIsConfigured() external whenERC20IsAccepted {
|
|
230
|
-
// it will increase allowance to the hook and emit HookAfterRecordPay and Pay
|
|
231
|
-
|
|
232
|
-
// mint mocked erc20 tokens to this contract
|
|
233
|
-
_mockToken.mint(address(this), _defaultAmount);
|
|
234
|
-
|
|
235
|
-
// approve those tokens to the terminal
|
|
236
|
-
_mockToken.approve(address(_terminal), _defaultAmount);
|
|
237
|
-
|
|
238
|
-
uint256 _mintAmount = 1e9;
|
|
239
|
-
|
|
240
|
-
// set an approval to the pay hook as the terminal
|
|
241
|
-
vm.prank(address(_terminal));
|
|
242
|
-
_mockToken.approve(address(_mockHook), _defaultAmount);
|
|
243
|
-
|
|
244
|
-
// needed for next mock call returns
|
|
245
|
-
JBTokenAmount memory tokenAmount = JBTokenAmount({
|
|
246
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
247
|
-
token: address(_mockToken),
|
|
248
|
-
decimals: 6,
|
|
249
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
250
|
-
currency: uint32(_mockTokenCurrency),
|
|
251
|
-
value: _defaultAmount
|
|
252
|
-
});
|
|
253
|
-
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](1);
|
|
254
|
-
hookSpecifications[0] =
|
|
255
|
-
JBPayHookSpecification({hook: _mockHook, noop: false, amount: _defaultAmount, metadata: ""});
|
|
256
|
-
|
|
257
|
-
JBRuleset memory returnedRuleset = JBRuleset({
|
|
258
|
-
cycleNumber: 1,
|
|
259
|
-
id: 1,
|
|
260
|
-
basedOnId: 0,
|
|
261
|
-
start: 0,
|
|
262
|
-
duration: 0,
|
|
263
|
-
weight: 0,
|
|
264
|
-
weightCutPercent: 0,
|
|
265
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
266
|
-
metadata: 0
|
|
267
|
-
});
|
|
268
|
-
|
|
269
|
-
// mock call to JBTerminalStore recordPaymentFrom
|
|
270
|
-
mockExpect(
|
|
271
|
-
address(store),
|
|
272
|
-
abi.encodeCall(
|
|
273
|
-
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
274
|
-
),
|
|
275
|
-
abi.encode(returnedRuleset, _mintAmount, hookSpecifications)
|
|
276
|
-
);
|
|
277
|
-
|
|
278
|
-
// mock call to controller (this contract per modifier mock call) mintTokensOf
|
|
279
|
-
mockExpect(
|
|
280
|
-
address(this),
|
|
281
|
-
abi.encodeCall(IJBController.mintTokensOf, (_projectId, _mintAmount, _bene, "", true)),
|
|
282
|
-
abi.encode(_mintAmount)
|
|
283
|
-
);
|
|
284
|
-
|
|
285
|
-
// Needed for hook call
|
|
286
|
-
JBAfterPayRecordedContext memory context = JBAfterPayRecordedContext({
|
|
287
|
-
payer: address(this),
|
|
288
|
-
projectId: _projectId,
|
|
289
|
-
rulesetId: returnedRuleset.id,
|
|
290
|
-
amount: tokenAmount,
|
|
291
|
-
forwardedAmount: tokenAmount,
|
|
292
|
-
weight: returnedRuleset.weight,
|
|
293
|
-
newlyIssuedTokenCount: _mintAmount,
|
|
294
|
-
beneficiary: _bene,
|
|
295
|
-
hookMetadata: bytes(""),
|
|
296
|
-
payerMetadata: bytes("")
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
// mock call to hook
|
|
300
|
-
mockExpect(address(_mockHook), abi.encodeCall(IJBPayHook.afterPayRecordedWith, (context)), "");
|
|
301
|
-
|
|
302
|
-
// Mock the temporary allowance as fully consumed by the hook so the cleanup guard passes.
|
|
303
|
-
vm.mockCall(
|
|
304
|
-
address(_mockToken),
|
|
305
|
-
abi.encodeCall(IERC20.allowance, (address(_terminal), address(_mockHook))),
|
|
306
|
-
abi.encode(0)
|
|
307
|
-
);
|
|
308
|
-
|
|
309
|
-
// Data for subsequent calls made for balance checks
|
|
310
|
-
bytes[] memory subsequentReturns = new bytes[](2);
|
|
311
|
-
subsequentReturns[0] = abi.encode(0);
|
|
312
|
-
subsequentReturns[1] = abi.encode(_mintAmount);
|
|
313
|
-
|
|
314
|
-
// Mock subsequent calls made for balance checks
|
|
315
|
-
mockExpectSubsequent(
|
|
316
|
-
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
317
|
-
);
|
|
318
|
-
|
|
319
|
-
_terminal.pay({
|
|
320
|
-
projectId: _projectId,
|
|
321
|
-
token: address(_mockToken),
|
|
322
|
-
amount: _defaultAmount,
|
|
323
|
-
beneficiary: _bene,
|
|
324
|
-
minReturnedTokens: _mintAmount,
|
|
325
|
-
memo: "",
|
|
326
|
-
metadata: ""
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function test_GivenThePaidTokenIsNativeAndPayHookIsConfigured() external whenNativeTokenIsAccepted {
|
|
331
|
-
// it will send ETH to the hook and emit HookAfterRecordPay and Pay
|
|
332
|
-
|
|
333
|
-
// needed for next mock call returns
|
|
334
|
-
JBTokenAmount memory tokenAmount =
|
|
335
|
-
JBTokenAmount({token: _native, decimals: 18, currency: uint32(_nativeCurrency), value: _defaultAmount});
|
|
336
|
-
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](1);
|
|
337
|
-
hookSpecifications[0] =
|
|
338
|
-
JBPayHookSpecification({hook: _mockHook, noop: false, amount: _defaultAmount, metadata: ""});
|
|
339
|
-
|
|
340
|
-
JBRuleset memory returnedRuleset = JBRuleset({
|
|
341
|
-
cycleNumber: 1,
|
|
342
|
-
id: 1,
|
|
343
|
-
basedOnId: 0,
|
|
344
|
-
start: 0,
|
|
345
|
-
duration: 0,
|
|
346
|
-
weight: 0,
|
|
347
|
-
weightCutPercent: 0,
|
|
348
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
349
|
-
metadata: 0
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
uint256 _mintAmount = 1e9;
|
|
353
|
-
|
|
354
|
-
// mock call to JBTerminalStore recordPaymentFrom
|
|
355
|
-
mockExpect(
|
|
356
|
-
address(store),
|
|
357
|
-
abi.encodeCall(
|
|
358
|
-
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
359
|
-
),
|
|
360
|
-
abi.encode(returnedRuleset, _mintAmount, hookSpecifications)
|
|
361
|
-
);
|
|
362
|
-
|
|
363
|
-
// mock call to controller (this contract per modifier mock call) mintTokensOf
|
|
364
|
-
mockExpect(
|
|
365
|
-
address(this),
|
|
366
|
-
abi.encodeCall(IJBController.mintTokensOf, (_projectId, _mintAmount, _bene, "", true)),
|
|
367
|
-
abi.encode(_mintAmount)
|
|
368
|
-
);
|
|
369
|
-
|
|
370
|
-
// Needed for hook call
|
|
371
|
-
JBAfterPayRecordedContext memory context = JBAfterPayRecordedContext({
|
|
372
|
-
payer: address(this),
|
|
373
|
-
projectId: _projectId,
|
|
374
|
-
rulesetId: returnedRuleset.id,
|
|
375
|
-
amount: tokenAmount,
|
|
376
|
-
forwardedAmount: tokenAmount,
|
|
377
|
-
weight: returnedRuleset.weight,
|
|
378
|
-
newlyIssuedTokenCount: _mintAmount,
|
|
379
|
-
beneficiary: _bene,
|
|
380
|
-
hookMetadata: bytes(""),
|
|
381
|
-
payerMetadata: bytes("")
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
// mock call to hook (including msg.value)
|
|
385
|
-
mockExpect(address(_mockHook), abi.encodeCall(IJBPayHook.afterPayRecordedWith, (context)), "");
|
|
386
|
-
|
|
387
|
-
// Data for subsequent calls made for balance checks
|
|
388
|
-
bytes[] memory subsequentReturns = new bytes[](2);
|
|
389
|
-
subsequentReturns[0] = abi.encode(0);
|
|
390
|
-
subsequentReturns[1] = abi.encode(_mintAmount);
|
|
391
|
-
|
|
392
|
-
// Mock subsequent calls made for balance checks
|
|
393
|
-
mockExpectSubsequent(
|
|
394
|
-
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
395
|
-
);
|
|
396
|
-
|
|
397
|
-
vm.expectEmit();
|
|
398
|
-
emit IJBTerminal.Pay(
|
|
399
|
-
returnedRuleset.id,
|
|
400
|
-
returnedRuleset.cycleNumber,
|
|
401
|
-
_projectId,
|
|
402
|
-
address(this),
|
|
403
|
-
_bene,
|
|
404
|
-
_defaultAmount,
|
|
405
|
-
_mintAmount,
|
|
406
|
-
"",
|
|
407
|
-
bytes(""),
|
|
408
|
-
address(this)
|
|
409
|
-
);
|
|
410
|
-
|
|
411
|
-
vm.expectEmit();
|
|
412
|
-
emit IJBTerminal.HookAfterRecordPay(_mockHook, context, _defaultAmount, address(this));
|
|
413
|
-
|
|
414
|
-
_terminal.pay{value: 1e18}({
|
|
415
|
-
projectId: _projectId,
|
|
416
|
-
token: _native,
|
|
417
|
-
amount: _defaultAmount,
|
|
418
|
-
beneficiary: _bene,
|
|
419
|
-
minReturnedTokens: 0,
|
|
420
|
-
memo: "",
|
|
421
|
-
metadata: ""
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
function test_WhenTheProjectDNHAccountingContextForTheToken() external {
|
|
426
|
-
// it will revert TOKEN_NOT_ACCEPTED
|
|
427
|
-
|
|
428
|
-
// Mock totalBalanceOf (called before _acceptFundsFor)
|
|
429
|
-
mockExpect(address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), abi.encode(0));
|
|
430
|
-
|
|
431
|
-
// Mock accountingContextOf to return empty context (token not accepted)
|
|
432
|
-
mockExpect(
|
|
433
|
-
address(store),
|
|
434
|
-
abi.encodeCall(IJBTerminalStore.accountingContextOf, (address(_terminal), _projectId, _native)),
|
|
435
|
-
abi.encode(JBAccountingContext({token: address(0), decimals: 0, currency: 0}))
|
|
436
|
-
);
|
|
437
|
-
|
|
438
|
-
vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_TokenNotAccepted.selector, _native));
|
|
439
|
-
_terminal.pay{value: 1e18}({
|
|
440
|
-
projectId: _projectId,
|
|
441
|
-
token: _native,
|
|
442
|
-
amount: _defaultAmount,
|
|
443
|
-
beneficiary: _bene,
|
|
444
|
-
minReturnedTokens: 0,
|
|
445
|
-
memo: "",
|
|
446
|
-
metadata: ""
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/* function test_WhenTheTerminalsTokenEqNativeToken() external {
|
|
451
|
-
// it will use msg.value
|
|
452
|
-
// covered above
|
|
453
|
-
} */
|
|
454
|
-
|
|
455
|
-
function test_WhenTheTerminalsTokenEqNativeTokenAndMsgvalueEqZero() external {
|
|
456
|
-
// it will revert NO_MSG_VALUE_ALLOWED
|
|
457
|
-
|
|
458
|
-
// Mock totalBalanceOf (called before _acceptFundsFor)
|
|
459
|
-
mockExpect(address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), abi.encode(0));
|
|
460
|
-
|
|
461
|
-
// Mock accountingContextOf to return empty context (token not accepted)
|
|
462
|
-
mockExpect(
|
|
463
|
-
address(store),
|
|
464
|
-
abi.encodeCall(IJBTerminalStore.accountingContextOf, (address(_terminal), _projectId, _native)),
|
|
465
|
-
abi.encode(JBAccountingContext({token: address(0), decimals: 0, currency: 0}))
|
|
466
|
-
);
|
|
467
|
-
|
|
468
|
-
vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_TokenNotAccepted.selector, _native));
|
|
469
|
-
_terminal.pay{value: 0}({
|
|
470
|
-
projectId: _projectId,
|
|
471
|
-
token: _native,
|
|
472
|
-
amount: _defaultAmount,
|
|
473
|
-
beneficiary: _bene,
|
|
474
|
-
minReturnedTokens: 0,
|
|
475
|
-
memo: "",
|
|
476
|
-
metadata: ""
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
function test_WhenTheTerminalIsCallingItself() external whenNativeTokenIsAccepted {
|
|
481
|
-
// it will not transfer
|
|
482
|
-
|
|
483
|
-
// needed for next mock call returns
|
|
484
|
-
JBTokenAmount memory tokenAmount =
|
|
485
|
-
JBTokenAmount({token: _native, decimals: 18, currency: uint32(_nativeCurrency), value: _defaultAmount});
|
|
486
|
-
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](0);
|
|
487
|
-
|
|
488
|
-
JBRuleset memory returnedRuleset = JBRuleset({
|
|
489
|
-
cycleNumber: 1,
|
|
490
|
-
id: 1,
|
|
491
|
-
basedOnId: 0,
|
|
492
|
-
start: 0,
|
|
493
|
-
duration: 0,
|
|
494
|
-
weight: 0,
|
|
495
|
-
weightCutPercent: 0,
|
|
496
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
497
|
-
metadata: 0
|
|
498
|
-
});
|
|
499
|
-
|
|
500
|
-
// mock call to JBTerminalStore recordPaymentFrom
|
|
501
|
-
mockExpect(
|
|
502
|
-
address(store),
|
|
503
|
-
abi.encodeCall(
|
|
504
|
-
IJBTerminalStore.recordPaymentFrom, (address(_terminal), tokenAmount, _projectId, _bene, bytes(""))
|
|
505
|
-
),
|
|
506
|
-
abi.encode(returnedRuleset, 0, hookSpecifications)
|
|
507
|
-
);
|
|
508
|
-
|
|
509
|
-
// Data for subsequent calls made for balance checks
|
|
510
|
-
bytes[] memory subsequentReturns = new bytes[](2);
|
|
511
|
-
subsequentReturns[0] = abi.encode(0);
|
|
512
|
-
subsequentReturns[1] = abi.encode(0);
|
|
513
|
-
|
|
514
|
-
// Mock subsequent calls made for balance checks
|
|
515
|
-
mockExpectSubsequent(
|
|
516
|
-
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
517
|
-
);
|
|
518
|
-
|
|
519
|
-
vm.deal(address(_terminal), _defaultAmount);
|
|
520
|
-
vm.prank(address(_terminal));
|
|
521
|
-
_terminal.pay{value: _defaultAmount}({
|
|
522
|
-
projectId: _projectId,
|
|
523
|
-
token: _native,
|
|
524
|
-
amount: _defaultAmount,
|
|
525
|
-
beneficiary: _bene,
|
|
526
|
-
minReturnedTokens: 0,
|
|
527
|
-
memo: "",
|
|
528
|
-
metadata: ""
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
function test_GivenThePayHookSpecIsNoop() external whenNativeTokenIsAccepted {
|
|
533
|
-
JBTokenAmount memory tokenAmount =
|
|
534
|
-
JBTokenAmount({token: _native, decimals: 18, currency: uint32(_nativeCurrency), value: _defaultAmount});
|
|
535
|
-
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](1);
|
|
536
|
-
hookSpecifications[0] =
|
|
537
|
-
JBPayHookSpecification({hook: IJBPayHook(address(this)), noop: true, amount: 0, metadata: "info"});
|
|
538
|
-
|
|
539
|
-
JBRuleset memory returnedRuleset = JBRuleset({
|
|
540
|
-
cycleNumber: 1,
|
|
541
|
-
id: 1,
|
|
542
|
-
basedOnId: 0,
|
|
543
|
-
start: 0,
|
|
544
|
-
duration: 0,
|
|
545
|
-
weight: 0,
|
|
546
|
-
weightCutPercent: 0,
|
|
547
|
-
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
548
|
-
metadata: 0
|
|
549
|
-
});
|
|
550
|
-
|
|
551
|
-
mockExpect(
|
|
552
|
-
address(store),
|
|
553
|
-
abi.encodeCall(
|
|
554
|
-
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
555
|
-
),
|
|
556
|
-
abi.encode(returnedRuleset, 0, hookSpecifications)
|
|
557
|
-
);
|
|
558
|
-
|
|
559
|
-
bytes[] memory subsequentReturns = new bytes[](2);
|
|
560
|
-
subsequentReturns[0] = abi.encode(0);
|
|
561
|
-
subsequentReturns[1] = abi.encode(0);
|
|
562
|
-
|
|
563
|
-
mockExpectSubsequent(
|
|
564
|
-
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
565
|
-
);
|
|
566
|
-
|
|
567
|
-
vm.expectEmit();
|
|
568
|
-
emit IJBTerminal.Pay(
|
|
569
|
-
returnedRuleset.id,
|
|
570
|
-
returnedRuleset.cycleNumber,
|
|
571
|
-
_projectId,
|
|
572
|
-
address(this),
|
|
573
|
-
_bene,
|
|
574
|
-
_defaultAmount,
|
|
575
|
-
0,
|
|
576
|
-
"",
|
|
577
|
-
bytes(""),
|
|
578
|
-
address(this)
|
|
579
|
-
);
|
|
580
|
-
|
|
581
|
-
_terminal.pay{value: _defaultAmount}({
|
|
582
|
-
projectId: _projectId,
|
|
583
|
-
token: _native,
|
|
584
|
-
amount: _defaultAmount,
|
|
585
|
-
beneficiary: _bene,
|
|
586
|
-
minReturnedTokens: 0,
|
|
587
|
-
memo: "",
|
|
588
|
-
metadata: ""
|
|
589
|
-
});
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
// accept funds with permit2 has been extensively tested in other units
|
|
593
|
-
/* modifier whenPayMetadataContainsPermitData() {
|
|
594
|
-
_;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
function test_GivenThePermitAllowanceLtAmount() external whenPayMetadataContainsPermitData {
|
|
598
|
-
// it will revert PERMIT_ALLOWANCE_NOT_ENOUGH
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
function test_GivenPermitAllowanceIsGood() external whenPayMetadataContainsPermitData {
|
|
602
|
-
// it will set permit allowance to spend tokens for user via permit2
|
|
603
|
-
} */
|
|
604
|
-
}
|