@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,93 +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[] _permissionsArray = [256, 256];
|
|
12
|
-
|
|
13
|
-
function setUp() public {
|
|
14
|
-
super.permissionsSetup();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function test_WhenAnyPermissionIdGt255() external {
|
|
18
|
-
// it will revert with PERMISSION_ID_OUT_OF_BOUNDS
|
|
19
|
-
vm.expectRevert(abi.encodeWithSelector(JBPermissions.JBPermissions_PermissionIdOutOfBounds.selector, 256));
|
|
20
|
-
_permissions.hasPermissions(_op, _account, _projectId, _permissionsArray, true, true);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
modifier whenAllPermissionIdsLt255() {
|
|
24
|
-
_permissionsArray = [1, 2, 3];
|
|
25
|
-
_;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function test_GivenOperatorDoesNotHaveAllPermissionsSpecified() external whenAllPermissionIdsLt255 {
|
|
29
|
-
// it will return false
|
|
30
|
-
uint256 permissions = 1 << 1;
|
|
31
|
-
|
|
32
|
-
// Find the storage slot
|
|
33
|
-
bytes32 permissionsOfSlot = keccak256(abi.encode(_op, uint256(0)));
|
|
34
|
-
bytes32 accountSlot = keccak256(abi.encode(_account, uint256(permissionsOfSlot)));
|
|
35
|
-
bytes32 slot = keccak256(abi.encode(_projectId, accountSlot));
|
|
36
|
-
|
|
37
|
-
// Set storage
|
|
38
|
-
vm.store(address(_permissions), slot, bytes32(permissions));
|
|
39
|
-
|
|
40
|
-
bool hasAll = _permissions.hasPermissions(_op, _account, _projectId, _permissionsArray, false, true);
|
|
41
|
-
assertEq(hasAll, false);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function test_GivenOperatorHasAllPermissionsSpecified() external whenAllPermissionIdsLt255 {
|
|
45
|
-
// it will return true
|
|
46
|
-
uint256 permissions = 1 << 1;
|
|
47
|
-
permissions |= 1 << 2;
|
|
48
|
-
permissions |= 1 << 3;
|
|
49
|
-
|
|
50
|
-
// Find the storage slot
|
|
51
|
-
bytes32 permissionsOfSlot = keccak256(abi.encode(_op, uint256(0)));
|
|
52
|
-
bytes32 accountSlot = keccak256(abi.encode(_account, uint256(permissionsOfSlot)));
|
|
53
|
-
bytes32 slot = keccak256(abi.encode(_projectId, accountSlot));
|
|
54
|
-
|
|
55
|
-
// Set storage
|
|
56
|
-
vm.store(address(_permissions), slot, bytes32(permissions));
|
|
57
|
-
|
|
58
|
-
bool hasAll = _permissions.hasPermissions(_op, _account, _projectId, _permissionsArray, false, false);
|
|
59
|
-
assertEq(hasAll, true);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function test_GivenOperatorHasAllPermissionsSpecifiedCounterCase() external whenAllPermissionIdsLt255 {
|
|
63
|
-
// it will return false
|
|
64
|
-
uint256 permissions = 1 << 1;
|
|
65
|
-
permissions |= 1 << 5;
|
|
66
|
-
permissions |= 1 << 7;
|
|
67
|
-
|
|
68
|
-
// Find the storage slot
|
|
69
|
-
bytes32 permissionsOfSlot = keccak256(abi.encode(_op, uint256(0)));
|
|
70
|
-
bytes32 accountSlot = keccak256(abi.encode(_account, uint256(permissionsOfSlot)));
|
|
71
|
-
bytes32 slot = keccak256(abi.encode(_projectId, accountSlot));
|
|
72
|
-
|
|
73
|
-
// Set storage
|
|
74
|
-
vm.store(address(_permissions), slot, bytes32(permissions));
|
|
75
|
-
|
|
76
|
-
bool hasAll = _permissions.hasPermissions(_op, _account, _projectId, _permissionsArray, true, true);
|
|
77
|
-
bool hasAll2 = _permissions.hasPermissions(_op, _account, _projectId, _permissionsArray, false, false);
|
|
78
|
-
bool hasAll3 = _permissions.hasPermissions(_op, _account, _projectId, _permissionsArray, true, false);
|
|
79
|
-
bool hasAll4 = _permissions.hasPermissions(_op, _account, _projectId, _permissionsArray, false, true);
|
|
80
|
-
|
|
81
|
-
// True as it includes root
|
|
82
|
-
assertEq(hasAll, true);
|
|
83
|
-
|
|
84
|
-
// Does not include root
|
|
85
|
-
assertEq(hasAll2, false);
|
|
86
|
-
|
|
87
|
-
// True as it includes root
|
|
88
|
-
assertEq(hasAll3, true);
|
|
89
|
-
|
|
90
|
-
// Does not include root
|
|
91
|
-
assertEq(hasAll4, false);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {JBPermissions} from "../../../../src/JBPermissions.sol";
|
|
5
|
-
import {JBPermissionsData} from "../../../../src/structs/JBPermissionsData.sol";
|
|
6
|
-
import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
|
|
7
|
-
import {JBPermissionsSetup} from "./JBPermissionsSetup.sol";
|
|
8
|
-
|
|
9
|
-
contract TestSetPermissionsFor_Local is JBPermissionsSetup {
|
|
10
|
-
address _op = makeAddr("operator");
|
|
11
|
-
address _account = makeAddr("account");
|
|
12
|
-
uint64 _projectId = 1;
|
|
13
|
-
|
|
14
|
-
function setUp() public {
|
|
15
|
-
super.permissionsSetup();
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function test_WhenCallerDoesNotHavePermission() external {
|
|
19
|
-
// it will revert UNAUTHORIZED
|
|
20
|
-
JBPermissionsData memory emptyData;
|
|
21
|
-
|
|
22
|
-
vm.expectRevert(
|
|
23
|
-
abi.encodeWithSelector(
|
|
24
|
-
JBPermissions.JBPermissions_Unauthorized.selector, _account, address(this), 0, JBPermissionIds.ROOT
|
|
25
|
-
)
|
|
26
|
-
);
|
|
27
|
-
_permissions.setPermissionsFor(_account, emptyData);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function test_WhenCallerHasPermission() external {
|
|
31
|
-
// it packs permissions into a bitfield, stores them, and emits OperatorPermissionsSet
|
|
32
|
-
|
|
33
|
-
// used to set our root privelage and act as our counter case later
|
|
34
|
-
uint256 permissions = 1 << 1;
|
|
35
|
-
|
|
36
|
-
// Find the storage slot
|
|
37
|
-
bytes32 permissionsOfSlot = keccak256(abi.encode(_op, uint256(0)));
|
|
38
|
-
bytes32 accountSlot = keccak256(abi.encode(_account, uint256(permissionsOfSlot)));
|
|
39
|
-
bytes32 slot = keccak256(abi.encode(_projectId, accountSlot));
|
|
40
|
-
|
|
41
|
-
// Set storage: this contract can set permissions as ROOT
|
|
42
|
-
vm.store(address(_permissions), slot, bytes32(permissions));
|
|
43
|
-
|
|
44
|
-
uint8[] memory array = new uint8[](3);
|
|
45
|
-
array[0] = 1;
|
|
46
|
-
array[1] = 2;
|
|
47
|
-
array[2] = 3;
|
|
48
|
-
|
|
49
|
-
JBPermissionsData memory data = JBPermissionsData({operator: _op, projectId: _projectId, permissionIds: array});
|
|
50
|
-
|
|
51
|
-
// call it
|
|
52
|
-
vm.prank(_account);
|
|
53
|
-
_permissions.setPermissionsFor(_account, data);
|
|
54
|
-
|
|
55
|
-
// permissions that were set during the call
|
|
56
|
-
uint256 afterSet = _permissions.permissionsOf(_op, _account, _projectId);
|
|
57
|
-
|
|
58
|
-
// add missing permissions to our counter case "permissions" which we used to assign root access earlier
|
|
59
|
-
permissions |= 1 << 2;
|
|
60
|
-
permissions |= 1 << 3;
|
|
61
|
-
|
|
62
|
-
assertEq(afterSet, permissions);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {JBPrices} from "../../../../src/JBPrices.sol";
|
|
5
|
-
import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
|
|
6
|
-
import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
|
|
7
|
-
import {IJBPrices} from "../../../../src/interfaces/IJBPrices.sol";
|
|
8
|
-
import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
|
|
9
|
-
import {IJBRulesets} from "../../../../src/interfaces/IJBRulesets.sol";
|
|
10
|
-
import {JBTest} from "../../../helpers/JBTest.sol";
|
|
11
|
-
|
|
12
|
-
/*
|
|
13
|
-
Contract that deploys a target contract with other mock contracts to satisfy the constructor.
|
|
14
|
-
Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
|
|
15
|
-
*/
|
|
16
|
-
contract JBPricesSetup is JBTest {
|
|
17
|
-
address _owner = makeAddr("owner");
|
|
18
|
-
|
|
19
|
-
// Mocks
|
|
20
|
-
IJBPermissions public permissions = IJBPermissions(makeAddr("permissions"));
|
|
21
|
-
IJBProjects public projects = IJBProjects(makeAddr("projects"));
|
|
22
|
-
IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
|
|
23
|
-
IJBRulesets public rulesets = IJBRulesets(makeAddr("rulesets"));
|
|
24
|
-
|
|
25
|
-
// Target Contract
|
|
26
|
-
IJBPrices public _prices;
|
|
27
|
-
|
|
28
|
-
function pricesSetup() public virtual {
|
|
29
|
-
// Instantiate the contract being tested
|
|
30
|
-
_prices = new JBPrices(directory, permissions, projects, _owner, address(0));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {JBPrices} from "../../../../src/JBPrices.sol";
|
|
5
|
-
import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
|
|
6
|
-
import {IJBPriceFeed} from "../../../../src/interfaces/IJBPriceFeed.sol";
|
|
7
|
-
import {IJBPrices} from "../../../../src/interfaces/IJBPrices.sol";
|
|
8
|
-
import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
|
|
9
|
-
import {JBPricesSetup} from "./JBPricesSetup.sol";
|
|
10
|
-
|
|
11
|
-
contract TestAddPriceFeedFor_Local is JBPricesSetup {
|
|
12
|
-
IJBPriceFeed _feed = IJBPriceFeed(makeAddr("feed"));
|
|
13
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
14
|
-
uint256 DEFAULT_PROJECT_ID = 0;
|
|
15
|
-
uint256 _projectId = 1;
|
|
16
|
-
address _projectOneOwner = makeAddr("oneOwner");
|
|
17
|
-
uint256 _pricingCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
|
|
18
|
-
uint256 _unitCurrency = uint32(uint160(makeAddr("someToken")));
|
|
19
|
-
uint256 _invalidCurrency = 0;
|
|
20
|
-
|
|
21
|
-
function setUp() public {
|
|
22
|
-
super.pricesSetup();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function test_WhenProjectIdIsTheDEFAULT_PROJECT_IDAndMsgSenderIsTheOwnerOfJBPrices() external {
|
|
26
|
-
// it should add the price feed without checking permissions
|
|
27
|
-
|
|
28
|
-
vm.prank(_owner);
|
|
29
|
-
_prices.addPriceFeedFor(DEFAULT_PROJECT_ID, _pricingCurrency, _unitCurrency, _feed);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function test_WhenProjectIdIsTheDEFAULT_PROJECT_IDAndMsgSenderIsTheOwnerOfProjectZero() external {
|
|
33
|
-
// it should add the price feed
|
|
34
|
-
vm.prank(_owner);
|
|
35
|
-
_prices.addPriceFeedFor(DEFAULT_PROJECT_ID, _pricingCurrency, _unitCurrency, _feed);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function test_WhenProjectIdIsTheDEFAULT_PROJECT_IDAndMsgSenderIsNotTheOwnerOfProjectZero() external {
|
|
39
|
-
// it should revert ONLY_OWNER()
|
|
40
|
-
|
|
41
|
-
// encode custom error
|
|
42
|
-
bytes4 selector = bytes4(keccak256("OwnableUnauthorizedAccount(address)"));
|
|
43
|
-
bytes memory expectedError = abi.encodeWithSelector(selector, address(this));
|
|
44
|
-
|
|
45
|
-
vm.expectRevert(expectedError);
|
|
46
|
-
_prices.addPriceFeedFor(DEFAULT_PROJECT_ID, _pricingCurrency, _unitCurrency, _feed);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
modifier whenProjectIsNotDefaultAndHasPermissions() {
|
|
50
|
-
// mock controllerOf call
|
|
51
|
-
mockExpect(
|
|
52
|
-
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
53
|
-
);
|
|
54
|
-
_;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function test_WhenProjectIdIsNotTheDEFAULT_PROJECT_ID() external whenProjectIsNotDefaultAndHasPermissions {
|
|
58
|
-
// it should require ADD_PRICE_FEED permission from the project's owner or an operator
|
|
59
|
-
|
|
60
|
-
_prices.addPriceFeedFor(_projectId, _pricingCurrency, _unitCurrency, _feed);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function test_WhenPricingCurrencyOrUnitCurrencyIs0() external whenProjectIsNotDefaultAndHasPermissions {
|
|
64
|
-
// it should revert with INVALID_CURRENCY
|
|
65
|
-
|
|
66
|
-
vm.expectRevert(JBPrices.JBPrices_ZeroPricingCurrency.selector);
|
|
67
|
-
_prices.addPriceFeedFor(_projectId, _invalidCurrency, _unitCurrency, _feed);
|
|
68
|
-
|
|
69
|
-
vm.expectRevert(JBPrices.JBPrices_ZeroUnitCurrency.selector);
|
|
70
|
-
_prices.addPriceFeedFor(_projectId, _pricingCurrency, _invalidCurrency, _feed);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function test_WhenADefaultFeedForTheCurrencyPairOrItsInverseAlreadyExists()
|
|
74
|
-
external
|
|
75
|
-
whenProjectIsNotDefaultAndHasPermissions
|
|
76
|
-
{
|
|
77
|
-
// it should revert with PRICE_FEED_ALREADY_EXISTS
|
|
78
|
-
|
|
79
|
-
vm.prank(_owner);
|
|
80
|
-
_prices.addPriceFeedFor(DEFAULT_PROJECT_ID, _pricingCurrency, _unitCurrency, _feed);
|
|
81
|
-
|
|
82
|
-
vm.expectRevert(abi.encodeWithSelector(JBPrices.JBPrices_PriceFeedAlreadyExists.selector, _feed));
|
|
83
|
-
_prices.addPriceFeedFor(_projectId, _pricingCurrency, _unitCurrency, _feed);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function test_WhenThisProjectAlreadyHasFeedsForTheCurrencyPairOrItsInverse()
|
|
87
|
-
external
|
|
88
|
-
whenProjectIsNotDefaultAndHasPermissions
|
|
89
|
-
{
|
|
90
|
-
// it should revert with PRICE_FEED_ALREADY_EXISTS
|
|
91
|
-
|
|
92
|
-
_prices.addPriceFeedFor(_projectId, _pricingCurrency, _unitCurrency, _feed);
|
|
93
|
-
|
|
94
|
-
vm.expectRevert(abi.encodeWithSelector(JBPrices.JBPrices_PriceFeedAlreadyExists.selector, _feed));
|
|
95
|
-
_prices.addPriceFeedFor(_projectId, _pricingCurrency, _unitCurrency, _feed);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function test_HappyPath() external whenProjectIsNotDefaultAndHasPermissions {
|
|
99
|
-
// it should store the feed for the project and currency pair
|
|
100
|
-
// it should emit AddPriceFeed event with projectId, pricingCurrency, unitCurrency, and feed
|
|
101
|
-
|
|
102
|
-
vm.expectEmit();
|
|
103
|
-
emit IJBPrices.AddPriceFeed(_projectId, _pricingCurrency, _unitCurrency, _feed, address(this));
|
|
104
|
-
|
|
105
|
-
_prices.addPriceFeedFor(_projectId, _pricingCurrency, _unitCurrency, _feed);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
import {JBPrices} from "../../../../src/JBPrices.sol";
|
|
5
|
-
import {IJBPriceFeed} from "../../../../src/interfaces/IJBPriceFeed.sol";
|
|
6
|
-
import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
|
|
7
|
-
import {JBPricesSetup} from "./JBPricesSetup.sol";
|
|
8
|
-
|
|
9
|
-
contract TestPricePerUnitOf_Local is JBPricesSetup {
|
|
10
|
-
IJBPriceFeed _feed = IJBPriceFeed(makeAddr("priceFeed"));
|
|
11
|
-
// forge-lint: disable-next-line(mixed-case-variable)
|
|
12
|
-
uint256 DEFAULT_PROJECT_ID = 0;
|
|
13
|
-
uint256 _projectId = 1;
|
|
14
|
-
uint256 _defaultDirectPrice = 1_000_000_000;
|
|
15
|
-
uint256 _directPrice = 2_000_000_000;
|
|
16
|
-
uint256 _inversePrice = 1e18;
|
|
17
|
-
uint256 _directDecimals = 18;
|
|
18
|
-
uint256 _inverseDecimals = 6;
|
|
19
|
-
uint256 _pricingCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
|
|
20
|
-
uint256 _unitCurrency = uint32(uint160(makeAddr("someToken")));
|
|
21
|
-
|
|
22
|
-
function setUp() public {
|
|
23
|
-
super.pricesSetup();
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
modifier givenDirectFeedExists() {
|
|
27
|
-
// Find the storage slot
|
|
28
|
-
bytes32 priceFeedForSlot = keccak256(abi.encode(_projectId, uint256(1)));
|
|
29
|
-
bytes32 pricingSlot = keccak256(abi.encode(_pricingCurrency, uint256(priceFeedForSlot)));
|
|
30
|
-
bytes32 slot = keccak256(abi.encode(_unitCurrency, uint256(pricingSlot)));
|
|
31
|
-
|
|
32
|
-
bytes32 feedBytes = bytes32(uint256(uint160(address(_feed))));
|
|
33
|
-
|
|
34
|
-
// Set direct price feed
|
|
35
|
-
vm.store(address(_prices), slot, feedBytes);
|
|
36
|
-
|
|
37
|
-
// Confirm price feed was set
|
|
38
|
-
IJBPriceFeed feed = _prices.priceFeedFor(_projectId, _pricingCurrency, _unitCurrency);
|
|
39
|
-
assertEq(address(feed), address(_feed));
|
|
40
|
-
|
|
41
|
-
bytes memory currentUnitPriceCall = abi.encodeCall(IJBPriceFeed.currentUnitPrice, (_inverseDecimals));
|
|
42
|
-
bytes memory directReturned = abi.encode(_directPrice);
|
|
43
|
-
|
|
44
|
-
mockExpect(address(feed), currentUnitPriceCall, directReturned);
|
|
45
|
-
_;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
modifier givenIndirectFeedExists() {
|
|
49
|
-
// Find the storage slot
|
|
50
|
-
bytes32 priceFeedForSlot = keccak256(abi.encode(_projectId, uint256(1)));
|
|
51
|
-
bytes32 pricingSlot = keccak256(abi.encode(_unitCurrency, uint256(priceFeedForSlot)));
|
|
52
|
-
bytes32 slot = keccak256(abi.encode(_pricingCurrency, uint256(pricingSlot)));
|
|
53
|
-
|
|
54
|
-
bytes32 feedBytes = bytes32(uint256(uint160(address(_feed))));
|
|
55
|
-
|
|
56
|
-
// Set indirect price feed
|
|
57
|
-
vm.store(address(_prices), slot, feedBytes);
|
|
58
|
-
|
|
59
|
-
// Confirm price feed was set
|
|
60
|
-
IJBPriceFeed feed = _prices.priceFeedFor(_projectId, _unitCurrency, _pricingCurrency);
|
|
61
|
-
assertEq(address(feed), address(_feed));
|
|
62
|
-
|
|
63
|
-
bytes memory currentUnitPriceCall = abi.encodeCall(IJBPriceFeed.currentUnitPrice, (_directDecimals));
|
|
64
|
-
bytes memory directReturned = abi.encode(_inversePrice);
|
|
65
|
-
|
|
66
|
-
mockExpect(address(feed), currentUnitPriceCall, directReturned);
|
|
67
|
-
_;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
modifier givenOnlyDefaultDirectFeedExists() {
|
|
71
|
-
// Find the storage slot
|
|
72
|
-
bytes32 priceFeedForSlot = keccak256(abi.encode(DEFAULT_PROJECT_ID, uint256(1)));
|
|
73
|
-
bytes32 pricingSlot = keccak256(abi.encode(_pricingCurrency, uint256(priceFeedForSlot)));
|
|
74
|
-
bytes32 slot = keccak256(abi.encode(_unitCurrency, uint256(pricingSlot)));
|
|
75
|
-
|
|
76
|
-
bytes32 feedBytes = bytes32(uint256(uint160(address(_feed))));
|
|
77
|
-
|
|
78
|
-
// Set direct price feed
|
|
79
|
-
vm.store(address(_prices), slot, feedBytes);
|
|
80
|
-
|
|
81
|
-
// Confirm price feed was set
|
|
82
|
-
IJBPriceFeed feed = _prices.priceFeedFor(DEFAULT_PROJECT_ID, _pricingCurrency, _unitCurrency);
|
|
83
|
-
assertEq(address(feed), address(_feed));
|
|
84
|
-
|
|
85
|
-
bytes memory currentUnitPriceCall = abi.encodeCall(IJBPriceFeed.currentUnitPrice, (_inverseDecimals));
|
|
86
|
-
bytes memory directReturned = abi.encode(_defaultDirectPrice);
|
|
87
|
-
|
|
88
|
-
mockExpect(address(feed), currentUnitPriceCall, directReturned);
|
|
89
|
-
_;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function test_WhenPricingCurrencyIsTheSameAsUnitCurrency() external view {
|
|
93
|
-
// it should return 1 with requested decimals
|
|
94
|
-
|
|
95
|
-
uint256 price = _prices.pricePerUnitOf(_projectId, _pricingCurrency, _pricingCurrency, 18);
|
|
96
|
-
assertEq(price, 1e18);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function test_WhenPriceFeedExistsForProjectIdAndPricingCurrencyToUnitCurrency() external givenDirectFeedExists {
|
|
100
|
-
// it should return the current price from price feed
|
|
101
|
-
|
|
102
|
-
uint256 pricesPrice = _prices.pricePerUnitOf(_projectId, _pricingCurrency, _unitCurrency, 6);
|
|
103
|
-
assertEq(pricesPrice, _directPrice);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function test_WhenInversePriceFeedExistsForProjectIdAndUnitCurrencyToPricingCurrency()
|
|
107
|
-
external
|
|
108
|
-
givenIndirectFeedExists
|
|
109
|
-
{
|
|
110
|
-
// it should return the inverse of the current price from inverse price feed
|
|
111
|
-
|
|
112
|
-
uint256 inversePrice = _prices.pricePerUnitOf(_projectId, _pricingCurrency, _unitCurrency, 18);
|
|
113
|
-
assertEq(inversePrice, _inversePrice);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function test_WhenProjectIdIsNotTheDEFAULT_PROJECT_IDAndNoDirectOrInversePriceFeedIsFound()
|
|
117
|
-
external
|
|
118
|
-
givenOnlyDefaultDirectFeedExists
|
|
119
|
-
{
|
|
120
|
-
// it should attempt to use the default price feed for DEFAULT_PROJECT_ID
|
|
121
|
-
|
|
122
|
-
uint256 defaultPrice = _prices.pricePerUnitOf(_projectId, _pricingCurrency, _unitCurrency, 6);
|
|
123
|
-
assertEq(defaultPrice, _defaultDirectPrice);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function test_WhenNoPriceFeedIsFoundOrExistsIncludingDefaultCase() external {
|
|
127
|
-
// it should revert with PRICE_FEED_NOT_FOUND
|
|
128
|
-
|
|
129
|
-
vm.expectRevert(JBPrices.JBPrices_PriceFeedNotFound.selector);
|
|
130
|
-
_prices.pricePerUnitOf(_projectId, _pricingCurrency, _unitCurrency, 6);
|
|
131
|
-
}
|
|
132
|
-
}
|