@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,526 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBRulesetsSetup} from "./JBRulesetsSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestUpcomingOf_Local is JBRulesetsSetup {
|
|
8
|
+
// Necessary params
|
|
9
|
+
JBRulesetMetadata private _metadata;
|
|
10
|
+
JBRulesetMetadata private _metadataWithApprovalHook;
|
|
11
|
+
IJBRulesetApprovalHook private _mockApprovalHook = IJBRulesetApprovalHook(makeAddr("hook"));
|
|
12
|
+
uint256 _packedMetadata;
|
|
13
|
+
uint256 _packedWithApprovalHook;
|
|
14
|
+
uint256 _projectId = 1;
|
|
15
|
+
uint256 _duration = 3 days;
|
|
16
|
+
uint256 _weight = 0;
|
|
17
|
+
uint256 _weightCutPercent = 450_000_000;
|
|
18
|
+
uint48 _mustStartAt = 0;
|
|
19
|
+
uint256 _hookDuration = 1 days;
|
|
20
|
+
IJBRulesetApprovalHook private _noHook = IJBRulesetApprovalHook(address(0));
|
|
21
|
+
|
|
22
|
+
function setUp() public {
|
|
23
|
+
super.rulesetsSetup();
|
|
24
|
+
|
|
25
|
+
// Params for tests
|
|
26
|
+
_metadata = JBRulesetMetadata({
|
|
27
|
+
reservedPercent: 0,
|
|
28
|
+
cashOutTaxRate: 0,
|
|
29
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
30
|
+
pausePay: false,
|
|
31
|
+
pauseCreditTransfers: false,
|
|
32
|
+
allowOwnerMinting: false,
|
|
33
|
+
allowSetCustomToken: false,
|
|
34
|
+
allowTerminalMigration: false,
|
|
35
|
+
allowSetTerminals: false,
|
|
36
|
+
ownerMustSendPayouts: false,
|
|
37
|
+
allowSetController: false,
|
|
38
|
+
allowAddAccountingContext: true,
|
|
39
|
+
allowAddPriceFeed: false,
|
|
40
|
+
holdFees: false,
|
|
41
|
+
useTotalSurplusForCashOuts: false,
|
|
42
|
+
useDataHookForPay: false,
|
|
43
|
+
useDataHookForCashOut: false,
|
|
44
|
+
dataHook: address(0),
|
|
45
|
+
metadata: 0
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Params for tests
|
|
49
|
+
_metadataWithApprovalHook = JBRulesetMetadata({
|
|
50
|
+
reservedPercent: 0,
|
|
51
|
+
cashOutTaxRate: 0,
|
|
52
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
53
|
+
pausePay: false,
|
|
54
|
+
pauseCreditTransfers: false,
|
|
55
|
+
allowOwnerMinting: false,
|
|
56
|
+
allowSetCustomToken: false,
|
|
57
|
+
allowTerminalMigration: false,
|
|
58
|
+
allowSetTerminals: false,
|
|
59
|
+
ownerMustSendPayouts: false,
|
|
60
|
+
allowSetController: false,
|
|
61
|
+
allowAddAccountingContext: true,
|
|
62
|
+
allowAddPriceFeed: false,
|
|
63
|
+
holdFees: false,
|
|
64
|
+
useTotalSurplusForCashOuts: false,
|
|
65
|
+
useDataHookForPay: false,
|
|
66
|
+
useDataHookForCashOut: false,
|
|
67
|
+
dataHook: address(0),
|
|
68
|
+
metadata: 0
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
_packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
72
|
+
_packedWithApprovalHook = JBRulesetMetadataResolver.packRulesetMetadata(_metadataWithApprovalHook);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function test_WhenLatestRulesetIdEQZero() external view {
|
|
76
|
+
// it will return an empty ruleset
|
|
77
|
+
|
|
78
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
79
|
+
assertEq(_upcoming.id, 0);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
modifier whenUpcomingRulesetIdDNEQZero() {
|
|
83
|
+
// put code at hook address
|
|
84
|
+
vm.etch(address(_mockApprovalHook), abi.encode(1));
|
|
85
|
+
|
|
86
|
+
// mock call to hook interface support
|
|
87
|
+
mockExpect(
|
|
88
|
+
address(_mockApprovalHook),
|
|
89
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
90
|
+
abi.encode(true)
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
94
|
+
// permissions, encode & mock that.
|
|
95
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
96
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
97
|
+
|
|
98
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
99
|
+
|
|
100
|
+
// mock call to hook duration
|
|
101
|
+
mockExpect(
|
|
102
|
+
address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
106
|
+
vm.expectEmit();
|
|
107
|
+
emit IJBRulesets.RulesetQueued(
|
|
108
|
+
block.timestamp,
|
|
109
|
+
_projectId,
|
|
110
|
+
_duration,
|
|
111
|
+
_weight,
|
|
112
|
+
_weightCutPercent,
|
|
113
|
+
_mockApprovalHook,
|
|
114
|
+
_packedWithApprovalHook,
|
|
115
|
+
block.timestamp,
|
|
116
|
+
address(this)
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
120
|
+
_rulesets.queueFor({
|
|
121
|
+
projectId: _projectId,
|
|
122
|
+
duration: _duration,
|
|
123
|
+
weight: _weight,
|
|
124
|
+
weightCutPercent: _weightCutPercent,
|
|
125
|
+
approvalHook: _mockApprovalHook,
|
|
126
|
+
metadata: _packedWithApprovalHook,
|
|
127
|
+
mustStartAtOrAfter: _mustStartAt
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
131
|
+
vm.expectEmit();
|
|
132
|
+
emit IJBRulesets.RulesetQueued(
|
|
133
|
+
block.timestamp + 1,
|
|
134
|
+
_projectId,
|
|
135
|
+
_duration,
|
|
136
|
+
_weight,
|
|
137
|
+
_weightCutPercent,
|
|
138
|
+
_mockApprovalHook,
|
|
139
|
+
_packedWithApprovalHook,
|
|
140
|
+
block.timestamp,
|
|
141
|
+
address(this)
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
145
|
+
_rulesets.queueFor({
|
|
146
|
+
projectId: _projectId,
|
|
147
|
+
duration: _duration,
|
|
148
|
+
weight: _weight,
|
|
149
|
+
weightCutPercent: _weightCutPercent,
|
|
150
|
+
approvalHook: _mockApprovalHook,
|
|
151
|
+
metadata: _packedWithApprovalHook,
|
|
152
|
+
mustStartAtOrAfter: _mustStartAt
|
|
153
|
+
});
|
|
154
|
+
_;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function test_GivenStatusEQApprovedOrApprovalExpectedOrEmpty() external whenUpcomingRulesetIdDNEQZero {
|
|
158
|
+
// it will return that ruleset
|
|
159
|
+
uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
|
|
160
|
+
JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
|
|
161
|
+
|
|
162
|
+
// mock call to hook approvalStatusOf
|
|
163
|
+
mockExpect(
|
|
164
|
+
address(_mockApprovalHook),
|
|
165
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
|
|
166
|
+
abi.encode(JBApprovalStatus.ApprovalExpected)
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
170
|
+
assertEq(_upcoming.id, block.timestamp + 1); // timestamp + 1 = second queued, since the preceeding ruleset is
|
|
171
|
+
// in
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function test_GivenStatusDNEQApprovedOrApprovalExpectedOrEmpty() external whenUpcomingRulesetIdDNEQZero {
|
|
175
|
+
// it will return the ruleset upcoming was based on
|
|
176
|
+
uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
|
|
177
|
+
JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
|
|
178
|
+
|
|
179
|
+
// mock call to hook approvalStatusOf
|
|
180
|
+
mockExpect(
|
|
181
|
+
address(_mockApprovalHook),
|
|
182
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
|
|
183
|
+
abi.encode(JBApprovalStatus.Active)
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
187
|
+
assertEq(_upcoming.id, block.timestamp); // first queued, since the preceeding ruleset approval hook is still
|
|
188
|
+
// "Active"
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function test_GivenTheLatestRulesetStartsInTheFuture() external {
|
|
192
|
+
// it will return the ruleset that latestRuleset is based on, which is zero in this case, which defaults to an
|
|
193
|
+
// approval status of "Empty"
|
|
194
|
+
|
|
195
|
+
// put code at hook address
|
|
196
|
+
vm.etch(address(_mockApprovalHook), abi.encode(1));
|
|
197
|
+
|
|
198
|
+
// mock call to hook interface support
|
|
199
|
+
mockExpect(
|
|
200
|
+
address(_mockApprovalHook),
|
|
201
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
202
|
+
abi.encode(true)
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
206
|
+
// permissions, encode & mock that.
|
|
207
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
208
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
209
|
+
|
|
210
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
211
|
+
|
|
212
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
213
|
+
vm.expectEmit();
|
|
214
|
+
emit IJBRulesets.RulesetQueued(
|
|
215
|
+
block.timestamp,
|
|
216
|
+
_projectId,
|
|
217
|
+
_duration,
|
|
218
|
+
_weight,
|
|
219
|
+
_weightCutPercent,
|
|
220
|
+
_mockApprovalHook,
|
|
221
|
+
_packedWithApprovalHook,
|
|
222
|
+
block.timestamp + 10 days, // starts in the future
|
|
223
|
+
address(this)
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
227
|
+
_rulesets.queueFor({
|
|
228
|
+
projectId: _projectId,
|
|
229
|
+
duration: _duration,
|
|
230
|
+
weight: _weight,
|
|
231
|
+
weightCutPercent: _weightCutPercent,
|
|
232
|
+
approvalHook: _mockApprovalHook,
|
|
233
|
+
metadata: _packedWithApprovalHook,
|
|
234
|
+
mustStartAtOrAfter: uint48(block.timestamp + 10 days)
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
238
|
+
assertEq(_upcoming.id, block.timestamp);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function test_WhenLatestRulesetHasDurationEqZero() external {
|
|
242
|
+
// it will return an empty ruleset
|
|
243
|
+
|
|
244
|
+
// put code at hook address
|
|
245
|
+
vm.etch(address(_mockApprovalHook), abi.encode(1));
|
|
246
|
+
|
|
247
|
+
// mock call to hook interface support
|
|
248
|
+
mockExpect(
|
|
249
|
+
address(_mockApprovalHook),
|
|
250
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
251
|
+
abi.encode(true)
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
255
|
+
// permissions, encode & mock that.
|
|
256
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
257
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
258
|
+
|
|
259
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
260
|
+
|
|
261
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
262
|
+
vm.expectEmit();
|
|
263
|
+
emit IJBRulesets.RulesetQueued(
|
|
264
|
+
block.timestamp,
|
|
265
|
+
_projectId,
|
|
266
|
+
0, // duration zero
|
|
267
|
+
_weight,
|
|
268
|
+
_weightCutPercent,
|
|
269
|
+
_mockApprovalHook,
|
|
270
|
+
_packedWithApprovalHook,
|
|
271
|
+
block.timestamp,
|
|
272
|
+
address(this)
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
276
|
+
_rulesets.queueFor({
|
|
277
|
+
projectId: _projectId,
|
|
278
|
+
duration: 0,
|
|
279
|
+
weight: _weight,
|
|
280
|
+
weightCutPercent: _weightCutPercent,
|
|
281
|
+
approvalHook: _mockApprovalHook,
|
|
282
|
+
metadata: _packedWithApprovalHook,
|
|
283
|
+
mustStartAtOrAfter: _mustStartAt
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// mock call to hook duration
|
|
287
|
+
mockExpect(
|
|
288
|
+
address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
292
|
+
vm.expectEmit();
|
|
293
|
+
emit IJBRulesets.RulesetQueued(
|
|
294
|
+
block.timestamp + 1, // incremented by one since queued in the same block and we cant have duplicate ids
|
|
295
|
+
_projectId,
|
|
296
|
+
0, // duration zero
|
|
297
|
+
_weight,
|
|
298
|
+
_weightCutPercent,
|
|
299
|
+
_mockApprovalHook,
|
|
300
|
+
_packedWithApprovalHook,
|
|
301
|
+
block.timestamp + 10 days,
|
|
302
|
+
address(this)
|
|
303
|
+
);
|
|
304
|
+
|
|
305
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
306
|
+
_rulesets.queueFor({
|
|
307
|
+
projectId: _projectId,
|
|
308
|
+
duration: 0,
|
|
309
|
+
weight: _weight,
|
|
310
|
+
weightCutPercent: _weightCutPercent,
|
|
311
|
+
approvalHook: _mockApprovalHook,
|
|
312
|
+
metadata: _packedWithApprovalHook,
|
|
313
|
+
mustStartAtOrAfter: uint48(block.timestamp + 10 days)
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
vm.warp(block.timestamp + 11 days);
|
|
317
|
+
|
|
318
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
319
|
+
assertEq(_upcoming.id, 0);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function test_GivenApprovalStatusIsApprovedOrEmpty() external whenUpcomingRulesetIdDNEQZero {
|
|
323
|
+
// it will return a simulatedCycledRulesetBasedOn
|
|
324
|
+
uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
|
|
325
|
+
JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
|
|
326
|
+
|
|
327
|
+
// mock call to hook approvalStatusOf
|
|
328
|
+
mockExpect(
|
|
329
|
+
address(_mockApprovalHook),
|
|
330
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
|
|
331
|
+
abi.encode(JBApprovalStatus.Approved)
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
335
|
+
assertEq(_upcoming.id, block.timestamp + 1); // timestamp + 1 = second queued
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function test_GivenTheRulesetsApprovalFailedAndItsBasedOnDurationDNEQZero() external whenUpcomingRulesetIdDNEQZero {
|
|
339
|
+
// it will return the simulatedCycledRulesetBasedOn it was based on
|
|
340
|
+
uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
|
|
341
|
+
JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
|
|
342
|
+
|
|
343
|
+
// mock call to hook approvalStatusOf
|
|
344
|
+
mockExpect(
|
|
345
|
+
address(_mockApprovalHook),
|
|
346
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
|
|
347
|
+
abi.encode(JBApprovalStatus.Failed)
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
351
|
+
assertEq(_upcoming.id, block.timestamp); // first timestamp = first queued
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// duplicate covered above in a single case
|
|
355
|
+
function test_GivenTheRulesetsApprovalFailedAndItsBasedOnDurationEQZero() external {
|
|
356
|
+
// it will return an empty ruleset
|
|
357
|
+
|
|
358
|
+
// put code at hook address
|
|
359
|
+
vm.etch(address(_mockApprovalHook), abi.encode(1));
|
|
360
|
+
|
|
361
|
+
// mock call to hook interface support
|
|
362
|
+
mockExpect(
|
|
363
|
+
address(_mockApprovalHook),
|
|
364
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
365
|
+
abi.encode(true)
|
|
366
|
+
);
|
|
367
|
+
|
|
368
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
369
|
+
// permissions, encode & mock that.
|
|
370
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
371
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
372
|
+
|
|
373
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
374
|
+
|
|
375
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
376
|
+
vm.expectEmit();
|
|
377
|
+
emit IJBRulesets.RulesetQueued(
|
|
378
|
+
block.timestamp,
|
|
379
|
+
_projectId,
|
|
380
|
+
0, // duration zero
|
|
381
|
+
_weight,
|
|
382
|
+
_weightCutPercent,
|
|
383
|
+
_mockApprovalHook,
|
|
384
|
+
_packedWithApprovalHook,
|
|
385
|
+
block.timestamp,
|
|
386
|
+
address(this)
|
|
387
|
+
);
|
|
388
|
+
|
|
389
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
390
|
+
_rulesets.queueFor({
|
|
391
|
+
projectId: _projectId,
|
|
392
|
+
duration: 0,
|
|
393
|
+
weight: _weight,
|
|
394
|
+
weightCutPercent: _weightCutPercent,
|
|
395
|
+
approvalHook: _mockApprovalHook,
|
|
396
|
+
metadata: _packedWithApprovalHook,
|
|
397
|
+
mustStartAtOrAfter: _mustStartAt
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
// mock call to hook duration
|
|
401
|
+
mockExpect(
|
|
402
|
+
address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
|
|
403
|
+
);
|
|
404
|
+
|
|
405
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
406
|
+
vm.expectEmit();
|
|
407
|
+
emit IJBRulesets.RulesetQueued(
|
|
408
|
+
block.timestamp + 1, // incremented by one since queued in the same block and we cant have duplicate ids
|
|
409
|
+
_projectId,
|
|
410
|
+
_duration,
|
|
411
|
+
_weight,
|
|
412
|
+
_weightCutPercent,
|
|
413
|
+
_mockApprovalHook,
|
|
414
|
+
_packedWithApprovalHook,
|
|
415
|
+
block.timestamp + 10 days,
|
|
416
|
+
address(this)
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
420
|
+
_rulesets.queueFor({
|
|
421
|
+
projectId: _projectId,
|
|
422
|
+
duration: _duration,
|
|
423
|
+
weight: _weight,
|
|
424
|
+
weightCutPercent: _weightCutPercent,
|
|
425
|
+
approvalHook: _mockApprovalHook,
|
|
426
|
+
metadata: _packedWithApprovalHook,
|
|
427
|
+
mustStartAtOrAfter: uint48(block.timestamp + 10 days)
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
// it will return the simulatedCycledRulesetBasedOn it was based on
|
|
431
|
+
uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
|
|
432
|
+
JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
|
|
433
|
+
|
|
434
|
+
// mock call to hook approvalStatusOf
|
|
435
|
+
mockExpect(
|
|
436
|
+
address(_mockApprovalHook),
|
|
437
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
|
|
438
|
+
abi.encode(JBApprovalStatus.ApprovalExpected)
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
vm.warp(block.timestamp + 11 days);
|
|
442
|
+
|
|
443
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
444
|
+
assertEq(_upcoming.id, 0);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Not sure how to reach the last line of this function..
|
|
448
|
+
function test_baseRulesetDurationDNEQZero() external {
|
|
449
|
+
// it will simulate a ruleset basedOn
|
|
450
|
+
|
|
451
|
+
uint256 ogTimestamp = block.timestamp;
|
|
452
|
+
|
|
453
|
+
// put code at hook address
|
|
454
|
+
vm.etch(address(_mockApprovalHook), abi.encode(1));
|
|
455
|
+
|
|
456
|
+
// mock call to hook interface support
|
|
457
|
+
mockExpect(
|
|
458
|
+
address(_mockApprovalHook),
|
|
459
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
460
|
+
abi.encode(true)
|
|
461
|
+
);
|
|
462
|
+
|
|
463
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
464
|
+
// permissions, encode & mock that.
|
|
465
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
466
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
467
|
+
|
|
468
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
469
|
+
|
|
470
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
471
|
+
vm.expectEmit();
|
|
472
|
+
emit IJBRulesets.RulesetQueued(
|
|
473
|
+
block.timestamp,
|
|
474
|
+
_projectId,
|
|
475
|
+
_duration,
|
|
476
|
+
_weight,
|
|
477
|
+
_weightCutPercent,
|
|
478
|
+
_mockApprovalHook,
|
|
479
|
+
_packedWithApprovalHook,
|
|
480
|
+
block.timestamp,
|
|
481
|
+
address(this)
|
|
482
|
+
);
|
|
483
|
+
|
|
484
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
485
|
+
_rulesets.queueFor({
|
|
486
|
+
projectId: _projectId,
|
|
487
|
+
duration: _duration,
|
|
488
|
+
weight: _weight,
|
|
489
|
+
weightCutPercent: _weightCutPercent,
|
|
490
|
+
approvalHook: _mockApprovalHook,
|
|
491
|
+
metadata: _packedWithApprovalHook,
|
|
492
|
+
mustStartAtOrAfter: _mustStartAt
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
// mock call to hook duration
|
|
496
|
+
mockExpect(
|
|
497
|
+
address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
|
|
498
|
+
);
|
|
499
|
+
|
|
500
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
501
|
+
_rulesets.queueFor({
|
|
502
|
+
projectId: _projectId,
|
|
503
|
+
duration: _duration,
|
|
504
|
+
weight: _weight,
|
|
505
|
+
weightCutPercent: _weightCutPercent,
|
|
506
|
+
approvalHook: _mockApprovalHook,
|
|
507
|
+
metadata: _packedWithApprovalHook,
|
|
508
|
+
mustStartAtOrAfter: 0
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
vm.warp(block.timestamp + 3 days);
|
|
512
|
+
|
|
513
|
+
uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
|
|
514
|
+
JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
|
|
515
|
+
|
|
516
|
+
// mock call to hook approvalStatusOf
|
|
517
|
+
mockExpect(
|
|
518
|
+
address(_mockApprovalHook),
|
|
519
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
|
|
520
|
+
abi.encode(JBApprovalStatus.Failed)
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
JBRuleset memory _upcoming = _rulesets.upcomingOf(_projectId);
|
|
524
|
+
assertEq(_upcoming.id, ogTimestamp); // original id
|
|
525
|
+
}
|
|
526
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBRulesetsSetup} from "./JBRulesetsSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestUpdateRulesetWeightCache_Local is JBRulesetsSetup {
|
|
8
|
+
// Necessary params
|
|
9
|
+
JBRulesetMetadata private _metadata;
|
|
10
|
+
uint256 _packedMetadata;
|
|
11
|
+
uint256 _projectId = 1;
|
|
12
|
+
uint256 _duration = 3 days;
|
|
13
|
+
uint256 _weight = 0;
|
|
14
|
+
uint256 _weightCutPercent = 450_000_000;
|
|
15
|
+
uint48 _mustStartAt = 0;
|
|
16
|
+
uint256 _hookDuration = 1 days;
|
|
17
|
+
IJBRulesetApprovalHook private _noHook = IJBRulesetApprovalHook(address(0));
|
|
18
|
+
|
|
19
|
+
function setUp() public {
|
|
20
|
+
super.rulesetsSetup();
|
|
21
|
+
|
|
22
|
+
// Params for tests
|
|
23
|
+
_metadata = JBRulesetMetadata({
|
|
24
|
+
reservedPercent: 0,
|
|
25
|
+
cashOutTaxRate: 0,
|
|
26
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
27
|
+
pausePay: false,
|
|
28
|
+
pauseCreditTransfers: false,
|
|
29
|
+
allowOwnerMinting: false,
|
|
30
|
+
allowSetCustomToken: false,
|
|
31
|
+
allowTerminalMigration: false,
|
|
32
|
+
allowSetTerminals: false,
|
|
33
|
+
ownerMustSendPayouts: false,
|
|
34
|
+
allowSetController: false,
|
|
35
|
+
allowAddAccountingContext: true,
|
|
36
|
+
allowAddPriceFeed: false,
|
|
37
|
+
holdFees: false,
|
|
38
|
+
useTotalSurplusForCashOuts: false,
|
|
39
|
+
useDataHookForPay: false,
|
|
40
|
+
useDataHookForCashOut: false,
|
|
41
|
+
dataHook: address(0),
|
|
42
|
+
metadata: 0
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
_packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function test_WhenLatestRulesetOfProjectDurationOrWeightCutPercentEQZero() external {
|
|
49
|
+
// it will return without updating
|
|
50
|
+
|
|
51
|
+
_rulesets.updateRulesetWeightCache(_projectId);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function test_WhenLatestRulesetHasProperDurationAndWeightCutPercent() external {
|
|
55
|
+
// it will store a new derivedWeightFrom and weightCutMultiple in storage
|
|
56
|
+
|
|
57
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
58
|
+
// permissions, encode & mock that.
|
|
59
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
60
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
61
|
+
|
|
62
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
63
|
+
|
|
64
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
65
|
+
vm.expectEmit();
|
|
66
|
+
emit IJBRulesets.RulesetQueued(
|
|
67
|
+
block.timestamp,
|
|
68
|
+
_projectId,
|
|
69
|
+
_duration,
|
|
70
|
+
_weight,
|
|
71
|
+
_weightCutPercent,
|
|
72
|
+
_noHook,
|
|
73
|
+
_packedMetadata,
|
|
74
|
+
block.timestamp,
|
|
75
|
+
address(this)
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
79
|
+
_rulesets.queueFor({
|
|
80
|
+
projectId: _projectId,
|
|
81
|
+
duration: _duration,
|
|
82
|
+
weight: _weight,
|
|
83
|
+
weightCutPercent: _weightCutPercent,
|
|
84
|
+
approvalHook: _noHook,
|
|
85
|
+
metadata: _packedMetadata,
|
|
86
|
+
mustStartAtOrAfter: _mustStartAt
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
_rulesets.updateRulesetWeightCache(_projectId);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
Contract that deploys a target contract with other mock contracts to satisfy the constructor.
|
|
8
|
+
Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
|
|
9
|
+
*/
|
|
10
|
+
contract JBSplitsSetup is JBTest {
|
|
11
|
+
address _owner = makeAddr("owner");
|
|
12
|
+
|
|
13
|
+
// Mocks
|
|
14
|
+
IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
|
|
15
|
+
|
|
16
|
+
// Target Contract
|
|
17
|
+
IJBSplits public _splits;
|
|
18
|
+
|
|
19
|
+
function splitsSetup() public virtual {
|
|
20
|
+
// Instantiate the contract being tested
|
|
21
|
+
_splits = new JBSplits(directory);
|
|
22
|
+
}
|
|
23
|
+
}
|