@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,20 @@
|
|
|
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 JBProjectsSetup is JBTest {
|
|
11
|
+
address _owner = makeAddr("owner");
|
|
12
|
+
|
|
13
|
+
// Target Contract
|
|
14
|
+
IJBProjects public _projects;
|
|
15
|
+
|
|
16
|
+
function projectsSetup() public virtual {
|
|
17
|
+
// Instantiate the contract being tested
|
|
18
|
+
_projects = new JBProjects(_owner, address(0), address(0));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
|
|
6
|
+
import {JBProjectsSetup} from "./JBProjectsSetup.sol";
|
|
7
|
+
|
|
8
|
+
contract TestCreateFor_Local is JBProjectsSetup {
|
|
9
|
+
using stdStorage for StdStorage;
|
|
10
|
+
|
|
11
|
+
address _user = makeAddr("sudoer");
|
|
12
|
+
|
|
13
|
+
function setUp() public {
|
|
14
|
+
super.projectsSetup();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function test_WhenProjectIdPlusOneIsGtUint256Max() external {
|
|
18
|
+
// it will revert with overflow
|
|
19
|
+
|
|
20
|
+
// set storage to uint256 max
|
|
21
|
+
stdstore.target(address(_projects)).sig("count()").checked_write(type(uint256).max);
|
|
22
|
+
|
|
23
|
+
assertEq(_projects.count(), type(uint256).max);
|
|
24
|
+
|
|
25
|
+
vm.expectRevert(stdError.arithmeticError);
|
|
26
|
+
_projects.createFor(address(this));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
modifier whenProjectIdPlusOneIsLtOrEqToUint256Max() {
|
|
30
|
+
_;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function test_GivenOwnerIsNotAContract() external whenProjectIdPlusOneIsLtOrEqToUint256Max {
|
|
34
|
+
// it will mint and emit Create
|
|
35
|
+
|
|
36
|
+
// created on behalf of user by this contract
|
|
37
|
+
vm.expectEmit();
|
|
38
|
+
emit IJBProjects.Create(1, _user, address(this));
|
|
39
|
+
|
|
40
|
+
_projects.createFor(_user);
|
|
41
|
+
|
|
42
|
+
// check count is incrementing
|
|
43
|
+
assertEq(_projects.count(), 1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function test_GivenItIsIERC721Receiver() external whenProjectIdPlusOneIsLtOrEqToUint256Max {
|
|
47
|
+
// it will mint and emit Create
|
|
48
|
+
|
|
49
|
+
// mock IERC721Receiver support (return interface selector for onERC721Received)
|
|
50
|
+
bytes memory receiverCall =
|
|
51
|
+
abi.encodeCall(IERC721Receiver.onERC721Received, (address(this), address(0), 1, bytes("")));
|
|
52
|
+
bytes memory returned = abi.encode(IERC721Receiver.onERC721Received.selector);
|
|
53
|
+
|
|
54
|
+
mockExpect(address(this), receiverCall, returned);
|
|
55
|
+
|
|
56
|
+
_projects.createFor(address(this));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function test_GivenItDoesNotSupportIERC721Receiver() external whenProjectIdPlusOneIsLtOrEqToUint256Max {
|
|
60
|
+
// it will revert
|
|
61
|
+
|
|
62
|
+
// encode custom error
|
|
63
|
+
bytes4 selector = bytes4(keccak256("ERC721InvalidReceiver(address)"));
|
|
64
|
+
bytes memory expectedError = abi.encodeWithSelector(selector, address(this));
|
|
65
|
+
|
|
66
|
+
vm.expectRevert(expectedError);
|
|
67
|
+
_projects.createFor(address(this));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
|
|
6
|
+
contract TestInitialProject_Local is JBTest {
|
|
7
|
+
address _owner = makeAddr("owner");
|
|
8
|
+
IJBProjects _projects;
|
|
9
|
+
|
|
10
|
+
function setUp() public {}
|
|
11
|
+
|
|
12
|
+
function test_WhenInitialOwnerDNEQZeroAddress() external {
|
|
13
|
+
// It will create a project
|
|
14
|
+
|
|
15
|
+
vm.expectEmit();
|
|
16
|
+
emit IJBProjects.Create(1, _owner, address(this));
|
|
17
|
+
_projects = new JBProjects(_owner, _owner, address(0));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBProjectsSetup} from "./JBProjectsSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestSupportsInterface_Local is JBProjectsSetup {
|
|
8
|
+
function setUp() public {
|
|
9
|
+
super.projectsSetup();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function test_WhenInterfaceIdIsIJBProjects() external {
|
|
13
|
+
// it will return true
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function test_WhenInterfaceIdIsIERC721() external {
|
|
17
|
+
// it will return true
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function test_WhenInterfaceIdIsIERC721Metadata() external {
|
|
21
|
+
// it will return true
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function test_WhenInterfaceIdIsAnythingElse() external {
|
|
25
|
+
// it will return false
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBProjectsSetup} from "./JBProjectsSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestSetTokenURIResolver_Local is JBProjectsSetup {
|
|
8
|
+
IJBTokenUriResolver _resolver = IJBTokenUriResolver(makeAddr("uri"));
|
|
9
|
+
|
|
10
|
+
function setUp() public {
|
|
11
|
+
super.projectsSetup();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function test_WhenCallerIsOwner() external {
|
|
15
|
+
// it will set resolver and emit SetTokenUriResolver
|
|
16
|
+
|
|
17
|
+
// expect call from owner since we prank
|
|
18
|
+
vm.expectEmit();
|
|
19
|
+
emit IJBProjects.SetTokenUriResolver(_resolver, _owner);
|
|
20
|
+
|
|
21
|
+
vm.prank(_owner);
|
|
22
|
+
_projects.setTokenUriResolver(_resolver);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function test_WhenCallerIsNotOwner() external {
|
|
26
|
+
// it will revert
|
|
27
|
+
|
|
28
|
+
// encode custom error
|
|
29
|
+
bytes4 selector = bytes4(keccak256("OwnableUnauthorizedAccount(address)"));
|
|
30
|
+
bytes memory expectedError = abi.encodeWithSelector(selector, address(this));
|
|
31
|
+
|
|
32
|
+
vm.expectRevert(expectedError);
|
|
33
|
+
|
|
34
|
+
_projects.setTokenUriResolver(_resolver);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBProjectsSetup} from "./JBProjectsSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestTokenURI_Local is JBProjectsSetup {
|
|
8
|
+
using stdStorage for StdStorage;
|
|
9
|
+
|
|
10
|
+
IJBTokenUriResolver _resolver = IJBTokenUriResolver(makeAddr("uri"));
|
|
11
|
+
|
|
12
|
+
function setUp() public {
|
|
13
|
+
super.projectsSetup();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function test_WhenTheresNoResolver() external view {
|
|
17
|
+
// it will return empty string
|
|
18
|
+
string memory uri = IERC721Metadata(address(_projects)).tokenURI(0);
|
|
19
|
+
|
|
20
|
+
assertEq(bytes(uri), "");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function test_WhenTheresAResolver() external {
|
|
24
|
+
// it will return the resolved URI
|
|
25
|
+
|
|
26
|
+
// set tokenUriResolver
|
|
27
|
+
stdstore.target(address(_projects)).sig("tokenUriResolver()").checked_write(address(_resolver));
|
|
28
|
+
|
|
29
|
+
// mock call to mock resolver
|
|
30
|
+
bytes memory resolverCall = abi.encodeCall(IJBTokenUriResolver.getUri, (0));
|
|
31
|
+
bytes memory returned = abi.encode("JUICAY");
|
|
32
|
+
|
|
33
|
+
mockExpect(address(_resolver), resolverCall, returned);
|
|
34
|
+
|
|
35
|
+
string memory uri = IERC721Metadata(address(_projects)).tokenURI(0);
|
|
36
|
+
assertEq(bytes(uri), bytes("JUICAY"));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
|
|
6
|
+
contract TestSetCashOutTaxRateTo_Local is JBTest {
|
|
7
|
+
using JBRulesetMetadataResolver for JBRulesetMetadata;
|
|
8
|
+
|
|
9
|
+
function setUp() external {}
|
|
10
|
+
|
|
11
|
+
function testFuzzEnsureCorrectlyPackedBits(
|
|
12
|
+
uint16 _fuzzReservedPercent,
|
|
13
|
+
uint16 _fuzzCashOutTaxRate,
|
|
14
|
+
uint16 _fuzzMetadata
|
|
15
|
+
)
|
|
16
|
+
external
|
|
17
|
+
{
|
|
18
|
+
// cash out tax rate should be re-set and re-packed correctly
|
|
19
|
+
|
|
20
|
+
address _hookAddress = makeAddr("someting");
|
|
21
|
+
|
|
22
|
+
_fuzzReservedPercent = uint16(bound(_fuzzReservedPercent, 0, JBConstants.MAX_RESERVED_PERCENT));
|
|
23
|
+
_fuzzCashOutTaxRate = uint16(bound(_fuzzCashOutTaxRate, 0, JBConstants.MAX_CASH_OUT_TAX_RATE));
|
|
24
|
+
// Ensure the metadata is a max of 14 bits.
|
|
25
|
+
_fuzzMetadata = uint16(bound(_fuzzCashOutTaxRate, 0, 16_383));
|
|
26
|
+
|
|
27
|
+
JBRulesetMetadata memory _rulesMetadata = JBRulesetMetadata({
|
|
28
|
+
reservedPercent: _fuzzReservedPercent,
|
|
29
|
+
cashOutTaxRate: _fuzzCashOutTaxRate,
|
|
30
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
31
|
+
pausePay: true,
|
|
32
|
+
pauseCreditTransfers: true,
|
|
33
|
+
allowOwnerMinting: true,
|
|
34
|
+
allowSetCustomToken: true,
|
|
35
|
+
allowTerminalMigration: true,
|
|
36
|
+
allowSetTerminals: true,
|
|
37
|
+
ownerMustSendPayouts: true,
|
|
38
|
+
allowSetController: true,
|
|
39
|
+
allowAddAccountingContext: true,
|
|
40
|
+
allowAddPriceFeed: true,
|
|
41
|
+
holdFees: true,
|
|
42
|
+
useTotalSurplusForCashOuts: true,
|
|
43
|
+
useDataHookForPay: true,
|
|
44
|
+
useDataHookForCashOut: true,
|
|
45
|
+
dataHook: _hookAddress,
|
|
46
|
+
metadata: _fuzzMetadata
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
uint256 _packed = _rulesMetadata.packRulesetMetadata();
|
|
50
|
+
|
|
51
|
+
// Reserved Rate
|
|
52
|
+
uint256 _reservedPercent = uint256(uint16(_packed >> 4));
|
|
53
|
+
|
|
54
|
+
// Cash out tax rate
|
|
55
|
+
uint256 _cashOutTaxRate = uint256(uint16(_packed >> 20));
|
|
56
|
+
|
|
57
|
+
assertEq(_reservedPercent, _fuzzReservedPercent);
|
|
58
|
+
assertEq(_cashOutTaxRate, _fuzzCashOutTaxRate);
|
|
59
|
+
|
|
60
|
+
for (uint256 _i = 68; _i < 81; _i++) {
|
|
61
|
+
uint256 _flag = uint256(uint16(_packed >> _i) & 1);
|
|
62
|
+
assertEq(_flag, 1);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Data source address
|
|
66
|
+
address _packedDataHook = address(uint160(_packed >> 82));
|
|
67
|
+
assertEq(_packedDataHook, _hookAddress);
|
|
68
|
+
|
|
69
|
+
// Metadata
|
|
70
|
+
uint256 _packedMetadata = uint256(uint16(_packed >> 242));
|
|
71
|
+
assertEq(_packedMetadata, uint256(_fuzzMetadata));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function testFuzzEnsureCorrectlyPackedBits_implementationIndependent(JBRulesetMetadata memory _rulesMetadata)
|
|
75
|
+
external
|
|
76
|
+
pure
|
|
77
|
+
{
|
|
78
|
+
// Handle the unique constraints of the JBRulesetMetadata.
|
|
79
|
+
{
|
|
80
|
+
// First 2 bits of `metadata.metadata` are ignored
|
|
81
|
+
_rulesMetadata.metadata = _rulesMetadata.metadata % 16_383;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Get the keccak from before.
|
|
85
|
+
bytes32 _before = keccak256(abi.encode(_rulesMetadata));
|
|
86
|
+
|
|
87
|
+
// Pack the metadata.
|
|
88
|
+
uint256 _packed = _rulesMetadata.packRulesetMetadata();
|
|
89
|
+
|
|
90
|
+
// Unpack the metadata and calculate the new keccak.
|
|
91
|
+
JBRuleset memory _ruleset;
|
|
92
|
+
_ruleset.metadata = _packed;
|
|
93
|
+
JBRulesetMetadata memory _unpackedMetadata = JBRulesetMetadataResolver.expandMetadata(_ruleset);
|
|
94
|
+
bytes32 _after = keccak256(abi.encode(_unpackedMetadata));
|
|
95
|
+
|
|
96
|
+
// Compare the before and the after.
|
|
97
|
+
assertEq(_before, _after);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
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 JBRulesetsSetup is JBTest {
|
|
11
|
+
// Target Contract
|
|
12
|
+
IJBRulesets public _rulesets;
|
|
13
|
+
|
|
14
|
+
// Mocks
|
|
15
|
+
IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
|
|
16
|
+
|
|
17
|
+
function rulesetsSetup() public virtual {
|
|
18
|
+
// Instantiate the contract being tested
|
|
19
|
+
_rulesets = new JBRulesets(directory);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
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 TestCurrentApprovalStatusForLatestRulesetOf_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
|
+
modifier whenARulesetIsConfiguredWithHook() {
|
|
76
|
+
// put code at hook address
|
|
77
|
+
vm.etch(address(_mockApprovalHook), abi.encode(1));
|
|
78
|
+
|
|
79
|
+
// mock call to hook interface support
|
|
80
|
+
mockExpect(
|
|
81
|
+
address(_mockApprovalHook),
|
|
82
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
83
|
+
abi.encode(true)
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
87
|
+
// permissions, encode & mock that.
|
|
88
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
89
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
90
|
+
|
|
91
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
92
|
+
|
|
93
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
94
|
+
vm.expectEmit();
|
|
95
|
+
emit IJBRulesets.RulesetQueued(
|
|
96
|
+
block.timestamp,
|
|
97
|
+
_projectId,
|
|
98
|
+
_duration,
|
|
99
|
+
_weight,
|
|
100
|
+
_weightCutPercent,
|
|
101
|
+
_mockApprovalHook,
|
|
102
|
+
_packedWithApprovalHook,
|
|
103
|
+
block.timestamp,
|
|
104
|
+
address(this)
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
108
|
+
_rulesets.queueFor({
|
|
109
|
+
projectId: _projectId,
|
|
110
|
+
duration: _duration,
|
|
111
|
+
weight: _weight,
|
|
112
|
+
weightCutPercent: _weightCutPercent,
|
|
113
|
+
approvalHook: _mockApprovalHook,
|
|
114
|
+
metadata: _packedWithApprovalHook,
|
|
115
|
+
mustStartAtOrAfter: _mustStartAt
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
_;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function test_GivenTheBasedOnRulesetEqZero() external whenARulesetIsConfiguredWithHook {
|
|
122
|
+
// it will return status Empty
|
|
123
|
+
|
|
124
|
+
JBApprovalStatus status = _rulesets.currentApprovalStatusForLatestRulesetOf(_projectId);
|
|
125
|
+
assertEq(uint256(status), 0);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function test_GivenThereIsNoApprovalHook() external {
|
|
129
|
+
// it will return status Empty
|
|
130
|
+
|
|
131
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
132
|
+
// permissions, encode & mock that.
|
|
133
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
134
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
135
|
+
|
|
136
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
137
|
+
|
|
138
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
139
|
+
vm.expectEmit();
|
|
140
|
+
emit IJBRulesets.RulesetQueued(
|
|
141
|
+
block.timestamp,
|
|
142
|
+
_projectId,
|
|
143
|
+
_duration,
|
|
144
|
+
_weight,
|
|
145
|
+
_weightCutPercent,
|
|
146
|
+
_noHook,
|
|
147
|
+
_packedMetadata,
|
|
148
|
+
block.timestamp,
|
|
149
|
+
address(this)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
153
|
+
_rulesets.queueFor({
|
|
154
|
+
projectId: _projectId,
|
|
155
|
+
duration: _duration,
|
|
156
|
+
weight: _weight,
|
|
157
|
+
weightCutPercent: _weightCutPercent,
|
|
158
|
+
approvalHook: _noHook,
|
|
159
|
+
metadata: _packedMetadata,
|
|
160
|
+
mustStartAtOrAfter: _mustStartAt
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
JBApprovalStatus status = _rulesets.currentApprovalStatusForLatestRulesetOf(_projectId);
|
|
164
|
+
assertEq(uint256(status), 0);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function test_GivenBasedOnDNEQZeroAndThereIsAnApprovalHook() external {
|
|
168
|
+
// it will return the approval status by calling the hook
|
|
169
|
+
|
|
170
|
+
// put code at hook address
|
|
171
|
+
vm.etch(address(_mockApprovalHook), abi.encode(1));
|
|
172
|
+
|
|
173
|
+
// mock call to hook interface support
|
|
174
|
+
mockExpect(
|
|
175
|
+
address(_mockApprovalHook),
|
|
176
|
+
abi.encodeCall(IERC165.supportsInterface, (type(IJBRulesetApprovalHook).interfaceId)),
|
|
177
|
+
abi.encode(true)
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
// Setup: queueFor will call onlyControllerOf modifier -> Directory.controllerOf to see if caller has proper
|
|
181
|
+
// permissions, encode & mock that.
|
|
182
|
+
bytes memory _encodedCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
|
|
183
|
+
bytes memory _willReturn = abi.encode(address(this));
|
|
184
|
+
|
|
185
|
+
mockExpect(address(directory), _encodedCall, _willReturn);
|
|
186
|
+
|
|
187
|
+
// First queue a base funding cycle
|
|
188
|
+
|
|
189
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
190
|
+
vm.expectEmit();
|
|
191
|
+
emit IJBRulesets.RulesetQueued(
|
|
192
|
+
block.timestamp,
|
|
193
|
+
_projectId,
|
|
194
|
+
_duration,
|
|
195
|
+
_weight,
|
|
196
|
+
_weightCutPercent,
|
|
197
|
+
_mockApprovalHook,
|
|
198
|
+
_packedWithApprovalHook,
|
|
199
|
+
block.timestamp,
|
|
200
|
+
address(this)
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
// mock call to hook duration
|
|
204
|
+
mockExpect(
|
|
205
|
+
address(_mockApprovalHook), abi.encodeCall(IJBRulesetApprovalHook.DURATION, ()), abi.encode(_hookDuration)
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
209
|
+
_rulesets.queueFor({
|
|
210
|
+
projectId: _projectId,
|
|
211
|
+
duration: _duration,
|
|
212
|
+
weight: _weight,
|
|
213
|
+
weightCutPercent: _weightCutPercent,
|
|
214
|
+
approvalHook: _mockApprovalHook,
|
|
215
|
+
metadata: _packedWithApprovalHook,
|
|
216
|
+
mustStartAtOrAfter: _mustStartAt
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Setup: expect ruleset event (RulesetQueued) is emitted
|
|
220
|
+
vm.expectEmit();
|
|
221
|
+
emit IJBRulesets.RulesetQueued(
|
|
222
|
+
block.timestamp + 1,
|
|
223
|
+
_projectId,
|
|
224
|
+
_duration,
|
|
225
|
+
_weight,
|
|
226
|
+
_weightCutPercent,
|
|
227
|
+
_noHook,
|
|
228
|
+
_packedMetadata,
|
|
229
|
+
block.timestamp,
|
|
230
|
+
address(this)
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
// Send: Call from this contract as it's been mock authorized above.
|
|
234
|
+
_rulesets.queueFor({
|
|
235
|
+
projectId: _projectId,
|
|
236
|
+
duration: _duration,
|
|
237
|
+
weight: _weight,
|
|
238
|
+
weightCutPercent: _weightCutPercent,
|
|
239
|
+
approvalHook: _noHook,
|
|
240
|
+
metadata: _packedMetadata,
|
|
241
|
+
mustStartAtOrAfter: _mustStartAt
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
uint256 _latestQueuedId = _rulesets.latestRulesetIdOf(_projectId);
|
|
245
|
+
JBRuleset memory _queuedRuleset = _rulesets.getRulesetOf(_projectId, _latestQueuedId);
|
|
246
|
+
|
|
247
|
+
// mock call to hook approvalStatusOf
|
|
248
|
+
mockExpect(
|
|
249
|
+
address(_mockApprovalHook),
|
|
250
|
+
abi.encodeCall(IJBRulesetApprovalHook.approvalStatusOf, (_projectId, _queuedRuleset)),
|
|
251
|
+
abi.encode(JBApprovalStatus.Failed)
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
JBApprovalStatus status = _rulesets.currentApprovalStatusForLatestRulesetOf(_projectId);
|
|
255
|
+
assertEq(uint256(status), 5);
|
|
256
|
+
}
|
|
257
|
+
}
|