@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,125 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBSurplus} from "../../../../src/libraries/JBSurplus.sol";
|
|
6
|
+
|
|
7
|
+
/// @notice Mock terminal that returns a fixed surplus for testing JBSurplus.
|
|
8
|
+
contract MockSurplusTerminal is ERC165, IJBTerminal {
|
|
9
|
+
uint256 public surplusAmount;
|
|
10
|
+
|
|
11
|
+
constructor(uint256 _surplus) {
|
|
12
|
+
surplusAmount = _surplus;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function currentSurplusOf(
|
|
16
|
+
uint256,
|
|
17
|
+
JBAccountingContext[] memory,
|
|
18
|
+
uint256,
|
|
19
|
+
uint256
|
|
20
|
+
)
|
|
21
|
+
external
|
|
22
|
+
view
|
|
23
|
+
override
|
|
24
|
+
returns (uint256)
|
|
25
|
+
{
|
|
26
|
+
return surplusAmount;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) {
|
|
30
|
+
return interfaceId == type(IJBTerminal).interfaceId || super.supportsInterface(interfaceId);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Stub implementations for IJBTerminal
|
|
34
|
+
function accountingContextForTokenOf(uint256, address)
|
|
35
|
+
external
|
|
36
|
+
pure
|
|
37
|
+
override
|
|
38
|
+
returns (JBAccountingContext memory)
|
|
39
|
+
{}
|
|
40
|
+
function accountingContextsOf(uint256) external pure override returns (JBAccountingContext[] memory) {}
|
|
41
|
+
function addAccountingContextsFor(uint256, JBAccountingContext[] calldata) external override {}
|
|
42
|
+
function addToBalanceOf(
|
|
43
|
+
uint256,
|
|
44
|
+
address,
|
|
45
|
+
uint256,
|
|
46
|
+
bool,
|
|
47
|
+
string calldata,
|
|
48
|
+
bytes calldata
|
|
49
|
+
)
|
|
50
|
+
external
|
|
51
|
+
payable
|
|
52
|
+
override
|
|
53
|
+
{}
|
|
54
|
+
|
|
55
|
+
function migrateBalanceOf(uint256, address, IJBTerminal) external override returns (uint256) {
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function pay(
|
|
60
|
+
uint256,
|
|
61
|
+
address,
|
|
62
|
+
uint256,
|
|
63
|
+
address,
|
|
64
|
+
uint256,
|
|
65
|
+
string calldata,
|
|
66
|
+
bytes calldata
|
|
67
|
+
)
|
|
68
|
+
external
|
|
69
|
+
payable
|
|
70
|
+
override
|
|
71
|
+
returns (uint256)
|
|
72
|
+
{
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/// @notice Fuzz tests for the JBSurplus library.
|
|
78
|
+
contract TestSurplusFuzz_Local is JBTest {
|
|
79
|
+
function setUp() external {}
|
|
80
|
+
|
|
81
|
+
/// @notice Surplus with no terminals is 0.
|
|
82
|
+
function testFuzz_noTerminals_returnsZero(uint256 projectId) external view {
|
|
83
|
+
IJBTerminal[] memory terminals = new IJBTerminal[](0);
|
|
84
|
+
JBAccountingContext[] memory contexts = new JBAccountingContext[](0);
|
|
85
|
+
|
|
86
|
+
uint256 surplus = JBSurplus.currentSurplusOf(projectId, terminals, contexts, 18, 1);
|
|
87
|
+
assertEq(surplus, 0, "surplus with no terminals should be 0");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// @notice Surplus aggregates correctly across multiple terminals.
|
|
91
|
+
function testFuzz_multipleTerminals_aggregates(uint128 surplus1, uint128 surplus2) external {
|
|
92
|
+
MockSurplusTerminal terminal1 = new MockSurplusTerminal(surplus1);
|
|
93
|
+
MockSurplusTerminal terminal2 = new MockSurplusTerminal(surplus2);
|
|
94
|
+
|
|
95
|
+
IJBTerminal[] memory terminals = new IJBTerminal[](2);
|
|
96
|
+
terminals[0] = terminal1;
|
|
97
|
+
terminals[1] = terminal2;
|
|
98
|
+
|
|
99
|
+
JBAccountingContext[] memory contexts = new JBAccountingContext[](0);
|
|
100
|
+
|
|
101
|
+
uint256 total = JBSurplus.currentSurplusOf(1, terminals, contexts, 18, 1);
|
|
102
|
+
assertEq(total, uint256(surplus1) + uint256(surplus2), "surplus should be sum of all terminals");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/// @notice Surplus is monotonically increasing as terminal surpluses increase.
|
|
106
|
+
function testFuzz_monotonic(uint128 surplus1, uint128 surplus2) external {
|
|
107
|
+
vm.assume(surplus1 <= surplus2);
|
|
108
|
+
|
|
109
|
+
MockSurplusTerminal terminal1 = new MockSurplusTerminal(surplus1);
|
|
110
|
+
MockSurplusTerminal terminal2 = new MockSurplusTerminal(surplus2);
|
|
111
|
+
|
|
112
|
+
IJBTerminal[] memory terminals1 = new IJBTerminal[](1);
|
|
113
|
+
terminals1[0] = terminal1;
|
|
114
|
+
|
|
115
|
+
IJBTerminal[] memory terminals2 = new IJBTerminal[](1);
|
|
116
|
+
terminals2[0] = terminal2;
|
|
117
|
+
|
|
118
|
+
JBAccountingContext[] memory contexts = new JBAccountingContext[](0);
|
|
119
|
+
|
|
120
|
+
uint256 total1 = JBSurplus.currentSurplusOf(1, terminals1, contexts, 18, 1);
|
|
121
|
+
uint256 total2 = JBSurplus.currentSurplusOf(1, terminals2, contexts, 18, 1);
|
|
122
|
+
|
|
123
|
+
assertLe(total1, total2, "surplus should be monotonically increasing");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
Contract that deploys a target contract with other mock contracts to satisfy the constructor.
|
|
8
|
+
Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
|
|
9
|
+
*/
|
|
10
|
+
contract JBTerminalStoreSetup is JBTest {
|
|
11
|
+
// Mocks
|
|
12
|
+
IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
|
|
13
|
+
IJBRulesets public rulesets = IJBRulesets(makeAddr("rules"));
|
|
14
|
+
IJBPrices public prices = IJBPrices(makeAddr("prices"));
|
|
15
|
+
|
|
16
|
+
// Target Contract
|
|
17
|
+
IJBTerminalStore public _store;
|
|
18
|
+
|
|
19
|
+
function terminalStoreSetup() public virtual {
|
|
20
|
+
// Instantiate the contract being tested
|
|
21
|
+
_store = new JBTerminalStore(directory, prices, rulesets);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBTerminalStoreSetup} from "./JBTerminalStoreSetup.sol";
|
|
6
|
+
import {JBCashOuts} from "../../../../src/libraries/JBCashOuts.sol";
|
|
7
|
+
|
|
8
|
+
contract TestCurrentReclaimableSurplusOf_Local is JBTerminalStoreSetup {
|
|
9
|
+
using JBRulesetMetadataResolver for JBRulesetMetadata;
|
|
10
|
+
|
|
11
|
+
uint256 _projectId = 1;
|
|
12
|
+
uint256 _balance = 1e18;
|
|
13
|
+
|
|
14
|
+
// Mocks
|
|
15
|
+
IJBTerminal _terminal = IJBTerminal(makeAddr("terminal"));
|
|
16
|
+
IJBToken _token = IJBToken(makeAddr("token"));
|
|
17
|
+
IJBController _controller = IJBController(makeAddr("controller"));
|
|
18
|
+
IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
|
|
19
|
+
|
|
20
|
+
uint32 _currency = uint32(uint160(address(_token)));
|
|
21
|
+
uint256 _tokenCount = 1e18;
|
|
22
|
+
|
|
23
|
+
function setUp() public {
|
|
24
|
+
super.terminalStoreSetup();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
modifier whenProjectHasBalance() {
|
|
28
|
+
// Find the storage slot
|
|
29
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(address(_terminal), uint256(0)));
|
|
30
|
+
bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
|
|
31
|
+
bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
|
|
32
|
+
|
|
33
|
+
bytes32 balanceBytes = bytes32(_balance);
|
|
34
|
+
|
|
35
|
+
// Set balance
|
|
36
|
+
vm.store(address(_store), slot, balanceBytes);
|
|
37
|
+
|
|
38
|
+
// Ensure balance is set correctly
|
|
39
|
+
uint256 _balanceCallReturn = _store.balanceOf(address(_terminal), _projectId, address(_token));
|
|
40
|
+
assertEq(_balanceCallReturn, _balance);
|
|
41
|
+
_;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function test_GivenCurrentSurplusEqZero() external {
|
|
45
|
+
// it will return zero
|
|
46
|
+
|
|
47
|
+
// setup calldata
|
|
48
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
49
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
50
|
+
|
|
51
|
+
// JBRulesets return calldata
|
|
52
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
53
|
+
cycleNumber: uint48(block.timestamp),
|
|
54
|
+
id: uint48(block.timestamp),
|
|
55
|
+
basedOnId: 0,
|
|
56
|
+
start: uint48(block.timestamp),
|
|
57
|
+
duration: uint32(block.timestamp + 1000),
|
|
58
|
+
weight: 1e18,
|
|
59
|
+
weightCutPercent: 0,
|
|
60
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
61
|
+
metadata: 0
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// mock call to JBRulesets currentOf
|
|
65
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
66
|
+
|
|
67
|
+
// mock current surplus as zero
|
|
68
|
+
mockExpect(
|
|
69
|
+
address(_terminal),
|
|
70
|
+
abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
|
|
71
|
+
abi.encode(0)
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
75
|
+
_terminals[0] = _terminal;
|
|
76
|
+
uint256 reclaimable =
|
|
77
|
+
_store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
|
|
78
|
+
assertEq(0, reclaimable);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function test_GivenCurrentSurplusGtZero() external whenProjectHasBalance {
|
|
82
|
+
// it will get the number of outstanding tokens and return the reclaimable surplus
|
|
83
|
+
|
|
84
|
+
// setup calldata
|
|
85
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
86
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
87
|
+
|
|
88
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
89
|
+
reservedPercent: 0,
|
|
90
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
91
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
92
|
+
pausePay: false,
|
|
93
|
+
pauseCreditTransfers: false,
|
|
94
|
+
allowOwnerMinting: false,
|
|
95
|
+
allowSetCustomToken: false,
|
|
96
|
+
allowTerminalMigration: false,
|
|
97
|
+
allowSetTerminals: false,
|
|
98
|
+
ownerMustSendPayouts: false,
|
|
99
|
+
allowSetController: false,
|
|
100
|
+
allowAddAccountingContext: true,
|
|
101
|
+
allowAddPriceFeed: false,
|
|
102
|
+
holdFees: false,
|
|
103
|
+
useTotalSurplusForCashOuts: false,
|
|
104
|
+
useDataHookForPay: false,
|
|
105
|
+
useDataHookForCashOut: false,
|
|
106
|
+
dataHook: address(0),
|
|
107
|
+
metadata: 0
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
111
|
+
|
|
112
|
+
// JBRulesets return calldata
|
|
113
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
114
|
+
cycleNumber: uint48(block.timestamp),
|
|
115
|
+
id: uint48(block.timestamp),
|
|
116
|
+
basedOnId: 0,
|
|
117
|
+
start: uint48(block.timestamp),
|
|
118
|
+
duration: uint32(block.timestamp + 1000),
|
|
119
|
+
weight: 1e18,
|
|
120
|
+
weightCutPercent: 0,
|
|
121
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
122
|
+
metadata: _packedMetadata
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// mock call to JBRulesets currentOf
|
|
126
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
127
|
+
|
|
128
|
+
// mock call to JBDirectory controllerOf
|
|
129
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
130
|
+
|
|
131
|
+
// "mock" payout amount since the currentSurplusOf call is mocked
|
|
132
|
+
uint224 _payout = 1e17;
|
|
133
|
+
uint256 _supply = 1e19;
|
|
134
|
+
uint256 _cashoutAmount = 1e18;
|
|
135
|
+
|
|
136
|
+
// surplus call to the terminal
|
|
137
|
+
mockExpect(
|
|
138
|
+
address(_terminal),
|
|
139
|
+
abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
|
|
140
|
+
abi.encode(_supply - _payout)
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
144
|
+
mockExpect(
|
|
145
|
+
address(_controller),
|
|
146
|
+
abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
|
|
147
|
+
abi.encode(_supply)
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
151
|
+
_terminals[0] = _terminal;
|
|
152
|
+
uint256 reclaimable =
|
|
153
|
+
_store.currentReclaimableSurplusOf(_projectId, _cashoutAmount, _terminals, _contexts, 18, _currency);
|
|
154
|
+
|
|
155
|
+
// The above call should be calculating the reclaimable amount as we are here, so they will be congruent.
|
|
156
|
+
uint256 assumed =
|
|
157
|
+
JBCashOuts.cashOutFrom(_supply - _payout, _cashoutAmount, _supply, JBConstants.MAX_CASH_OUT_TAX_RATE / 2);
|
|
158
|
+
|
|
159
|
+
assertEq(assumed, reclaimable);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function test_GivenTokenCountIsEqToTotalSupply() external whenProjectHasBalance {
|
|
163
|
+
// it will return the rest of the surplus
|
|
164
|
+
|
|
165
|
+
// setup calldata
|
|
166
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
167
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
168
|
+
|
|
169
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
170
|
+
reservedPercent: 0,
|
|
171
|
+
cashOutTaxRate: 0,
|
|
172
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
173
|
+
pausePay: false,
|
|
174
|
+
pauseCreditTransfers: false,
|
|
175
|
+
allowOwnerMinting: false,
|
|
176
|
+
allowSetCustomToken: false,
|
|
177
|
+
allowTerminalMigration: false,
|
|
178
|
+
allowSetTerminals: false,
|
|
179
|
+
ownerMustSendPayouts: false,
|
|
180
|
+
allowSetController: false,
|
|
181
|
+
allowAddAccountingContext: true,
|
|
182
|
+
allowAddPriceFeed: false,
|
|
183
|
+
holdFees: false,
|
|
184
|
+
useTotalSurplusForCashOuts: false,
|
|
185
|
+
useDataHookForPay: false,
|
|
186
|
+
useDataHookForCashOut: false,
|
|
187
|
+
dataHook: address(0),
|
|
188
|
+
metadata: 0
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
192
|
+
|
|
193
|
+
// JBRulesets return calldata
|
|
194
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
195
|
+
cycleNumber: uint48(block.timestamp),
|
|
196
|
+
id: uint48(block.timestamp),
|
|
197
|
+
basedOnId: 0,
|
|
198
|
+
start: uint48(block.timestamp),
|
|
199
|
+
duration: uint32(block.timestamp + 1000),
|
|
200
|
+
weight: 1e18,
|
|
201
|
+
weightCutPercent: 0,
|
|
202
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
203
|
+
metadata: _packedMetadata
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// mock call to JBRulesets currentOf
|
|
207
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
208
|
+
|
|
209
|
+
// mock call to JBDirectory controllerOf
|
|
210
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
211
|
+
|
|
212
|
+
// mock call to get cumulative surplus
|
|
213
|
+
mockExpect(
|
|
214
|
+
address(_terminal),
|
|
215
|
+
abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
|
|
216
|
+
abi.encode(_tokenCount)
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
220
|
+
bytes memory _totalTokenCall = abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId));
|
|
221
|
+
bytes memory _tokenTotal = abi.encode(_tokenCount);
|
|
222
|
+
mockExpect(address(_controller), _totalTokenCall, _tokenTotal);
|
|
223
|
+
|
|
224
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
225
|
+
_terminals[0] = _terminal;
|
|
226
|
+
uint256 reclaimable =
|
|
227
|
+
_store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
|
|
228
|
+
|
|
229
|
+
// The tokenCount is equal to the total supply, so the reclaimable amount will be the same as the supply. We
|
|
230
|
+
// couldn't reclaim more.
|
|
231
|
+
assertEq(_tokenCount, reclaimable);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function test_GivenCashOutTaxRateEqZero() external whenProjectHasBalance {
|
|
235
|
+
// it will return zero
|
|
236
|
+
|
|
237
|
+
// setup calldata
|
|
238
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
239
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
240
|
+
|
|
241
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
242
|
+
reservedPercent: 0,
|
|
243
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE, // no surplus can be reclaimed.
|
|
244
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
245
|
+
pausePay: false,
|
|
246
|
+
pauseCreditTransfers: false,
|
|
247
|
+
allowOwnerMinting: false,
|
|
248
|
+
allowSetCustomToken: false,
|
|
249
|
+
allowTerminalMigration: false,
|
|
250
|
+
allowSetTerminals: false,
|
|
251
|
+
ownerMustSendPayouts: false,
|
|
252
|
+
allowSetController: false,
|
|
253
|
+
allowAddAccountingContext: true,
|
|
254
|
+
allowAddPriceFeed: false,
|
|
255
|
+
holdFees: false,
|
|
256
|
+
useTotalSurplusForCashOuts: false,
|
|
257
|
+
useDataHookForPay: false,
|
|
258
|
+
useDataHookForCashOut: false,
|
|
259
|
+
dataHook: address(0),
|
|
260
|
+
metadata: 0
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
264
|
+
|
|
265
|
+
// JBRulesets return calldata
|
|
266
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
267
|
+
cycleNumber: uint48(block.timestamp),
|
|
268
|
+
id: uint48(block.timestamp),
|
|
269
|
+
basedOnId: 0,
|
|
270
|
+
start: uint48(block.timestamp),
|
|
271
|
+
duration: uint32(block.timestamp + 1000),
|
|
272
|
+
weight: 1e18,
|
|
273
|
+
weightCutPercent: 0,
|
|
274
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
275
|
+
metadata: _packedMetadata
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// mock call to JBRulesets currentOf
|
|
279
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
280
|
+
|
|
281
|
+
// mock call to JBDirectory controllerOf
|
|
282
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
283
|
+
|
|
284
|
+
JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
|
|
285
|
+
_limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
|
|
286
|
+
|
|
287
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
288
|
+
bytes memory _totalTokenCall = abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId));
|
|
289
|
+
bytes memory _tokenTotal = abi.encode(1e18);
|
|
290
|
+
mockExpect(address(_controller), _totalTokenCall, _tokenTotal);
|
|
291
|
+
|
|
292
|
+
// mock current surplus
|
|
293
|
+
mockExpect(
|
|
294
|
+
address(_terminal),
|
|
295
|
+
abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
|
|
296
|
+
abi.encode(1e18)
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
300
|
+
_terminals[0] = _terminal;
|
|
301
|
+
uint256 reclaimable =
|
|
302
|
+
_store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
|
|
303
|
+
|
|
304
|
+
// No surplus can be reclaimed.
|
|
305
|
+
assertEq(0, reclaimable);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function test_GivenCashOutRateDneqMAX_CASH_OUT_RATE() external whenProjectHasBalance {
|
|
309
|
+
// it will return the calculated proportion
|
|
310
|
+
|
|
311
|
+
// setup calldata
|
|
312
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
313
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
314
|
+
|
|
315
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
316
|
+
reservedPercent: 0,
|
|
317
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
318
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
319
|
+
pausePay: false,
|
|
320
|
+
pauseCreditTransfers: false,
|
|
321
|
+
allowOwnerMinting: false,
|
|
322
|
+
allowSetCustomToken: false,
|
|
323
|
+
allowTerminalMigration: false,
|
|
324
|
+
allowSetTerminals: false,
|
|
325
|
+
ownerMustSendPayouts: false,
|
|
326
|
+
allowSetController: false,
|
|
327
|
+
allowAddAccountingContext: true,
|
|
328
|
+
allowAddPriceFeed: false,
|
|
329
|
+
holdFees: false,
|
|
330
|
+
useTotalSurplusForCashOuts: false,
|
|
331
|
+
useDataHookForPay: false,
|
|
332
|
+
useDataHookForCashOut: false,
|
|
333
|
+
dataHook: address(0),
|
|
334
|
+
metadata: 0
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
338
|
+
|
|
339
|
+
// JBRulesets return calldata
|
|
340
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
341
|
+
cycleNumber: uint48(block.timestamp),
|
|
342
|
+
id: uint48(block.timestamp),
|
|
343
|
+
basedOnId: 0,
|
|
344
|
+
start: uint48(block.timestamp),
|
|
345
|
+
duration: uint32(block.timestamp + 1000),
|
|
346
|
+
weight: 1e18,
|
|
347
|
+
weightCutPercent: 0,
|
|
348
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
349
|
+
metadata: _packedMetadata
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// mock call to JBRulesets currentOf
|
|
353
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
354
|
+
|
|
355
|
+
// mock call to JBDirectory controllerOf
|
|
356
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
357
|
+
|
|
358
|
+
// mock current surplus
|
|
359
|
+
mockExpect(
|
|
360
|
+
address(_terminal),
|
|
361
|
+
abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
|
|
362
|
+
abi.encode(1e18)
|
|
363
|
+
);
|
|
364
|
+
|
|
365
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
366
|
+
bytes memory _totalTokenCall = abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId));
|
|
367
|
+
bytes memory _tokenTotal = abi.encode(1e18);
|
|
368
|
+
mockExpect(address(_controller), _totalTokenCall, _tokenTotal);
|
|
369
|
+
|
|
370
|
+
uint256 reclaimable;
|
|
371
|
+
{
|
|
372
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](1);
|
|
373
|
+
_terminals[0] = _terminal;
|
|
374
|
+
reclaimable =
|
|
375
|
+
_store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
uint256 assumed = mulDiv(
|
|
379
|
+
1e18,
|
|
380
|
+
5000 + mulDiv(_tokenCount, JBConstants.MAX_CASH_OUT_TAX_RATE - 5000, 1e18),
|
|
381
|
+
JBConstants.MAX_CASH_OUT_TAX_RATE
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
assertEq(assumed, reclaimable);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function test_GivenNotOverloaded() external whenProjectHasBalance {
|
|
388
|
+
// it will get the current ruleset and proceed to return reclaimable as above
|
|
389
|
+
|
|
390
|
+
// Params
|
|
391
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
392
|
+
reservedPercent: 0,
|
|
393
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
|
|
394
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
395
|
+
pausePay: false,
|
|
396
|
+
pauseCreditTransfers: false,
|
|
397
|
+
allowOwnerMinting: false,
|
|
398
|
+
allowSetCustomToken: false,
|
|
399
|
+
allowTerminalMigration: false,
|
|
400
|
+
allowSetTerminals: false,
|
|
401
|
+
ownerMustSendPayouts: false,
|
|
402
|
+
allowSetController: false,
|
|
403
|
+
allowAddAccountingContext: true,
|
|
404
|
+
allowAddPriceFeed: false,
|
|
405
|
+
holdFees: false,
|
|
406
|
+
useTotalSurplusForCashOuts: false,
|
|
407
|
+
useDataHookForPay: false,
|
|
408
|
+
useDataHookForCashOut: false,
|
|
409
|
+
dataHook: address(0),
|
|
410
|
+
metadata: 0
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
414
|
+
|
|
415
|
+
// JBRulesets return calldata
|
|
416
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
417
|
+
cycleNumber: uint48(block.timestamp),
|
|
418
|
+
id: uint48(block.timestamp),
|
|
419
|
+
basedOnId: 0,
|
|
420
|
+
start: uint48(block.timestamp),
|
|
421
|
+
duration: uint32(block.timestamp + 1000),
|
|
422
|
+
weight: 1e18,
|
|
423
|
+
weightCutPercent: 0,
|
|
424
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
425
|
+
metadata: _packedMetadata
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
// mock call to JBRulesets currentOf
|
|
429
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
430
|
+
|
|
431
|
+
uint256 reclaimable = _store.currentReclaimableSurplusOf(_projectId, _tokenCount, 1e18, 1e18);
|
|
432
|
+
assertEq(1e18, reclaimable);
|
|
433
|
+
}
|
|
434
|
+
}
|