@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,514 @@
|
|
|
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 TestPay_Local is JBMultiTerminalSetup {
|
|
8
|
+
uint64 _projectId = 1;
|
|
9
|
+
uint256 _defaultAmount = 1e18;
|
|
10
|
+
address _bene = makeAddr("beneficiary");
|
|
11
|
+
address _native = JBConstants.NATIVE_TOKEN;
|
|
12
|
+
uint32 _nativeCurrency = uint32(uint160(_native));
|
|
13
|
+
address _usdc = makeAddr("USDC");
|
|
14
|
+
uint32 _usdcCurrency = uint32(uint160(_usdc));
|
|
15
|
+
|
|
16
|
+
address _mockController = makeAddr("mc");
|
|
17
|
+
IJBPayHook _mockHook = IJBPayHook(makeAddr("hook"));
|
|
18
|
+
|
|
19
|
+
// mock erc20 necessary for balance checks
|
|
20
|
+
MockERC20 _mockToken;
|
|
21
|
+
uint256 _mockTokenCurrency;
|
|
22
|
+
|
|
23
|
+
function setUp() public {
|
|
24
|
+
super.multiTerminalSetup();
|
|
25
|
+
|
|
26
|
+
_mockToken = new MockERC20("testToken", "TT");
|
|
27
|
+
_mockTokenCurrency = uint32(uint160(address(_mockToken)));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
modifier whenNativeTokenIsAccepted() {
|
|
31
|
+
// mock call to JBProjects ownerOf
|
|
32
|
+
mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(0)));
|
|
33
|
+
|
|
34
|
+
// mock call to JBDirectory controllerOf
|
|
35
|
+
mockExpect(
|
|
36
|
+
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
|
|
40
|
+
_tokens[0] = JBAccountingContext({
|
|
41
|
+
token: JBConstants.NATIVE_TOKEN, decimals: 18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// setup: return data
|
|
45
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
46
|
+
cycleNumber: 1,
|
|
47
|
+
id: 0,
|
|
48
|
+
basedOnId: 0,
|
|
49
|
+
start: 0,
|
|
50
|
+
duration: 0,
|
|
51
|
+
weight: 0,
|
|
52
|
+
weightCutPercent: 0,
|
|
53
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
54
|
+
metadata: 0
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(returnedRuleset));
|
|
58
|
+
|
|
59
|
+
_terminal.addAccountingContextsFor(_projectId, _tokens);
|
|
60
|
+
|
|
61
|
+
_;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
modifier whenERC20IsAccepted() {
|
|
65
|
+
// mock call to JBProjects ownerOf
|
|
66
|
+
mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(0)));
|
|
67
|
+
|
|
68
|
+
// mock call to JBDirectory controllerOf
|
|
69
|
+
mockExpect(
|
|
70
|
+
address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(this))
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
// mock call to token decimals
|
|
74
|
+
mockExpect(address(_mockToken), abi.encodeCall(IERC20Metadata.decimals, ()), abi.encode(6));
|
|
75
|
+
|
|
76
|
+
JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
|
|
77
|
+
_tokens[0] = JBAccountingContext({
|
|
78
|
+
token: address(_mockToken), decimals: 6, currency: uint32(uint160(address(_mockToken)))
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// setup: return data
|
|
82
|
+
JBRuleset memory ruleset = JBRuleset({
|
|
83
|
+
cycleNumber: 1,
|
|
84
|
+
id: 0,
|
|
85
|
+
basedOnId: 0,
|
|
86
|
+
start: 0,
|
|
87
|
+
duration: 0,
|
|
88
|
+
weight: 0,
|
|
89
|
+
weightCutPercent: 0,
|
|
90
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
91
|
+
metadata: 0
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(ruleset));
|
|
95
|
+
|
|
96
|
+
_terminal.addAccountingContextsFor(_projectId, _tokens);
|
|
97
|
+
|
|
98
|
+
_;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function test_WhenTokensReturnedLTMinReturnedTokens() external whenNativeTokenIsAccepted {
|
|
102
|
+
// it will revert UNDER_MIN_RETURNED_TOKENS
|
|
103
|
+
|
|
104
|
+
// needed for next mock call returns
|
|
105
|
+
JBTokenAmount memory tokenAmount = JBTokenAmount(_native, 18, uint32(_nativeCurrency), _defaultAmount);
|
|
106
|
+
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](0);
|
|
107
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
108
|
+
cycleNumber: 1,
|
|
109
|
+
id: 1,
|
|
110
|
+
basedOnId: 0,
|
|
111
|
+
start: 0,
|
|
112
|
+
duration: 0,
|
|
113
|
+
weight: 0,
|
|
114
|
+
weightCutPercent: 0,
|
|
115
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
116
|
+
metadata: 0
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// mock call to JBTerminalStore recordPaymentFrom
|
|
120
|
+
mockExpect(
|
|
121
|
+
address(store),
|
|
122
|
+
abi.encodeCall(
|
|
123
|
+
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
124
|
+
),
|
|
125
|
+
abi.encode(returnedRuleset, 0, hookSpecifications)
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
mockExpect(address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), abi.encode(0));
|
|
129
|
+
|
|
130
|
+
vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_UnderMinReturnedTokens.selector, 0, 1));
|
|
131
|
+
_terminal.pay{value: 1e18}({
|
|
132
|
+
projectId: _projectId,
|
|
133
|
+
token: _native,
|
|
134
|
+
amount: _defaultAmount,
|
|
135
|
+
beneficiary: _bene,
|
|
136
|
+
minReturnedTokens: 1,
|
|
137
|
+
memo: "",
|
|
138
|
+
metadata: ""
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function test_WhenTerminalStoreReturnsTokenCountGTZeroAndHappypath() external whenNativeTokenIsAccepted {
|
|
143
|
+
// it will mint tokens and emit Pay
|
|
144
|
+
|
|
145
|
+
// needed for next mock call returns
|
|
146
|
+
JBTokenAmount memory tokenAmount = JBTokenAmount(_native, 18, uint32(_nativeCurrency), _defaultAmount);
|
|
147
|
+
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](0);
|
|
148
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
149
|
+
cycleNumber: 1,
|
|
150
|
+
id: 1,
|
|
151
|
+
basedOnId: 0,
|
|
152
|
+
start: 0,
|
|
153
|
+
duration: 0,
|
|
154
|
+
weight: 0,
|
|
155
|
+
weightCutPercent: 0,
|
|
156
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
157
|
+
metadata: 0
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
uint256 _mintAmount = 1e9;
|
|
161
|
+
|
|
162
|
+
// mock call to JBTerminalStore recordPaymentFrom
|
|
163
|
+
mockExpect(
|
|
164
|
+
address(store),
|
|
165
|
+
abi.encodeCall(
|
|
166
|
+
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
167
|
+
),
|
|
168
|
+
abi.encode(returnedRuleset, _mintAmount, hookSpecifications)
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
// mock call to controller (this contract per modifier mock call) mintTokensOf
|
|
172
|
+
mockExpect(
|
|
173
|
+
address(this),
|
|
174
|
+
abi.encodeCall(IJBController.mintTokensOf, (_projectId, _mintAmount, _bene, "", true)),
|
|
175
|
+
abi.encode(_mintAmount)
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
// Data for subsequent calls made for balance checks
|
|
179
|
+
bytes[] memory subsequentReturns = new bytes[](2);
|
|
180
|
+
subsequentReturns[0] = abi.encode(0);
|
|
181
|
+
subsequentReturns[1] = abi.encode(_mintAmount);
|
|
182
|
+
|
|
183
|
+
// Mock subsequent calls made for balance checks
|
|
184
|
+
mockExpectSubsequent(
|
|
185
|
+
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
vm.expectEmit();
|
|
189
|
+
emit IJBTerminal.Pay(
|
|
190
|
+
returnedRuleset.id,
|
|
191
|
+
returnedRuleset.cycleNumber,
|
|
192
|
+
_projectId,
|
|
193
|
+
address(this),
|
|
194
|
+
_bene,
|
|
195
|
+
_defaultAmount,
|
|
196
|
+
_mintAmount,
|
|
197
|
+
"",
|
|
198
|
+
bytes(""),
|
|
199
|
+
address(this)
|
|
200
|
+
);
|
|
201
|
+
_terminal.pay{value: 1e18}({
|
|
202
|
+
projectId: _projectId,
|
|
203
|
+
token: _native,
|
|
204
|
+
amount: _defaultAmount,
|
|
205
|
+
beneficiary: _bene,
|
|
206
|
+
minReturnedTokens: 0,
|
|
207
|
+
memo: "",
|
|
208
|
+
metadata: ""
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
modifier whenAPayHookIsConfiguredAndHappypath() {
|
|
213
|
+
_;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function test_GivenThePaidTokenIsAnERC20AndPayHookIsConfigured() external whenERC20IsAccepted {
|
|
217
|
+
// it will increase allowance to the hook and emit HookAfterRecordPay and Pay
|
|
218
|
+
|
|
219
|
+
// mint mocked erc20 tokens to this contract
|
|
220
|
+
_mockToken.mint(address(this), _defaultAmount);
|
|
221
|
+
|
|
222
|
+
// approve those tokens to the terminal
|
|
223
|
+
_mockToken.approve(address(_terminal), _defaultAmount);
|
|
224
|
+
|
|
225
|
+
uint256 _mintAmount = 1e9;
|
|
226
|
+
|
|
227
|
+
// set an approval to the pay hook as the terminal
|
|
228
|
+
vm.prank(address(_terminal));
|
|
229
|
+
_mockToken.approve(address(_mockHook), _defaultAmount);
|
|
230
|
+
|
|
231
|
+
// needed for next mock call returns
|
|
232
|
+
JBTokenAmount memory tokenAmount =
|
|
233
|
+
JBTokenAmount(address(_mockToken), 6, uint32(_mockTokenCurrency), _defaultAmount);
|
|
234
|
+
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](1);
|
|
235
|
+
hookSpecifications[0] = JBPayHookSpecification({hook: _mockHook, amount: _defaultAmount, metadata: ""});
|
|
236
|
+
|
|
237
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
238
|
+
cycleNumber: 1,
|
|
239
|
+
id: 1,
|
|
240
|
+
basedOnId: 0,
|
|
241
|
+
start: 0,
|
|
242
|
+
duration: 0,
|
|
243
|
+
weight: 0,
|
|
244
|
+
weightCutPercent: 0,
|
|
245
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
246
|
+
metadata: 0
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// mock call to JBTerminalStore recordPaymentFrom
|
|
250
|
+
mockExpect(
|
|
251
|
+
address(store),
|
|
252
|
+
abi.encodeCall(
|
|
253
|
+
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
254
|
+
),
|
|
255
|
+
abi.encode(returnedRuleset, _mintAmount, hookSpecifications)
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
// mock call to controller (this contract per modifier mock call) mintTokensOf
|
|
259
|
+
mockExpect(
|
|
260
|
+
address(this),
|
|
261
|
+
abi.encodeCall(IJBController.mintTokensOf, (_projectId, _mintAmount, _bene, "", true)),
|
|
262
|
+
abi.encode(_mintAmount)
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
// Needed for hook call
|
|
266
|
+
JBAfterPayRecordedContext memory context = JBAfterPayRecordedContext({
|
|
267
|
+
payer: address(this),
|
|
268
|
+
projectId: _projectId,
|
|
269
|
+
rulesetId: returnedRuleset.id,
|
|
270
|
+
amount: tokenAmount,
|
|
271
|
+
forwardedAmount: tokenAmount,
|
|
272
|
+
weight: returnedRuleset.weight,
|
|
273
|
+
newlyIssuedTokenCount: _mintAmount,
|
|
274
|
+
beneficiary: _bene,
|
|
275
|
+
hookMetadata: bytes(""),
|
|
276
|
+
payerMetadata: bytes("")
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// mock call to hook
|
|
280
|
+
mockExpect(address(_mockHook), abi.encodeCall(IJBPayHook.afterPayRecordedWith, (context)), "");
|
|
281
|
+
|
|
282
|
+
vm.expectEmit();
|
|
283
|
+
emit IJBTerminal.Pay(
|
|
284
|
+
returnedRuleset.id,
|
|
285
|
+
returnedRuleset.cycleNumber,
|
|
286
|
+
_projectId,
|
|
287
|
+
address(this),
|
|
288
|
+
_bene,
|
|
289
|
+
_defaultAmount,
|
|
290
|
+
_mintAmount,
|
|
291
|
+
"",
|
|
292
|
+
bytes(""),
|
|
293
|
+
address(this)
|
|
294
|
+
);
|
|
295
|
+
vm.expectEmit();
|
|
296
|
+
emit IJBTerminal.HookAfterRecordPay(_mockHook, context, _defaultAmount, address(this));
|
|
297
|
+
|
|
298
|
+
// Data for subsequent calls made for balance checks
|
|
299
|
+
bytes[] memory subsequentReturns = new bytes[](2);
|
|
300
|
+
subsequentReturns[0] = abi.encode(0);
|
|
301
|
+
subsequentReturns[1] = abi.encode(_mintAmount);
|
|
302
|
+
|
|
303
|
+
// Mock subsequent calls made for balance checks
|
|
304
|
+
mockExpectSubsequent(
|
|
305
|
+
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
_terminal.pay({
|
|
309
|
+
projectId: _projectId,
|
|
310
|
+
token: address(_mockToken),
|
|
311
|
+
amount: _defaultAmount,
|
|
312
|
+
beneficiary: _bene,
|
|
313
|
+
minReturnedTokens: _mintAmount,
|
|
314
|
+
memo: "",
|
|
315
|
+
metadata: ""
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function test_GivenThePaidTokenIsNativeAndPayHookIsConfigured() external whenNativeTokenIsAccepted {
|
|
320
|
+
// it will send ETH to the hook and emit HookAfterRecordPay and Pay
|
|
321
|
+
|
|
322
|
+
// needed for next mock call returns
|
|
323
|
+
JBTokenAmount memory tokenAmount = JBTokenAmount(_native, 18, uint32(_nativeCurrency), _defaultAmount);
|
|
324
|
+
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](1);
|
|
325
|
+
hookSpecifications[0] = JBPayHookSpecification({hook: _mockHook, amount: _defaultAmount, metadata: ""});
|
|
326
|
+
|
|
327
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
328
|
+
cycleNumber: 1,
|
|
329
|
+
id: 1,
|
|
330
|
+
basedOnId: 0,
|
|
331
|
+
start: 0,
|
|
332
|
+
duration: 0,
|
|
333
|
+
weight: 0,
|
|
334
|
+
weightCutPercent: 0,
|
|
335
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
336
|
+
metadata: 0
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
uint256 _mintAmount = 1e9;
|
|
340
|
+
|
|
341
|
+
// mock call to JBTerminalStore recordPaymentFrom
|
|
342
|
+
mockExpect(
|
|
343
|
+
address(store),
|
|
344
|
+
abi.encodeCall(
|
|
345
|
+
IJBTerminalStore.recordPaymentFrom, (address(this), tokenAmount, _projectId, _bene, bytes(""))
|
|
346
|
+
),
|
|
347
|
+
abi.encode(returnedRuleset, _mintAmount, hookSpecifications)
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// mock call to controller (this contract per modifier mock call) mintTokensOf
|
|
351
|
+
mockExpect(
|
|
352
|
+
address(this),
|
|
353
|
+
abi.encodeCall(IJBController.mintTokensOf, (_projectId, _mintAmount, _bene, "", true)),
|
|
354
|
+
abi.encode(_mintAmount)
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
// Needed for hook call
|
|
358
|
+
JBAfterPayRecordedContext memory context = JBAfterPayRecordedContext({
|
|
359
|
+
payer: address(this),
|
|
360
|
+
projectId: _projectId,
|
|
361
|
+
rulesetId: returnedRuleset.id,
|
|
362
|
+
amount: tokenAmount,
|
|
363
|
+
forwardedAmount: tokenAmount,
|
|
364
|
+
weight: returnedRuleset.weight,
|
|
365
|
+
newlyIssuedTokenCount: _mintAmount,
|
|
366
|
+
beneficiary: _bene,
|
|
367
|
+
hookMetadata: bytes(""),
|
|
368
|
+
payerMetadata: bytes("")
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
// mock call to hook (including msg.value)
|
|
372
|
+
mockExpect(address(_mockHook), abi.encodeCall(IJBPayHook.afterPayRecordedWith, (context)), "");
|
|
373
|
+
|
|
374
|
+
// Data for subsequent calls made for balance checks
|
|
375
|
+
bytes[] memory subsequentReturns = new bytes[](2);
|
|
376
|
+
subsequentReturns[0] = abi.encode(0);
|
|
377
|
+
subsequentReturns[1] = abi.encode(_mintAmount);
|
|
378
|
+
|
|
379
|
+
// Mock subsequent calls made for balance checks
|
|
380
|
+
mockExpectSubsequent(
|
|
381
|
+
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
vm.expectEmit();
|
|
385
|
+
emit IJBTerminal.Pay(
|
|
386
|
+
returnedRuleset.id,
|
|
387
|
+
returnedRuleset.cycleNumber,
|
|
388
|
+
_projectId,
|
|
389
|
+
address(this),
|
|
390
|
+
_bene,
|
|
391
|
+
_defaultAmount,
|
|
392
|
+
_mintAmount,
|
|
393
|
+
"",
|
|
394
|
+
bytes(""),
|
|
395
|
+
address(this)
|
|
396
|
+
);
|
|
397
|
+
|
|
398
|
+
vm.expectEmit();
|
|
399
|
+
emit IJBTerminal.HookAfterRecordPay(_mockHook, context, _defaultAmount, address(this));
|
|
400
|
+
|
|
401
|
+
_terminal.pay{value: 1e18}({
|
|
402
|
+
projectId: _projectId,
|
|
403
|
+
token: _native,
|
|
404
|
+
amount: _defaultAmount,
|
|
405
|
+
beneficiary: _bene,
|
|
406
|
+
minReturnedTokens: 0,
|
|
407
|
+
memo: "",
|
|
408
|
+
metadata: ""
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
function test_WhenTheProjectDNHAccountingContextForTheToken() external {
|
|
413
|
+
// it will revert TOKEN_NOT_ACCEPTED
|
|
414
|
+
|
|
415
|
+
mockExpect(address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), abi.encode(0));
|
|
416
|
+
|
|
417
|
+
vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_TokenNotAccepted.selector, _native));
|
|
418
|
+
_terminal.pay{value: 1e18}({
|
|
419
|
+
projectId: _projectId,
|
|
420
|
+
token: _native,
|
|
421
|
+
amount: _defaultAmount,
|
|
422
|
+
beneficiary: _bene,
|
|
423
|
+
minReturnedTokens: 0,
|
|
424
|
+
memo: "",
|
|
425
|
+
metadata: ""
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/* function test_WhenTheTerminalsTokenEqNativeToken() external {
|
|
430
|
+
// it will use msg.value
|
|
431
|
+
// covered above
|
|
432
|
+
} */
|
|
433
|
+
|
|
434
|
+
function test_WhenTheTerminalsTokenEqNativeTokenAndMsgvalueEqZero() external {
|
|
435
|
+
// it will revert NO_MSG_VALUE_ALLOWED
|
|
436
|
+
|
|
437
|
+
mockExpect(address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), abi.encode(0));
|
|
438
|
+
|
|
439
|
+
vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_TokenNotAccepted.selector, _native));
|
|
440
|
+
_terminal.pay{value: 0}({
|
|
441
|
+
projectId: _projectId,
|
|
442
|
+
token: _native,
|
|
443
|
+
amount: _defaultAmount,
|
|
444
|
+
beneficiary: _bene,
|
|
445
|
+
minReturnedTokens: 0,
|
|
446
|
+
memo: "",
|
|
447
|
+
metadata: ""
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function test_WhenTheTerminalIsCallingItself() external whenNativeTokenIsAccepted {
|
|
452
|
+
// it will not transfer
|
|
453
|
+
|
|
454
|
+
// needed for next mock call returns
|
|
455
|
+
JBTokenAmount memory tokenAmount = JBTokenAmount(_native, 18, uint32(_nativeCurrency), _defaultAmount);
|
|
456
|
+
JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](0);
|
|
457
|
+
|
|
458
|
+
JBRuleset memory returnedRuleset = JBRuleset({
|
|
459
|
+
cycleNumber: 1,
|
|
460
|
+
id: 1,
|
|
461
|
+
basedOnId: 0,
|
|
462
|
+
start: 0,
|
|
463
|
+
duration: 0,
|
|
464
|
+
weight: 0,
|
|
465
|
+
weightCutPercent: 0,
|
|
466
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
467
|
+
metadata: 0
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
// mock call to JBTerminalStore recordPaymentFrom
|
|
471
|
+
mockExpect(
|
|
472
|
+
address(store),
|
|
473
|
+
abi.encodeCall(
|
|
474
|
+
IJBTerminalStore.recordPaymentFrom, (address(_terminal), tokenAmount, _projectId, _bene, bytes(""))
|
|
475
|
+
),
|
|
476
|
+
abi.encode(returnedRuleset, 0, hookSpecifications)
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
// Data for subsequent calls made for balance checks
|
|
480
|
+
bytes[] memory subsequentReturns = new bytes[](2);
|
|
481
|
+
subsequentReturns[0] = abi.encode(0);
|
|
482
|
+
subsequentReturns[1] = abi.encode(0);
|
|
483
|
+
|
|
484
|
+
// Mock subsequent calls made for balance checks
|
|
485
|
+
mockExpectSubsequent(
|
|
486
|
+
address(tokens), abi.encodeCall(IJBTokens.totalBalanceOf, (_bene, _projectId)), subsequentReturns
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
vm.deal(address(_terminal), _defaultAmount);
|
|
490
|
+
vm.prank(address(_terminal));
|
|
491
|
+
_terminal.pay{value: _defaultAmount}({
|
|
492
|
+
projectId: _projectId,
|
|
493
|
+
token: _native,
|
|
494
|
+
amount: _defaultAmount,
|
|
495
|
+
beneficiary: _bene,
|
|
496
|
+
minReturnedTokens: 0,
|
|
497
|
+
memo: "",
|
|
498
|
+
metadata: ""
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// accept funds with permit2 has been extensively tested in other units
|
|
503
|
+
/* modifier whenPayMetadataContainsPermitData() {
|
|
504
|
+
_;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
function test_GivenThePermitAllowanceLtAmount() external whenPayMetadataContainsPermitData {
|
|
508
|
+
// it will revert PERMIT_ALLOWANCE_NOT_ENOUGH
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
function test_GivenPermitAllowanceIsGood() external whenPayMetadataContainsPermitData {
|
|
512
|
+
// it will set permit allowance to spend tokens for user via permit2
|
|
513
|
+
} */
|
|
514
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
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 TestProcessHeldFeesOf_Local is JBMultiTerminalSetup {
|
|
8
|
+
// covered extensively in other units but leaving the scaffolding for now
|
|
9
|
+
/* function setUp() public {
|
|
10
|
+
super.multiTerminalSetup();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function test_WhenHeldFeeUnlockTimestampGTBlocktimestamp() external {
|
|
14
|
+
// it will add the fee back to _heldFeesOf
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
modifier whenHeldFeeIsUnlocked() {
|
|
18
|
+
_;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function test_GivenExecuteProcessFeeSucceeds() external whenHeldFeeIsUnlocked {
|
|
22
|
+
// it will process the fee and emit ProcessFee
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function test_GivenExecuteProcessFeeFails() external whenHeldFeeIsUnlocked {
|
|
26
|
+
// it will readd balance and emit FeeReverted
|
|
27
|
+
} */
|
|
28
|
+
|
|
29
|
+
}
|