@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,479 @@
|
|
|
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
|
+
|
|
7
|
+
contract TestRecordCashOutsFor_Local is JBTerminalStoreSetup {
|
|
8
|
+
uint64 _projectId = 1;
|
|
9
|
+
uint256 _decimals = 18;
|
|
10
|
+
uint256 _balance = 10e18;
|
|
11
|
+
uint256 _totalSupply = 20e18;
|
|
12
|
+
uint256 _currentSurplus = 3e18;
|
|
13
|
+
|
|
14
|
+
// Mocks
|
|
15
|
+
IJBTerminal _terminal1 = IJBTerminal(makeAddr("terminal1"));
|
|
16
|
+
IJBTerminal _terminal2 = IJBTerminal(makeAddr("terminal2"));
|
|
17
|
+
IJBToken _token = IJBToken(makeAddr("token"));
|
|
18
|
+
IJBController _controller = IJBController(makeAddr("controller"));
|
|
19
|
+
IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
|
|
20
|
+
IJBRulesetDataHook _dataHook = IJBRulesetDataHook(makeAddr("dataHook"));
|
|
21
|
+
IJBCashOutHook _cashOutHook = IJBCashOutHook(makeAddr("cashOutHook"));
|
|
22
|
+
|
|
23
|
+
uint32 _currency = uint32(uint160(address(_token)));
|
|
24
|
+
address _nativeAddress = JBConstants.NATIVE_TOKEN;
|
|
25
|
+
uint32 _nativeCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
|
|
26
|
+
|
|
27
|
+
function setUp() public {
|
|
28
|
+
super.terminalStoreSetup();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
modifier whenCurrentRulesetUseTotalSurplusForCashOutsEqTrue() {
|
|
32
|
+
// Find the storage slot
|
|
33
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
|
|
34
|
+
bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
|
|
35
|
+
bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
|
|
36
|
+
|
|
37
|
+
bytes32 balanceBytes = bytes32(_balance);
|
|
38
|
+
|
|
39
|
+
// Set balance
|
|
40
|
+
vm.store(address(_store), slot, balanceBytes);
|
|
41
|
+
|
|
42
|
+
// Ensure balance is set correctly
|
|
43
|
+
uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_token));
|
|
44
|
+
assertEq(_balanceCallReturn, _balance);
|
|
45
|
+
|
|
46
|
+
// return data for mock call
|
|
47
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](2);
|
|
48
|
+
_terminals[0] = _terminal1;
|
|
49
|
+
_terminals[1] = _terminal2;
|
|
50
|
+
|
|
51
|
+
// mock call to JBDirectory terminalsOf
|
|
52
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
|
|
53
|
+
bytes memory _returned = abi.encode(_terminals);
|
|
54
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
55
|
+
|
|
56
|
+
// mock call to first terminal currentSurplusOf
|
|
57
|
+
bytes memory _terminal1Call = abi.encodeCall(
|
|
58
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
59
|
+
);
|
|
60
|
+
bytes memory _terminal1Return = abi.encode(1e18);
|
|
61
|
+
mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
|
|
62
|
+
|
|
63
|
+
// mock call to first terminal currentSurplusOf
|
|
64
|
+
bytes memory _terminal2Call = abi.encodeCall(
|
|
65
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
66
|
+
);
|
|
67
|
+
bytes memory _terminal2Return = abi.encode(2e18);
|
|
68
|
+
mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
|
|
69
|
+
|
|
70
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
71
|
+
reservedPercent: 0,
|
|
72
|
+
cashOutTaxRate: 0,
|
|
73
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
74
|
+
pausePay: true,
|
|
75
|
+
pauseCreditTransfers: false,
|
|
76
|
+
allowOwnerMinting: false,
|
|
77
|
+
allowSetCustomToken: false,
|
|
78
|
+
allowTerminalMigration: false,
|
|
79
|
+
allowSetTerminals: false,
|
|
80
|
+
ownerMustSendPayouts: false,
|
|
81
|
+
allowSetController: false,
|
|
82
|
+
allowAddAccountingContext: true,
|
|
83
|
+
allowAddPriceFeed: false,
|
|
84
|
+
holdFees: false,
|
|
85
|
+
useTotalSurplusForCashOuts: true,
|
|
86
|
+
useDataHookForPay: false,
|
|
87
|
+
useDataHookForCashOut: false,
|
|
88
|
+
dataHook: address(0),
|
|
89
|
+
metadata: 0
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
93
|
+
|
|
94
|
+
// JBRulesets return calldata
|
|
95
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
96
|
+
cycleNumber: uint48(block.timestamp),
|
|
97
|
+
id: uint48(block.timestamp),
|
|
98
|
+
basedOnId: 0,
|
|
99
|
+
start: uint48(block.timestamp),
|
|
100
|
+
duration: uint32(block.timestamp + 1000),
|
|
101
|
+
weight: 1e18,
|
|
102
|
+
weightCutPercent: 0,
|
|
103
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
104
|
+
metadata: _packedMetadata
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
108
|
+
bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
|
|
109
|
+
mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
|
|
110
|
+
|
|
111
|
+
// mock call to JBDirectory controllerOf
|
|
112
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
113
|
+
_;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
modifier whenCallerBalanceIsZero() {
|
|
117
|
+
// Find the storage slot
|
|
118
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
|
|
119
|
+
bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
|
|
120
|
+
bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
|
|
121
|
+
|
|
122
|
+
bytes32 balanceBytes = bytes32(0);
|
|
123
|
+
|
|
124
|
+
// Set balance
|
|
125
|
+
vm.store(address(_store), slot, balanceBytes);
|
|
126
|
+
|
|
127
|
+
// Ensure balance is set correctly
|
|
128
|
+
uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_token));
|
|
129
|
+
assertEq(_balanceCallReturn, 0);
|
|
130
|
+
|
|
131
|
+
// return data for mock call
|
|
132
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](2);
|
|
133
|
+
_terminals[0] = _terminal1;
|
|
134
|
+
_terminals[1] = _terminal2;
|
|
135
|
+
|
|
136
|
+
// mock call to JBDirectory terminalsOf
|
|
137
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
|
|
138
|
+
bytes memory _returned = abi.encode(_terminals);
|
|
139
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
140
|
+
|
|
141
|
+
// mock call to first terminal currentSurplusOf
|
|
142
|
+
bytes memory _terminal1Call = abi.encodeCall(
|
|
143
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
144
|
+
);
|
|
145
|
+
bytes memory _terminal1Return = abi.encode(1e18);
|
|
146
|
+
mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
|
|
147
|
+
|
|
148
|
+
// mock call to first terminal currentSurplusOf
|
|
149
|
+
bytes memory _terminal2Call = abi.encodeCall(
|
|
150
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
151
|
+
);
|
|
152
|
+
bytes memory _terminal2Return = abi.encode(2e18);
|
|
153
|
+
mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
|
|
154
|
+
|
|
155
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
156
|
+
reservedPercent: 0,
|
|
157
|
+
cashOutTaxRate: 0,
|
|
158
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
159
|
+
pausePay: true,
|
|
160
|
+
pauseCreditTransfers: false,
|
|
161
|
+
allowOwnerMinting: false,
|
|
162
|
+
allowSetCustomToken: false,
|
|
163
|
+
allowTerminalMigration: false,
|
|
164
|
+
allowSetTerminals: false,
|
|
165
|
+
ownerMustSendPayouts: false,
|
|
166
|
+
allowSetController: false,
|
|
167
|
+
allowAddAccountingContext: true,
|
|
168
|
+
allowAddPriceFeed: false,
|
|
169
|
+
holdFees: false,
|
|
170
|
+
useTotalSurplusForCashOuts: true,
|
|
171
|
+
useDataHookForPay: false,
|
|
172
|
+
useDataHookForCashOut: false,
|
|
173
|
+
dataHook: address(0),
|
|
174
|
+
metadata: 0
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
178
|
+
|
|
179
|
+
// JBRulesets return calldata
|
|
180
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
181
|
+
cycleNumber: uint48(block.timestamp),
|
|
182
|
+
id: uint48(block.timestamp),
|
|
183
|
+
basedOnId: 0,
|
|
184
|
+
start: uint48(block.timestamp),
|
|
185
|
+
duration: uint32(block.timestamp + 1000),
|
|
186
|
+
weight: 1e18,
|
|
187
|
+
weightCutPercent: 0,
|
|
188
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
189
|
+
metadata: _packedMetadata
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
193
|
+
bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
|
|
194
|
+
mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
|
|
195
|
+
|
|
196
|
+
// mock call to JBDirectory controllerOf
|
|
197
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
198
|
+
_;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
modifier whenCurrentRulesetUseTotalSurplusForCashOutsEqTrueWithHook() {
|
|
202
|
+
// Find the storage slot
|
|
203
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
|
|
204
|
+
bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
|
|
205
|
+
bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
|
|
206
|
+
|
|
207
|
+
bytes32 balanceBytes = bytes32(_balance);
|
|
208
|
+
|
|
209
|
+
// Set balance
|
|
210
|
+
vm.store(address(_store), slot, balanceBytes);
|
|
211
|
+
|
|
212
|
+
// Ensure balance is set correctly
|
|
213
|
+
uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_token));
|
|
214
|
+
assertEq(_balanceCallReturn, _balance);
|
|
215
|
+
|
|
216
|
+
// return data for mock call
|
|
217
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](2);
|
|
218
|
+
_terminals[0] = _terminal1;
|
|
219
|
+
_terminals[1] = _terminal2;
|
|
220
|
+
|
|
221
|
+
// mock call to JBDirectory terminalsOf
|
|
222
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
|
|
223
|
+
bytes memory _returned = abi.encode(_terminals);
|
|
224
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
225
|
+
|
|
226
|
+
// mock call to first terminal currentSurplusOf
|
|
227
|
+
bytes memory _terminal1Call = abi.encodeCall(
|
|
228
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
229
|
+
);
|
|
230
|
+
bytes memory _terminal1Return = abi.encode(1e18);
|
|
231
|
+
mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
|
|
232
|
+
|
|
233
|
+
// mock call to first terminal currentSurplusOf
|
|
234
|
+
bytes memory _terminal2Call = abi.encodeCall(
|
|
235
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
236
|
+
);
|
|
237
|
+
bytes memory _terminal2Return = abi.encode(2e18);
|
|
238
|
+
mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
|
|
239
|
+
|
|
240
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
241
|
+
reservedPercent: 0,
|
|
242
|
+
cashOutTaxRate: 0,
|
|
243
|
+
baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
|
|
244
|
+
pausePay: true,
|
|
245
|
+
pauseCreditTransfers: false,
|
|
246
|
+
allowOwnerMinting: false,
|
|
247
|
+
allowSetCustomToken: false,
|
|
248
|
+
allowTerminalMigration: false,
|
|
249
|
+
allowSetTerminals: false,
|
|
250
|
+
ownerMustSendPayouts: false,
|
|
251
|
+
allowSetController: false,
|
|
252
|
+
allowAddAccountingContext: true,
|
|
253
|
+
allowAddPriceFeed: false,
|
|
254
|
+
holdFees: false,
|
|
255
|
+
useTotalSurplusForCashOuts: true,
|
|
256
|
+
useDataHookForPay: false,
|
|
257
|
+
useDataHookForCashOut: true,
|
|
258
|
+
dataHook: address(_dataHook),
|
|
259
|
+
metadata: 0
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
263
|
+
|
|
264
|
+
// JBRulesets return calldata
|
|
265
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
266
|
+
cycleNumber: uint48(block.timestamp),
|
|
267
|
+
id: uint48(block.timestamp),
|
|
268
|
+
basedOnId: 0,
|
|
269
|
+
start: uint48(block.timestamp),
|
|
270
|
+
duration: uint32(block.timestamp + 1000),
|
|
271
|
+
weight: 1e18,
|
|
272
|
+
weightCutPercent: 0,
|
|
273
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
274
|
+
metadata: _packedMetadata
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
278
|
+
bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
|
|
279
|
+
mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
|
|
280
|
+
|
|
281
|
+
// mock call to JBDirectory controllerOf
|
|
282
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
283
|
+
|
|
284
|
+
_;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function test_GivenTheCashOutCountGtTotalSupply() external whenCurrentRulesetUseTotalSurplusForCashOutsEqTrue {
|
|
288
|
+
// it will revert INSUFFICIENT_TOKENS
|
|
289
|
+
|
|
290
|
+
uint256 _supply = 1e18;
|
|
291
|
+
|
|
292
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
293
|
+
mockExpect(
|
|
294
|
+
address(_controller),
|
|
295
|
+
abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
|
|
296
|
+
abi.encode(_supply)
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
300
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
301
|
+
|
|
302
|
+
// call params
|
|
303
|
+
JBAccountingContext memory _accountingContexts =
|
|
304
|
+
JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
305
|
+
JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
|
|
306
|
+
|
|
307
|
+
_balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
308
|
+
|
|
309
|
+
uint256 _cashOutCount = 4e18; // greater than token total supply
|
|
310
|
+
|
|
311
|
+
vm.expectRevert(
|
|
312
|
+
abi.encodeWithSelector(JBTerminalStore.JBTerminalStore_InsufficientTokens.selector, _cashOutCount, _supply)
|
|
313
|
+
);
|
|
314
|
+
_store.recordCashOutFor({
|
|
315
|
+
holder: address(this),
|
|
316
|
+
projectId: _projectId,
|
|
317
|
+
cashOutCount: _cashOutCount,
|
|
318
|
+
accountingContext: _accountingContexts,
|
|
319
|
+
balanceAccountingContexts: _balanceContexts,
|
|
320
|
+
metadata: ""
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function test_GivenTheCurrentSurplusGtZero() external whenCurrentRulesetUseTotalSurplusForCashOutsEqTrue {
|
|
325
|
+
// it will set reclaim amount using the currentSurplus
|
|
326
|
+
|
|
327
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
328
|
+
mockExpect(
|
|
329
|
+
address(_controller),
|
|
330
|
+
abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
|
|
331
|
+
abi.encode(_totalSupply)
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
335
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
336
|
+
|
|
337
|
+
// call params
|
|
338
|
+
JBAccountingContext memory _accountingContexts =
|
|
339
|
+
JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
340
|
+
JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
|
|
341
|
+
|
|
342
|
+
_balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
343
|
+
|
|
344
|
+
uint256 _cashOutCount = 6; // within balance bounds
|
|
345
|
+
uint256 expectedCashOuts = mulDiv(3e18, _cashOutCount, _totalSupply);
|
|
346
|
+
|
|
347
|
+
(, uint256 reclaimed,,) = _store.recordCashOutFor({
|
|
348
|
+
holder: address(this),
|
|
349
|
+
projectId: _projectId,
|
|
350
|
+
cashOutCount: _cashOutCount,
|
|
351
|
+
accountingContext: _accountingContexts,
|
|
352
|
+
balanceAccountingContexts: _balanceContexts,
|
|
353
|
+
metadata: ""
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
assertEq(expectedCashOuts, reclaimed);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function test_GivenCurrentRulesetUseDataHookForCashOutEqTrue()
|
|
360
|
+
external
|
|
361
|
+
whenCurrentRulesetUseTotalSurplusForCashOutsEqTrueWithHook
|
|
362
|
+
{
|
|
363
|
+
// it will call the dataHook for the reclaim amount and hookSpecs
|
|
364
|
+
|
|
365
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
366
|
+
mockExpect(
|
|
367
|
+
address(_controller),
|
|
368
|
+
abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
|
|
369
|
+
abi.encode(_totalSupply)
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
373
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
374
|
+
|
|
375
|
+
// call params
|
|
376
|
+
JBAccountingContext memory _accountingContexts =
|
|
377
|
+
JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
378
|
+
JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
|
|
379
|
+
|
|
380
|
+
_balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
381
|
+
|
|
382
|
+
uint256 _cashOutCount = 1e18; // within balance bounds
|
|
383
|
+
uint256 expectedCashOuts = mulDiv(3e18, _cashOutCount, _totalSupply);
|
|
384
|
+
|
|
385
|
+
// Create the struct that describes the amount being reclaimed.
|
|
386
|
+
JBTokenAmount memory _reclaimedTokenAmount = JBTokenAmount({
|
|
387
|
+
token: _accountingContexts.token,
|
|
388
|
+
value: 3e18,
|
|
389
|
+
decimals: _accountingContexts.decimals,
|
|
390
|
+
currency: _accountingContexts.currency
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
// Create the cash out context that'll be sent to the data hook.
|
|
394
|
+
JBBeforeCashOutRecordedContext memory _context = JBBeforeCashOutRecordedContext({
|
|
395
|
+
terminal: address(this),
|
|
396
|
+
holder: address(this),
|
|
397
|
+
projectId: _projectId,
|
|
398
|
+
rulesetId: uint48(block.timestamp),
|
|
399
|
+
cashOutCount: _cashOutCount,
|
|
400
|
+
totalSupply: _totalSupply,
|
|
401
|
+
surplus: _reclaimedTokenAmount,
|
|
402
|
+
useTotalSurplus: true,
|
|
403
|
+
cashOutTaxRate: 0,
|
|
404
|
+
metadata: ""
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
// return data
|
|
408
|
+
JBCashOutHookSpecification[] memory _spec = new JBCashOutHookSpecification[](1);
|
|
409
|
+
_spec[0] = JBCashOutHookSpecification({hook: _cashOutHook, amount: 0, metadata: ""});
|
|
410
|
+
|
|
411
|
+
// mock call to data hook beforeCashOutRecordedWith
|
|
412
|
+
mockExpect(
|
|
413
|
+
address(_dataHook),
|
|
414
|
+
abi.encodeCall(IJBRulesetDataHook.beforeCashOutRecordedWith, (_context)),
|
|
415
|
+
abi.encode(0, 1e18, _totalSupply, _spec)
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
uint256 balanceBefore = _store.balanceOf(address(this), _projectId, _accountingContexts.token);
|
|
419
|
+
|
|
420
|
+
(, uint256 reclaimed,,) = _store.recordCashOutFor({
|
|
421
|
+
holder: address(this),
|
|
422
|
+
projectId: _projectId,
|
|
423
|
+
cashOutCount: _cashOutCount,
|
|
424
|
+
accountingContext: _accountingContexts,
|
|
425
|
+
balanceAccountingContexts: _balanceContexts,
|
|
426
|
+
metadata: ""
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
// covers GivenTheBalanceDiffGtZero()
|
|
430
|
+
assertEq(
|
|
431
|
+
balanceBefore - expectedCashOuts, _store.balanceOf(address(this), _projectId, _accountingContexts.token)
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
assertEq(expectedCashOuts, reclaimed);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
function test_GivenTheAmountReclaimedGtCallerBalance() external whenCallerBalanceIsZero {
|
|
438
|
+
// it will revert INADEQUATE_TERMINAL_STORE_BALANCE
|
|
439
|
+
|
|
440
|
+
uint256 _totalTokens = 10e18;
|
|
441
|
+
|
|
442
|
+
// mock JBController totalTokenSupplyWithReservedTokensOf
|
|
443
|
+
mockExpect(
|
|
444
|
+
address(_controller),
|
|
445
|
+
abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
|
|
446
|
+
abi.encode(_totalTokens)
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
// call params
|
|
450
|
+
JBAccountingContext memory _accountingContexts =
|
|
451
|
+
JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
452
|
+
JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
|
|
453
|
+
|
|
454
|
+
_balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
455
|
+
|
|
456
|
+
uint256 _cashOutCount = 4e18; // greater than caller balance
|
|
457
|
+
|
|
458
|
+
uint256 reclaimAmount = mulDiv(_currentSurplus, _cashOutCount, _totalTokens);
|
|
459
|
+
|
|
460
|
+
vm.expectRevert(
|
|
461
|
+
abi.encodeWithSelector(
|
|
462
|
+
JBTerminalStore.JBTerminalStore_InadequateTerminalStoreBalance.selector, reclaimAmount, 0
|
|
463
|
+
)
|
|
464
|
+
);
|
|
465
|
+
_store.recordCashOutFor({
|
|
466
|
+
holder: address(this),
|
|
467
|
+
projectId: _projectId,
|
|
468
|
+
cashOutCount: _cashOutCount,
|
|
469
|
+
accountingContext: _accountingContexts,
|
|
470
|
+
balanceAccountingContexts: _balanceContexts,
|
|
471
|
+
metadata: ""
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Probably unnecessary even though it may give us a bit of cov %.. skipping for now
|
|
476
|
+
/* function test_WhenTheCurrentRulesetUseTotalSurplusForCashOutsEqFalse() external {
|
|
477
|
+
// it will use the standard surplus calculation
|
|
478
|
+
} */
|
|
479
|
+
}
|