@bananapus/core-v6 0.0.1
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/LICENSE +21 -0
- package/README.md +112 -0
- package/SKILLS.md +151 -0
- package/docs/book.css +13 -0
- package/docs/book.toml +12 -0
- package/docs/solidity.min.js +74 -0
- package/docs/src/README.md +703 -0
- package/docs/src/SUMMARY.md +94 -0
- package/docs/src/src/JBChainlinkV3PriceFeed.sol/contract.JBChainlinkV3PriceFeed.md +83 -0
- package/docs/src/src/JBChainlinkV3SequencerPriceFeed.sol/contract.JBChainlinkV3SequencerPriceFeed.md +88 -0
- package/docs/src/src/JBController.sol/contract.JBController.md +1121 -0
- package/docs/src/src/JBDeadline.sol/contract.JBDeadline.md +84 -0
- package/docs/src/src/JBDirectory.sol/contract.JBDirectory.md +294 -0
- package/docs/src/src/JBERC20.sol/contract.JBERC20.md +190 -0
- package/docs/src/src/JBFeelessAddresses.sol/contract.JBFeelessAddresses.md +80 -0
- package/docs/src/src/JBFundAccessLimits.sol/contract.JBFundAccessLimits.md +253 -0
- package/docs/src/src/JBMultiTerminal.sol/contract.JBMultiTerminal.md +1472 -0
- package/docs/src/src/JBPermissions.sol/contract.JBPermissions.md +199 -0
- package/docs/src/src/JBPrices.sol/contract.JBPrices.md +154 -0
- package/docs/src/src/JBProjects.sol/contract.JBProjects.md +131 -0
- package/docs/src/src/JBRulesets.sol/contract.JBRulesets.md +677 -0
- package/docs/src/src/JBSplits.sol/contract.JBSplits.md +237 -0
- package/docs/src/src/JBTerminalStore.sol/contract.JBTerminalStore.md +591 -0
- package/docs/src/src/JBTokens.sol/contract.JBTokens.md +353 -0
- package/docs/src/src/README.md +25 -0
- package/docs/src/src/abstract/JBControlled.sol/abstract.JBControlled.md +64 -0
- package/docs/src/src/abstract/JBPermissioned.sol/abstract.JBPermissioned.md +84 -0
- package/docs/src/src/abstract/README.md +5 -0
- package/docs/src/src/enums/JBApprovalStatus.sol/enum.JBApprovalStatus.md +17 -0
- package/docs/src/src/enums/README.md +4 -0
- package/docs/src/src/interfaces/IJBCashOutHook.sol/interface.IJBCashOutHook.md +29 -0
- package/docs/src/src/interfaces/IJBCashOutTerminal.sol/interface.IJBCashOutTerminal.md +57 -0
- package/docs/src/src/interfaces/IJBControlled.sol/interface.IJBControlled.md +12 -0
- package/docs/src/src/interfaces/IJBController.sol/interface.IJBController.md +334 -0
- package/docs/src/src/interfaces/IJBDirectory.sol/interface.IJBDirectory.md +108 -0
- package/docs/src/src/interfaces/IJBDirectoryAccessControl.sol/interface.IJBDirectoryAccessControl.md +19 -0
- package/docs/src/src/interfaces/IJBFeeTerminal.sol/interface.IJBFeeTerminal.md +91 -0
- package/docs/src/src/interfaces/IJBFeelessAddresses.sol/interface.IJBFeelessAddresses.md +26 -0
- package/docs/src/src/interfaces/IJBFundAccessLimits.sol/interface.IJBFundAccessLimits.md +88 -0
- package/docs/src/src/interfaces/IJBMigratable.sol/interface.IJBMigratable.md +29 -0
- package/docs/src/src/interfaces/IJBMultiTerminal.sol/interface.IJBMultiTerminal.md +50 -0
- package/docs/src/src/interfaces/IJBPayHook.sol/interface.IJBPayHook.md +28 -0
- package/docs/src/src/interfaces/IJBPayoutTerminal.sol/interface.IJBPayoutTerminal.md +105 -0
- package/docs/src/src/interfaces/IJBPermissioned.sol/interface.IJBPermissioned.md +12 -0
- package/docs/src/src/interfaces/IJBPermissions.sol/interface.IJBPermissions.md +74 -0
- package/docs/src/src/interfaces/IJBPermitTerminal.sol/interface.IJBPermitTerminal.md +15 -0
- package/docs/src/src/interfaces/IJBPriceFeed.sol/interface.IJBPriceFeed.md +12 -0
- package/docs/src/src/interfaces/IJBPrices.sol/interface.IJBPrices.md +74 -0
- package/docs/src/src/interfaces/IJBProjectUriRegistry.sol/interface.IJBProjectUriRegistry.md +19 -0
- package/docs/src/src/interfaces/IJBProjects.sol/interface.IJBProjects.md +49 -0
- package/docs/src/src/interfaces/IJBRulesetApprovalHook.sol/interface.IJBRulesetApprovalHook.md +35 -0
- package/docs/src/src/interfaces/IJBRulesetDataHook.sol/interface.IJBRulesetDataHook.md +97 -0
- package/docs/src/src/interfaces/IJBRulesets.sol/interface.IJBRulesets.md +165 -0
- package/docs/src/src/interfaces/IJBSplitHook.sol/interface.IJBSplitHook.md +31 -0
- package/docs/src/src/interfaces/IJBSplits.sol/interface.IJBSplits.md +35 -0
- package/docs/src/src/interfaces/IJBTerminal.sol/interface.IJBTerminal.md +141 -0
- package/docs/src/src/interfaces/IJBTerminalStore.sol/interface.IJBTerminalStore.md +198 -0
- package/docs/src/src/interfaces/IJBToken.sol/interface.IJBToken.md +54 -0
- package/docs/src/src/interfaces/IJBTokenUriResolver.sol/interface.IJBTokenUriResolver.md +12 -0
- package/docs/src/src/interfaces/IJBTokens.sol/interface.IJBTokens.md +151 -0
- package/docs/src/src/interfaces/README.md +33 -0
- package/docs/src/src/libraries/JBCashOuts.sol/library.JBCashOuts.md +40 -0
- package/docs/src/src/libraries/JBConstants.sol/library.JBConstants.md +52 -0
- package/docs/src/src/libraries/JBCurrencyIds.sol/library.JBCurrencyIds.md +19 -0
- package/docs/src/src/libraries/JBFees.sol/library.JBFees.md +52 -0
- package/docs/src/src/libraries/JBFixedPointNumber.sol/library.JBFixedPointNumber.md +12 -0
- package/docs/src/src/libraries/JBMetadataResolver.sol/library.JBMetadataResolver.md +242 -0
- package/docs/src/src/libraries/JBRulesetMetadataResolver.sol/library.JBRulesetMetadataResolver.md +180 -0
- package/docs/src/src/libraries/JBSplitGroupIds.sol/library.JBSplitGroupIds.md +14 -0
- package/docs/src/src/libraries/JBSurplus.sol/library.JBSurplus.md +44 -0
- package/docs/src/src/libraries/README.md +12 -0
- package/docs/src/src/periphery/JBDeadline1Day.sol/contract.JBDeadline1Day.md +15 -0
- package/docs/src/src/periphery/JBDeadline3Days.sol/contract.JBDeadline3Days.md +15 -0
- package/docs/src/src/periphery/JBDeadline3Hours.sol/contract.JBDeadline3Hours.md +15 -0
- package/docs/src/src/periphery/JBDeadline7Days.sol/contract.JBDeadline7Days.md +15 -0
- package/docs/src/src/periphery/JBMatchingPriceFeed.sol/contract.JBMatchingPriceFeed.md +22 -0
- package/docs/src/src/periphery/README.md +8 -0
- package/docs/src/src/structs/JBAccountingContext.sol/struct.JBAccountingContext.md +20 -0
- package/docs/src/src/structs/JBAfterCashOutRecordedContext.sol/struct.JBAfterCashOutRecordedContext.md +43 -0
- package/docs/src/src/structs/JBAfterPayRecordedContext.sol/struct.JBAfterPayRecordedContext.md +42 -0
- package/docs/src/src/structs/JBBeforeCashOutRecordedContext.sol/struct.JBBeforeCashOutRecordedContext.md +45 -0
- package/docs/src/src/structs/JBBeforePayRecordedContext.sol/struct.JBBeforePayRecordedContext.md +41 -0
- package/docs/src/src/structs/JBCashOutHookSpecification.sol/struct.JBCashOutHookSpecification.md +22 -0
- package/docs/src/src/structs/JBCurrencyAmount.sol/struct.JBCurrencyAmount.md +17 -0
- package/docs/src/src/structs/JBFee.sol/struct.JBFee.md +20 -0
- package/docs/src/src/structs/JBFundAccessLimitGroup.sol/struct.JBFundAccessLimitGroup.md +39 -0
- package/docs/src/src/structs/JBPayHookSpecification.sol/struct.JBPayHookSpecification.md +22 -0
- package/docs/src/src/structs/JBPermissionsData.sol/struct.JBPermissionsData.md +21 -0
- package/docs/src/src/structs/JBRuleset.sol/struct.JBRuleset.md +55 -0
- package/docs/src/src/structs/JBRulesetConfig.sol/struct.JBRulesetConfig.md +51 -0
- package/docs/src/src/structs/JBRulesetMetadata.sol/struct.JBRulesetMetadata.md +79 -0
- package/docs/src/src/structs/JBRulesetWeightCache.sol/struct.JBRulesetWeightCache.md +16 -0
- package/docs/src/src/structs/JBRulesetWithMetadata.sol/struct.JBRulesetWithMetadata.md +16 -0
- package/docs/src/src/structs/JBSingleAllowance.sol/struct.JBSingleAllowance.md +26 -0
- package/docs/src/src/structs/JBSplit.sol/struct.JBSplit.md +49 -0
- package/docs/src/src/structs/JBSplitGroup.sol/struct.JBSplitGroup.md +17 -0
- package/docs/src/src/structs/JBSplitHookContext.sol/struct.JBSplitHookContext.md +29 -0
- package/docs/src/src/structs/JBTerminalConfig.sol/struct.JBTerminalConfig.md +16 -0
- package/docs/src/src/structs/JBTokenAmount.sol/struct.JBTokenAmount.md +23 -0
- package/docs/src/src/structs/README.md +25 -0
- package/foundry.lock +11 -0
- package/foundry.toml +41 -0
- package/package.json +38 -0
- package/remappings.txt +1 -0
- package/script/Deploy.s.sol +111 -0
- package/script/DeployPeriphery.s.sol +287 -0
- package/script/helpers/CoreDeploymentLib.sol +121 -0
- package/slither-ci.config.json +10 -0
- package/sphinx.lock +507 -0
- package/src/JBChainlinkV3PriceFeed.sol +77 -0
- package/src/JBChainlinkV3SequencerPriceFeed.sol +75 -0
- package/src/JBController.sol +1186 -0
- package/src/JBDeadline.sol +73 -0
- package/src/JBDirectory.sol +343 -0
- package/src/JBERC20.sol +131 -0
- package/src/JBFeelessAddresses.sol +54 -0
- package/src/JBFundAccessLimits.sol +308 -0
- package/src/JBMultiTerminal.sol +2024 -0
- package/src/JBPermissions.sol +252 -0
- package/src/JBPrices.sol +227 -0
- package/src/JBProjects.sol +126 -0
- package/src/JBRulesets.sol +1093 -0
- package/src/JBSplits.sol +324 -0
- package/src/JBTerminalStore.sol +908 -0
- package/src/JBTokens.sol +376 -0
- package/src/abstract/JBControlled.sol +48 -0
- package/src/abstract/JBPermissioned.sol +77 -0
- package/src/enums/JBApprovalStatus.sol +12 -0
- package/src/interfaces/IJBCashOutHook.sol +15 -0
- package/src/interfaces/IJBCashOutTerminal.sol +51 -0
- package/src/interfaces/IJBControlled.sol +10 -0
- package/src/interfaces/IJBController.sol +280 -0
- package/src/interfaces/IJBDirectory.sol +69 -0
- package/src/interfaces/IJBDirectoryAccessControl.sol +15 -0
- package/src/interfaces/IJBFeeTerminal.sol +61 -0
- package/src/interfaces/IJBFeelessAddresses.sol +17 -0
- package/src/interfaces/IJBFundAccessLimits.sol +94 -0
- package/src/interfaces/IJBMigratable.sol +24 -0
- package/src/interfaces/IJBMultiTerminal.sol +36 -0
- package/src/interfaces/IJBPayHook.sol +14 -0
- package/src/interfaces/IJBPayoutTerminal.sol +92 -0
- package/src/interfaces/IJBPermissioned.sol +10 -0
- package/src/interfaces/IJBPermissions.sol +71 -0
- package/src/interfaces/IJBPermitTerminal.sol +14 -0
- package/src/interfaces/IJBPriceFeed.sol +10 -0
- package/src/interfaces/IJBPrices.sol +65 -0
- package/src/interfaces/IJBProjectUriRegistry.sol +15 -0
- package/src/interfaces/IJBProjects.sol +27 -0
- package/src/interfaces/IJBRulesetApprovalHook.sol +21 -0
- package/src/interfaces/IJBRulesetDataHook.sol +56 -0
- package/src/interfaces/IJBRulesets.sol +151 -0
- package/src/interfaces/IJBSplitHook.sol +16 -0
- package/src/interfaces/IJBSplits.sol +28 -0
- package/src/interfaces/IJBTerminal.sol +120 -0
- package/src/interfaces/IJBTerminalStore.sol +225 -0
- package/src/interfaces/IJBToken.sol +39 -0
- package/src/interfaces/IJBTokenUriResolver.sol +10 -0
- package/src/interfaces/IJBTokens.sol +113 -0
- package/src/libraries/JBCashOuts.sol +120 -0
- package/src/libraries/JBConstants.sol +14 -0
- package/src/libraries/JBCurrencyIds.sol +7 -0
- package/src/libraries/JBFees.sol +28 -0
- package/src/libraries/JBFixedPointNumber.sol +12 -0
- package/src/libraries/JBMetadataResolver.sol +306 -0
- package/src/libraries/JBRulesetMetadataResolver.sol +160 -0
- package/src/libraries/JBSplitGroupIds.sol +7 -0
- package/src/libraries/JBSurplus.sol +40 -0
- package/src/periphery/JBDeadline1Day.sol +8 -0
- package/src/periphery/JBDeadline3Days.sol +8 -0
- package/src/periphery/JBDeadline3Hours.sol +8 -0
- package/src/periphery/JBDeadline7Days.sol +8 -0
- package/src/periphery/JBMatchingPriceFeed.sol +13 -0
- package/src/structs/JBAccountingContext.sol +12 -0
- package/src/structs/JBAfterCashOutRecordedContext.sol +30 -0
- package/src/structs/JBAfterPayRecordedContext.sol +29 -0
- package/src/structs/JBBeforeCashOutRecordedContext.sol +31 -0
- package/src/structs/JBBeforePayRecordedContext.sol +28 -0
- package/src/structs/JBCashOutHookSpecification.sol +15 -0
- package/src/structs/JBCurrencyAmount.sol +10 -0
- package/src/structs/JBFee.sol +12 -0
- package/src/structs/JBFundAccessLimitGroup.sol +28 -0
- package/src/structs/JBPayHookSpecification.sol +15 -0
- package/src/structs/JBPermissionsData.sol +13 -0
- package/src/structs/JBRuleset.sol +42 -0
- package/src/structs/JBRulesetConfig.sol +43 -0
- package/src/structs/JBRulesetMetadata.sol +56 -0
- package/src/structs/JBRulesetWeightCache.sol +9 -0
- package/src/structs/JBRulesetWithMetadata.sol +12 -0
- package/src/structs/JBSingleAllowance.sol +16 -0
- package/src/structs/JBSplit.sol +37 -0
- package/src/structs/JBSplitGroup.sol +12 -0
- package/src/structs/JBSplitHookContext.sol +20 -0
- package/src/structs/JBTerminalConfig.sol +12 -0
- package/src/structs/JBTokenAmount.sol +14 -0
- package/test/AuditExploits.t.sol +2710 -0
- package/test/ComprehensiveInvariant.t.sol +298 -0
- package/test/EconomicSimulation.t.sol +340 -0
- package/test/EntryPointPermutations.t.sol +671 -0
- package/test/FlashLoanAttacks.t.sol +792 -0
- package/test/PermissionEscalation.t.sol +679 -0
- package/test/RulesetTransitions.t.sol +699 -0
- package/test/SplitLoopTests.t.sol +731 -0
- package/test/TestAccessToFunds.sol +2644 -0
- package/test/TestCashOut.sol +185 -0
- package/test/TestCashOutCountFor.sol +272 -0
- package/test/TestCashOutHooks.sol +317 -0
- package/test/TestCashOutTimingEdge.sol +229 -0
- package/test/TestDurationUnderflow.sol +220 -0
- package/test/TestFeeProcessingFailure.sol +208 -0
- package/test/TestFees.sol +604 -0
- package/test/TestInterfaceSupport.sol +62 -0
- package/test/TestJBERC20Inheritance.sol +91 -0
- package/test/TestLaunchProject.sol +176 -0
- package/test/TestMetaTx.sol +203 -0
- package/test/TestMetadataParserLib.sol +438 -0
- package/test/TestMigrationHeldFees.sol +249 -0
- package/test/TestMintTokensOf.sol +172 -0
- package/test/TestMultiTokenSurplus.sol +206 -0
- package/test/TestMultipleAccessLimits.sol +642 -0
- package/test/TestPayBurnRedeemFlow.sol +180 -0
- package/test/TestPayHooks.sol +190 -0
- package/test/TestPermissions.sol +305 -0
- package/test/TestPermissionsEdge.sol +286 -0
- package/test/TestPermit2Terminal.sol +339 -0
- package/test/TestRulesetQueueing.sol +1001 -0
- package/test/TestRulesetQueuingStress.sol +778 -0
- package/test/TestRulesetWeightCaching.sol +177 -0
- package/test/TestSplits.sol +369 -0
- package/test/TestTerminalMigration.sol +167 -0
- package/test/TestTokenFlow.sol +174 -0
- package/test/WeirdTokenTests.t.sol +764 -0
- package/test/formal/BondingCurveProperties.t.sol +411 -0
- package/test/formal/FeeProperties.t.sol +246 -0
- package/test/helpers/JBTest.sol +129 -0
- package/test/helpers/MetadataResolverHelper.sol +116 -0
- package/test/helpers/TestBaseWorkflow.sol +317 -0
- package/test/invariants/Phase3DeepInvariant.t.sol +404 -0
- package/test/invariants/RulesetsInvariant.t.sol +115 -0
- package/test/invariants/TerminalStoreInvariant.t.sol +220 -0
- package/test/invariants/TokensInvariant.t.sol +184 -0
- package/test/invariants/handlers/ComprehensiveHandler.sol +285 -0
- package/test/invariants/handlers/EconomicHandler.sol +347 -0
- package/test/invariants/handlers/Phase3Handler.sol +414 -0
- package/test/invariants/handlers/RulesetsHandler.sol +111 -0
- package/test/invariants/handlers/TerminalStoreHandler.sol +146 -0
- package/test/invariants/handlers/TokensHandler.sol +127 -0
- package/test/mock/ERC2771ForwarderMock.sol +37 -0
- package/test/mock/MockERC20.sol +18 -0
- package/test/mock/MockMaliciousBeneficiary.sol +67 -0
- package/test/mock/MockMaliciousSplitHook.sol +42 -0
- package/test/mock/MockPriceFeed.sol +20 -0
- package/test/trees/JBController/burnTokensOf.tree +9 -0
- package/test/trees/JBController/claimTokensFor.tree +5 -0
- package/test/trees/JBController/deployERC20For.tree +5 -0
- package/test/trees/JBController/getRulesetOf.tree +5 -0
- package/test/trees/JBController/launchProjectFor.tree +12 -0
- package/test/trees/JBController/launchRulesetsFor.tree +8 -0
- package/test/trees/JBController/migrateController.tree +12 -0
- package/test/trees/JBController/mintTokensOf.tree +12 -0
- package/test/trees/JBController/payReservedTokenToTerminal.tree +8 -0
- package/test/trees/JBController/receiveMigrationFrom.tree +4 -0
- package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +12 -0
- package/test/trees/JBController/setMetadataOf.tree +5 -0
- package/test/trees/JBController/setSplitGroupsOf.tree +5 -0
- package/test/trees/JBController/setTokenFor.tree +5 -0
- package/test/trees/JBController/transferCreditsFrom.tree +8 -0
- package/test/trees/JBDirectory/primaryTerminalOf.tree +8 -0
- package/test/trees/JBDirectory/setControllerOf.tree +11 -0
- package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +15 -0
- package/test/trees/JBDirectory/setTerminalsOf.tree +11 -0
- package/test/trees/JBERC20/initialize.tree +7 -0
- package/test/trees/JBERC20/name.tree +5 -0
- package/test/trees/JBERC20/nonces.tree +5 -0
- package/test/trees/JBERC20/symbol.tree +5 -0
- package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +5 -0
- package/test/trees/JBFeelessAddresses/supportsInterface.tree +5 -0
- package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +5 -0
- package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +8 -0
- package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +18 -0
- package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +5 -0
- package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +8 -0
- package/test/trees/JBMetadataResolver/getDataFor.tree +8 -0
- package/test/trees/JBMultiTerminal/accountingContextsOf.tree +5 -0
- package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +10 -0
- package/test/trees/JBMultiTerminal/addToBalanceOf.tree +23 -0
- package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +23 -0
- package/test/trees/JBMultiTerminal/executePayout.tree +32 -0
- package/test/trees/JBMultiTerminal/executeProcessFee.tree +14 -0
- package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +12 -0
- package/test/trees/JBMultiTerminal/pay.tree +23 -0
- package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +8 -0
- package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +34 -0
- package/test/trees/JBMultiTerminal/useAllowanceOf.tree +16 -0
- package/test/trees/JBPermissions/hasPermission.tree +8 -0
- package/test/trees/JBPermissions/hasPermissions.tree +8 -0
- package/test/trees/JBPermissions/setPermissionsFor.tree +5 -0
- package/test/trees/JBPrices/addPriceFeedFor.tree +14 -0
- package/test/trees/JBPrices/pricePerUnitOf.tree +11 -0
- package/test/trees/JBProjects/createFor.tree +11 -0
- package/test/trees/JBProjects/setTokenUriResolver.tree +5 -0
- package/test/trees/JBProjects/supportsInterface.tree +9 -0
- package/test/trees/JBProjects/tokenURI.tree +5 -0
- package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +8 -0
- package/test/trees/JBRulesets/currentOf.tree +12 -0
- package/test/trees/JBRulesets/getRulesetOf.tree +5 -0
- package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +10 -0
- package/test/trees/JBRulesets/rulesetsOf.tree +11 -0
- package/test/trees/JBRulesets/upcomingRulesetOf.tree +20 -0
- package/test/trees/JBRulesets/updateRulesetWeightCache.tree +5 -0
- package/test/trees/JBSplits/setSplitGroupsOf.tree +17 -0
- package/test/trees/JBSplits/splitsOf.tree +5 -0
- package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +16 -0
- package/test/trees/JBTerminalStore/currentSurplusOf.tree +25 -0
- package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +5 -0
- package/test/trees/JBTerminalStore/recordCashOutsFor.tree +16 -0
- package/test/trees/JBTerminalStore/recordPaymentFrom.tree +14 -0
- package/test/trees/JBTerminalStore/recordPayoutFor.tree +10 -0
- package/test/trees/JBTerminalStore/recordTerminalMigration.tree +5 -0
- package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +10 -0
- package/test/trees/JBTokens/burnFrom.tree +10 -0
- package/test/trees/JBTokens/claimTokensFor.tree +10 -0
- package/test/trees/JBTokens/deployERC20For.tree +12 -0
- package/test/trees/JBTokens/mintFor.tree +10 -0
- package/test/trees/JBTokens/setTokenFor.tree +11 -0
- package/test/trees/JBTokens/totalBalanceOf.tree +5 -0
- package/test/trees/JBTokens/totalSupplyOf.tree +5 -0
- package/test/trees/JBTokens/transferCreditsFrom.tree +8 -0
- package/test/trees/mintTokensOf.tree +12 -0
- package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +220 -0
- package/test/units/static/JBController/JBControllerSetup.sol +40 -0
- package/test/units/static/JBController/TestBurnTokensOf.sol +107 -0
- package/test/units/static/JBController/TestClaimTokensFor.sol +60 -0
- package/test/units/static/JBController/TestDeployErc20For.sol +80 -0
- package/test/units/static/JBController/TestLaunchProjectFor.sol +282 -0
- package/test/units/static/JBController/TestLaunchRulesetsFor.sol +322 -0
- package/test/units/static/JBController/TestMigrateController.sol +148 -0
- package/test/units/static/JBController/TestMintTokensOfUnits.sol +102 -0
- package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +71 -0
- package/test/units/static/JBController/TestReceiveMigrationFrom.sol +95 -0
- package/test/units/static/JBController/TestRulesetViews.sol +219 -0
- package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +595 -0
- package/test/units/static/JBController/TestSetSplitGroupsOf.sol +63 -0
- package/test/units/static/JBController/TestSetTokenFor.sol +227 -0
- package/test/units/static/JBController/TestSetUriOf.sol +53 -0
- package/test/units/static/JBController/TestTransferCreditsFrom.sol +159 -0
- package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +194 -0
- package/test/units/static/JBDirectory/JBDirectorySetup.sol +22 -0
- package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +122 -0
- package/test/units/static/JBDirectory/TestSetControllerOf.sol +173 -0
- package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +98 -0
- package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +169 -0
- package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +128 -0
- package/test/units/static/JBERC20/JBERC20Setup.sol +20 -0
- package/test/units/static/JBERC20/SigUtils.sol +34 -0
- package/test/units/static/JBERC20/TestInitialize.sol +54 -0
- package/test/units/static/JBERC20/TestName.sol +30 -0
- package/test/units/static/JBERC20/TestNonces.sol +59 -0
- package/test/units/static/JBERC20/TestSymbol.sol +31 -0
- package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +20 -0
- package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +29 -0
- package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +35 -0
- package/test/units/static/JBFees/TestFeesFuzz.sol +78 -0
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +16 -0
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +71 -0
- package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +21 -0
- package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +159 -0
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +56 -0
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +94 -0
- package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +182 -0
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +61 -0
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +96 -0
- package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +89 -0
- package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +227 -0
- package/test/units/static/JBMetadataResolver/TestMetadataResolverM20M21.sol +245 -0
- package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +39 -0
- package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +65 -0
- package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +313 -0
- package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +432 -0
- package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +478 -0
- package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +577 -0
- package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +176 -0
- package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +190 -0
- package/test/units/static/JBMultiTerminal/TestPay.sol +514 -0
- package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +29 -0
- package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +243 -0
- package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +310 -0
- package/test/units/static/JBPermissions/JBPermissionsSetup.sol +18 -0
- package/test/units/static/JBPermissions/TestHasPermission.sol +50 -0
- package/test/units/static/JBPermissions/TestHasPermissions.sol +93 -0
- package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +62 -0
- package/test/units/static/JBPrices/JBPricesSetup.sol +26 -0
- package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +102 -0
- package/test/units/static/JBPrices/TestPricePerUnitOf.sol +129 -0
- package/test/units/static/JBPrices/TestPrices.sol +262 -0
- package/test/units/static/JBProjects/JBProjectsSetup.sol +20 -0
- package/test/units/static/JBProjects/TestCreateFor.sol +69 -0
- package/test/units/static/JBProjects/TestInitialProject.sol +19 -0
- package/test/units/static/JBProjects/TestInterfaces.sol +27 -0
- package/test/units/static/JBProjects/TestSetResolver.sol +36 -0
- package/test/units/static/JBProjects/TestTokenUri.sol +38 -0
- package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +99 -0
- package/test/units/static/JBRulesets/JBRulesetsSetup.sol +21 -0
- package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +257 -0
- package/test/units/static/JBRulesets/TestCurrentOf.sol +231 -0
- package/test/units/static/JBRulesets/TestGetRulesetOf.sol +94 -0
- package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +252 -0
- package/test/units/static/JBRulesets/TestRulesets.sol +617 -0
- package/test/units/static/JBRulesets/TestRulesetsOf.sol +37 -0
- package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +526 -0
- package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +91 -0
- package/test/units/static/JBSplits/JBSplitsSetup.sol +23 -0
- package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +502 -0
- package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +370 -0
- package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +262 -0
- package/test/units/static/JBSplits/TestSplitsOf.sol +24 -0
- package/test/units/static/JBSplits/TestSplitsPacking.sol +33 -0
- package/test/units/static/JBSurplus/TestSurplusFuzz.sol +125 -0
- package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +23 -0
- package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +434 -0
- package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +428 -0
- package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +65 -0
- package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +479 -0
- package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +508 -0
- package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +257 -0
- package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +131 -0
- package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +390 -0
- package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +187 -0
- package/test/units/static/JBTokens/JBTokensSetup.sol +23 -0
- package/test/units/static/JBTokens/TestBurnFrom.sol +104 -0
- package/test/units/static/JBTokens/TestClaimTokensFor.sol +107 -0
- package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +89 -0
- package/test/units/static/JBTokens/TestMintFor.sol +97 -0
- package/test/units/static/JBTokens/TestSetTokenFor.sol +95 -0
- package/test/units/static/JBTokens/TestTotalBalanceOf.sol +65 -0
- package/test/units/static/JBTokens/TestTotalSupplyOf.sol +56 -0
- package/test/units/static/JBTokens/TestTransferCreditsFrom.sol +54 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBDirectorySetup} from "./JBDirectorySetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestPrimaryTerminalOf_Local is JBDirectorySetup {
|
|
8
|
+
uint256 _projectId = 1;
|
|
9
|
+
address _mockTerminal = makeAddr("mockTerminal");
|
|
10
|
+
address _mockTerminal2 = makeAddr("mockTerminal2");
|
|
11
|
+
address _mockToken = makeAddr("mockToken");
|
|
12
|
+
|
|
13
|
+
function setUp() public {
|
|
14
|
+
super.directorySetup();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function test_WhenThereAreNoTerminalsSupportingTheInputToken() external {
|
|
18
|
+
// it will return the zero address
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
modifier whenThereIsAPrimaryTerminal() {
|
|
22
|
+
_;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function test_GivenThereIsAPrimaryTerminalForTheToken() external whenThereIsAPrimaryTerminal {
|
|
26
|
+
// it will return the primary terminal
|
|
27
|
+
|
|
28
|
+
// first set the primary terminal
|
|
29
|
+
|
|
30
|
+
// mock call to JBProjects ownerOf which will give permission
|
|
31
|
+
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
32
|
+
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
33
|
+
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
34
|
+
|
|
35
|
+
// mock call to the terminal accountingContextForTokenOf
|
|
36
|
+
|
|
37
|
+
// accounting context needed for call
|
|
38
|
+
JBAccountingContext memory _context =
|
|
39
|
+
JBAccountingContext({token: _mockToken, decimals: 18, currency: uint32(1)});
|
|
40
|
+
mockExpect(
|
|
41
|
+
address(_mockTerminal),
|
|
42
|
+
abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, _mockToken)),
|
|
43
|
+
abi.encode(_context)
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// mock call to "controller" (zero address here) for interface supp
|
|
47
|
+
mockExpect(
|
|
48
|
+
address(0),
|
|
49
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
|
|
50
|
+
abi.encode(true)
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// mock call to "controller" (zero address here) for setTerminalsAllowed
|
|
54
|
+
mockExpect(
|
|
55
|
+
address(0), abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (_projectId)), abi.encode(true)
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
// Set the primary terminal of using the previous mocks
|
|
59
|
+
_directory.setPrimaryTerminalOf(_projectId, _mockToken, IJBTerminal(_mockTerminal));
|
|
60
|
+
|
|
61
|
+
// Make sure it is stored correctly
|
|
62
|
+
IJBTerminal _storedTerminal = _directory.primaryTerminalOf(_projectId, _mockToken);
|
|
63
|
+
assertEq(address(_storedTerminal), _mockTerminal);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function test_GivenThereAreMultipleTerminalsWithProperAccountingContextForTokenOf() external {
|
|
67
|
+
// it will check each terminals accountingContextForTokenOf and return the first
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function test_GivenThereAreMultipleTerminalsButNoneWithTheProperAccountingContextForTokenOf() external {
|
|
71
|
+
// it will return the zero address
|
|
72
|
+
|
|
73
|
+
// first set the terminals
|
|
74
|
+
|
|
75
|
+
// mock call to JBProjects ownerOf which will give permission
|
|
76
|
+
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
77
|
+
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
78
|
+
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
79
|
+
|
|
80
|
+
// mock call to the terminal accountingContextForTokenOf
|
|
81
|
+
|
|
82
|
+
// accounting context needed for call
|
|
83
|
+
JBAccountingContext memory _context = JBAccountingContext({token: address(0), decimals: 0, currency: uint32(0)});
|
|
84
|
+
mockExpect(
|
|
85
|
+
address(_mockTerminal),
|
|
86
|
+
abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, address(0))),
|
|
87
|
+
abi.encode(_context)
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
// mock call the the 2nd terminal accountingContextForTokenOf
|
|
91
|
+
|
|
92
|
+
// accounting context needed for call
|
|
93
|
+
mockExpect(
|
|
94
|
+
address(_mockTerminal2),
|
|
95
|
+
abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (_projectId, address(0))),
|
|
96
|
+
abi.encode(_context)
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
// mock call to "controller" (zero address here) for interface supp
|
|
100
|
+
mockExpect(
|
|
101
|
+
address(0),
|
|
102
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
|
|
103
|
+
abi.encode(true)
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
// mock call to "controller" (zero address here) for setTerminalsAllowed
|
|
107
|
+
mockExpect(
|
|
108
|
+
address(0), abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (_projectId)), abi.encode(true)
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
// terminals to set
|
|
112
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](2);
|
|
113
|
+
_terminals[0] = IJBTerminal(_mockTerminal);
|
|
114
|
+
_terminals[1] = IJBTerminal(_mockTerminal2);
|
|
115
|
+
|
|
116
|
+
// Set the primary terminal of using the previous mocks
|
|
117
|
+
_directory.setTerminalsOf(_projectId, _terminals);
|
|
118
|
+
|
|
119
|
+
IJBTerminal returnedTerminal = _directory.primaryTerminalOf(_projectId, address(0));
|
|
120
|
+
assertEq(address(returnedTerminal), address(0));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBDirectorySetup} from "./JBDirectorySetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestSetControllerOf_Local is JBDirectorySetup {
|
|
8
|
+
using stdStorage for StdStorage;
|
|
9
|
+
|
|
10
|
+
function setUp() public {
|
|
11
|
+
super.directorySetup();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
modifier givenProjectExists() {
|
|
15
|
+
bytes memory _countCall = abi.encodeCall(IJBProjects.count, ());
|
|
16
|
+
bytes memory _countReturn = abi.encode(type(uint256).max);
|
|
17
|
+
|
|
18
|
+
mockExpect(address(projects), _countCall, _countReturn);
|
|
19
|
+
_;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
modifier whenCallerIsAllowedToSetFirstController() {
|
|
23
|
+
stdstore.target(address(_directory)).sig("isAllowedToSetFirstController(address)").with_key(address(this))
|
|
24
|
+
.depth(0).checked_write(true);
|
|
25
|
+
|
|
26
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0).checked_write(address(0));
|
|
27
|
+
|
|
28
|
+
// mock ownerOf call
|
|
29
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
30
|
+
bytes memory _ownerData = abi.encode(address(this));
|
|
31
|
+
|
|
32
|
+
mockExpect(address(projects), _ownerOfCall, _ownerData);
|
|
33
|
+
|
|
34
|
+
_;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
modifier givenControllerIsAlreadySet() {
|
|
38
|
+
address _bumController = makeAddr("bum");
|
|
39
|
+
|
|
40
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
|
|
41
|
+
.checked_write(_bumController);
|
|
42
|
+
|
|
43
|
+
// mock erc165 call
|
|
44
|
+
bytes memory _supportCall =
|
|
45
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
|
|
46
|
+
bytes memory _supportReturned = abi.encode(true);
|
|
47
|
+
|
|
48
|
+
mockExpect(address(_bumController), _supportCall, _supportReturned);
|
|
49
|
+
|
|
50
|
+
// mock access control call
|
|
51
|
+
bytes memory _accessCall = abi.encodeCall(IJBDirectoryAccessControl.setControllerAllowed, (1));
|
|
52
|
+
bytes memory _accessReturned = abi.encode(false);
|
|
53
|
+
|
|
54
|
+
mockExpect(address(_bumController), _accessCall, _accessReturned);
|
|
55
|
+
|
|
56
|
+
_;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function test_RevertWhenCallerDoesNotHaveAnyPermission() external {
|
|
60
|
+
// it should revert
|
|
61
|
+
// mock ownerOf call
|
|
62
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
63
|
+
address _ownerData = address(1);
|
|
64
|
+
|
|
65
|
+
mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
|
|
66
|
+
|
|
67
|
+
// mock first permissions call
|
|
68
|
+
bytes memory _permissionsCall = abi.encodeCall(
|
|
69
|
+
IJBPermissions.hasPermission, (address(this), address(1), 1, JBPermissionIds.SET_CONTROLLER, true, true)
|
|
70
|
+
);
|
|
71
|
+
bytes memory _permissionsReturned = abi.encode(false);
|
|
72
|
+
|
|
73
|
+
mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
|
|
74
|
+
|
|
75
|
+
vm.expectRevert(
|
|
76
|
+
abi.encodeWithSelector(
|
|
77
|
+
JBPermissioned.JBPermissioned_Unauthorized.selector,
|
|
78
|
+
_ownerData,
|
|
79
|
+
address(this),
|
|
80
|
+
1,
|
|
81
|
+
JBPermissionIds.SET_CONTROLLER
|
|
82
|
+
)
|
|
83
|
+
);
|
|
84
|
+
_directory.setControllerOf(1, IERC165(address(this)));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function test_RevertGivenAProjectDoesntExist() external whenCallerIsAllowedToSetFirstController {
|
|
88
|
+
// it should revert
|
|
89
|
+
|
|
90
|
+
// project count mock call
|
|
91
|
+
bytes memory _countCall = abi.encodeCall(IJBProjects.count, ());
|
|
92
|
+
bytes memory _countReturn = abi.encode(0);
|
|
93
|
+
|
|
94
|
+
mockExpect(address(projects), _countCall, _countReturn);
|
|
95
|
+
|
|
96
|
+
vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_InvalidProjectIdInDirectory.selector, 1, 0));
|
|
97
|
+
_directory.setControllerOf(1, IERC165(address(this)));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function test_RevertGivenCurrentControllerIsNotSetControllerAllowed()
|
|
101
|
+
external
|
|
102
|
+
whenCallerIsAllowedToSetFirstController
|
|
103
|
+
givenProjectExists
|
|
104
|
+
givenControllerIsAlreadySet
|
|
105
|
+
{
|
|
106
|
+
// it should revert
|
|
107
|
+
vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetControllerNotAllowed.selector, 1));
|
|
108
|
+
_directory.setControllerOf(1, IERC165(address(this)));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function test_GivenCurrentControllerIsSetControllerAllowed()
|
|
112
|
+
external
|
|
113
|
+
whenCallerIsAllowedToSetFirstController
|
|
114
|
+
givenProjectExists
|
|
115
|
+
{
|
|
116
|
+
// it should set controllerOf and emit SetController
|
|
117
|
+
vm.expectEmit();
|
|
118
|
+
emit IJBDirectory.SetController(1, IERC165(address(this)), address(this));
|
|
119
|
+
|
|
120
|
+
_directory.setControllerOf(1, IERC165(address(this)));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function test_GivenCurrentControllerIsSetAndMigrating() external givenProjectExists {
|
|
124
|
+
address _bumController = makeAddr("bum");
|
|
125
|
+
|
|
126
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
|
|
127
|
+
.checked_write(_bumController);
|
|
128
|
+
|
|
129
|
+
// mock ownerOf call
|
|
130
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
131
|
+
bytes memory _ownerData = abi.encode(address(this));
|
|
132
|
+
|
|
133
|
+
mockExpect(address(projects), _ownerOfCall, _ownerData);
|
|
134
|
+
|
|
135
|
+
// Mock call to bum controller setControllerAllowed
|
|
136
|
+
mockExpect(
|
|
137
|
+
_bumController, abi.encodeCall(IJBDirectoryAccessControl.setControllerAllowed, (1)), abi.encode(true)
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// Mock call to it's interface support
|
|
141
|
+
mockExpect(
|
|
142
|
+
_bumController,
|
|
143
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId)),
|
|
144
|
+
abi.encode(true)
|
|
145
|
+
);
|
|
146
|
+
mockExpect(
|
|
147
|
+
_bumController,
|
|
148
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBMigratable).interfaceId)),
|
|
149
|
+
abi.encode(true)
|
|
150
|
+
);
|
|
151
|
+
mockExpect(
|
|
152
|
+
address(this),
|
|
153
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBMigratable).interfaceId)),
|
|
154
|
+
abi.encode(true)
|
|
155
|
+
);
|
|
156
|
+
mockExpect(
|
|
157
|
+
address(this),
|
|
158
|
+
abi.encodeCall(IJBMigratable.beforeReceiveMigrationFrom, (IERC165(address(_bumController)), 1)),
|
|
159
|
+
abi.encode("")
|
|
160
|
+
);
|
|
161
|
+
mockExpect(
|
|
162
|
+
address(this),
|
|
163
|
+
abi.encodeCall(IJBMigratable.afterReceiveMigrationFrom, (IERC165(address(_bumController)), 1)),
|
|
164
|
+
abi.encode("")
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
// it should set controllerOf and emit SetController
|
|
168
|
+
vm.expectEmit();
|
|
169
|
+
emit IJBDirectory.SetController(1, IERC165(address(this)), address(this));
|
|
170
|
+
|
|
171
|
+
_directory.setControllerOf(1, IERC165(address(this)));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBDirectorySetup} from "./JBDirectorySetup.sol";
|
|
6
|
+
|
|
7
|
+
/// @notice A mock controller that asserts the directory still points to it during migrate().
|
|
8
|
+
/// This validates that controllerOf is NOT updated before migrate() is called.
|
|
9
|
+
contract MockMigratingController is ERC165 {
|
|
10
|
+
IJBDirectory public immutable DIRECTORY;
|
|
11
|
+
uint256 public immutable PROJECT_ID;
|
|
12
|
+
bool public migrateCalled;
|
|
13
|
+
bool public directoryPointedToSelfDuringMigrate;
|
|
14
|
+
|
|
15
|
+
constructor(IJBDirectory directory, uint256 projectId) {
|
|
16
|
+
DIRECTORY = directory;
|
|
17
|
+
PROJECT_ID = projectId;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
|
|
21
|
+
return interfaceId == type(IJBMigratable).interfaceId
|
|
22
|
+
|| interfaceId == type(IJBDirectoryAccessControl).interfaceId || super.supportsInterface(interfaceId);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function setControllerAllowed(uint256) external pure returns (bool) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function migrate(uint256, IERC165) external {
|
|
30
|
+
migrateCalled = true;
|
|
31
|
+
// The critical assertion: during migrate(), the directory should still point to this controller.
|
|
32
|
+
directoryPointedToSelfDuringMigrate = (address(DIRECTORY.controllerOf(PROJECT_ID)) == address(this));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function beforeReceiveMigrationFrom(IERC165, uint256) external {}
|
|
36
|
+
|
|
37
|
+
function afterReceiveMigrationFrom(IERC165, uint256) external {}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// @notice A simple new controller that accepts migration.
|
|
41
|
+
contract MockNewController is ERC165 {
|
|
42
|
+
function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
|
|
43
|
+
return interfaceId == type(IJBMigratable).interfaceId || super.supportsInterface(interfaceId);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function migrate(uint256, IERC165) external {}
|
|
47
|
+
|
|
48
|
+
function beforeReceiveMigrationFrom(IERC165, uint256) external {}
|
|
49
|
+
|
|
50
|
+
function afterReceiveMigrationFrom(IERC165, uint256) external {}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
contract TestSetControllerOfMigrationOrder is JBDirectorySetup {
|
|
54
|
+
using stdStorage for StdStorage;
|
|
55
|
+
|
|
56
|
+
uint256 constant PROJECT_ID = 1;
|
|
57
|
+
|
|
58
|
+
function setUp() public {
|
|
59
|
+
super.directorySetup();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// @notice Verifies that during migrate(), the directory still points to the old controller.
|
|
63
|
+
/// This test PASSES with the correct ordering (migrate before set) and FAILS if set happens before migrate.
|
|
64
|
+
function test_DirectoryPointsToOldControllerDuringMigrate() external {
|
|
65
|
+
// Deploy mock controllers with real code (not mocked addresses).
|
|
66
|
+
MockMigratingController oldController = new MockMigratingController(_directory, PROJECT_ID);
|
|
67
|
+
MockNewController newController = new MockNewController();
|
|
68
|
+
|
|
69
|
+
// Set the old controller in the directory's storage.
|
|
70
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(PROJECT_ID).depth(0)
|
|
71
|
+
.checked_write(address(oldController));
|
|
72
|
+
|
|
73
|
+
// Mock ownerOf to return this test contract as the project owner.
|
|
74
|
+
mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (PROJECT_ID)), abi.encode(address(this)));
|
|
75
|
+
|
|
76
|
+
// Mock project count to allow the project to exist.
|
|
77
|
+
mockExpect(address(projects), abi.encodeCall(IJBProjects.count, ()), abi.encode(type(uint256).max));
|
|
78
|
+
|
|
79
|
+
// Perform the migration.
|
|
80
|
+
_directory.setControllerOf(PROJECT_ID, IERC165(address(newController)));
|
|
81
|
+
|
|
82
|
+
// Verify migrate() was called.
|
|
83
|
+
assertTrue(oldController.migrateCalled(), "migrate() should have been called on old controller");
|
|
84
|
+
|
|
85
|
+
// Verify the directory pointed to the old controller during migrate().
|
|
86
|
+
assertTrue(
|
|
87
|
+
oldController.directoryPointedToSelfDuringMigrate(),
|
|
88
|
+
"Directory should point to old controller during migrate()"
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
// Verify the directory now points to the new controller after everything completes.
|
|
92
|
+
assertEq(
|
|
93
|
+
address(_directory.controllerOf(PROJECT_ID)),
|
|
94
|
+
address(newController),
|
|
95
|
+
"Directory should point to new controller after migration"
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBDirectorySetup} from "./JBDirectorySetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestSetPrimaryTerminalOf_Local is JBDirectorySetup {
|
|
8
|
+
using stdStorage for StdStorage;
|
|
9
|
+
|
|
10
|
+
IJBTerminal _terminalToAdd = IJBTerminal(makeAddr("newTerminal"));
|
|
11
|
+
address _mockController = makeAddr("controller");
|
|
12
|
+
address _token = makeAddr("newToken");
|
|
13
|
+
|
|
14
|
+
function setUp() public {
|
|
15
|
+
super.directorySetup();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
modifier givenTerminalHasNotBeenAdded() {
|
|
19
|
+
vm.expectEmit();
|
|
20
|
+
emit IJBDirectory.AddTerminal(1, _terminalToAdd, address(this));
|
|
21
|
+
_;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
modifier whenCallerHasPermission() {
|
|
25
|
+
// mock ownerOf call
|
|
26
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
27
|
+
bytes memory _ownerData = abi.encode(address(this));
|
|
28
|
+
|
|
29
|
+
mockExpect(address(projects), _ownerOfCall, _ownerData);
|
|
30
|
+
_;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
modifier givenValidAccountingContext() {
|
|
34
|
+
// accounting context
|
|
35
|
+
JBAccountingContext memory _context = JBAccountingContext({token: _token, decimals: 6, currency: uint32(1)});
|
|
36
|
+
|
|
37
|
+
// mock accountingContext call
|
|
38
|
+
bytes memory _contextCall = abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (1, _token));
|
|
39
|
+
bytes memory _contextReturn = abi.encode(_context);
|
|
40
|
+
|
|
41
|
+
mockExpect(address(_terminalToAdd), _contextCall, _contextReturn);
|
|
42
|
+
_;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function test_WhenCallerHasNoMaidens() external {
|
|
46
|
+
// it should revert with UNAUTHORIZED()
|
|
47
|
+
// mock ownerOf call
|
|
48
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
49
|
+
address _ownerData = address(1);
|
|
50
|
+
|
|
51
|
+
mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
|
|
52
|
+
|
|
53
|
+
// mock first permissions call
|
|
54
|
+
bytes memory _permissionsCall = abi.encodeCall(
|
|
55
|
+
IJBPermissions.hasPermission,
|
|
56
|
+
(address(this), address(1), 1, JBPermissionIds.SET_PRIMARY_TERMINAL, true, true)
|
|
57
|
+
);
|
|
58
|
+
bytes memory _permissionsReturned = abi.encode(false);
|
|
59
|
+
|
|
60
|
+
mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
|
|
61
|
+
|
|
62
|
+
vm.expectRevert(
|
|
63
|
+
abi.encodeWithSelector(
|
|
64
|
+
JBPermissioned.JBPermissioned_Unauthorized.selector,
|
|
65
|
+
_ownerData,
|
|
66
|
+
address(this),
|
|
67
|
+
1,
|
|
68
|
+
JBPermissionIds.SET_PRIMARY_TERMINAL
|
|
69
|
+
)
|
|
70
|
+
);
|
|
71
|
+
_directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function test_GivenNoValidAccountingContextForTokenOf() external whenCallerHasPermission {
|
|
75
|
+
// it should revert with TOKEN_NOT_ACCEPTED
|
|
76
|
+
// accounting context
|
|
77
|
+
JBAccountingContext memory _context = JBAccountingContext({token: address(0), decimals: 6, currency: uint32(1)});
|
|
78
|
+
|
|
79
|
+
// mock accountingContext call
|
|
80
|
+
bytes memory _contextCall = abi.encodeCall(IJBTerminal.accountingContextForTokenOf, (1, _token));
|
|
81
|
+
bytes memory _contextReturn = abi.encode(_context);
|
|
82
|
+
|
|
83
|
+
mockExpect(address(_terminalToAdd), _contextCall, _contextReturn);
|
|
84
|
+
|
|
85
|
+
vm.expectRevert(
|
|
86
|
+
abi.encodeWithSelector(JBDirectory.JBDirectory_TokenNotAccepted.selector, 1, _token, _terminalToAdd)
|
|
87
|
+
);
|
|
88
|
+
_directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function test_RevertIf_GivenTerminalHasAlreadyBeenAdded()
|
|
92
|
+
external
|
|
93
|
+
whenCallerHasPermission
|
|
94
|
+
givenValidAccountingContext
|
|
95
|
+
{
|
|
96
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
|
|
97
|
+
.checked_write(_mockController);
|
|
98
|
+
// mock erc165 call
|
|
99
|
+
bytes memory _supportCall =
|
|
100
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
|
|
101
|
+
bytes memory _supportReturned = abi.encode(false);
|
|
102
|
+
|
|
103
|
+
mockExpect(address(_mockController), _supportCall, _supportReturned);
|
|
104
|
+
|
|
105
|
+
// it should not add the terminal, but set it as primary
|
|
106
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
107
|
+
_terminals[0] = _terminalToAdd;
|
|
108
|
+
|
|
109
|
+
vm.expectEmit();
|
|
110
|
+
emit IJBDirectory.SetTerminals(1, _terminals, address(this));
|
|
111
|
+
|
|
112
|
+
_directory.setTerminalsOf(1, _terminals);
|
|
113
|
+
|
|
114
|
+
// prove that the terminal was not added - forces this test to fail as intended
|
|
115
|
+
vm.expectEmit();
|
|
116
|
+
emit IJBDirectory.SetPrimaryTerminal(1, _token, _terminals[0], address(this));
|
|
117
|
+
|
|
118
|
+
// set the primary next and mock whatever calls
|
|
119
|
+
_directory.setPrimaryTerminalOf(1, _token, _terminals[0]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function test_GivenProjectIsNotAllowedToSetTerminals()
|
|
123
|
+
external
|
|
124
|
+
whenCallerHasPermission
|
|
125
|
+
givenValidAccountingContext
|
|
126
|
+
{
|
|
127
|
+
// it should revert with SET_TERMINALS_NOT_ALLOWED
|
|
128
|
+
|
|
129
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
|
|
130
|
+
.checked_write(_mockController);
|
|
131
|
+
|
|
132
|
+
// mock erc165 call
|
|
133
|
+
bytes memory _supportCall =
|
|
134
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
|
|
135
|
+
bytes memory _supportReturned = abi.encode(true);
|
|
136
|
+
|
|
137
|
+
mockExpect(address(_mockController), _supportCall, _supportReturned);
|
|
138
|
+
|
|
139
|
+
// mock setTerminalsAllowed call
|
|
140
|
+
bytes memory _allowedCall = abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (1));
|
|
141
|
+
bytes memory _allowedReturn = abi.encode(false);
|
|
142
|
+
|
|
143
|
+
mockExpect(address(_mockController), _allowedCall, _allowedReturn);
|
|
144
|
+
|
|
145
|
+
vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetTerminalsNotAllowed.selector, 1));
|
|
146
|
+
_directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function test_GivenProjectIsAllowedToSetTerminals()
|
|
150
|
+
external
|
|
151
|
+
whenCallerHasPermission
|
|
152
|
+
givenValidAccountingContext
|
|
153
|
+
givenTerminalHasNotBeenAdded
|
|
154
|
+
{
|
|
155
|
+
// it should set the terminal and emit AddTerminal
|
|
156
|
+
// it should set the terminal as primary and emit SetPrimaryTerminal
|
|
157
|
+
|
|
158
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
|
|
159
|
+
.checked_write(_mockController);
|
|
160
|
+
// mock erc165 call
|
|
161
|
+
bytes memory _supportCall =
|
|
162
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
|
|
163
|
+
bytes memory _supportReturned = abi.encode(false);
|
|
164
|
+
|
|
165
|
+
mockExpect(address(_mockController), _supportCall, _supportReturned);
|
|
166
|
+
|
|
167
|
+
_directory.setPrimaryTerminalOf(1, _token, _terminalToAdd);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBDirectorySetup} from "./JBDirectorySetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestSetTerminalsOf_Local is JBDirectorySetup {
|
|
8
|
+
using stdStorage for StdStorage;
|
|
9
|
+
|
|
10
|
+
IJBTerminal _terminalToAdd = IJBTerminal(makeAddr("newTerminal"));
|
|
11
|
+
address _mockController = makeAddr("controller");
|
|
12
|
+
address _token = makeAddr("newToken");
|
|
13
|
+
|
|
14
|
+
function setUp() public {
|
|
15
|
+
super.directorySetup();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
modifier whenCallerHasPermission() {
|
|
19
|
+
// mock ownerOf call
|
|
20
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
21
|
+
bytes memory _ownerData = abi.encode(address(this));
|
|
22
|
+
|
|
23
|
+
mockExpect(address(projects), _ownerOfCall, _ownerData);
|
|
24
|
+
_;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
modifier givenSetTerminalsAllowed() {
|
|
28
|
+
// it should revert with revert SET_TERMINALS_NOT_ALLOWED()
|
|
29
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
|
|
30
|
+
.checked_write(_mockController);
|
|
31
|
+
|
|
32
|
+
// mock erc165 call
|
|
33
|
+
bytes memory _supportCall =
|
|
34
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
|
|
35
|
+
bytes memory _supportReturned = abi.encode(true);
|
|
36
|
+
|
|
37
|
+
mockExpect(address(_mockController), _supportCall, _supportReturned);
|
|
38
|
+
|
|
39
|
+
// mock setTerminalsAllowed call
|
|
40
|
+
bytes memory _allowedCall = abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (1));
|
|
41
|
+
bytes memory _allowedReturn = abi.encode(true);
|
|
42
|
+
|
|
43
|
+
mockExpect(address(_mockController), _allowedCall, _allowedReturn);
|
|
44
|
+
_;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function test_GivenNotSetTerminalsAllowed() external whenCallerHasPermission {
|
|
48
|
+
// it should revert with revert SET_TERMINALS_NOT_ALLOWED()
|
|
49
|
+
stdstore.target(address(_directory)).sig("controllerOf(uint256)").with_key(1).depth(0)
|
|
50
|
+
.checked_write(_mockController);
|
|
51
|
+
|
|
52
|
+
// mock erc165 call
|
|
53
|
+
bytes memory _supportCall =
|
|
54
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBDirectoryAccessControl).interfaceId));
|
|
55
|
+
bytes memory _supportReturned = abi.encode(true);
|
|
56
|
+
|
|
57
|
+
mockExpect(address(_mockController), _supportCall, _supportReturned);
|
|
58
|
+
|
|
59
|
+
// mock setTerminalsAllowed call
|
|
60
|
+
bytes memory _allowedCall = abi.encodeCall(IJBDirectoryAccessControl.setTerminalsAllowed, (1));
|
|
61
|
+
bytes memory _allowedReturn = abi.encode(false);
|
|
62
|
+
|
|
63
|
+
mockExpect(address(_mockController), _allowedCall, _allowedReturn);
|
|
64
|
+
|
|
65
|
+
// needed for the call
|
|
66
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
67
|
+
_terminals[0] = _terminalToAdd;
|
|
68
|
+
|
|
69
|
+
vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_SetTerminalsNotAllowed.selector, 1));
|
|
70
|
+
_directory.setTerminalsOf(1, _terminals);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function test_WhenCallerHasNoPermission() external {
|
|
74
|
+
// it should revert with UNAUTHORIZED()
|
|
75
|
+
// mock ownerOf call
|
|
76
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (1));
|
|
77
|
+
address _ownerData = address(1);
|
|
78
|
+
|
|
79
|
+
mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerData));
|
|
80
|
+
|
|
81
|
+
// mock first permissions call
|
|
82
|
+
bytes memory _permissionsCall = abi.encodeCall(
|
|
83
|
+
IJBPermissions.hasPermission, (address(this), address(1), 1, JBPermissionIds.SET_TERMINALS, true, true)
|
|
84
|
+
);
|
|
85
|
+
bytes memory _permissionsReturned = abi.encode(false);
|
|
86
|
+
|
|
87
|
+
mockExpect(address(permissions), _permissionsCall, _permissionsReturned);
|
|
88
|
+
|
|
89
|
+
// needed for the call
|
|
90
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
91
|
+
_terminals[0] = _terminalToAdd;
|
|
92
|
+
|
|
93
|
+
vm.expectRevert(
|
|
94
|
+
abi.encodeWithSelector(
|
|
95
|
+
JBPermissioned.JBPermissioned_Unauthorized.selector,
|
|
96
|
+
_ownerData,
|
|
97
|
+
address(this),
|
|
98
|
+
1,
|
|
99
|
+
JBPermissionIds.SET_TERMINALS
|
|
100
|
+
)
|
|
101
|
+
);
|
|
102
|
+
_directory.setTerminalsOf(1, _terminals);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function test_GivenDuplicateTerminalsWereAdded() external whenCallerHasPermission givenSetTerminalsAllowed {
|
|
106
|
+
// it should revert with DUPLICATE_TERMINALS()
|
|
107
|
+
// needed for the call
|
|
108
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](2);
|
|
109
|
+
_terminals[0] = _terminalToAdd;
|
|
110
|
+
_terminals[1] = _terminalToAdd;
|
|
111
|
+
|
|
112
|
+
vm.expectRevert(abi.encodeWithSelector(JBDirectory.JBDirectory_DuplicateTerminals.selector, _terminalToAdd));
|
|
113
|
+
_directory.setTerminalsOf(1, _terminals);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function test_GivenDuplicateTerminalsWereNotAdded() external whenCallerHasPermission givenSetTerminalsAllowed {
|
|
117
|
+
// it should set terminals and emit SetTerminals
|
|
118
|
+
|
|
119
|
+
// needed for the call
|
|
120
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
121
|
+
_terminals[0] = _terminalToAdd;
|
|
122
|
+
|
|
123
|
+
vm.expectEmit();
|
|
124
|
+
emit IJBDirectory.SetTerminals(1, _terminals, address(this));
|
|
125
|
+
|
|
126
|
+
_directory.setTerminalsOf(1, _terminals);
|
|
127
|
+
}
|
|
128
|
+
}
|