@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,177 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity >=0.8.6;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "./helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {MockPriceFeed} from "./mock/MockPriceFeed.sol";
|
|
6
|
+
|
|
7
|
+
// A ruleset's weight can be cached to make larger intervals calculable while staying within the gas limit.
|
|
8
|
+
contract TestRulesetWeightCaching_Local is TestBaseWorkflow {
|
|
9
|
+
uint256 private constant _GAS_LIMIT = 30_000_000;
|
|
10
|
+
uint8 private constant _WEIGHT_DECIMALS = 18; // FIXED
|
|
11
|
+
uint256 private constant _DURATION = 1;
|
|
12
|
+
uint256 private constant _WEIGHT_CUT_PERCENT = 1;
|
|
13
|
+
|
|
14
|
+
IJBController private _controller;
|
|
15
|
+
IJBRulesets private _rulesets;
|
|
16
|
+
address private _projectOwner;
|
|
17
|
+
|
|
18
|
+
JBRulesetMetadata private _metadata;
|
|
19
|
+
|
|
20
|
+
function setUp() public override {
|
|
21
|
+
super.setUp();
|
|
22
|
+
|
|
23
|
+
_projectOwner = multisig();
|
|
24
|
+
_rulesets = jbRulesets();
|
|
25
|
+
_controller = jbController();
|
|
26
|
+
|
|
27
|
+
_metadata = JBRulesetMetadata({
|
|
28
|
+
reservedPercent: 0,
|
|
29
|
+
cashOutTaxRate: 0,
|
|
30
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
31
|
+
pausePay: false,
|
|
32
|
+
pauseCreditTransfers: false,
|
|
33
|
+
allowOwnerMinting: false,
|
|
34
|
+
allowSetCustomToken: false,
|
|
35
|
+
allowTerminalMigration: false,
|
|
36
|
+
allowSetTerminals: false,
|
|
37
|
+
ownerMustSendPayouts: false,
|
|
38
|
+
allowSetController: false,
|
|
39
|
+
allowAddAccountingContext: true,
|
|
40
|
+
allowAddPriceFeed: false,
|
|
41
|
+
holdFees: false,
|
|
42
|
+
useTotalSurplusForCashOuts: true,
|
|
43
|
+
useDataHookForPay: false,
|
|
44
|
+
useDataHookForCashOut: false,
|
|
45
|
+
dataHook: address(0),
|
|
46
|
+
metadata: 0
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// Test that caching a ruleset's weight yields the same result as computing it.
|
|
51
|
+
function testWeightCaching(uint256 _rulesetDiff) public {
|
|
52
|
+
// TODO temporarily removed for faster test suite
|
|
53
|
+
// // Bound to 8x the weight cut multiple cache threshold.
|
|
54
|
+
// _rulesetDiff = bound(_rulesetDiff, 0, 80000);
|
|
55
|
+
|
|
56
|
+
// // Keep references to the projects.
|
|
57
|
+
// uint256 _projectId1;
|
|
58
|
+
// uint256 _projectId2;
|
|
59
|
+
|
|
60
|
+
// // Package up the ruleset configuration.
|
|
61
|
+
// JBRulesetConfig[] memory _rulesetConfigurations = new JBRulesetConfig[](1);
|
|
62
|
+
|
|
63
|
+
// {
|
|
64
|
+
// _rulesetConfigurations[0].mustStartAtOrAfter = 0;
|
|
65
|
+
// _rulesetConfigurations[0].duration = _DURATION;
|
|
66
|
+
// _rulesetConfigurations[0].weight = 1000 * 10 ** _WEIGHT_DECIMALS;
|
|
67
|
+
// _rulesetConfigurations[0].weightCutPercent = _WEIGHT_CUT_PERCENT;
|
|
68
|
+
// _rulesetConfigurations[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
69
|
+
// _rulesetConfigurations[0].metadata = _metadata;
|
|
70
|
+
// _rulesetConfigurations[0].splitGroups = new JBSplitGroup[](0);
|
|
71
|
+
// _rulesetConfigurations[0].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
|
|
72
|
+
|
|
73
|
+
// // Create the project to test.
|
|
74
|
+
// _projectId1 = _controller.launchProjectFor({
|
|
75
|
+
// owner: _projectOwner,
|
|
76
|
+
// projectUri: "myIPFSHash",
|
|
77
|
+
// rulesetConfigurations: _rulesetConfigurations,
|
|
78
|
+
// terminalConfigurations: new JBTerminalConfig[](0),
|
|
79
|
+
// memo: ""
|
|
80
|
+
// });
|
|
81
|
+
|
|
82
|
+
// // Create the project to test.
|
|
83
|
+
// _projectId2 = _controller.launchProjectFor({
|
|
84
|
+
// owner: _projectOwner,
|
|
85
|
+
// projectUri: "myIPFSHash",
|
|
86
|
+
// rulesetConfigurations: _rulesetConfigurations,
|
|
87
|
+
// terminalConfigurations: new JBTerminalConfig[](0),
|
|
88
|
+
// memo: ""
|
|
89
|
+
// });
|
|
90
|
+
// }
|
|
91
|
+
|
|
92
|
+
// // Keep a reference to the current rulesets.
|
|
93
|
+
// JBRuleset memory _ruleset1 = jbRulesets().currentOf(_projectId1);
|
|
94
|
+
// JBRuleset memory _ruleset2 = jbRulesets().currentOf(_projectId2);
|
|
95
|
+
|
|
96
|
+
// // Go a few rolled over rulesets into the future.
|
|
97
|
+
// vm.warp(block.timestamp + (_DURATION * 10));
|
|
98
|
+
|
|
99
|
+
// // Keep a reference to the amount of gas before the caching call.
|
|
100
|
+
// uint256 _gasBeforeCache = gasleft();
|
|
101
|
+
|
|
102
|
+
// // Cache the weight in the second project.
|
|
103
|
+
// _rulesets.updateRulesetWeightCache(_projectId2);
|
|
104
|
+
|
|
105
|
+
// // Keep a reference to the amout of gas spent on the call.
|
|
106
|
+
// uint256 _gasDiffCache = _gasBeforeCache - gasleft();
|
|
107
|
+
|
|
108
|
+
// // Make sure the difference is within the gas limit.
|
|
109
|
+
// assertLe(_gasDiffCache, _GAS_LIMIT);
|
|
110
|
+
|
|
111
|
+
// // Go many rolled over rulesets into the future.
|
|
112
|
+
// vm.warp(block.timestamp + (_DURATION * _rulesetDiff));
|
|
113
|
+
|
|
114
|
+
// // Cache the weight in the second project again.
|
|
115
|
+
// _rulesets.updateRulesetWeightCache(_projectId2);
|
|
116
|
+
|
|
117
|
+
// // Inherit the weight.
|
|
118
|
+
// _rulesetConfigurations[0].data.weight = 0;
|
|
119
|
+
|
|
120
|
+
// // Keep a reference to the amount of gas before the call.
|
|
121
|
+
// uint256 _gasBefore1 = gasleft();
|
|
122
|
+
|
|
123
|
+
// // Queue the ruleset.
|
|
124
|
+
// vm.startPrank(_projectOwner);
|
|
125
|
+
// _controller.queueRulesetsOf({
|
|
126
|
+
// projectId: _projectId1,
|
|
127
|
+
// rulesetConfigurations: _rulesetConfigurations,
|
|
128
|
+
// memo: ""
|
|
129
|
+
// });
|
|
130
|
+
|
|
131
|
+
// // Keep a reference to the amout of gas spent on the call.
|
|
132
|
+
// uint256 _gasDiff1 = _gasBefore1 - gasleft();
|
|
133
|
+
|
|
134
|
+
// // Make sure the difference is within the gas limit.
|
|
135
|
+
// assertLe(_gasDiff1, _GAS_LIMIT);
|
|
136
|
+
|
|
137
|
+
// // Keep a reference to the amount of gas before the call.
|
|
138
|
+
// uint256 _gasBefore2 = gasleft();
|
|
139
|
+
|
|
140
|
+
// _controller.queueRulesetsOf({
|
|
141
|
+
// projectId: _projectId2,
|
|
142
|
+
// rulesetConfigurations: _rulesetConfigurations,
|
|
143
|
+
// memo: ""
|
|
144
|
+
// });
|
|
145
|
+
// vm.stopPrank();
|
|
146
|
+
|
|
147
|
+
// // Keep a reference to the amout of gas spent on the call.
|
|
148
|
+
// uint256 _gasDiff2 = _gasBefore2 - gasleft();
|
|
149
|
+
|
|
150
|
+
// // Make sure the difference is within the gas limit.
|
|
151
|
+
// assertLe(_gasDiff2, _GAS_LIMIT);
|
|
152
|
+
|
|
153
|
+
// // Renew the reference to the current ruleset.
|
|
154
|
+
// _ruleset1 = jbRulesets().currentOf(_projectId1);
|
|
155
|
+
// _ruleset2 = jbRulesets().currentOf(_projectId2);
|
|
156
|
+
|
|
157
|
+
// // The cached call should have been cheaper.
|
|
158
|
+
// assertLe(_gasDiff2, _gasDiff1);
|
|
159
|
+
|
|
160
|
+
// // Make sure the rulesets have the same weight.
|
|
161
|
+
// assertEq(_ruleset1.weight, _ruleset2.weight);
|
|
162
|
+
|
|
163
|
+
// // Cache the weight in the second project again.
|
|
164
|
+
// _rulesets.updateRulesetWeightCache(_projectId2);
|
|
165
|
+
|
|
166
|
+
// // Go many rolled over rulesets into the future.
|
|
167
|
+
// vm.warp(block.timestamp + (_DURATION * _rulesetDiff));
|
|
168
|
+
|
|
169
|
+
// // Queue the ruleset.
|
|
170
|
+
// vm.prank(_projectOwner);
|
|
171
|
+
// _controller.queueRulesetsOf({
|
|
172
|
+
// projectId: _projectId2,
|
|
173
|
+
// rulesetConfigurations: _rulesetConfigurations,
|
|
174
|
+
// memo: ""
|
|
175
|
+
// });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.6;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "./helpers/TestBaseWorkflow.sol";
|
|
5
|
+
|
|
6
|
+
contract TestSplits_Local is TestBaseWorkflow {
|
|
7
|
+
IJBController private _controller;
|
|
8
|
+
JBRulesetMetadata private _metadata;
|
|
9
|
+
IJBMultiTerminal private _terminal;
|
|
10
|
+
IJBTokens private _tokens;
|
|
11
|
+
uint112 private _weight;
|
|
12
|
+
|
|
13
|
+
address private _projectOwner;
|
|
14
|
+
address payable private _splitsGuy;
|
|
15
|
+
uint256 private _projectId;
|
|
16
|
+
uint224 _nativePayoutLimit = 4 ether;
|
|
17
|
+
|
|
18
|
+
function setUp() public override {
|
|
19
|
+
super.setUp();
|
|
20
|
+
|
|
21
|
+
_projectOwner = multisig();
|
|
22
|
+
_terminal = jbMultiTerminal();
|
|
23
|
+
_controller = jbController();
|
|
24
|
+
_tokens = jbTokens();
|
|
25
|
+
_splitsGuy = payable(makeAddr("guy"));
|
|
26
|
+
_weight = 1000 * 10 ** 18;
|
|
27
|
+
|
|
28
|
+
_metadata = JBRulesetMetadata({
|
|
29
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT / 2,
|
|
30
|
+
cashOutTaxRate: 0,
|
|
31
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
32
|
+
pausePay: false,
|
|
33
|
+
pauseCreditTransfers: false,
|
|
34
|
+
allowOwnerMinting: false,
|
|
35
|
+
allowSetCustomToken: false,
|
|
36
|
+
allowTerminalMigration: false,
|
|
37
|
+
allowSetTerminals: false,
|
|
38
|
+
ownerMustSendPayouts: false,
|
|
39
|
+
allowSetController: false,
|
|
40
|
+
allowAddAccountingContext: true,
|
|
41
|
+
allowAddPriceFeed: false,
|
|
42
|
+
holdFees: false,
|
|
43
|
+
useTotalSurplusForCashOuts: false,
|
|
44
|
+
useDataHookForPay: false,
|
|
45
|
+
useDataHookForCashOut: false,
|
|
46
|
+
dataHook: address(0),
|
|
47
|
+
metadata: 0
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Instantiate split parameters.
|
|
51
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](3);
|
|
52
|
+
JBSplit[] memory _splits = new JBSplit[](2);
|
|
53
|
+
JBSplit[] memory _reserveRateSplits = new JBSplit[](1);
|
|
54
|
+
|
|
55
|
+
// Set up a payout split recipient.
|
|
56
|
+
_splits[0] = JBSplit({
|
|
57
|
+
preferAddToBalance: false,
|
|
58
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT / 2,
|
|
59
|
+
projectId: 0,
|
|
60
|
+
beneficiary: _splitsGuy,
|
|
61
|
+
lockedUntil: 0,
|
|
62
|
+
hook: IJBSplitHook(address(0))
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// A dummy used to check that splits groups of "0" cannot bypass payout limits.
|
|
66
|
+
_splits[1] = JBSplit({
|
|
67
|
+
preferAddToBalance: false,
|
|
68
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT / 2,
|
|
69
|
+
projectId: 0,
|
|
70
|
+
beneficiary: _splitsGuy,
|
|
71
|
+
lockedUntil: 0,
|
|
72
|
+
hook: IJBSplitHook(address(0))
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
_splitsGroup[0] = JBSplitGroup({groupId: uint32(uint160(JBConstants.NATIVE_TOKEN)), splits: _splits});
|
|
76
|
+
|
|
77
|
+
// A dummy used to check that splits groups of "0" cannot bypass payout limits.
|
|
78
|
+
_splitsGroup[1] = JBSplitGroup({groupId: 0, splits: _splits});
|
|
79
|
+
|
|
80
|
+
// Configure a reserve rate split recipient.
|
|
81
|
+
_reserveRateSplits[0] = JBSplit({
|
|
82
|
+
preferAddToBalance: false,
|
|
83
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT,
|
|
84
|
+
projectId: 0,
|
|
85
|
+
beneficiary: _splitsGuy,
|
|
86
|
+
lockedUntil: 0,
|
|
87
|
+
hook: IJBSplitHook(address(0))
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Reserved rate split group.
|
|
91
|
+
_splitsGroup[2] = JBSplitGroup({groupId: JBSplitGroupIds.RESERVED_TOKENS, splits: _reserveRateSplits});
|
|
92
|
+
|
|
93
|
+
// Package up fund access limits.
|
|
94
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](1);
|
|
95
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
96
|
+
JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](1);
|
|
97
|
+
|
|
98
|
+
_payoutLimits[0] =
|
|
99
|
+
JBCurrencyAmount({amount: _nativePayoutLimit, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
|
|
100
|
+
_surplusAllowances[0] = JBCurrencyAmount({amount: 2 ether, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
|
|
101
|
+
_fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
|
|
102
|
+
terminal: address(_terminal),
|
|
103
|
+
token: JBConstants.NATIVE_TOKEN,
|
|
104
|
+
payoutLimits: _payoutLimits,
|
|
105
|
+
surplusAllowances: _surplusAllowances
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Package up ruleset configuration.
|
|
109
|
+
JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
|
|
110
|
+
_rulesetConfig[0].mustStartAtOrAfter = 0;
|
|
111
|
+
_rulesetConfig[0].duration = 0;
|
|
112
|
+
_rulesetConfig[0].weight = _weight;
|
|
113
|
+
_rulesetConfig[0].weightCutPercent = 0;
|
|
114
|
+
_rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
115
|
+
_rulesetConfig[0].metadata = _metadata;
|
|
116
|
+
_rulesetConfig[0].splitGroups = _splitsGroup;
|
|
117
|
+
_rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
118
|
+
|
|
119
|
+
// Package up terminal configuration.
|
|
120
|
+
JBTerminalConfig[] memory _terminalConfigurations = new JBTerminalConfig[](1);
|
|
121
|
+
JBAccountingContext[] memory _tokensToAccept = new JBAccountingContext[](1);
|
|
122
|
+
_tokensToAccept[0] = JBAccountingContext({
|
|
123
|
+
token: JBConstants.NATIVE_TOKEN, decimals: 18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))
|
|
124
|
+
});
|
|
125
|
+
_terminalConfigurations[0] =
|
|
126
|
+
JBTerminalConfig({terminal: _terminal, accountingContextsToAccept: _tokensToAccept});
|
|
127
|
+
|
|
128
|
+
// Dummy project to receive fees.
|
|
129
|
+
_controller.launchProjectFor({
|
|
130
|
+
owner: _projectOwner,
|
|
131
|
+
projectUri: "myIPFSHash",
|
|
132
|
+
rulesetConfigurations: _rulesetConfig,
|
|
133
|
+
terminalConfigurations: _terminalConfigurations,
|
|
134
|
+
memo: ""
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
_projectId = _controller.launchProjectFor({
|
|
138
|
+
owner: _projectOwner,
|
|
139
|
+
projectUri: "myIPFSHash",
|
|
140
|
+
rulesetConfigurations: _rulesetConfig,
|
|
141
|
+
terminalConfigurations: _terminalConfigurations,
|
|
142
|
+
memo: ""
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function testSplitPayoutAndReservedPercentSplit() public {
|
|
147
|
+
uint256 _nativePayAmount = 10 ether;
|
|
148
|
+
address _payee = makeAddr("payee");
|
|
149
|
+
vm.deal(_payee, _nativePayAmount);
|
|
150
|
+
vm.prank(_payee);
|
|
151
|
+
|
|
152
|
+
_terminal.pay{value: _nativePayAmount}({
|
|
153
|
+
projectId: _projectId,
|
|
154
|
+
amount: _nativePayAmount,
|
|
155
|
+
token: JBConstants.NATIVE_TOKEN,
|
|
156
|
+
beneficiary: _payee,
|
|
157
|
+
minReturnedTokens: 0,
|
|
158
|
+
memo: "Take my money!",
|
|
159
|
+
metadata: new bytes(0)
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// First payout meets our native token payout limit.
|
|
163
|
+
_terminal.sendPayoutsOf({
|
|
164
|
+
projectId: _projectId,
|
|
165
|
+
amount: _nativePayoutLimit,
|
|
166
|
+
currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
167
|
+
token: JBConstants.NATIVE_TOKEN, // Unused.
|
|
168
|
+
minTokensPaidOut: 0
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Calculate the amount returned after fees are processed.
|
|
172
|
+
uint256 _beneficiaryNativeBalance =
|
|
173
|
+
_nativePayoutLimit - mulDiv(_nativePayoutLimit, _terminal.FEE(), JBConstants.MAX_FEE);
|
|
174
|
+
|
|
175
|
+
assertEq(_splitsGuy.balance, _beneficiaryNativeBalance);
|
|
176
|
+
|
|
177
|
+
// Check that split groups of "0" don't extend the payout limit (keeping this out of a number test, for
|
|
178
|
+
// brevity).
|
|
179
|
+
vm.expectRevert(
|
|
180
|
+
abi.encodeWithSelector(
|
|
181
|
+
JBTerminalStore.JBTerminalStore_InadequateControllerPayoutLimit.selector,
|
|
182
|
+
_nativePayoutLimit * 2,
|
|
183
|
+
_nativePayoutLimit
|
|
184
|
+
)
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
// First payout meets our native token payout limit.
|
|
188
|
+
_terminal.sendPayoutsOf({
|
|
189
|
+
projectId: _projectId,
|
|
190
|
+
amount: _nativePayoutLimit,
|
|
191
|
+
currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
192
|
+
token: JBConstants.NATIVE_TOKEN, // Unused.
|
|
193
|
+
minTokensPaidOut: 0
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
vm.prank(_projectOwner);
|
|
197
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
198
|
+
|
|
199
|
+
// 10 native tokens paid -> 1000 per Eth, 10000 total, 50% reserve rate, 5000 tokens sent.
|
|
200
|
+
uint256 _reserveRateDistributionAmount =
|
|
201
|
+
mulDiv(_nativePayAmount, _weight, 10 ** 18) * _metadata.reservedPercent / JBConstants.MAX_RESERVED_PERCENT;
|
|
202
|
+
|
|
203
|
+
assertEq(_tokens.totalBalanceOf(_splitsGuy, _projectId), _reserveRateDistributionAmount);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function testReservedPercentSplitTerminal_reverts() public {
|
|
207
|
+
uint256 _amount = 100 ether;
|
|
208
|
+
uint64 _mockProjectId = 9_999_999;
|
|
209
|
+
address _mockTerminal = address(88_888_888);
|
|
210
|
+
JBSplit[] memory _reserveRateSplits = new JBSplit[](1);
|
|
211
|
+
|
|
212
|
+
// Configure a reserve rate split recipient.
|
|
213
|
+
_reserveRateSplits[0] = JBSplit({
|
|
214
|
+
preferAddToBalance: false,
|
|
215
|
+
percent: JBConstants.SPLITS_TOTAL_PERCENT,
|
|
216
|
+
projectId: _mockProjectId,
|
|
217
|
+
beneficiary: _splitsGuy,
|
|
218
|
+
lockedUntil: 0,
|
|
219
|
+
hook: IJBSplitHook(address(0))
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](1);
|
|
223
|
+
_splitsGroup[0] = JBSplitGroup({groupId: JBSplitGroupIds.RESERVED_TOKENS, splits: _reserveRateSplits});
|
|
224
|
+
|
|
225
|
+
_metadata = JBRulesetMetadata({
|
|
226
|
+
reservedPercent: JBConstants.MAX_RESERVED_PERCENT,
|
|
227
|
+
cashOutTaxRate: 0,
|
|
228
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
229
|
+
pausePay: false,
|
|
230
|
+
pauseCreditTransfers: false,
|
|
231
|
+
allowOwnerMinting: true,
|
|
232
|
+
allowSetCustomToken: true,
|
|
233
|
+
allowTerminalMigration: false,
|
|
234
|
+
allowSetTerminals: false,
|
|
235
|
+
ownerMustSendPayouts: false,
|
|
236
|
+
allowSetController: false,
|
|
237
|
+
allowAddAccountingContext: true,
|
|
238
|
+
allowAddPriceFeed: false,
|
|
239
|
+
holdFees: false,
|
|
240
|
+
useTotalSurplusForCashOuts: false,
|
|
241
|
+
useDataHookForPay: false,
|
|
242
|
+
useDataHookForCashOut: false,
|
|
243
|
+
dataHook: address(0),
|
|
244
|
+
metadata: 0
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// Package up ruleset configuration.
|
|
248
|
+
JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
|
|
249
|
+
_rulesetConfig[0].mustStartAtOrAfter = 0;
|
|
250
|
+
_rulesetConfig[0].duration = 0;
|
|
251
|
+
_rulesetConfig[0].weight = _weight;
|
|
252
|
+
_rulesetConfig[0].weightCutPercent = 0;
|
|
253
|
+
_rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
254
|
+
_rulesetConfig[0].metadata = _metadata;
|
|
255
|
+
_rulesetConfig[0].splitGroups = _splitsGroup;
|
|
256
|
+
|
|
257
|
+
// Create a new project.
|
|
258
|
+
_projectId = _controller.launchProjectFor({
|
|
259
|
+
owner: _projectOwner,
|
|
260
|
+
projectUri: "myIPFSHash",
|
|
261
|
+
rulesetConfigurations: _rulesetConfig,
|
|
262
|
+
terminalConfigurations: new JBTerminalConfig[](0),
|
|
263
|
+
memo: ""
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
// Deploy the token.
|
|
267
|
+
vm.startPrank(_projectOwner);
|
|
268
|
+
IERC20Metadata _token =
|
|
269
|
+
IERC20Metadata(address(_controller.deployERC20For(_projectId, "Token", "Token", bytes32(0))));
|
|
270
|
+
|
|
271
|
+
// Mint tokens with reservedPercent enabled.
|
|
272
|
+
_controller.mintTokensOf({
|
|
273
|
+
projectId: _projectId, tokenCount: _amount, beneficiary: _projectOwner, memo: "", useReservedPercent: true
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// Mock the primary terminal of the mock project.
|
|
277
|
+
vm.mockCall({
|
|
278
|
+
callee: address(jbDirectory()),
|
|
279
|
+
msgValue: 0,
|
|
280
|
+
data: abi.encodeCall(IJBDirectory.primaryTerminalOf, (_mockProjectId, address(_token))),
|
|
281
|
+
returnData: abi.encode(_mockTerminal)
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// Make it revert on payment.
|
|
285
|
+
vm.mockCallRevert({callee: _mockTerminal, data: abi.encode(IJBTerminal.pay.selector), revertData: ""});
|
|
286
|
+
|
|
287
|
+
// Distribute the tokens to the reverting terminal.
|
|
288
|
+
_controller.sendReservedTokensToSplitsOf(_projectId);
|
|
289
|
+
|
|
290
|
+
// Assert that the terminal does *NOT* have any allowance.
|
|
291
|
+
assertEq(_token.allowance(address(_controller), address(_mockTerminal)), 0);
|
|
292
|
+
|
|
293
|
+
// Assert that the beneficiary did receive the tokens.
|
|
294
|
+
assertEq(_token.balanceOf(_splitsGuy), _amount);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function testFuzzedSplitParameters(uint32 _currencyId, uint256 _multiplier) public {
|
|
298
|
+
_multiplier = bound(_multiplier, 2, JBConstants.SPLITS_TOTAL_PERCENT);
|
|
299
|
+
|
|
300
|
+
// Instantiate split parameters.
|
|
301
|
+
JBSplitGroup[] memory _splitsGroup = new JBSplitGroup[](2);
|
|
302
|
+
JBSplit[] memory _splits = new JBSplit[](2);
|
|
303
|
+
|
|
304
|
+
// Set up a payout split recipient.
|
|
305
|
+
_splits[0] = JBSplit({
|
|
306
|
+
preferAddToBalance: false,
|
|
307
|
+
percent: uint32(JBConstants.SPLITS_TOTAL_PERCENT / _multiplier),
|
|
308
|
+
projectId: 0,
|
|
309
|
+
beneficiary: _splitsGuy,
|
|
310
|
+
lockedUntil: 0,
|
|
311
|
+
hook: IJBSplitHook(address(0))
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
// A dummy used to check that splits groups of "0" don't bypass payout limits.
|
|
315
|
+
_splits[1] = JBSplit({
|
|
316
|
+
preferAddToBalance: false,
|
|
317
|
+
percent: uint32(JBConstants.SPLITS_TOTAL_PERCENT / _multiplier),
|
|
318
|
+
projectId: 0,
|
|
319
|
+
beneficiary: _splitsGuy,
|
|
320
|
+
lockedUntil: 0,
|
|
321
|
+
hook: IJBSplitHook(address(0))
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
_splitsGroup[0] = JBSplitGroup({groupId: _currencyId, splits: _splits});
|
|
325
|
+
|
|
326
|
+
// Package up fund access limits.
|
|
327
|
+
JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](1);
|
|
328
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
329
|
+
JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](1);
|
|
330
|
+
|
|
331
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: _nativePayoutLimit, currency: _currencyId});
|
|
332
|
+
_surplusAllowances[0] = JBCurrencyAmount({amount: 2 ether, currency: _currencyId});
|
|
333
|
+
_fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
|
|
334
|
+
terminal: address(_terminal),
|
|
335
|
+
token: JBConstants.NATIVE_TOKEN,
|
|
336
|
+
payoutLimits: _payoutLimits,
|
|
337
|
+
surplusAllowances: _surplusAllowances
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
// Package up ruleset configuration.
|
|
341
|
+
JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
|
|
342
|
+
_rulesetConfig[0].mustStartAtOrAfter = 0;
|
|
343
|
+
_rulesetConfig[0].duration = 0;
|
|
344
|
+
_rulesetConfig[0].weight = _weight;
|
|
345
|
+
_rulesetConfig[0].weightCutPercent = 0;
|
|
346
|
+
_rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
|
|
347
|
+
_rulesetConfig[0].metadata = _metadata;
|
|
348
|
+
_rulesetConfig[0].splitGroups = _splitsGroup;
|
|
349
|
+
_rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
|
|
350
|
+
|
|
351
|
+
// Package up terminal configuration.
|
|
352
|
+
JBTerminalConfig[] memory _terminalConfigurations = new JBTerminalConfig[](1);
|
|
353
|
+
JBAccountingContext[] memory _tokensToAccept = new JBAccountingContext[](1);
|
|
354
|
+
_tokensToAccept[0] = JBAccountingContext({
|
|
355
|
+
token: JBConstants.NATIVE_TOKEN, decimals: 18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))
|
|
356
|
+
});
|
|
357
|
+
_terminalConfigurations[0] =
|
|
358
|
+
JBTerminalConfig({terminal: _terminal, accountingContextsToAccept: _tokensToAccept});
|
|
359
|
+
|
|
360
|
+
// Dummy project to receive fees.
|
|
361
|
+
_controller.launchProjectFor({
|
|
362
|
+
owner: _projectOwner,
|
|
363
|
+
projectUri: "myIPFSHash",
|
|
364
|
+
rulesetConfigurations: _rulesetConfig,
|
|
365
|
+
terminalConfigurations: _terminalConfigurations,
|
|
366
|
+
memo: ""
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|