@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,617 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBRulesetWeightCache} from "src/structs/JBRulesetWeightCache.sol";
|
|
6
|
+
|
|
7
|
+
contract TestJBRulesetsUnits_Local is JBTest {
|
|
8
|
+
// Contracts
|
|
9
|
+
JBRulesets public _rulesets;
|
|
10
|
+
IJBDirectory internal _directory;
|
|
11
|
+
IJBPermissions internal _permissions;
|
|
12
|
+
|
|
13
|
+
// Necessary params
|
|
14
|
+
JBRulesetMetadata private _metadata;
|
|
15
|
+
JBRulesetMetadata private _metadataWithApprovalHook;
|
|
16
|
+
IJBRulesetApprovalHook private _mockApprovalHook = IJBRulesetApprovalHook(makeAddr("hook"));
|
|
17
|
+
uint256 _packedMetadata;
|
|
18
|
+
uint256 _packedWithApprovalHook;
|
|
19
|
+
uint64 _projectId = 1;
|
|
20
|
+
uint32 _duration = 3 days;
|
|
21
|
+
uint112 _weight = 0;
|
|
22
|
+
uint32 _weightCutPercent = 450_000_000;
|
|
23
|
+
uint256 _mustStartAt = 0;
|
|
24
|
+
uint256 _hookDuration = 1 days;
|
|
25
|
+
IJBRulesetApprovalHook private _hook = IJBRulesetApprovalHook(address(0));
|
|
26
|
+
|
|
27
|
+
function equals(JBRuleset memory queued, JBRuleset memory stored) internal pure returns (bool) {
|
|
28
|
+
// Just compare the output of hashing all fields packed.
|
|
29
|
+
return (keccak256(
|
|
30
|
+
abi.encodePacked(
|
|
31
|
+
queued.cycleNumber,
|
|
32
|
+
queued.id,
|
|
33
|
+
queued.basedOnId,
|
|
34
|
+
queued.start,
|
|
35
|
+
queued.duration,
|
|
36
|
+
queued.weight,
|
|
37
|
+
queued.weightCutPercent,
|
|
38
|
+
queued.approvalHook,
|
|
39
|
+
queued.metadata
|
|
40
|
+
)
|
|
41
|
+
)
|
|
42
|
+
== keccak256(
|
|
43
|
+
abi.encodePacked(
|
|
44
|
+
stored.cycleNumber,
|
|
45
|
+
stored.id,
|
|
46
|
+
stored.basedOnId,
|
|
47
|
+
stored.start,
|
|
48
|
+
stored.duration,
|
|
49
|
+
stored.weight,
|
|
50
|
+
stored.weightCutPercent,
|
|
51
|
+
stored.approvalHook,
|
|
52
|
+
stored.metadata
|
|
53
|
+
)
|
|
54
|
+
));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function setUp() public {
|
|
58
|
+
// Mock contracts and label them
|
|
59
|
+
_directory = IJBDirectory(makeAddr("JBDirectory"));
|
|
60
|
+
_permissions = IJBPermissions(makeAddr("JBPermissions"));
|
|
61
|
+
|
|
62
|
+
// Instantiate the contract being tested
|
|
63
|
+
_rulesets = new JBRulesets(_directory);
|
|
64
|
+
|
|
65
|
+
// Params for tests
|
|
66
|
+
_metadata = JBRulesetMetadata({
|
|
67
|
+
reservedPercent: 0,
|
|
68
|
+
cashOutTaxRate: 0,
|
|
69
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
70
|
+
pausePay: false,
|
|
71
|
+
pauseCreditTransfers: false,
|
|
72
|
+
allowOwnerMinting: false,
|
|
73
|
+
allowSetCustomToken: false,
|
|
74
|
+
allowTerminalMigration: false,
|
|
75
|
+
allowSetTerminals: false,
|
|
76
|
+
ownerMustSendPayouts: false,
|
|
77
|
+
allowSetController: false,
|
|
78
|
+
allowAddAccountingContext: true,
|
|
79
|
+
allowAddPriceFeed: false,
|
|
80
|
+
holdFees: false,
|
|
81
|
+
useTotalSurplusForCashOuts: false,
|
|
82
|
+
useDataHookForPay: false,
|
|
83
|
+
useDataHookForCashOut: false,
|
|
84
|
+
dataHook: address(0),
|
|
85
|
+
metadata: 0
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Params for tests
|
|
89
|
+
_metadataWithApprovalHook = JBRulesetMetadata({
|
|
90
|
+
reservedPercent: 0,
|
|
91
|
+
cashOutTaxRate: 0,
|
|
92
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
93
|
+
pausePay: false,
|
|
94
|
+
pauseCreditTransfers: false,
|
|
95
|
+
allowOwnerMinting: false,
|
|
96
|
+
allowSetCustomToken: false,
|
|
97
|
+
allowTerminalMigration: false,
|
|
98
|
+
allowSetTerminals: false,
|
|
99
|
+
ownerMustSendPayouts: false,
|
|
100
|
+
allowSetController: false,
|
|
101
|
+
allowAddAccountingContext: true,
|
|
102
|
+
allowAddPriceFeed: false,
|
|
103
|
+
holdFees: false,
|
|
104
|
+
useTotalSurplusForCashOuts: false,
|
|
105
|
+
useDataHookForPay: false,
|
|
106
|
+
useDataHookForCashOut: false,
|
|
107
|
+
dataHook: address(0),
|
|
108
|
+
metadata: 0
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
_packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
112
|
+
_packedWithApprovalHook = JBRulesetMetadataResolver.packRulesetMetadata(_metadataWithApprovalHook);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function testQueueForHappyPath() public {
|
|
116
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
117
|
+
// permissions, encode & mock that.
|
|
118
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
119
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
120
|
+
|
|
121
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
122
|
+
|
|
123
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
124
|
+
vm.expectEmit();
|
|
125
|
+
emit IJBRulesets.RulesetQueued(
|
|
126
|
+
block.timestamp,
|
|
127
|
+
_projectId,
|
|
128
|
+
_duration,
|
|
129
|
+
_weight,
|
|
130
|
+
_weightCutPercent,
|
|
131
|
+
_hook,
|
|
132
|
+
_packedMetadata,
|
|
133
|
+
block.timestamp,
|
|
134
|
+
address(this)
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
138
|
+
_rulesets.queueFor({
|
|
139
|
+
projectId: _projectId,
|
|
140
|
+
duration: _duration,
|
|
141
|
+
weight: _weight,
|
|
142
|
+
weightCutPercent: _weightCutPercent,
|
|
143
|
+
approvalHook: _hook,
|
|
144
|
+
metadata: _packedMetadata,
|
|
145
|
+
mustStartAtOrAfter: _mustStartAt
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Get a reference to the now configured ruleset.
|
|
149
|
+
JBRuleset memory configuredRuleset = _rulesets.currentOf(_projectId);
|
|
150
|
+
|
|
151
|
+
// Reference queued attributes for sake of comparison.
|
|
152
|
+
JBRuleset memory queued = JBRuleset({
|
|
153
|
+
cycleNumber: 1,
|
|
154
|
+
id: uint48(block.timestamp),
|
|
155
|
+
basedOnId: 0,
|
|
156
|
+
start: uint48(block.timestamp),
|
|
157
|
+
duration: _duration,
|
|
158
|
+
weight: _weight,
|
|
159
|
+
weightCutPercent: _weightCutPercent,
|
|
160
|
+
approvalHook: _hook,
|
|
161
|
+
metadata: configuredRuleset.metadata
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Check: structs are the same.
|
|
165
|
+
bool same = equals(queued, configuredRuleset);
|
|
166
|
+
assertEq(same, true);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function testQueueForPastMustStart() public {
|
|
170
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
171
|
+
// permissions, encode & mock that.
|
|
172
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
173
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
174
|
+
|
|
175
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
176
|
+
|
|
177
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
178
|
+
vm.expectEmit();
|
|
179
|
+
emit IJBRulesets.RulesetQueued(
|
|
180
|
+
block.timestamp,
|
|
181
|
+
_projectId,
|
|
182
|
+
_duration,
|
|
183
|
+
_weight,
|
|
184
|
+
_weightCutPercent,
|
|
185
|
+
_hook,
|
|
186
|
+
_packedMetadata,
|
|
187
|
+
block.timestamp - 1,
|
|
188
|
+
address(this)
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
192
|
+
_rulesets.queueFor({
|
|
193
|
+
projectId: _projectId,
|
|
194
|
+
duration: _duration,
|
|
195
|
+
weight: _weight,
|
|
196
|
+
weightCutPercent: _weightCutPercent,
|
|
197
|
+
approvalHook: _hook,
|
|
198
|
+
metadata: _packedMetadata,
|
|
199
|
+
// Set this in the past
|
|
200
|
+
mustStartAtOrAfter: block.timestamp - 1
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// Get a reference to the now configured ruleset.
|
|
204
|
+
JBRuleset memory configuredRuleset = _rulesets.currentOf(_projectId);
|
|
205
|
+
|
|
206
|
+
// Reference queued attributes for sake of comparison.
|
|
207
|
+
JBRuleset memory queued = JBRuleset({
|
|
208
|
+
cycleNumber: 1,
|
|
209
|
+
id: uint48(block.timestamp),
|
|
210
|
+
basedOnId: 0,
|
|
211
|
+
start: uint48(block.timestamp - 1),
|
|
212
|
+
duration: _duration,
|
|
213
|
+
weight: _weight,
|
|
214
|
+
weightCutPercent: _weightCutPercent,
|
|
215
|
+
approvalHook: _hook,
|
|
216
|
+
metadata: configuredRuleset.metadata
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Check: structs are the same.
|
|
220
|
+
bool same = equals(queued, configuredRuleset);
|
|
221
|
+
assertEq(same, true);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function testQueueForInvalidDuration() public {
|
|
225
|
+
uint256 _invalidDuration = uint256(type(uint32).max) + 1;
|
|
226
|
+
|
|
227
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
228
|
+
// permissions, encode & mock that.
|
|
229
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
230
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
231
|
+
|
|
232
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
233
|
+
|
|
234
|
+
vm.expectRevert(
|
|
235
|
+
abi.encodeWithSelector(
|
|
236
|
+
JBRulesets.JBRulesets_InvalidRulesetDuration.selector, _invalidDuration, type(uint32).max
|
|
237
|
+
)
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
241
|
+
_rulesets.queueFor({
|
|
242
|
+
projectId: _projectId,
|
|
243
|
+
duration: _invalidDuration,
|
|
244
|
+
weight: _weight,
|
|
245
|
+
weightCutPercent: _weightCutPercent,
|
|
246
|
+
approvalHook: _hook,
|
|
247
|
+
metadata: _packedMetadata,
|
|
248
|
+
mustStartAtOrAfter: _mustStartAt
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function testQueueForInvalidWeightCutPercent() public {
|
|
253
|
+
uint256 _invalidWeightCutPercent = JBConstants.MAX_WEIGHT_CUT_PERCENT + 1;
|
|
254
|
+
|
|
255
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
256
|
+
// permissions, encode & mock that.
|
|
257
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
258
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
259
|
+
|
|
260
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
261
|
+
|
|
262
|
+
vm.expectRevert(
|
|
263
|
+
abi.encodeWithSelector(JBRulesets.JBRulesets_InvalidWeightCutPercent.selector, _invalidWeightCutPercent)
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
267
|
+
_rulesets.queueFor({
|
|
268
|
+
projectId: _projectId,
|
|
269
|
+
duration: _duration,
|
|
270
|
+
weight: _weight,
|
|
271
|
+
weightCutPercent: _invalidWeightCutPercent,
|
|
272
|
+
approvalHook: _hook,
|
|
273
|
+
metadata: _packedMetadata,
|
|
274
|
+
mustStartAtOrAfter: _mustStartAt
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function testQueueForInvalidWeight() public {
|
|
279
|
+
uint256 _invalidWeight = uint256(type(uint112).max) + 1;
|
|
280
|
+
|
|
281
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
282
|
+
// permissions, encode & mock that.
|
|
283
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
284
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
285
|
+
|
|
286
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
287
|
+
|
|
288
|
+
vm.expectRevert(
|
|
289
|
+
abi.encodeWithSelector(JBRulesets.JBRulesets_InvalidWeight.selector, _invalidWeight, type(uint112).max)
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
293
|
+
_rulesets.queueFor({
|
|
294
|
+
projectId: _projectId,
|
|
295
|
+
duration: _duration,
|
|
296
|
+
weight: _invalidWeight,
|
|
297
|
+
weightCutPercent: _weightCutPercent,
|
|
298
|
+
approvalHook: _hook,
|
|
299
|
+
metadata: _packedMetadata,
|
|
300
|
+
mustStartAtOrAfter: _mustStartAt
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function testFuzzQueueForInvalidEndTime(uint256 _bigDuration, uint256 _bigStartAt) public {
|
|
305
|
+
_bigDuration = bound(_bigDuration, 1, type(uint32).max);
|
|
306
|
+
_bigStartAt = bound(_bigStartAt, 1, type(uint48).max);
|
|
307
|
+
|
|
308
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
309
|
+
// permissions, encode & mock that.
|
|
310
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
311
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
312
|
+
|
|
313
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
314
|
+
|
|
315
|
+
// Use unchecked arithmetic to force an overflow.
|
|
316
|
+
uint256 _sum;
|
|
317
|
+
unchecked {
|
|
318
|
+
_sum = _bigDuration + _bigStartAt;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Sum should always be less if overflowed
|
|
322
|
+
if (_bigDuration > _sum) {
|
|
323
|
+
vm.expectRevert(stdError.arithmeticError);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (_bigDuration + _bigStartAt > type(uint48).max) {
|
|
327
|
+
vm.expectRevert(
|
|
328
|
+
abi.encodeWithSelector(
|
|
329
|
+
JBRulesets.JBRulesets_InvalidRulesetEndTime.selector, _bigDuration + _bigStartAt, type(uint48).max
|
|
330
|
+
)
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
335
|
+
_rulesets.queueFor({
|
|
336
|
+
projectId: _projectId,
|
|
337
|
+
duration: _bigDuration,
|
|
338
|
+
weight: _weight,
|
|
339
|
+
weightCutPercent: _weightCutPercent,
|
|
340
|
+
approvalHook: _hook,
|
|
341
|
+
metadata: _packedMetadata,
|
|
342
|
+
mustStartAtOrAfter: _bigStartAt
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function testQueueApprovalHookCodeReqsAndLogic() public {
|
|
347
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
348
|
+
// permissions, encode & mock that.
|
|
349
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
350
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
351
|
+
|
|
352
|
+
// note: this applies to subsequent calls unless we clear mocks
|
|
353
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
354
|
+
|
|
355
|
+
// will revert since code length is zero
|
|
356
|
+
vm.expectRevert(
|
|
357
|
+
abi.encodeWithSelector(JBRulesets.JBRulesets_InvalidRulesetApprovalHook.selector, _mockApprovalHook)
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
361
|
+
_rulesets.queueFor({
|
|
362
|
+
projectId: _projectId,
|
|
363
|
+
duration: _duration,
|
|
364
|
+
weight: _weight,
|
|
365
|
+
weightCutPercent: _weightCutPercent,
|
|
366
|
+
approvalHook: _mockApprovalHook,
|
|
367
|
+
metadata: _packedWithApprovalHook,
|
|
368
|
+
mustStartAtOrAfter: _mustStartAt
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
// try another with any length of code deployed and mock interface support to pass other checks
|
|
372
|
+
bytes memory code = address(_rulesets).code;
|
|
373
|
+
vm.etch(address(_mockApprovalHook), code);
|
|
374
|
+
|
|
375
|
+
bytes memory _encodedCall3 =
|
|
376
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId));
|
|
377
|
+
bytes memory _willReturn3 = abi.encode(true);
|
|
378
|
+
|
|
379
|
+
mockExpect(address(_mockApprovalHook), _encodedCall3, _willReturn3);
|
|
380
|
+
|
|
381
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
382
|
+
_rulesets.queueFor({
|
|
383
|
+
projectId: _projectId,
|
|
384
|
+
duration: _duration,
|
|
385
|
+
weight: _weight,
|
|
386
|
+
weightCutPercent: _weightCutPercent,
|
|
387
|
+
approvalHook: _mockApprovalHook,
|
|
388
|
+
metadata: _packedWithApprovalHook,
|
|
389
|
+
mustStartAtOrAfter: _mustStartAt
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
uint256 firstId = block.timestamp;
|
|
393
|
+
|
|
394
|
+
// Mock call to approval hook duration
|
|
395
|
+
bytes memory _encodedDurationCall = abi.encodeCall(IJBRulesetApprovalHook.DURATION, ());
|
|
396
|
+
bytes memory _willReturnDuration = abi.encode(_hookDuration);
|
|
397
|
+
|
|
398
|
+
mockExpect(address(_mockApprovalHook), _encodedDurationCall, _willReturnDuration);
|
|
399
|
+
|
|
400
|
+
// avoid overwrite
|
|
401
|
+
vm.warp(block.timestamp + 1);
|
|
402
|
+
|
|
403
|
+
uint256 latestId = block.timestamp;
|
|
404
|
+
|
|
405
|
+
// Send: Anotha One! Call from this contract as it's been mock authorized above.
|
|
406
|
+
_rulesets.queueFor({
|
|
407
|
+
projectId: _projectId,
|
|
408
|
+
duration: _duration,
|
|
409
|
+
weight: _weight,
|
|
410
|
+
weightCutPercent: _weightCutPercent,
|
|
411
|
+
approvalHook: _mockApprovalHook,
|
|
412
|
+
metadata: _packedWithApprovalHook,
|
|
413
|
+
mustStartAtOrAfter: block.timestamp
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
// avoid overwrite
|
|
417
|
+
vm.warp(block.timestamp + 2 days);
|
|
418
|
+
uint256 previouslyApprovedDurationEnds = block.timestamp + 3 days - 2 days - 1;
|
|
419
|
+
|
|
420
|
+
// Get the ruleset.
|
|
421
|
+
JBRuleset memory latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
|
|
422
|
+
|
|
423
|
+
// Mock call to approvalStatusOf and return an approved status
|
|
424
|
+
bytes memory _encodedApprovalCall =
|
|
425
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
|
|
426
|
+
bytes memory _willReturnStatus = abi.encode(JBApprovalStatus.Approved);
|
|
427
|
+
|
|
428
|
+
mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
|
|
429
|
+
|
|
430
|
+
// Send: Anotha One! Call from this contract as it's been mock authorized above.
|
|
431
|
+
_rulesets.queueFor({
|
|
432
|
+
projectId: _projectId,
|
|
433
|
+
duration: _duration,
|
|
434
|
+
weight: _weight,
|
|
435
|
+
weightCutPercent: _weightCutPercent,
|
|
436
|
+
approvalHook: _mockApprovalHook,
|
|
437
|
+
metadata: _packedWithApprovalHook,
|
|
438
|
+
mustStartAtOrAfter: block.timestamp
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
latestId = block.timestamp;
|
|
442
|
+
latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
|
|
443
|
+
|
|
444
|
+
// avoid overwrite
|
|
445
|
+
vm.warp(block.timestamp + 1);
|
|
446
|
+
|
|
447
|
+
previouslyApprovedDurationEnds = block.timestamp + 6 days - 2 days - 2;
|
|
448
|
+
|
|
449
|
+
// Mock call to approvalStatusOf and return an approvalExpected status
|
|
450
|
+
_encodedApprovalCall = abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
|
|
451
|
+
_willReturnStatus = abi.encode(JBApprovalStatus.ApprovalExpected);
|
|
452
|
+
|
|
453
|
+
mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
|
|
454
|
+
|
|
455
|
+
// Send: Anotha One! Call from this contract as it's been mock authorized above.
|
|
456
|
+
_rulesets.queueFor({
|
|
457
|
+
projectId: _projectId,
|
|
458
|
+
duration: _duration,
|
|
459
|
+
weight: _weight,
|
|
460
|
+
weightCutPercent: _weightCutPercent,
|
|
461
|
+
approvalHook: _mockApprovalHook,
|
|
462
|
+
metadata: _packedWithApprovalHook,
|
|
463
|
+
mustStartAtOrAfter: block.timestamp
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
latestId = block.timestamp;
|
|
467
|
+
latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
|
|
468
|
+
|
|
469
|
+
// avoid overwrite
|
|
470
|
+
vm.warp(block.timestamp + 1);
|
|
471
|
+
previouslyApprovedDurationEnds = block.timestamp + 6 days - 2 days - 3;
|
|
472
|
+
|
|
473
|
+
// Mock call to approvalStatusOf and return a failed status
|
|
474
|
+
_encodedApprovalCall = abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
|
|
475
|
+
_willReturnStatus = abi.encode(JBApprovalStatus.Failed);
|
|
476
|
+
|
|
477
|
+
mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
|
|
478
|
+
|
|
479
|
+
// Send: Anotha One! Call from this contract as it's been mock authorized above.
|
|
480
|
+
_rulesets.queueFor({
|
|
481
|
+
projectId: _projectId,
|
|
482
|
+
duration: _duration,
|
|
483
|
+
weight: _weight,
|
|
484
|
+
weightCutPercent: _weightCutPercent,
|
|
485
|
+
approvalHook: _mockApprovalHook,
|
|
486
|
+
metadata: _packedWithApprovalHook,
|
|
487
|
+
mustStartAtOrAfter: block.timestamp
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
latestId = block.timestamp;
|
|
491
|
+
latesetQueuedRuleset = _rulesets.getRulesetOf(_projectId, latestId);
|
|
492
|
+
|
|
493
|
+
// avoid overwrite
|
|
494
|
+
vm.warp(block.timestamp + 1);
|
|
495
|
+
|
|
496
|
+
previouslyApprovedDurationEnds = block.timestamp + 6 days - 2 days - 4;
|
|
497
|
+
|
|
498
|
+
// Mock call to approvalStatusOf and return an empty status
|
|
499
|
+
_encodedApprovalCall = abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (1, latesetQueuedRuleset));
|
|
500
|
+
_willReturnStatus = abi.encode(JBApprovalStatus.Empty);
|
|
501
|
+
|
|
502
|
+
mockExpect(address(_mockApprovalHook), _encodedApprovalCall, _willReturnStatus);
|
|
503
|
+
|
|
504
|
+
// Send: Anotha One! Call from this contract as it's been mock authorized above.
|
|
505
|
+
_rulesets.queueFor({
|
|
506
|
+
projectId: _projectId,
|
|
507
|
+
duration: _duration,
|
|
508
|
+
weight: _weight,
|
|
509
|
+
weightCutPercent: _weightCutPercent,
|
|
510
|
+
approvalHook: _mockApprovalHook,
|
|
511
|
+
metadata: _packedWithApprovalHook,
|
|
512
|
+
mustStartAtOrAfter: block.timestamp
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
JBRuleset[] memory queuedRulesetsOf = _rulesets.allOf(_projectId, block.timestamp, 3);
|
|
516
|
+
|
|
517
|
+
// check: 2 rulesets will be enqueued, we just overwrote the last queued
|
|
518
|
+
assertEq(queuedRulesetsOf.length, 3);
|
|
519
|
+
assertEq(queuedRulesetsOf[0].id, block.timestamp);
|
|
520
|
+
|
|
521
|
+
// check first timestamp
|
|
522
|
+
assertEq(queuedRulesetsOf[2].id, firstId);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
function test_WhenCacheIsUpdatedTooSoon() external {
|
|
526
|
+
// the weight cut multiple will be re-used if it's the same.
|
|
527
|
+
|
|
528
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
529
|
+
// permissions, encode & mock that.
|
|
530
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
531
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
532
|
+
|
|
533
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
534
|
+
|
|
535
|
+
_rulesets.queueFor({
|
|
536
|
+
projectId: _projectId,
|
|
537
|
+
duration: 1 days, // 3 days
|
|
538
|
+
weight: 1e18,
|
|
539
|
+
weightCutPercent: JBConstants.MAX_WEIGHT_CUT_PERCENT / 10,
|
|
540
|
+
approvalHook: _hook,
|
|
541
|
+
metadata: _packedMetadata,
|
|
542
|
+
mustStartAtOrAfter: 0
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
vm.warp(block.timestamp + (20_000 days));
|
|
546
|
+
|
|
547
|
+
// Update the weight cache incrementally — each call advances by at most 20,000 cycles.
|
|
548
|
+
// With 20,000 cycles and 10% weight cut per cycle, weight reaches 0 well before 20,000 cycles.
|
|
549
|
+
// First call: advances cache by up to 20,000 cycles (weight decays to 0).
|
|
550
|
+
_rulesets.updateRulesetWeightCache(_projectId);
|
|
551
|
+
|
|
552
|
+
// Second call during the same block should mirror the previous (cache already covers current time).
|
|
553
|
+
_rulesets.updateRulesetWeightCache(_projectId);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
function test_QueueForApprovalHookDNSupportInterface() external {
|
|
557
|
+
//
|
|
558
|
+
|
|
559
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
560
|
+
// permissions, mock that call.
|
|
561
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
562
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
563
|
+
|
|
564
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
565
|
+
|
|
566
|
+
mockExpect(
|
|
567
|
+
address(123),
|
|
568
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
569
|
+
abi.encode(false)
|
|
570
|
+
);
|
|
571
|
+
|
|
572
|
+
// Since hook address is not 0 interface support will be checked.
|
|
573
|
+
vm.expectRevert(
|
|
574
|
+
abi.encodeWithSelector(
|
|
575
|
+
JBRulesets.JBRulesets_InvalidRulesetApprovalHook.selector, (IJBRulesetApprovalHook(address(123)))
|
|
576
|
+
)
|
|
577
|
+
);
|
|
578
|
+
_rulesets.queueFor({
|
|
579
|
+
projectId: _projectId,
|
|
580
|
+
duration: 1 days, // 3 days
|
|
581
|
+
weight: 1e18,
|
|
582
|
+
weightCutPercent: JBConstants.MAX_WEIGHT_CUT_PERCENT / 10,
|
|
583
|
+
approvalHook: IJBRulesetApprovalHook(address(123)),
|
|
584
|
+
metadata: _packedMetadata,
|
|
585
|
+
mustStartAtOrAfter: 0
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
function test_QueueForApprovalHookDNSupportInterfaceCatch() external {
|
|
590
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
591
|
+
// permissions, mock that call.
|
|
592
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
593
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
594
|
+
|
|
595
|
+
mockExpect(address(_directory), _encodedCall, _willReturn);
|
|
596
|
+
|
|
597
|
+
vm.mockCallRevert(
|
|
598
|
+
address(123), abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)), "ERROR"
|
|
599
|
+
);
|
|
600
|
+
|
|
601
|
+
// Since hook address is not 0 interface support will be checked.
|
|
602
|
+
vm.expectRevert(
|
|
603
|
+
abi.encodeWithSelector(
|
|
604
|
+
JBRulesets.JBRulesets_InvalidRulesetApprovalHook.selector, (IJBRulesetApprovalHook(address(123)))
|
|
605
|
+
)
|
|
606
|
+
);
|
|
607
|
+
_rulesets.queueFor({
|
|
608
|
+
projectId: _projectId,
|
|
609
|
+
duration: 1 days, // 3 days
|
|
610
|
+
weight: 1e18,
|
|
611
|
+
weightCutPercent: JBConstants.MAX_WEIGHT_CUT_PERCENT / 10,
|
|
612
|
+
approvalHook: IJBRulesetApprovalHook(address(123)),
|
|
613
|
+
metadata: _packedMetadata,
|
|
614
|
+
mustStartAtOrAfter: 0
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
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 TestRulesetsOf_Local is JBRulesetsSetup {
|
|
8
|
+
// Necessary params
|
|
9
|
+
uint256 _projectId = 1;
|
|
10
|
+
|
|
11
|
+
function setUp() public {
|
|
12
|
+
super.rulesetsSetup();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function test_WhenStartingIdEqZero() external {
|
|
16
|
+
// it will return latest ruleset
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function test_WhenStartingIdDneqZero() external {
|
|
20
|
+
// it will return predecessors up to latest ruleset
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function test_WhenSizeIsZero() external view {
|
|
24
|
+
// it will return an empty array
|
|
25
|
+
|
|
26
|
+
JBRuleset[] memory _rulesets = _rulesets.allOf(_projectId, 0, 0);
|
|
27
|
+
assertEq(_rulesets.length, 0);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function test_WhenThereAreNoRulesets() external {
|
|
31
|
+
// it will return an empty array
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function test_WhenSizeIsGtConfiguredRulesets() external {
|
|
35
|
+
// it will return up to latest ruleset
|
|
36
|
+
}
|
|
37
|
+
}
|