@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,428 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBTerminalStoreSetup} from "./JBTerminalStoreSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestCurrentSurplusOf_Local is JBTerminalStoreSetup {
|
|
8
|
+
using JBRulesetMetadataResolver for JBRulesetMetadata;
|
|
9
|
+
|
|
10
|
+
uint256 _projectId = 1;
|
|
11
|
+
uint256 _balance = 1e18;
|
|
12
|
+
|
|
13
|
+
// Mocks
|
|
14
|
+
IJBTerminal _terminal = IJBTerminal(makeAddr("terminal"));
|
|
15
|
+
IJBToken _token = IJBToken(makeAddr("token"));
|
|
16
|
+
IJBController _controller = IJBController(makeAddr("controller"));
|
|
17
|
+
IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
|
|
18
|
+
|
|
19
|
+
uint32 _currency = uint32(uint160(address(_token)));
|
|
20
|
+
address _nativeAddress = JBConstants.NATIVE_TOKEN;
|
|
21
|
+
uint32 _nativeCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
|
|
22
|
+
|
|
23
|
+
function setUp() public {
|
|
24
|
+
super.terminalStoreSetup();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
modifier whenProjectHasBalance() {
|
|
28
|
+
// Find the storage slot
|
|
29
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(address(_terminal), uint256(0)));
|
|
30
|
+
bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
|
|
31
|
+
bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
|
|
32
|
+
|
|
33
|
+
bytes32 balanceBytes = bytes32(_balance);
|
|
34
|
+
|
|
35
|
+
// Set balance
|
|
36
|
+
vm.store(address(_store), slot, balanceBytes);
|
|
37
|
+
|
|
38
|
+
// Ensure balance is set correctly
|
|
39
|
+
uint256 _balanceCallReturn = _store.balanceOf(address(_terminal), _projectId, address(_token));
|
|
40
|
+
assertEq(_balanceCallReturn, _balance);
|
|
41
|
+
_;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function test_GivenSurplusRequiresDecimalAdjustmentAndAccountingCurrencyMatchesTargetCurrency()
|
|
45
|
+
external
|
|
46
|
+
whenProjectHasBalance
|
|
47
|
+
{
|
|
48
|
+
// it will adjust surplus to target decimals without conversion
|
|
49
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
50
|
+
|
|
51
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
52
|
+
|
|
53
|
+
// JBRulesets calldata
|
|
54
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
55
|
+
cycleNumber: uint48(block.timestamp),
|
|
56
|
+
id: uint48(block.timestamp),
|
|
57
|
+
basedOnId: 0,
|
|
58
|
+
start: uint48(block.timestamp),
|
|
59
|
+
duration: uint32(block.timestamp + 1000),
|
|
60
|
+
weight: 1e18,
|
|
61
|
+
weightCutPercent: 0,
|
|
62
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
63
|
+
metadata: 0
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// mock call to JBRulesets currentOf
|
|
67
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
68
|
+
|
|
69
|
+
// mock call to JBDirectory controllerOf
|
|
70
|
+
mockExpect(
|
|
71
|
+
address(directory),
|
|
72
|
+
abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
|
|
73
|
+
abi.encode(address(_controller))
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// mock call to controller FUND_ACCESS_LIMITS
|
|
77
|
+
mockExpect(
|
|
78
|
+
address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
82
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
83
|
+
|
|
84
|
+
// mock call to fundAccessLimits payoutLimitsOf
|
|
85
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
86
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
87
|
+
);
|
|
88
|
+
bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
|
|
89
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
90
|
+
|
|
91
|
+
uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 6, _currency);
|
|
92
|
+
|
|
93
|
+
// assert correct calcs
|
|
94
|
+
uint256 expectedSurplus = (1e18 - 1e17) / 10 ** (18 - 6);
|
|
95
|
+
assertEq(expectedSurplus, currentSurplus);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function test_GivenSurplusRequiresDecimalAdjustmentAndAccountingCurrencyDoesNotMatchTargetCurrency()
|
|
99
|
+
external
|
|
100
|
+
whenProjectHasBalance
|
|
101
|
+
{
|
|
102
|
+
// it will convert surplus to target currency with decimal adjustment
|
|
103
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
104
|
+
|
|
105
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
106
|
+
|
|
107
|
+
// JBRulesets calldata
|
|
108
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
109
|
+
cycleNumber: uint48(block.timestamp),
|
|
110
|
+
id: uint48(block.timestamp),
|
|
111
|
+
basedOnId: 0,
|
|
112
|
+
start: uint48(block.timestamp),
|
|
113
|
+
duration: uint32(block.timestamp + 1000),
|
|
114
|
+
weight: 1e18,
|
|
115
|
+
weightCutPercent: 0,
|
|
116
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
117
|
+
metadata: 0
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// mock call to JBRulesets currentOf
|
|
121
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
122
|
+
|
|
123
|
+
// mock call to JBDirectory controllerOf
|
|
124
|
+
mockExpect(
|
|
125
|
+
address(directory),
|
|
126
|
+
abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
|
|
127
|
+
abi.encode(address(_controller))
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
// mock call to controller FUND_ACCESS_LIMITS
|
|
131
|
+
bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
|
|
132
|
+
bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
|
|
133
|
+
mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
|
|
134
|
+
|
|
135
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
136
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
137
|
+
|
|
138
|
+
// mock call to fundAccessLimits payoutLimitsOf
|
|
139
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
140
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
141
|
+
);
|
|
142
|
+
bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
|
|
143
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
144
|
+
|
|
145
|
+
// mock call to JBPrices pricePerUnitOf
|
|
146
|
+
bytes memory _pricePerCall =
|
|
147
|
+
abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
|
|
148
|
+
bytes memory _pricePerReturn = abi.encode(uint256(1));
|
|
149
|
+
mockExpect(address(prices), _pricePerCall, _pricePerReturn);
|
|
150
|
+
|
|
151
|
+
uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 6, _nativeCurrency);
|
|
152
|
+
|
|
153
|
+
// assert correct calcs
|
|
154
|
+
uint256 expectedSurplus = ((1e18 - 1e17) * 1e18) / 10 ** (18 - 6);
|
|
155
|
+
assertEq(expectedSurplus, currentSurplus);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function test_GivenAccountingCurrencyMatchesTargetCurrency() external whenProjectHasBalance {
|
|
159
|
+
// it will return standard surplus
|
|
160
|
+
|
|
161
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
162
|
+
|
|
163
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
164
|
+
|
|
165
|
+
// JBRulesets calldata
|
|
166
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
167
|
+
cycleNumber: uint48(block.timestamp),
|
|
168
|
+
id: uint48(block.timestamp),
|
|
169
|
+
basedOnId: 0,
|
|
170
|
+
start: uint48(block.timestamp),
|
|
171
|
+
duration: uint32(block.timestamp + 1000),
|
|
172
|
+
weight: 1e18,
|
|
173
|
+
weightCutPercent: 0,
|
|
174
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
175
|
+
metadata: 0
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// mock call to JBRulesets currentOf
|
|
179
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
180
|
+
|
|
181
|
+
// mock call to JBDirectory controllerOf
|
|
182
|
+
mockExpect(
|
|
183
|
+
address(directory),
|
|
184
|
+
abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
|
|
185
|
+
abi.encode(address(_controller))
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
// mock call to controller FUND_ACCESS_LIMITS
|
|
189
|
+
mockExpect(
|
|
190
|
+
address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
194
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
195
|
+
|
|
196
|
+
// mock call to fundAccessLimits payoutLimitsOf
|
|
197
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
198
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
199
|
+
);
|
|
200
|
+
bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
|
|
201
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
202
|
+
|
|
203
|
+
uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
|
|
204
|
+
|
|
205
|
+
// assert correct calcs
|
|
206
|
+
uint256 expectedSurplus = 1e18 - 1e17;
|
|
207
|
+
assertEq(expectedSurplus, currentSurplus);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function test_GivenAccountingCurrencyDoesNotMatchTargetCurrency() external whenProjectHasBalance {
|
|
211
|
+
// it will convert surplus to target currency without decimal adjustment
|
|
212
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
213
|
+
|
|
214
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
215
|
+
|
|
216
|
+
// JBRulesets calldata
|
|
217
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
218
|
+
cycleNumber: uint48(block.timestamp),
|
|
219
|
+
id: uint48(block.timestamp),
|
|
220
|
+
basedOnId: 0,
|
|
221
|
+
start: uint48(block.timestamp),
|
|
222
|
+
duration: uint32(block.timestamp + 1000),
|
|
223
|
+
weight: 1e18,
|
|
224
|
+
weightCutPercent: 0,
|
|
225
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
226
|
+
metadata: 0
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// mock call to JBRulesets currentOf
|
|
230
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
231
|
+
|
|
232
|
+
// mock call to JBDirectory controllerOf
|
|
233
|
+
mockExpect(
|
|
234
|
+
address(directory),
|
|
235
|
+
abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
|
|
236
|
+
abi.encode(address(_controller))
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
// mock call to controller FUND_ACCESS_LIMITS
|
|
240
|
+
bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
|
|
241
|
+
bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
|
|
242
|
+
mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
|
|
243
|
+
|
|
244
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
245
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
246
|
+
|
|
247
|
+
// mock call to fundAccessLimits payoutLimitsOf
|
|
248
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
249
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
250
|
+
);
|
|
251
|
+
bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
|
|
252
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
253
|
+
|
|
254
|
+
// mock call to JBPrices pricePerUnitOf
|
|
255
|
+
bytes memory _pricePerCall =
|
|
256
|
+
abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
|
|
257
|
+
bytes memory _pricePerReturn = abi.encode(uint256(1));
|
|
258
|
+
mockExpect(address(prices), _pricePerCall, _pricePerReturn);
|
|
259
|
+
|
|
260
|
+
uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _nativeCurrency);
|
|
261
|
+
|
|
262
|
+
// assert correct calcs
|
|
263
|
+
uint256 expectedSurplus = (1e18 - 1e17) * 1e18;
|
|
264
|
+
assertEq(expectedSurplus, currentSurplus);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function test_GivenPayoutLimitCurrencyMatchesTargetCurrency() external whenProjectHasBalance {
|
|
268
|
+
// it will return standard surplus
|
|
269
|
+
|
|
270
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
271
|
+
|
|
272
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
273
|
+
|
|
274
|
+
// JBRulesets calldata
|
|
275
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
276
|
+
cycleNumber: uint48(block.timestamp),
|
|
277
|
+
id: uint48(block.timestamp),
|
|
278
|
+
basedOnId: 0,
|
|
279
|
+
start: uint48(block.timestamp),
|
|
280
|
+
duration: uint32(block.timestamp + 1000),
|
|
281
|
+
weight: 1e18,
|
|
282
|
+
weightCutPercent: 0,
|
|
283
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
284
|
+
metadata: 0
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// mock call to JBRulesets currentOf
|
|
288
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
289
|
+
|
|
290
|
+
// mock call to JBDirectory controllerOf
|
|
291
|
+
mockExpect(
|
|
292
|
+
address(directory),
|
|
293
|
+
abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
|
|
294
|
+
abi.encode(address(_controller))
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// mock call to controller FUND_ACCESS_LIMITS
|
|
298
|
+
bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
|
|
299
|
+
bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
|
|
300
|
+
mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
|
|
301
|
+
|
|
302
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
303
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
304
|
+
|
|
305
|
+
// mock call to fundAccessLimits payoutLimitsOf
|
|
306
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
307
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
308
|
+
);
|
|
309
|
+
bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
|
|
310
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
311
|
+
|
|
312
|
+
uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
|
|
313
|
+
|
|
314
|
+
// assert correct calcs
|
|
315
|
+
uint256 expectedSurplus = (1e18 - 1e17);
|
|
316
|
+
assertEq(expectedSurplus, currentSurplus);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function test_GivenPayoutLimitCurrencyDoesNotMatchTargetCurrency() external whenProjectHasBalance {
|
|
320
|
+
// it will convert payout limit target currency without decimal adjustment
|
|
321
|
+
|
|
322
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
323
|
+
|
|
324
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _nativeCurrency});
|
|
325
|
+
|
|
326
|
+
// JBRulesets calldata
|
|
327
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
328
|
+
cycleNumber: uint48(block.timestamp),
|
|
329
|
+
id: uint48(block.timestamp),
|
|
330
|
+
basedOnId: 0,
|
|
331
|
+
start: uint48(block.timestamp),
|
|
332
|
+
duration: uint32(block.timestamp + 1000),
|
|
333
|
+
weight: 1e18,
|
|
334
|
+
weightCutPercent: 0,
|
|
335
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
336
|
+
metadata: 0
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
// mock call to JBRulesets currentOf
|
|
340
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
341
|
+
|
|
342
|
+
// mock call to JBDirectory controllerOf
|
|
343
|
+
mockExpect(
|
|
344
|
+
address(directory),
|
|
345
|
+
abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
|
|
346
|
+
abi.encode(address(_controller))
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
// mock call to controller FUND_ACCESS_LIMITS
|
|
350
|
+
bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
|
|
351
|
+
bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
|
|
352
|
+
mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
|
|
353
|
+
|
|
354
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
355
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
|
|
356
|
+
|
|
357
|
+
// mock call to fundAccessLimits payoutLimitsOf
|
|
358
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
359
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
360
|
+
);
|
|
361
|
+
bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
|
|
362
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
363
|
+
|
|
364
|
+
// mock call to JBPrices pricePerUnitOf
|
|
365
|
+
bytes memory _pricePerCall =
|
|
366
|
+
abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
|
|
367
|
+
bytes memory _pricePerReturn = abi.encode(uint256(1e18));
|
|
368
|
+
mockExpect(address(prices), _pricePerCall, _pricePerReturn);
|
|
369
|
+
|
|
370
|
+
uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _nativeCurrency);
|
|
371
|
+
|
|
372
|
+
// assert correct calcs
|
|
373
|
+
uint256 expectedSurplus = 1e18 - 1e17;
|
|
374
|
+
assertEq(expectedSurplus, currentSurplus);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function test_GivenCumulativeBalanceNotGreaterThanCumulativePayoutLimit() external whenProjectHasBalance {
|
|
378
|
+
// it will return zero
|
|
379
|
+
|
|
380
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
381
|
+
|
|
382
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
383
|
+
|
|
384
|
+
// JBRulesets calldata
|
|
385
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
386
|
+
cycleNumber: uint48(block.timestamp),
|
|
387
|
+
id: uint48(block.timestamp),
|
|
388
|
+
basedOnId: 0,
|
|
389
|
+
start: uint48(block.timestamp),
|
|
390
|
+
duration: uint32(block.timestamp + 1000),
|
|
391
|
+
weight: 1e18,
|
|
392
|
+
weightCutPercent: 0,
|
|
393
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
394
|
+
metadata: 0
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
// mock call to JBRulesets currentOf
|
|
398
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
399
|
+
|
|
400
|
+
// mock call to JBDirectory controllerOf
|
|
401
|
+
mockExpect(
|
|
402
|
+
address(directory),
|
|
403
|
+
abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
|
|
404
|
+
abi.encode(address(_controller))
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
// mock call to controller FUND_ACCESS_LIMITS
|
|
408
|
+
bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
|
|
409
|
+
bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
|
|
410
|
+
mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
|
|
411
|
+
|
|
412
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
413
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 1e19, currency: _currency});
|
|
414
|
+
|
|
415
|
+
// mock call to fundAccessLimits payoutLimitsOf
|
|
416
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
417
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
418
|
+
);
|
|
419
|
+
bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
|
|
420
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
421
|
+
|
|
422
|
+
uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
|
|
423
|
+
|
|
424
|
+
// assert correct calcs
|
|
425
|
+
uint256 expectedSurplus = 0;
|
|
426
|
+
assertEq(expectedSurplus, currentSurplus);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
import {JBTerminalStoreSetup} from "./JBTerminalStoreSetup.sol";
|
|
6
|
+
|
|
7
|
+
contract TestCurrentTotalSurplusOf_Local is JBTerminalStoreSetup {
|
|
8
|
+
uint256 _projectId = 1;
|
|
9
|
+
uint256 _decimals = 18;
|
|
10
|
+
uint256 _currency = uint32(uint160(makeAddr("token")));
|
|
11
|
+
|
|
12
|
+
// Mocks
|
|
13
|
+
IJBTerminal _terminal1 = IJBTerminal(makeAddr("terminal1"));
|
|
14
|
+
IJBTerminal _terminal2 = IJBTerminal(makeAddr("terminal2"));
|
|
15
|
+
|
|
16
|
+
function setUp() public {
|
|
17
|
+
super.terminalStoreSetup();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function test_WhenTerminalsAreConfiguredInJBDirectory() external {
|
|
21
|
+
// it will return the cumulative surplus
|
|
22
|
+
|
|
23
|
+
// return data for mock call
|
|
24
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](2);
|
|
25
|
+
_terminals[0] = _terminal1;
|
|
26
|
+
_terminals[1] = _terminal2;
|
|
27
|
+
|
|
28
|
+
// mock call to JBDirectory terminalsOf
|
|
29
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
|
|
30
|
+
bytes memory _returned = abi.encode(_terminals);
|
|
31
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
32
|
+
|
|
33
|
+
// mock call to first terminal currentSurplusOf
|
|
34
|
+
bytes memory _terminal1Call = abi.encodeCall(
|
|
35
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
36
|
+
);
|
|
37
|
+
bytes memory _terminal1Return = abi.encode(1e18);
|
|
38
|
+
mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
|
|
39
|
+
|
|
40
|
+
// mock call to first terminal currentSurplusOf
|
|
41
|
+
bytes memory _terminal2Call = abi.encodeCall(
|
|
42
|
+
IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
|
|
43
|
+
);
|
|
44
|
+
bytes memory _terminal2Return = abi.encode(2e18);
|
|
45
|
+
mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
|
|
46
|
+
|
|
47
|
+
uint256 sum = _store.currentTotalSurplusOf(_projectId, _decimals, _currency);
|
|
48
|
+
assertEq(3e18, sum);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function test_WhenTerminalsAreNotConfiguredInJBDirectory() external {
|
|
52
|
+
// it will return zero
|
|
53
|
+
|
|
54
|
+
// return data for mock call
|
|
55
|
+
IJBTerminal[] memory _terminals = new IJBTerminal[](0);
|
|
56
|
+
|
|
57
|
+
// mock call to JBDirectory terminalsOf
|
|
58
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
|
|
59
|
+
bytes memory _returned = abi.encode(_terminals);
|
|
60
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
61
|
+
|
|
62
|
+
uint256 sum = _store.currentTotalSurplusOf(_projectId, _decimals, _currency);
|
|
63
|
+
assertEq(0, sum);
|
|
64
|
+
}
|
|
65
|
+
}
|