@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,478 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBMultiTerminalSetup} from "./JBMultiTerminalSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestCashOutTokensOf_Local is JBMultiTerminalSetup {
|
|
8
|
+
uint64 _projectId = 1;
|
|
9
|
+
uint256 _defaultAmount = 1e18;
|
|
10
|
+
uint16 _maxCashOutTaxRate = JBConstants.MAX_CASH_OUT_TAX_RATE;
|
|
11
|
+
uint16 _halfCashOutTaxRate = JBConstants.MAX_CASH_OUT_TAX_RATE / 2;
|
|
12
|
+
|
|
13
|
+
address _holder = makeAddr("holder");
|
|
14
|
+
address payable _bene = payable(makeAddr("beneficiary"));
|
|
15
|
+
address _mockToken = makeAddr("mockToken");
|
|
16
|
+
IJBCashOutHook _mockHook = IJBCashOutHook(makeAddr("cashOutHook"));
|
|
17
|
+
|
|
18
|
+
// mock erc20 necessary for balance checks
|
|
19
|
+
MockERC20 _mockToken2;
|
|
20
|
+
|
|
21
|
+
uint256 _minReclaimed;
|
|
22
|
+
|
|
23
|
+
function setUp() public {
|
|
24
|
+
super.multiTerminalSetup();
|
|
25
|
+
|
|
26
|
+
_mockToken2 = new MockERC20("testToken", "TT");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function test_WhenCallerDNHavePermission() external {
|
|
30
|
+
// it will revert UNAUTHORIZED
|
|
31
|
+
|
|
32
|
+
// mock call to JBPermissions hasPermission
|
|
33
|
+
mockExpect(
|
|
34
|
+
address(permissions),
|
|
35
|
+
abi.encodeCall(
|
|
36
|
+
IJBPermissions.hasPermission,
|
|
37
|
+
(address(_bene), address(_holder), _projectId, JBPermissionIds.CASH_OUT_TOKENS, true, true)
|
|
38
|
+
),
|
|
39
|
+
abi.encode(false)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
vm.expectRevert(
|
|
43
|
+
abi.encodeWithSelector(
|
|
44
|
+
JBPermissioned.JBPermissioned_Unauthorized.selector,
|
|
45
|
+
_holder,
|
|
46
|
+
_bene,
|
|
47
|
+
_projectId,
|
|
48
|
+
JBPermissionIds.CASH_OUT_TOKENS
|
|
49
|
+
)
|
|
50
|
+
);
|
|
51
|
+
vm.prank(_bene);
|
|
52
|
+
_terminal.cashOutTokensOf(_holder, _projectId, _defaultAmount, _mockToken, _minReclaimed, _bene, "");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
modifier whenCallerHasPermission() {
|
|
56
|
+
vm.prank(_bene);
|
|
57
|
+
|
|
58
|
+
// mock call to JBPermissions hasPermission
|
|
59
|
+
mockExpect(
|
|
60
|
+
address(permissions),
|
|
61
|
+
abi.encodeCall(
|
|
62
|
+
IJBPermissions.hasPermission,
|
|
63
|
+
(address(_bene), address(_holder), _projectId, JBPermissionIds.CASH_OUT_TOKENS, true, true)
|
|
64
|
+
),
|
|
65
|
+
abi.encode(true)
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
_;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function test_GivenCashOutCountLTMinTokensReclaimed() external whenCallerHasPermission {
|
|
72
|
+
// it will revert UNDER_MIN_TOKENS_RECLAIMED
|
|
73
|
+
|
|
74
|
+
uint256 reclaimAmount = 1e9;
|
|
75
|
+
JBCashOutHookSpecification[] memory hookSpecifications = new JBCashOutHookSpecification[](0);
|
|
76
|
+
JBAccountingContext[] memory mockBalanceContext = new JBAccountingContext[](0);
|
|
77
|
+
JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
|
|
78
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
79
|
+
cycleNumber: 1,
|
|
80
|
+
id: 1,
|
|
81
|
+
basedOnId: 0,
|
|
82
|
+
start: 0,
|
|
83
|
+
duration: 0,
|
|
84
|
+
weight: 0,
|
|
85
|
+
weightCutPercent: 0,
|
|
86
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
87
|
+
metadata: 0
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// mock call to JBTerminalStore recordCashOutFor
|
|
91
|
+
mockExpect(
|
|
92
|
+
address(store),
|
|
93
|
+
abi.encodeCall(
|
|
94
|
+
IJBTerminalStore.recordCashOutFor,
|
|
95
|
+
(_holder, _projectId, _defaultAmount, mockTokenContext, mockBalanceContext, "")
|
|
96
|
+
),
|
|
97
|
+
abi.encode(returnedRuleset, reclaimAmount, _maxCashOutTaxRate, hookSpecifications)
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
// mock call to find the controller (we'll just use this contracts address for simplicity)
|
|
101
|
+
mockExpect(
|
|
102
|
+
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// mock controller burn call
|
|
106
|
+
mockExpect(
|
|
107
|
+
address(this), abi.encodeCall(IJBController.burnTokensOf, (_holder, _projectId, _defaultAmount, "")), ""
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// put code at mockToken address to pass OZ Address check
|
|
111
|
+
vm.etch(_mockToken, abi.encode(1));
|
|
112
|
+
|
|
113
|
+
// mock feeless address check
|
|
114
|
+
mockExpect(address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (_bene)), abi.encode(true));
|
|
115
|
+
|
|
116
|
+
_terminal.cashOutTokensOf(_holder, _projectId, _defaultAmount, _mockToken, _minReclaimed, _bene, "");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function test_GivenCashOutCountGtZero() external whenCallerHasPermission {
|
|
120
|
+
// it will call directory controller of and burnTokensOf
|
|
121
|
+
|
|
122
|
+
uint256 reclaimAmount = 1e9;
|
|
123
|
+
JBCashOutHookSpecification[] memory hookSpecifications = new JBCashOutHookSpecification[](0);
|
|
124
|
+
JBAccountingContext[] memory mockBalanceContext = new JBAccountingContext[](0);
|
|
125
|
+
JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
|
|
126
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
127
|
+
cycleNumber: 1,
|
|
128
|
+
id: 1,
|
|
129
|
+
basedOnId: 0,
|
|
130
|
+
start: 0,
|
|
131
|
+
duration: 0,
|
|
132
|
+
weight: 0,
|
|
133
|
+
weightCutPercent: 0,
|
|
134
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
135
|
+
metadata: 0
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// mock call to JBTerminalStore recordCashOutFor
|
|
139
|
+
mockExpect(
|
|
140
|
+
address(store),
|
|
141
|
+
abi.encodeCall(
|
|
142
|
+
IJBTerminalStore.recordCashOutFor,
|
|
143
|
+
(_holder, _projectId, _defaultAmount, mockTokenContext, mockBalanceContext, "")
|
|
144
|
+
),
|
|
145
|
+
abi.encode(returnedRuleset, reclaimAmount, _maxCashOutTaxRate, hookSpecifications)
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// mock call to find the controller (we'll just use this contracts address for simplicity)
|
|
149
|
+
mockExpect(
|
|
150
|
+
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
// mock controller burn call
|
|
154
|
+
mockExpect(
|
|
155
|
+
address(this), abi.encodeCall(IJBController.burnTokensOf, (_holder, _projectId, _defaultAmount, "")), ""
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
// put code at mockToken address to pass OZ Address check
|
|
159
|
+
vm.etch(_mockToken, abi.encode(1));
|
|
160
|
+
|
|
161
|
+
// mock feeless address check
|
|
162
|
+
mockExpect(address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (_bene)), abi.encode(true));
|
|
163
|
+
vm.expectRevert(
|
|
164
|
+
abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_UnderMinTokensReclaimed.selector, 1e9, 1e18)
|
|
165
|
+
);
|
|
166
|
+
_terminal.cashOutTokensOf(_holder, _projectId, _defaultAmount, _mockToken, 1e18, _bene, ""); // minReclaimAmount
|
|
167
|
+
// = 1e18 but only 1e9 reclaimed
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function test_GivenReclaimAmountGtZeroBeneficiaryIsNotFeelessAndCashOutRateDneqMAX_CASH_OUT_RATE()
|
|
171
|
+
external
|
|
172
|
+
whenCallerHasPermission
|
|
173
|
+
{
|
|
174
|
+
// it will subtract the fee for the reclaim
|
|
175
|
+
|
|
176
|
+
uint256 reclaimAmount = 1e9;
|
|
177
|
+
JBCashOutHookSpecification[] memory hookSpecifications = new JBCashOutHookSpecification[](0);
|
|
178
|
+
JBAccountingContext[] memory mockBalanceContext = new JBAccountingContext[](0);
|
|
179
|
+
JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
|
|
180
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
181
|
+
cycleNumber: 1,
|
|
182
|
+
id: 1,
|
|
183
|
+
basedOnId: 0,
|
|
184
|
+
start: 0,
|
|
185
|
+
duration: 0,
|
|
186
|
+
weight: 0,
|
|
187
|
+
weightCutPercent: 0,
|
|
188
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
189
|
+
metadata: 0
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// mock call to JBTerminalStore recordCashOutFor
|
|
193
|
+
mockExpect(
|
|
194
|
+
address(store),
|
|
195
|
+
abi.encodeCall(
|
|
196
|
+
IJBTerminalStore.recordCashOutFor,
|
|
197
|
+
(_holder, _projectId, _defaultAmount, mockTokenContext, mockBalanceContext, "")
|
|
198
|
+
),
|
|
199
|
+
abi.encode(returnedRuleset, reclaimAmount, _halfCashOutTaxRate, hookSpecifications)
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
// mock call to find the controller (we'll just use this contracts address for simplicity)
|
|
203
|
+
mockExpect(
|
|
204
|
+
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
// mock controller burn call
|
|
208
|
+
mockExpect(
|
|
209
|
+
address(this), abi.encodeCall(IJBController.burnTokensOf, (_holder, _projectId, _defaultAmount, "")), ""
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
// put code at mockToken address to pass OZ Address check
|
|
213
|
+
vm.etch(_mockToken, abi.encode(1));
|
|
214
|
+
|
|
215
|
+
// mock feeless address check
|
|
216
|
+
mockExpect(address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (_bene)), abi.encode(false));
|
|
217
|
+
|
|
218
|
+
// get fee amount
|
|
219
|
+
uint256 tax = JBFees.feeAmountFrom(reclaimAmount, 25); // 25 = default fee)
|
|
220
|
+
uint256 transferredAmount = reclaimAmount - tax;
|
|
221
|
+
|
|
222
|
+
// transfer reclaimed to beneficiary
|
|
223
|
+
mockExpect(_mockToken, abi.encodeCall(IERC20.transfer, (_bene, transferredAmount)), abi.encode(true));
|
|
224
|
+
|
|
225
|
+
// find the terminal where subtracted fees are sent
|
|
226
|
+
mockExpect(
|
|
227
|
+
address(directory),
|
|
228
|
+
abi.encodeCall(IJBDirectory.primaryTerminalOf, (_projectId, _mockToken)),
|
|
229
|
+
abi.encode(address(_terminal))
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
// executeProcessFee
|
|
233
|
+
mockExpect(
|
|
234
|
+
address(_terminal),
|
|
235
|
+
abi.encodeCall(JBMultiTerminal.executeProcessFee, (_projectId, _mockToken, tax, _bene, _terminal)),
|
|
236
|
+
""
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
_terminal.cashOutTokensOf(_holder, _projectId, _defaultAmount, _mockToken, _minReclaimed, _bene, "");
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// covered above / in other units that test transfers
|
|
243
|
+
/* function test_GivenTheTokenIsNative() external whenCallerHasPermission {
|
|
244
|
+
// it will sendValue
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function test_GivenTheTokenIsErc20() external whenCallerHasPermission {
|
|
248
|
+
// it will safeTransfer tokens
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function test_GivenAmountEligibleForFeesDneqZero() external whenCallerHasPermission {
|
|
252
|
+
// it will call directory primaryTerminalOf and process the fee
|
|
253
|
+
} */
|
|
254
|
+
|
|
255
|
+
modifier whenADataHookIsConfigured() {
|
|
256
|
+
_;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* function test_GivenDataHookReturnsCashOutHookSpecsHookIsFeelessAndTokenIsNative()
|
|
260
|
+
external
|
|
261
|
+
whenADataHookIsConfigured
|
|
262
|
+
whenCallerHasPermission
|
|
263
|
+
{
|
|
264
|
+
// it will pass the full amount to the hook and emit HookAfterRecordCashOut
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
} */
|
|
268
|
+
|
|
269
|
+
function test_GivenDataHookReturnsCashOutHookSpecsHookIsFeelessAndTokenIsErc20()
|
|
270
|
+
external
|
|
271
|
+
whenADataHookIsConfigured
|
|
272
|
+
whenCallerHasPermission
|
|
273
|
+
{
|
|
274
|
+
// it will safeIncreaseAllowance pass the full amount to the hook and emit HookAfterRecordCashOut
|
|
275
|
+
|
|
276
|
+
// mint mocked erc20 tokens to hodler
|
|
277
|
+
_mockToken2.mint(address(_terminal), _defaultAmount * 10);
|
|
278
|
+
_mockToken2.mint(address(_holder), _defaultAmount * 10);
|
|
279
|
+
|
|
280
|
+
// approve those tokens to the terminal
|
|
281
|
+
vm.prank(_holder);
|
|
282
|
+
_mockToken2.approve(address(_terminal), _defaultAmount);
|
|
283
|
+
|
|
284
|
+
vm.prank(address(_terminal));
|
|
285
|
+
_mockToken2.approve(address(_mockHook), _defaultAmount);
|
|
286
|
+
|
|
287
|
+
uint256 reclaimAmount = 1e9;
|
|
288
|
+
JBCashOutHookSpecification[] memory hookSpecifications = new JBCashOutHookSpecification[](1);
|
|
289
|
+
hookSpecifications[0] = JBCashOutHookSpecification({hook: _mockHook, amount: _defaultAmount, metadata: ""});
|
|
290
|
+
JBAccountingContext[] memory mockBalanceContext = new JBAccountingContext[](0);
|
|
291
|
+
JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
|
|
292
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
293
|
+
cycleNumber: 1,
|
|
294
|
+
id: 1,
|
|
295
|
+
basedOnId: 0,
|
|
296
|
+
start: 0,
|
|
297
|
+
duration: 0,
|
|
298
|
+
weight: 0,
|
|
299
|
+
weightCutPercent: 0,
|
|
300
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
301
|
+
metadata: 0
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// mock call to JBTerminalStore recordCashOutFor
|
|
305
|
+
mockExpect(
|
|
306
|
+
address(store),
|
|
307
|
+
abi.encodeCall(
|
|
308
|
+
IJBTerminalStore.recordCashOutFor,
|
|
309
|
+
(_holder, _projectId, _defaultAmount, mockTokenContext, mockBalanceContext, "")
|
|
310
|
+
),
|
|
311
|
+
abi.encode(returnedRuleset, reclaimAmount, _maxCashOutTaxRate, hookSpecifications)
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
// mock call to find the controller (we'll just use this contracts address for simplicity)
|
|
315
|
+
mockExpect(
|
|
316
|
+
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
// mock controller burn call
|
|
320
|
+
mockExpect(
|
|
321
|
+
address(this), abi.encodeCall(IJBController.burnTokensOf, (_holder, _projectId, _defaultAmount, "")), ""
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
mockExpect(address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (_bene)), abi.encode(true));
|
|
325
|
+
|
|
326
|
+
mockExpect(
|
|
327
|
+
address(feelessAddresses),
|
|
328
|
+
abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(_mockHook))),
|
|
329
|
+
abi.encode(true)
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
JBTokenAmount memory reclaimedAmount = JBTokenAmount(address(_mockToken2), 0, 0, reclaimAmount);
|
|
333
|
+
JBTokenAmount memory forwardedAmount = JBTokenAmount(address(_mockToken2), 0, 0, _defaultAmount);
|
|
334
|
+
|
|
335
|
+
// needed for hook call
|
|
336
|
+
JBAfterCashOutRecordedContext memory context = JBAfterCashOutRecordedContext({
|
|
337
|
+
holder: _holder,
|
|
338
|
+
projectId: _projectId,
|
|
339
|
+
rulesetId: returnedRuleset.id,
|
|
340
|
+
cashOutCount: _defaultAmount,
|
|
341
|
+
reclaimedAmount: reclaimedAmount,
|
|
342
|
+
forwardedAmount: forwardedAmount,
|
|
343
|
+
cashOutTaxRate: _maxCashOutTaxRate,
|
|
344
|
+
beneficiary: _bene,
|
|
345
|
+
hookMetadata: "",
|
|
346
|
+
cashOutMetadata: ""
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
mockExpect(address(_mockHook), abi.encodeCall(IJBCashOutHook.afterCashOutRecordedWith, (context)), "");
|
|
350
|
+
|
|
351
|
+
// ensure approval is increased
|
|
352
|
+
vm.expectCall(address(_mockToken2), abi.encodeCall(IERC20.approve, (address(_mockHook), _defaultAmount * 2)));
|
|
353
|
+
|
|
354
|
+
vm.expectEmit();
|
|
355
|
+
emit IJBCashOutTerminal.HookAfterRecordCashOut(_mockHook, context, _defaultAmount, 0, address(_bene));
|
|
356
|
+
|
|
357
|
+
vm.prank(_bene);
|
|
358
|
+
_terminal.cashOutTokensOf(_holder, _projectId, _defaultAmount, address(_mockToken2), _minReclaimed, _bene, "");
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/* function test_GivenDataHookReturnsCashOutHookSpecsHookIsNotFeelessAndTokenIsNative()
|
|
362
|
+
external
|
|
363
|
+
whenADataHookIsConfigured
|
|
364
|
+
whenCallerHasPermission
|
|
365
|
+
{
|
|
366
|
+
// it will calculate the fee pass the amount to the hook and emit HookAfterRecordCashOut
|
|
367
|
+
} */
|
|
368
|
+
|
|
369
|
+
function test_GivenDataHookReturnsCashOutHookSpecsHookIsNotFeelessAndTokenIsErc20()
|
|
370
|
+
external
|
|
371
|
+
whenADataHookIsConfigured
|
|
372
|
+
whenCallerHasPermission
|
|
373
|
+
{
|
|
374
|
+
// it will safeIncreaseAllowance pass the amount to the hook and emit HookAfterRecordCashOut
|
|
375
|
+
|
|
376
|
+
// mint mocked erc20 tokens to hodler
|
|
377
|
+
_mockToken2.mint(address(_terminal), _defaultAmount * 10);
|
|
378
|
+
_mockToken2.mint(address(_holder), _defaultAmount * 10);
|
|
379
|
+
|
|
380
|
+
// approve those tokens to the terminal
|
|
381
|
+
vm.prank(_holder);
|
|
382
|
+
_mockToken2.approve(address(_terminal), _defaultAmount);
|
|
383
|
+
|
|
384
|
+
vm.prank(address(_terminal));
|
|
385
|
+
_mockToken2.approve(address(_mockHook), _defaultAmount);
|
|
386
|
+
|
|
387
|
+
uint256 reclaimAmount = 1e9;
|
|
388
|
+
JBCashOutHookSpecification[] memory hookSpecifications = new JBCashOutHookSpecification[](1);
|
|
389
|
+
JBCashOutHookSpecification[] memory paySpecs = new JBCashOutHookSpecification[](0);
|
|
390
|
+
hookSpecifications[0] = JBCashOutHookSpecification({hook: _mockHook, amount: _defaultAmount, metadata: ""});
|
|
391
|
+
JBAccountingContext[] memory mockBalanceContext = new JBAccountingContext[](0);
|
|
392
|
+
JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
|
|
393
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
394
|
+
cycleNumber: 1,
|
|
395
|
+
id: 1,
|
|
396
|
+
basedOnId: 0,
|
|
397
|
+
start: 0,
|
|
398
|
+
duration: 0,
|
|
399
|
+
weight: 0,
|
|
400
|
+
weightCutPercent: 0,
|
|
401
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
402
|
+
metadata: 0
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// mock call to JBTerminalStore recordCashOutFor
|
|
406
|
+
mockExpect(
|
|
407
|
+
address(store),
|
|
408
|
+
abi.encodeCall(
|
|
409
|
+
IJBTerminalStore.recordCashOutFor,
|
|
410
|
+
(_holder, _projectId, _defaultAmount, mockTokenContext, mockBalanceContext, "")
|
|
411
|
+
),
|
|
412
|
+
abi.encode(returnedRuleset, reclaimAmount, _maxCashOutTaxRate, hookSpecifications)
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
// mock call to find the controller (we'll just use this contracts address for simplicity)
|
|
416
|
+
mockExpect(
|
|
417
|
+
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
// mock controller burn call
|
|
421
|
+
mockExpect(
|
|
422
|
+
address(this), abi.encodeCall(IJBController.burnTokensOf, (_holder, _projectId, _defaultAmount, "")), ""
|
|
423
|
+
);
|
|
424
|
+
|
|
425
|
+
mockExpect(address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (_bene)), abi.encode(true));
|
|
426
|
+
|
|
427
|
+
mockExpect(
|
|
428
|
+
address(feelessAddresses),
|
|
429
|
+
abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(_mockHook))),
|
|
430
|
+
abi.encode(false)
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
uint256 hookTax = JBFees.feeAmountFrom(_defaultAmount, 25);
|
|
434
|
+
uint256 passedAfterTax = _defaultAmount - hookTax;
|
|
435
|
+
|
|
436
|
+
JBTokenAmount memory reclaimedAmount = JBTokenAmount(address(_mockToken2), 0, 0, reclaimAmount);
|
|
437
|
+
JBTokenAmount memory forwardedAmount = JBTokenAmount(address(_mockToken2), 0, 0, passedAfterTax);
|
|
438
|
+
JBTokenAmount memory feeRepayAmount = JBTokenAmount(address(_mockToken2), 0, 0, hookTax);
|
|
439
|
+
|
|
440
|
+
// needed for hook call
|
|
441
|
+
JBAfterCashOutRecordedContext memory context = JBAfterCashOutRecordedContext({
|
|
442
|
+
holder: _holder,
|
|
443
|
+
projectId: _projectId,
|
|
444
|
+
rulesetId: returnedRuleset.id,
|
|
445
|
+
cashOutCount: _defaultAmount,
|
|
446
|
+
reclaimedAmount: reclaimedAmount,
|
|
447
|
+
forwardedAmount: forwardedAmount,
|
|
448
|
+
cashOutTaxRate: _maxCashOutTaxRate,
|
|
449
|
+
beneficiary: _bene,
|
|
450
|
+
hookMetadata: "",
|
|
451
|
+
cashOutMetadata: ""
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
mockExpect(address(_mockHook), abi.encodeCall(IJBCashOutHook.afterCashOutRecordedWith, (context)), "");
|
|
455
|
+
|
|
456
|
+
// primary terminal check
|
|
457
|
+
mockExpect(
|
|
458
|
+
address(directory),
|
|
459
|
+
abi.encodeCall(IJBDirectory.primaryTerminalOf, (_projectId, address(_mockToken2))),
|
|
460
|
+
abi.encode(address(_terminal))
|
|
461
|
+
);
|
|
462
|
+
|
|
463
|
+
// mock call to JBTerminalStore recordPaymentFrom
|
|
464
|
+
mockExpect(
|
|
465
|
+
address(store),
|
|
466
|
+
abi.encodeCall(
|
|
467
|
+
IJBTerminalStore.recordPaymentFrom,
|
|
468
|
+
(address(_terminal), feeRepayAmount, _projectId, _bene, bytes(abi.encodePacked(uint256(_projectId))))
|
|
469
|
+
),
|
|
470
|
+
abi.encode(returnedRuleset, 0, paySpecs)
|
|
471
|
+
);
|
|
472
|
+
vm.expectEmit();
|
|
473
|
+
emit IJBCashOutTerminal.HookAfterRecordCashOut(_mockHook, context, passedAfterTax, hookTax, address(_bene));
|
|
474
|
+
|
|
475
|
+
vm.prank(_bene);
|
|
476
|
+
_terminal.cashOutTokensOf(_holder, _projectId, _defaultAmount, address(_mockToken2), _minReclaimed, _bene, "");
|
|
477
|
+
}
|
|
478
|
+
}
|