@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,595 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBControllerSetup} from "./JBControllerSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestSendReservedTokensToSplitsOf_Local is JBControllerSetup {
|
|
8
|
+
using stdStorage for StdStorage;
|
|
9
|
+
using JBRulesetMetadataResolver for JBRulesetMetadata;
|
|
10
|
+
|
|
11
|
+
uint64 _projectId = 1;
|
|
12
|
+
uint256 _tokenCount = 1e18;
|
|
13
|
+
uint8 _decimals = 18;
|
|
14
|
+
string _memo = "JUICAY";
|
|
15
|
+
address _beneficiary = makeAddr("bene");
|
|
16
|
+
IJBSplitHook _hook = IJBSplitHook(makeAddr("hook"));
|
|
17
|
+
IJBToken _token = IJBToken(makeAddr("token"));
|
|
18
|
+
|
|
19
|
+
function setUp() public {
|
|
20
|
+
super.controllerSetup();
|
|
21
|
+
vm.label(_beneficiary, "client");
|
|
22
|
+
vm.label(address(_controller), "controller");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function test_WhenTheProjectHasNoReservedTokens() external {
|
|
26
|
+
// it will revert NO_RESERVED_TOKENS
|
|
27
|
+
|
|
28
|
+
JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
|
|
29
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
|
|
30
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
31
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
32
|
+
pausePay: false,
|
|
33
|
+
pauseCreditTransfers: false,
|
|
34
|
+
allowOwnerMinting: false,
|
|
35
|
+
allowSetCustomToken: false,
|
|
36
|
+
allowTerminalMigration: false,
|
|
37
|
+
allowSetTerminals: false,
|
|
38
|
+
ownerMustSendPayouts: false,
|
|
39
|
+
allowSetController: false,
|
|
40
|
+
allowAddAccountingContext: true,
|
|
41
|
+
allowAddPriceFeed: false,
|
|
42
|
+
holdFees: false,
|
|
43
|
+
useTotalSurplusForCashOuts: true,
|
|
44
|
+
useDataHookForPay: false,
|
|
45
|
+
useDataHookForCashOut: false,
|
|
46
|
+
dataHook: address(0),
|
|
47
|
+
metadata: 0
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
|
|
51
|
+
|
|
52
|
+
// splits
|
|
53
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](0);
|
|
54
|
+
|
|
55
|
+
// Package up the ruleset configuration.
|
|
56
|
+
JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
|
|
57
|
+
_rulesetConfigurations[0].mustStartAtOrAfter = 0;
|
|
58
|
+
_rulesetConfigurations[0].duration = 0;
|
|
59
|
+
_rulesetConfigurations[0].weight = 1e18;
|
|
60
|
+
_rulesetConfigurations[0].weightCutPercent = 0;
|
|
61
|
+
_rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
62
|
+
_rulesetConfigurations[0].metadata = _rulesMetadata;
|
|
63
|
+
_rulesetConfigurations[0].splitGroups = _splitsGroup;
|
|
64
|
+
_rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
65
|
+
|
|
66
|
+
vm.expectRevert(JBController.JBController_NoReservedTokens.selector);
|
|
67
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
modifier whenTheProjectHasReservedTokensGtZero() {
|
|
71
|
+
// Set some pending reserved token balance
|
|
72
|
+
stdstore.target(address(_controller)).sig("pendingReservedTokenBalanceOf(uint256)").with_key(_projectId)
|
|
73
|
+
.depth(0).checked_write(1e18);
|
|
74
|
+
|
|
75
|
+
_;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function test_GivenAHookIsConfigured() external whenTheProjectHasReservedTokensGtZero {
|
|
79
|
+
// it will mint to hook and call its processSplitWith function
|
|
80
|
+
|
|
81
|
+
JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
|
|
82
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
|
|
83
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
84
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
85
|
+
pausePay: false,
|
|
86
|
+
pauseCreditTransfers: false,
|
|
87
|
+
allowOwnerMinting: false,
|
|
88
|
+
allowSetCustomToken: false,
|
|
89
|
+
allowTerminalMigration: false,
|
|
90
|
+
allowSetTerminals: false,
|
|
91
|
+
ownerMustSendPayouts: false,
|
|
92
|
+
allowSetController: false,
|
|
93
|
+
allowAddAccountingContext: true,
|
|
94
|
+
allowAddPriceFeed: false,
|
|
95
|
+
holdFees: false,
|
|
96
|
+
useTotalSurplusForCashOuts: true,
|
|
97
|
+
useDataHookForPay: false,
|
|
98
|
+
useDataHookForCashOut: false,
|
|
99
|
+
dataHook: address(0),
|
|
100
|
+
metadata: 0
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
uint256 _packed = _rulesMetadata.packRulesetMetadata();
|
|
104
|
+
|
|
105
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
|
|
106
|
+
|
|
107
|
+
// splits
|
|
108
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
|
|
109
|
+
JBSplit[] memory _splits = new JBSplit[](1);
|
|
110
|
+
|
|
111
|
+
_splits[0] = JBSplit({
|
|
112
|
+
preferAddToBalance: false,
|
|
113
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT,
|
|
114
|
+
projectId: _projectId,
|
|
115
|
+
beneficiary: payable(address(0)),
|
|
116
|
+
lockedUntil: 0,
|
|
117
|
+
hook: _hook
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
_splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
|
|
121
|
+
|
|
122
|
+
// Package up the ruleset configuration.
|
|
123
|
+
JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
|
|
124
|
+
_rulesetConfigurations[0].mustStartAtOrAfter = 0;
|
|
125
|
+
_rulesetConfigurations[0].duration = 0;
|
|
126
|
+
_rulesetConfigurations[0].weight = 1e18;
|
|
127
|
+
_rulesetConfigurations[0].weightCutPercent = 0;
|
|
128
|
+
_rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
129
|
+
_rulesetConfigurations[0].metadata = _rulesMetadata;
|
|
130
|
+
_rulesetConfigurations[0].splitGroups = _splitsGroup;
|
|
131
|
+
_rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
132
|
+
|
|
133
|
+
// JBRulesets calldata
|
|
134
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
135
|
+
cycleNumber: uint48(block.timestamp),
|
|
136
|
+
id: uint48(block.timestamp),
|
|
137
|
+
basedOnId: 0,
|
|
138
|
+
start: uint48(block.timestamp),
|
|
139
|
+
duration: _rulesetConfigurations[0].duration,
|
|
140
|
+
weight: _rulesetConfigurations[0].weight,
|
|
141
|
+
weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
|
|
142
|
+
approvalHook: _rulesetConfigurations[0].approvalHook,
|
|
143
|
+
metadata: _packed
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// mock call to JBRulesets currentOf
|
|
147
|
+
bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
148
|
+
bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
|
|
149
|
+
mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
|
|
150
|
+
|
|
151
|
+
// mock call to JBProjects ownerOf
|
|
152
|
+
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
153
|
+
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
154
|
+
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
155
|
+
|
|
156
|
+
//mock call to JBSplits splitsOf
|
|
157
|
+
bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
|
|
158
|
+
bytes memory _splitsCallReturn = abi.encode(_splits);
|
|
159
|
+
mockExpect(address(splits), _splitsCall, _splitsCallReturn);
|
|
160
|
+
|
|
161
|
+
// mock call to JBTokens mintFor
|
|
162
|
+
bytes memory _tokensMintCall =
|
|
163
|
+
abi.encodeCall(IJBTokens.mintFor, (address(_controller), _projectId, _tokenCount));
|
|
164
|
+
mockExpect(address(tokens), _tokensMintCall, abi.encode(_token));
|
|
165
|
+
|
|
166
|
+
// Mock send after minting to controller.
|
|
167
|
+
mockExpect(address(_token), abi.encodeCall(IERC20.transfer, (address(_hook), _tokenCount)), abi.encode(true));
|
|
168
|
+
|
|
169
|
+
// split hook data
|
|
170
|
+
JBSplitHookContext memory _context = JBSplitHookContext({
|
|
171
|
+
token: address(_token),
|
|
172
|
+
amount: _tokenCount,
|
|
173
|
+
decimals: _decimals,
|
|
174
|
+
projectId: _projectId,
|
|
175
|
+
groupId: 1,
|
|
176
|
+
split: _splits[0]
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// mock call to split hook processSplitWith
|
|
180
|
+
bytes memory _hookCall = abi.encodeCall(IJBSplitHook.processSplitWith, (_context));
|
|
181
|
+
mockExpect(address(_hook), _hookCall, "");
|
|
182
|
+
|
|
183
|
+
vm.expectEmit();
|
|
184
|
+
emit IJBController.SendReservedTokensToSplits(
|
|
185
|
+
block.timestamp, block.timestamp, _projectId, address(this), _tokenCount, 0, address(this)
|
|
186
|
+
);
|
|
187
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function test_GivenABeneficiaryIsConfiguredAndProjectIsZero() external whenTheProjectHasReservedTokensGtZero {
|
|
191
|
+
// it will mint for the beneficiary
|
|
192
|
+
|
|
193
|
+
JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
|
|
194
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
|
|
195
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
196
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
197
|
+
pausePay: false,
|
|
198
|
+
pauseCreditTransfers: false,
|
|
199
|
+
allowOwnerMinting: false,
|
|
200
|
+
allowSetCustomToken: false,
|
|
201
|
+
allowTerminalMigration: false,
|
|
202
|
+
allowSetTerminals: false,
|
|
203
|
+
ownerMustSendPayouts: false,
|
|
204
|
+
allowSetController: false,
|
|
205
|
+
allowAddAccountingContext: true,
|
|
206
|
+
allowAddPriceFeed: false,
|
|
207
|
+
holdFees: false,
|
|
208
|
+
useTotalSurplusForCashOuts: true,
|
|
209
|
+
useDataHookForPay: false,
|
|
210
|
+
useDataHookForCashOut: false,
|
|
211
|
+
dataHook: address(0),
|
|
212
|
+
metadata: 0
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
uint256 _packed = _rulesMetadata.packRulesetMetadata();
|
|
216
|
+
|
|
217
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
|
|
218
|
+
|
|
219
|
+
// splits
|
|
220
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
|
|
221
|
+
JBSplit[] memory _splits = new JBSplit[](1);
|
|
222
|
+
|
|
223
|
+
_splits[0] = JBSplit({
|
|
224
|
+
preferAddToBalance: false,
|
|
225
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT,
|
|
226
|
+
projectId: 0,
|
|
227
|
+
beneficiary: payable(_beneficiary),
|
|
228
|
+
lockedUntil: 0,
|
|
229
|
+
hook: IJBSplitHook(address(0))
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
_splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
|
|
233
|
+
|
|
234
|
+
// Package up the ruleset configuration.
|
|
235
|
+
JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
|
|
236
|
+
_rulesetConfigurations[0].mustStartAtOrAfter = 0;
|
|
237
|
+
_rulesetConfigurations[0].duration = 0;
|
|
238
|
+
_rulesetConfigurations[0].weight = 1e18;
|
|
239
|
+
_rulesetConfigurations[0].weightCutPercent = 0;
|
|
240
|
+
_rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
241
|
+
_rulesetConfigurations[0].metadata = _rulesMetadata;
|
|
242
|
+
_rulesetConfigurations[0].splitGroups = _splitsGroup;
|
|
243
|
+
_rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
244
|
+
|
|
245
|
+
// JBRulesets calldata
|
|
246
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
247
|
+
cycleNumber: uint48(block.timestamp),
|
|
248
|
+
id: uint48(block.timestamp),
|
|
249
|
+
basedOnId: 0,
|
|
250
|
+
start: uint48(block.timestamp),
|
|
251
|
+
duration: _rulesetConfigurations[0].duration,
|
|
252
|
+
weight: _rulesetConfigurations[0].weight,
|
|
253
|
+
weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
|
|
254
|
+
approvalHook: _rulesetConfigurations[0].approvalHook,
|
|
255
|
+
metadata: _packed
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// mock call to JBRulesets currentOf
|
|
259
|
+
bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
260
|
+
bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
|
|
261
|
+
mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
|
|
262
|
+
|
|
263
|
+
// mock call to JBProjects ownerOf
|
|
264
|
+
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
265
|
+
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
266
|
+
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
267
|
+
|
|
268
|
+
//mock call to JBSplits splitsOf
|
|
269
|
+
bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
|
|
270
|
+
bytes memory _splitsCallReturn = abi.encode(_splits);
|
|
271
|
+
mockExpect(address(splits), _splitsCall, _splitsCallReturn);
|
|
272
|
+
|
|
273
|
+
// Mock send after minting to controller.
|
|
274
|
+
mockExpect(address(_token), abi.encodeCall(IERC20.transfer, (_beneficiary, _tokenCount)), abi.encode(true));
|
|
275
|
+
|
|
276
|
+
// mock call to JBTokens mintFor
|
|
277
|
+
bytes memory _tokensMintCall =
|
|
278
|
+
abi.encodeCall(IJBTokens.mintFor, (address(_controller), _projectId, _tokenCount));
|
|
279
|
+
mockExpect(address(tokens), _tokensMintCall, abi.encode(_token));
|
|
280
|
+
|
|
281
|
+
vm.expectEmit();
|
|
282
|
+
emit IJBController.SendReservedTokensToSplit(
|
|
283
|
+
_projectId, block.timestamp, 1, _splits[0], _tokenCount, address(this)
|
|
284
|
+
);
|
|
285
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function test_GivenADeadAddressBeneficiary() external whenTheProjectHasReservedTokensGtZero {
|
|
289
|
+
JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
|
|
290
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
|
|
291
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
292
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
293
|
+
pausePay: false,
|
|
294
|
+
pauseCreditTransfers: false,
|
|
295
|
+
allowOwnerMinting: false,
|
|
296
|
+
allowSetCustomToken: false,
|
|
297
|
+
allowTerminalMigration: false,
|
|
298
|
+
allowSetTerminals: false,
|
|
299
|
+
ownerMustSendPayouts: false,
|
|
300
|
+
allowSetController: false,
|
|
301
|
+
allowAddAccountingContext: true,
|
|
302
|
+
allowAddPriceFeed: false,
|
|
303
|
+
holdFees: false,
|
|
304
|
+
useTotalSurplusForCashOuts: true,
|
|
305
|
+
useDataHookForPay: false,
|
|
306
|
+
useDataHookForCashOut: false,
|
|
307
|
+
dataHook: address(0),
|
|
308
|
+
metadata: 0
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
uint256 _packed = _rulesMetadata.packRulesetMetadata();
|
|
312
|
+
|
|
313
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
|
|
314
|
+
|
|
315
|
+
// splits
|
|
316
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
|
|
317
|
+
JBSplit[] memory _splits = new JBSplit[](1);
|
|
318
|
+
|
|
319
|
+
_splits[0] = JBSplit({
|
|
320
|
+
preferAddToBalance: false,
|
|
321
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT,
|
|
322
|
+
projectId: 0,
|
|
323
|
+
beneficiary: payable(address(0xdead)),
|
|
324
|
+
lockedUntil: 0,
|
|
325
|
+
hook: IJBSplitHook(address(0))
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
_splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
|
|
329
|
+
|
|
330
|
+
// Package up the ruleset configuration.
|
|
331
|
+
JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
|
|
332
|
+
_rulesetConfigurations[0].mustStartAtOrAfter = 0;
|
|
333
|
+
_rulesetConfigurations[0].duration = 0;
|
|
334
|
+
_rulesetConfigurations[0].weight = 1e18;
|
|
335
|
+
_rulesetConfigurations[0].weightCutPercent = 0;
|
|
336
|
+
_rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
337
|
+
_rulesetConfigurations[0].metadata = _rulesMetadata;
|
|
338
|
+
_rulesetConfigurations[0].splitGroups = _splitsGroup;
|
|
339
|
+
_rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
340
|
+
|
|
341
|
+
// JBRulesets calldata
|
|
342
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
343
|
+
cycleNumber: uint48(block.timestamp),
|
|
344
|
+
id: uint48(block.timestamp),
|
|
345
|
+
basedOnId: 0,
|
|
346
|
+
start: uint48(block.timestamp),
|
|
347
|
+
duration: _rulesetConfigurations[0].duration,
|
|
348
|
+
weight: _rulesetConfigurations[0].weight,
|
|
349
|
+
weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
|
|
350
|
+
approvalHook: _rulesetConfigurations[0].approvalHook,
|
|
351
|
+
metadata: _packed
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// mock call to JBRulesets currentOf
|
|
355
|
+
bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
356
|
+
bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
|
|
357
|
+
mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
|
|
358
|
+
|
|
359
|
+
// mock call to JBProjects ownerOf
|
|
360
|
+
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
361
|
+
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
362
|
+
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
363
|
+
|
|
364
|
+
//mock call to JBSplits splitsOf
|
|
365
|
+
bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
|
|
366
|
+
bytes memory _splitsCallReturn = abi.encode(_splits);
|
|
367
|
+
mockExpect(address(splits), _splitsCall, _splitsCallReturn);
|
|
368
|
+
|
|
369
|
+
// mock call to JBTokens mintFor
|
|
370
|
+
bytes memory _tokensMintCall =
|
|
371
|
+
abi.encodeCall(IJBTokens.mintFor, (address(_controller), _projectId, _tokenCount));
|
|
372
|
+
mockExpect(address(tokens), _tokensMintCall, abi.encode(_token));
|
|
373
|
+
|
|
374
|
+
mockExpect(address(tokens), abi.encodeCall(IJBTokens.burnFrom, (address(_controller), 1, _tokenCount)), "");
|
|
375
|
+
|
|
376
|
+
vm.expectEmit();
|
|
377
|
+
emit IJBController.SendReservedTokensToSplit(
|
|
378
|
+
_projectId, block.timestamp, 1, _splits[0], _tokenCount, address(this)
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function test_GivenSplitIsPayableToAProjectWhichAcceptsTheToken() external whenTheProjectHasReservedTokensGtZero {
|
|
385
|
+
// it will mint to the project
|
|
386
|
+
|
|
387
|
+
JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
|
|
388
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
|
|
389
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
390
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
391
|
+
pausePay: false,
|
|
392
|
+
pauseCreditTransfers: false,
|
|
393
|
+
allowOwnerMinting: false,
|
|
394
|
+
allowSetCustomToken: false,
|
|
395
|
+
allowTerminalMigration: false,
|
|
396
|
+
allowSetTerminals: false,
|
|
397
|
+
ownerMustSendPayouts: false,
|
|
398
|
+
allowSetController: false,
|
|
399
|
+
allowAddAccountingContext: true,
|
|
400
|
+
allowAddPriceFeed: false,
|
|
401
|
+
holdFees: false,
|
|
402
|
+
useTotalSurplusForCashOuts: true,
|
|
403
|
+
useDataHookForPay: false,
|
|
404
|
+
useDataHookForCashOut: false,
|
|
405
|
+
dataHook: address(0),
|
|
406
|
+
metadata: 0
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
uint256 _packed = _rulesMetadata.packRulesetMetadata();
|
|
410
|
+
|
|
411
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
|
|
412
|
+
|
|
413
|
+
// splits
|
|
414
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
|
|
415
|
+
JBSplit[] memory _splits = new JBSplit[](1);
|
|
416
|
+
|
|
417
|
+
_splits[0] = JBSplit({
|
|
418
|
+
preferAddToBalance: false,
|
|
419
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT,
|
|
420
|
+
projectId: 1, // non-zero to execute rest of the function
|
|
421
|
+
beneficiary: payable(address(0xdead)),
|
|
422
|
+
lockedUntil: 0,
|
|
423
|
+
hook: IJBSplitHook(address(0))
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
_splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
|
|
427
|
+
|
|
428
|
+
// Package up the ruleset configuration.
|
|
429
|
+
JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
|
|
430
|
+
_rulesetConfigurations[0].mustStartAtOrAfter = 0;
|
|
431
|
+
_rulesetConfigurations[0].duration = 0;
|
|
432
|
+
_rulesetConfigurations[0].weight = 1e18;
|
|
433
|
+
_rulesetConfigurations[0].weightCutPercent = 0;
|
|
434
|
+
_rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
435
|
+
_rulesetConfigurations[0].metadata = _rulesMetadata;
|
|
436
|
+
_rulesetConfigurations[0].splitGroups = _splitsGroup;
|
|
437
|
+
_rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
438
|
+
|
|
439
|
+
// JBRulesets calldata
|
|
440
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
441
|
+
cycleNumber: uint48(block.timestamp),
|
|
442
|
+
id: uint48(block.timestamp),
|
|
443
|
+
basedOnId: 0,
|
|
444
|
+
start: uint48(block.timestamp),
|
|
445
|
+
duration: _rulesetConfigurations[0].duration,
|
|
446
|
+
weight: _rulesetConfigurations[0].weight,
|
|
447
|
+
weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
|
|
448
|
+
approvalHook: _rulesetConfigurations[0].approvalHook,
|
|
449
|
+
metadata: _packed
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
// mock call to JBRulesets currentOf
|
|
453
|
+
bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
454
|
+
bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
|
|
455
|
+
mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
|
|
456
|
+
|
|
457
|
+
// mock call to JBProjects ownerOf
|
|
458
|
+
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
459
|
+
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
460
|
+
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
461
|
+
|
|
462
|
+
//mock call to JBSplits splitsOf
|
|
463
|
+
bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
|
|
464
|
+
bytes memory _splitsCallReturn = abi.encode(_splits);
|
|
465
|
+
mockExpect(address(splits), _splitsCall, _splitsCallReturn);
|
|
466
|
+
|
|
467
|
+
// mock to JBDirectory primaryTerminalOf
|
|
468
|
+
address terminal = makeAddr("terminal");
|
|
469
|
+
mockExpect(
|
|
470
|
+
address(directory),
|
|
471
|
+
abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, address(_token))),
|
|
472
|
+
abi.encode(terminal)
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
// mock to JBTokens mintFor
|
|
476
|
+
mockExpect(
|
|
477
|
+
address(tokens),
|
|
478
|
+
abi.encodeCall(IJBTokens.mintFor, (address(_controller), 1, _tokenCount)),
|
|
479
|
+
abi.encode(address(_token))
|
|
480
|
+
);
|
|
481
|
+
|
|
482
|
+
// mock token approval
|
|
483
|
+
mockExpect(address(_token), abi.encodeCall(IERC20.approve, (terminal, 1e18)), "");
|
|
484
|
+
|
|
485
|
+
vm.expectEmit();
|
|
486
|
+
emit IJBController.SendReservedTokensToSplit(
|
|
487
|
+
_projectId, block.timestamp, 1, _splits[0], _tokenCount, address(this)
|
|
488
|
+
);
|
|
489
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
function test_GivenSplitIsPayableToAProjectWhichAcceptsTheTokenButTokenIsInvalid()
|
|
493
|
+
external
|
|
494
|
+
whenTheProjectHasReservedTokensGtZero
|
|
495
|
+
{
|
|
496
|
+
// it will revert via OZ Address
|
|
497
|
+
JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
|
|
498
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
|
|
499
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
500
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
501
|
+
pausePay: false,
|
|
502
|
+
pauseCreditTransfers: false,
|
|
503
|
+
allowOwnerMinting: false,
|
|
504
|
+
allowSetCustomToken: false,
|
|
505
|
+
allowTerminalMigration: false,
|
|
506
|
+
allowSetTerminals: false,
|
|
507
|
+
ownerMustSendPayouts: false,
|
|
508
|
+
allowSetController: false,
|
|
509
|
+
allowAddAccountingContext: true,
|
|
510
|
+
allowAddPriceFeed: false,
|
|
511
|
+
holdFees: false,
|
|
512
|
+
useTotalSurplusForCashOuts: true,
|
|
513
|
+
useDataHookForPay: false,
|
|
514
|
+
useDataHookForCashOut: false,
|
|
515
|
+
dataHook: address(0),
|
|
516
|
+
metadata: 0
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
uint256 _packed = _rulesMetadata.packRulesetMetadata();
|
|
520
|
+
|
|
521
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](0);
|
|
522
|
+
|
|
523
|
+
// splits
|
|
524
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
|
|
525
|
+
JBSplit[] memory _splits = new JBSplit[](1);
|
|
526
|
+
|
|
527
|
+
_splits[0] = JBSplit({
|
|
528
|
+
preferAddToBalance: false,
|
|
529
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT,
|
|
530
|
+
projectId: 1, // non-zero to execute rest of the function
|
|
531
|
+
beneficiary: payable(address(0)),
|
|
532
|
+
lockedUntil: 0,
|
|
533
|
+
hook: IJBSplitHook(address(0))
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
_splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
|
|
537
|
+
|
|
538
|
+
// Package up the ruleset configuration.
|
|
539
|
+
JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
|
|
540
|
+
_rulesetConfigurations[0].mustStartAtOrAfter = 0;
|
|
541
|
+
_rulesetConfigurations[0].duration = 0;
|
|
542
|
+
_rulesetConfigurations[0].weight = 1e18;
|
|
543
|
+
_rulesetConfigurations[0].weightCutPercent = 0;
|
|
544
|
+
_rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
545
|
+
_rulesetConfigurations[0].metadata = _rulesMetadata;
|
|
546
|
+
_rulesetConfigurations[0].splitGroups = _splitsGroup;
|
|
547
|
+
_rulesetConfigurations[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
548
|
+
|
|
549
|
+
// JBRulesets calldata
|
|
550
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
551
|
+
cycleNumber: uint48(block.timestamp),
|
|
552
|
+
id: uint48(block.timestamp),
|
|
553
|
+
basedOnId: 0,
|
|
554
|
+
start: uint48(block.timestamp),
|
|
555
|
+
duration: _rulesetConfigurations[0].duration,
|
|
556
|
+
weight: _rulesetConfigurations[0].weight,
|
|
557
|
+
weightCutPercent: _rulesetConfigurations[0].weightCutPercent,
|
|
558
|
+
approvalHook: _rulesetConfigurations[0].approvalHook,
|
|
559
|
+
metadata: _packed
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
// mock call to JBRulesets currentOf
|
|
563
|
+
bytes memory _rulesetsCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
564
|
+
bytes memory _rulesetsCallReturn = abi.encode(_returnedRuleset);
|
|
565
|
+
mockExpect(address(rulesets), _rulesetsCall, _rulesetsCallReturn);
|
|
566
|
+
|
|
567
|
+
// mock call to JBProjects ownerOf
|
|
568
|
+
bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
569
|
+
bytes memory _projectsCallReturn = abi.encode(address(this));
|
|
570
|
+
mockExpect(address(projects), _projectsCall, _projectsCallReturn);
|
|
571
|
+
|
|
572
|
+
//mock call to JBSplits splitsOf
|
|
573
|
+
bytes memory _splitsCall = abi.encodeCall(IJBSplits.splitsOf, (_projectId, block.timestamp, 1));
|
|
574
|
+
bytes memory _splitsCallReturn = abi.encode(_splits);
|
|
575
|
+
mockExpect(address(splits), _splitsCall, _splitsCallReturn);
|
|
576
|
+
|
|
577
|
+
// mock to JBDirectory primaryTerminalOf
|
|
578
|
+
address terminal = makeAddr("terminal");
|
|
579
|
+
mockExpect(
|
|
580
|
+
address(directory),
|
|
581
|
+
abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, address(_token))),
|
|
582
|
+
abi.encode(terminal)
|
|
583
|
+
);
|
|
584
|
+
|
|
585
|
+
// mock to JBTokens mintFor
|
|
586
|
+
mockExpect(
|
|
587
|
+
address(tokens),
|
|
588
|
+
abi.encodeCall(IJBTokens.mintFor, (address(_controller), 1, _tokenCount)),
|
|
589
|
+
abi.encode(address(_token))
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
vm.expectRevert(abi.encodeWithSignature(("SafeERC20FailedOperation(address)"), address(_token)));
|
|
593
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBControllerSetup} from "./JBControllerSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestSetSplitGroupsOf_Local is JBControllerSetup {
|
|
8
|
+
uint256 _projectId = 1;
|
|
9
|
+
uint256 _rulesetId = block.timestamp;
|
|
10
|
+
|
|
11
|
+
function setUp() public {
|
|
12
|
+
super.controllerSetup();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function test_WhenCallerIsPermissioned() external {
|
|
16
|
+
// it will call JBSplits and "set splits"
|
|
17
|
+
|
|
18
|
+
// data for calls
|
|
19
|
+
JBSplitGroup[] memory _splitGroups = new JBSplitGroup[](0);
|
|
20
|
+
|
|
21
|
+
// mock call to JBProjects ownerOf for permission check
|
|
22
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
23
|
+
bytes memory _ownerOfReturn = abi.encode(address(this));
|
|
24
|
+
mockExpect(address(projects), _ownerOfCall, _ownerOfReturn);
|
|
25
|
+
|
|
26
|
+
// mock call to JBSplits setSplitGroupsOf
|
|
27
|
+
bytes memory _setSplitsCall = abi.encodeCall(IJBSplits.setSplitGroupsOf, (_projectId, _rulesetId, _splitGroups));
|
|
28
|
+
mockExpect(address(splits), _setSplitsCall, "");
|
|
29
|
+
|
|
30
|
+
_controller.setSplitGroupsOf(_projectId, _rulesetId, _splitGroups);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function test_WhenCallerIsNotPermissioned() external {
|
|
34
|
+
// it will revert UNAUTHORIZED
|
|
35
|
+
|
|
36
|
+
// data for calls
|
|
37
|
+
JBSplitGroup[] memory _splitGroups = new JBSplitGroup[](0);
|
|
38
|
+
|
|
39
|
+
// mock call to JBProjects ownerOf for permission check
|
|
40
|
+
bytes memory _ownerOfCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
|
|
41
|
+
address _ownerOfReturn = address(0);
|
|
42
|
+
mockExpect(address(projects), _ownerOfCall, abi.encode(_ownerOfReturn));
|
|
43
|
+
|
|
44
|
+
// mock call to JBPermissions
|
|
45
|
+
bytes memory _permCall = abi.encodeCall(
|
|
46
|
+
IJBPermissions.hasPermission,
|
|
47
|
+
(address(this), address(0), _projectId, JBPermissionIds.SET_SPLIT_GROUPS, true, true)
|
|
48
|
+
);
|
|
49
|
+
bytes memory _permReturn = abi.encode(false);
|
|
50
|
+
mockExpect(address(permissions), _permCall, _permReturn);
|
|
51
|
+
|
|
52
|
+
vm.expectRevert(
|
|
53
|
+
abi.encodeWithSelector(
|
|
54
|
+
JBPermissioned.JBPermissioned_Unauthorized.selector,
|
|
55
|
+
_ownerOfReturn,
|
|
56
|
+
address(this),
|
|
57
|
+
_projectId,
|
|
58
|
+
JBPermissionIds.SET_SPLIT_GROUPS
|
|
59
|
+
)
|
|
60
|
+
);
|
|
61
|
+
_controller.setSplitGroupsOf(_projectId, _rulesetId, _splitGroups);
|
|
62
|
+
}
|
|
63
|
+
}
|