@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,390 @@
|
|
|
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 TestRecordUsedAllowanceOf_Local is JBTerminalStoreSetup {
|
|
8
|
+
uint256 _projectId = 1;
|
|
9
|
+
uint256 _decimals = 18;
|
|
10
|
+
uint256 _defaultAmount = 1e18;
|
|
11
|
+
uint256 _balance = 1e19;
|
|
12
|
+
uint256 _payoutLimit = 2e18;
|
|
13
|
+
|
|
14
|
+
// Mocks
|
|
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 whenAmountIsWithinRangeToUseSurplusAllowance() {
|
|
28
|
+
// Find the storage slot
|
|
29
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(address(this), 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(this), _projectId, address(_token));
|
|
40
|
+
assertEq(_balanceCallReturn, _balance);
|
|
41
|
+
|
|
42
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
43
|
+
reservedPercent: 0,
|
|
44
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
|
|
45
|
+
baseCurrency: uint32(uint160(_nativeAddress)),
|
|
46
|
+
pausePay: false,
|
|
47
|
+
pauseCreditTransfers: false,
|
|
48
|
+
allowOwnerMinting: false,
|
|
49
|
+
allowSetCustomToken: false,
|
|
50
|
+
allowTerminalMigration: false,
|
|
51
|
+
allowSetTerminals: false,
|
|
52
|
+
ownerMustSendPayouts: false,
|
|
53
|
+
allowSetController: false,
|
|
54
|
+
allowAddAccountingContext: true,
|
|
55
|
+
allowAddPriceFeed: false,
|
|
56
|
+
holdFees: false,
|
|
57
|
+
useTotalSurplusForCashOuts: false,
|
|
58
|
+
useDataHookForPay: false,
|
|
59
|
+
useDataHookForCashOut: false,
|
|
60
|
+
dataHook: address(0),
|
|
61
|
+
metadata: 0
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
65
|
+
|
|
66
|
+
// JBRulesets return calldata
|
|
67
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
68
|
+
cycleNumber: uint48(block.timestamp),
|
|
69
|
+
id: uint48(block.timestamp),
|
|
70
|
+
basedOnId: 0,
|
|
71
|
+
start: uint48(block.timestamp),
|
|
72
|
+
duration: uint32(block.timestamp + 1000),
|
|
73
|
+
weight: 1e18,
|
|
74
|
+
weightCutPercent: 0,
|
|
75
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
76
|
+
metadata: _packedMetadata
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
80
|
+
bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
|
|
81
|
+
mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
|
|
82
|
+
|
|
83
|
+
// mock call to JBDirectory controllerOf
|
|
84
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.controllerOf, (_projectId));
|
|
85
|
+
bytes memory _returned = abi.encode(_controller);
|
|
86
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
87
|
+
|
|
88
|
+
// mock call to get JBFundAccessLimits address
|
|
89
|
+
mockExpect(
|
|
90
|
+
address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// mock call to JBFundAccessLimits surplusAllowanceOf
|
|
94
|
+
mockExpect(
|
|
95
|
+
address(_accessLimits),
|
|
96
|
+
abi.encodeCall(
|
|
97
|
+
IJBFundAccessLimits.surplusAllowanceOf,
|
|
98
|
+
(_projectId, block.timestamp, address(this), address(_token), _currency)
|
|
99
|
+
),
|
|
100
|
+
abi.encode(1e19)
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
|
|
104
|
+
_limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
|
|
105
|
+
|
|
106
|
+
// mock JBFundAccessLimits call to payoutLimitsOf
|
|
107
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
108
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(this), address(_token))
|
|
109
|
+
);
|
|
110
|
+
bytes memory _payoutLimitsReturn = abi.encode(_limits);
|
|
111
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
112
|
+
|
|
113
|
+
_;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function test_GivenCallingCurrencyEqAccountingCurrency() external whenAmountIsWithinRangeToUseSurplusAllowance {
|
|
117
|
+
// it will not convert prices
|
|
118
|
+
|
|
119
|
+
// setup calldata
|
|
120
|
+
JBAccountingContext memory _context =
|
|
121
|
+
JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
122
|
+
|
|
123
|
+
(, uint256 usedAmount) = _store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
|
|
124
|
+
assertEq(usedAmount, _defaultAmount);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function test_GivenCallingCurrencyDneqAccountingCurrency() external {
|
|
128
|
+
// it will convert prices
|
|
129
|
+
|
|
130
|
+
// Find the storage slot
|
|
131
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
|
|
132
|
+
bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
|
|
133
|
+
bytes32 slot = keccak256(abi.encode(address(_nativeAddress), uint256(projectSlot)));
|
|
134
|
+
|
|
135
|
+
bytes32 balanceBytes = bytes32(_balance);
|
|
136
|
+
|
|
137
|
+
// Set balance
|
|
138
|
+
vm.store(address(_store), slot, balanceBytes);
|
|
139
|
+
|
|
140
|
+
// Ensure balance is set correctly
|
|
141
|
+
uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_nativeAddress));
|
|
142
|
+
assertEq(_balanceCallReturn, _balance);
|
|
143
|
+
|
|
144
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
145
|
+
reservedPercent: 0,
|
|
146
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
|
|
147
|
+
baseCurrency: uint32(uint160(_nativeAddress)),
|
|
148
|
+
pausePay: false,
|
|
149
|
+
pauseCreditTransfers: false,
|
|
150
|
+
allowOwnerMinting: false,
|
|
151
|
+
allowSetCustomToken: false,
|
|
152
|
+
allowTerminalMigration: false,
|
|
153
|
+
allowSetTerminals: false,
|
|
154
|
+
ownerMustSendPayouts: false,
|
|
155
|
+
allowSetController: false,
|
|
156
|
+
allowAddAccountingContext: true,
|
|
157
|
+
allowAddPriceFeed: false,
|
|
158
|
+
holdFees: false,
|
|
159
|
+
useTotalSurplusForCashOuts: false,
|
|
160
|
+
useDataHookForPay: false,
|
|
161
|
+
useDataHookForCashOut: false,
|
|
162
|
+
dataHook: address(0),
|
|
163
|
+
metadata: 0
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
167
|
+
|
|
168
|
+
// JBRulesets return calldata
|
|
169
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
170
|
+
cycleNumber: uint48(block.timestamp),
|
|
171
|
+
id: uint48(block.timestamp),
|
|
172
|
+
basedOnId: 0,
|
|
173
|
+
start: uint48(block.timestamp),
|
|
174
|
+
duration: uint32(block.timestamp + 1000),
|
|
175
|
+
weight: 1e18,
|
|
176
|
+
weightCutPercent: 0,
|
|
177
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
178
|
+
metadata: _packedMetadata
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// mock call to JBRulesets currentOf
|
|
182
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
183
|
+
|
|
184
|
+
// mock call to JBDirectory controllerOf
|
|
185
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
186
|
+
|
|
187
|
+
// mock call to get JBFundAccessLimits address
|
|
188
|
+
mockExpect(
|
|
189
|
+
address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
// mock call to JBFundAccessLimits surplusAllowanceOf
|
|
193
|
+
mockExpect(
|
|
194
|
+
address(_accessLimits),
|
|
195
|
+
abi.encodeCall(
|
|
196
|
+
IJBFundAccessLimits.surplusAllowanceOf,
|
|
197
|
+
(_projectId, block.timestamp, address(this), address(_nativeAddress), _currency)
|
|
198
|
+
),
|
|
199
|
+
abi.encode(1e19)
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](2);
|
|
203
|
+
_limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
|
|
204
|
+
_limits[1] = JBCurrencyAmount({amount: 0, currency: _nativeCurrency});
|
|
205
|
+
|
|
206
|
+
// mock JBFundAccessLimits call to payoutLimitsOf
|
|
207
|
+
mockExpect(
|
|
208
|
+
address(_accessLimits),
|
|
209
|
+
abi.encodeCall(
|
|
210
|
+
IJBFundAccessLimits.payoutLimitsOf,
|
|
211
|
+
(_projectId, block.timestamp, address(this), address(_nativeAddress))
|
|
212
|
+
),
|
|
213
|
+
abi.encode(_limits)
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
// mock call to JBPrices pricePerUnitOf
|
|
217
|
+
bytes memory _pricePerCall =
|
|
218
|
+
abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
|
|
219
|
+
mockExpect(address(prices), _pricePerCall, abi.encode(1e18));
|
|
220
|
+
|
|
221
|
+
// setup calldata
|
|
222
|
+
JBAccountingContext memory _context =
|
|
223
|
+
JBAccountingContext({token: address(_nativeAddress), decimals: 18, currency: _nativeCurrency});
|
|
224
|
+
|
|
225
|
+
// price is 1:1
|
|
226
|
+
(, uint256 usedAmount) = _store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
|
|
227
|
+
assertEq(usedAmount, _defaultAmount);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function test_GivenThereIsInadequateBalance() external {
|
|
231
|
+
// it will revert INADEQUATE_TERMINAL_STORE_BALANCE
|
|
232
|
+
|
|
233
|
+
// do not set a balance (will be zero)
|
|
234
|
+
|
|
235
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
236
|
+
reservedPercent: 0,
|
|
237
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
|
|
238
|
+
baseCurrency: uint32(uint160(_currency)),
|
|
239
|
+
pausePay: false,
|
|
240
|
+
pauseCreditTransfers: false,
|
|
241
|
+
allowOwnerMinting: false,
|
|
242
|
+
allowSetCustomToken: false,
|
|
243
|
+
allowTerminalMigration: false,
|
|
244
|
+
allowSetTerminals: false,
|
|
245
|
+
ownerMustSendPayouts: false,
|
|
246
|
+
allowSetController: false,
|
|
247
|
+
allowAddAccountingContext: true,
|
|
248
|
+
allowAddPriceFeed: false,
|
|
249
|
+
holdFees: false,
|
|
250
|
+
useTotalSurplusForCashOuts: false,
|
|
251
|
+
useDataHookForPay: false,
|
|
252
|
+
useDataHookForCashOut: false,
|
|
253
|
+
dataHook: address(0),
|
|
254
|
+
metadata: 0
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
258
|
+
|
|
259
|
+
// JBRulesets return calldata
|
|
260
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
261
|
+
cycleNumber: uint48(block.timestamp),
|
|
262
|
+
id: uint48(block.timestamp),
|
|
263
|
+
basedOnId: 0,
|
|
264
|
+
start: uint48(block.timestamp),
|
|
265
|
+
duration: uint32(block.timestamp + 1000),
|
|
266
|
+
weight: 1e18,
|
|
267
|
+
weightCutPercent: 0,
|
|
268
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
269
|
+
metadata: _packedMetadata
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
273
|
+
bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
|
|
274
|
+
mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
|
|
275
|
+
|
|
276
|
+
// mock call to JBDirectory controllerOf
|
|
277
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.controllerOf, (_projectId));
|
|
278
|
+
bytes memory _returned = abi.encode(_controller);
|
|
279
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
280
|
+
|
|
281
|
+
// mock call to get JBFundAccessLimits address
|
|
282
|
+
mockExpect(
|
|
283
|
+
address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
|
|
287
|
+
_limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
|
|
288
|
+
|
|
289
|
+
// mock JBFundAccessLimits call to payoutLimitsOf
|
|
290
|
+
bytes memory _payoutLimitsCall = abi.encodeCall(
|
|
291
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(this), address(_token))
|
|
292
|
+
);
|
|
293
|
+
bytes memory _payoutLimitsReturn = abi.encode(_limits);
|
|
294
|
+
mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
|
|
295
|
+
|
|
296
|
+
// setup calldata
|
|
297
|
+
JBAccountingContext memory _context =
|
|
298
|
+
JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
299
|
+
|
|
300
|
+
vm.expectRevert(
|
|
301
|
+
abi.encodeWithSelector(
|
|
302
|
+
JBTerminalStore.JBTerminalStore_InadequateTerminalStoreBalance.selector, _defaultAmount, 0
|
|
303
|
+
)
|
|
304
|
+
);
|
|
305
|
+
_store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function test_WhenAmountIsNotWithinRangeToUseSurplusAllowance() external {
|
|
309
|
+
// it will revert JBTerminalStore_InadequateTerminalStoreBalance
|
|
310
|
+
|
|
311
|
+
// do not set a balance (will be zero)
|
|
312
|
+
|
|
313
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
314
|
+
reservedPercent: 0,
|
|
315
|
+
cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
|
|
316
|
+
baseCurrency: uint32(uint160(_currency)),
|
|
317
|
+
pausePay: false,
|
|
318
|
+
pauseCreditTransfers: false,
|
|
319
|
+
allowOwnerMinting: false,
|
|
320
|
+
allowSetCustomToken: false,
|
|
321
|
+
allowTerminalMigration: false,
|
|
322
|
+
allowSetTerminals: false,
|
|
323
|
+
ownerMustSendPayouts: false,
|
|
324
|
+
allowSetController: false,
|
|
325
|
+
allowAddAccountingContext: true,
|
|
326
|
+
allowAddPriceFeed: false,
|
|
327
|
+
holdFees: false,
|
|
328
|
+
useTotalSurplusForCashOuts: false,
|
|
329
|
+
useDataHookForPay: false,
|
|
330
|
+
useDataHookForCashOut: false,
|
|
331
|
+
dataHook: address(0),
|
|
332
|
+
metadata: 0
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
336
|
+
|
|
337
|
+
// JBRulesets return calldata
|
|
338
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
339
|
+
cycleNumber: uint48(block.timestamp),
|
|
340
|
+
id: uint48(block.timestamp),
|
|
341
|
+
basedOnId: 0,
|
|
342
|
+
start: uint48(block.timestamp),
|
|
343
|
+
duration: uint32(block.timestamp + 1000),
|
|
344
|
+
weight: 1e18,
|
|
345
|
+
weightCutPercent: 0,
|
|
346
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
347
|
+
metadata: _packedMetadata
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
|
|
351
|
+
bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
|
|
352
|
+
mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
|
|
353
|
+
|
|
354
|
+
// mock call to JBDirectory controllerOf
|
|
355
|
+
bytes memory _directoryCall = abi.encodeCall(IJBDirectory.controllerOf, (_projectId));
|
|
356
|
+
bytes memory _returned = abi.encode(_controller);
|
|
357
|
+
mockExpect(address(directory), _directoryCall, _returned);
|
|
358
|
+
|
|
359
|
+
// mock call to get JBFundAccessLimits address
|
|
360
|
+
mockExpect(
|
|
361
|
+
address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
// Return data for next mock
|
|
365
|
+
JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
|
|
366
|
+
_payoutLimits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
|
|
367
|
+
|
|
368
|
+
// mock call to JBFundAccessLimits payoutLimitsOf
|
|
369
|
+
mockExpect(
|
|
370
|
+
address(_accessLimits),
|
|
371
|
+
abi.encodeCall(
|
|
372
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(this), address(_token))
|
|
373
|
+
),
|
|
374
|
+
abi.encode(_payoutLimits)
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
// setup calldata
|
|
378
|
+
JBAccountingContext memory _context =
|
|
379
|
+
JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
380
|
+
|
|
381
|
+
vm.expectRevert(
|
|
382
|
+
abi.encodeWithSelector(
|
|
383
|
+
JBTerminalStore.JBTerminalStore_InadequateTerminalStoreBalance.selector,
|
|
384
|
+
_defaultAmount,
|
|
385
|
+
0 // no balance
|
|
386
|
+
)
|
|
387
|
+
);
|
|
388
|
+
_store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
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 TestUint224Overflow_Local is JBTerminalStoreSetup {
|
|
8
|
+
using JBRulesetMetadataResolver for JBRulesetMetadata;
|
|
9
|
+
|
|
10
|
+
uint256 _projectId = 1;
|
|
11
|
+
|
|
12
|
+
// Mocks
|
|
13
|
+
IJBTerminal _terminal = IJBTerminal(makeAddr("terminal"));
|
|
14
|
+
IJBToken _token = IJBToken(makeAddr("token"));
|
|
15
|
+
IJBController _controller = IJBController(makeAddr("controller"));
|
|
16
|
+
IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
|
|
17
|
+
|
|
18
|
+
uint32 _currency = uint32(uint160(address(_token)));
|
|
19
|
+
|
|
20
|
+
function setUp() public {
|
|
21
|
+
super.terminalStoreSetup();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// @notice Helper to set balance for a terminal/project/token via vm.store.
|
|
25
|
+
function _setBalance(address terminal, uint256 projectId, address token, uint256 balance) internal {
|
|
26
|
+
bytes32 balanceOfSlot = keccak256(abi.encode(terminal, uint256(0)));
|
|
27
|
+
bytes32 projectSlot = keccak256(abi.encode(projectId, uint256(balanceOfSlot)));
|
|
28
|
+
bytes32 slot = keccak256(abi.encode(token, uint256(projectSlot)));
|
|
29
|
+
vm.store(address(_store), slot, bytes32(balance));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// @notice Helper to create a standard ruleset with packed metadata.
|
|
33
|
+
function _mockRulesetAndControllerCalls() internal {
|
|
34
|
+
JBRulesetMetadata memory _metadata = JBRulesetMetadata({
|
|
35
|
+
reservedPercent: 0,
|
|
36
|
+
cashOutTaxRate: 0,
|
|
37
|
+
baseCurrency: _currency,
|
|
38
|
+
pausePay: false,
|
|
39
|
+
pauseCreditTransfers: false,
|
|
40
|
+
allowOwnerMinting: false,
|
|
41
|
+
allowSetCustomToken: false,
|
|
42
|
+
allowTerminalMigration: false,
|
|
43
|
+
allowSetTerminals: false,
|
|
44
|
+
ownerMustSendPayouts: false,
|
|
45
|
+
allowSetController: false,
|
|
46
|
+
allowAddAccountingContext: true,
|
|
47
|
+
allowAddPriceFeed: false,
|
|
48
|
+
holdFees: false,
|
|
49
|
+
useTotalSurplusForCashOuts: false,
|
|
50
|
+
useDataHookForPay: false,
|
|
51
|
+
useDataHookForCashOut: false,
|
|
52
|
+
dataHook: address(0),
|
|
53
|
+
metadata: 0
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
|
|
57
|
+
|
|
58
|
+
JBRuleset memory _returnedRuleset = JBRuleset({
|
|
59
|
+
cycleNumber: uint48(block.timestamp),
|
|
60
|
+
id: uint48(block.timestamp),
|
|
61
|
+
basedOnId: 0,
|
|
62
|
+
start: uint48(block.timestamp),
|
|
63
|
+
duration: uint32(block.timestamp + 1000),
|
|
64
|
+
weight: 1e18,
|
|
65
|
+
weightCutPercent: 0,
|
|
66
|
+
approvalHook: IJBRulesetApprovalHook(address(0)),
|
|
67
|
+
metadata: _packedMetadata
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Mock rulesets.currentOf
|
|
71
|
+
mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
|
|
72
|
+
|
|
73
|
+
// Mock directory.controllerOf
|
|
74
|
+
mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
|
|
75
|
+
|
|
76
|
+
// Mock controller.FUND_ACCESS_LIMITS
|
|
77
|
+
mockExpect(
|
|
78
|
+
address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// @notice Verifies that decimal adjustment overflow reverts with Uint224Overflow.
|
|
83
|
+
/// A payout limit that fits in uint224 but overflows when adjusted from 6 to 18 decimals.
|
|
84
|
+
function test_RevertWhen_DecimalAdjustmentOverflowsUint224() external {
|
|
85
|
+
// Balance must be large enough (after decimal adjustment) to exceed the payout limit,
|
|
86
|
+
// but not so large that the balance itself overflows during adjustment.
|
|
87
|
+
// Balance in 6-decimal terms: 1e62 → adjusted to 18 decimals = 1e74 (fits uint256).
|
|
88
|
+
_setBalance(address(_terminal), _projectId, address(_token), 1e62);
|
|
89
|
+
|
|
90
|
+
_mockRulesetAndControllerCalls();
|
|
91
|
+
|
|
92
|
+
// Amount that fits in uint224 but when multiplied by 10^12 (6→18 decimal adjustment) exceeds uint224.
|
|
93
|
+
// type(uint224).max / 1e6 ≈ 2.7e61. Multiplied by 1e12 → ≈ 2.7e73, exceeds uint224 but fits uint256.
|
|
94
|
+
uint224 amount = type(uint224).max / 1e6;
|
|
95
|
+
JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
|
|
96
|
+
_limits[0] = JBCurrencyAmount({amount: amount, currency: _currency});
|
|
97
|
+
|
|
98
|
+
// Mock payoutLimitsOf to return the large limit.
|
|
99
|
+
mockExpect(
|
|
100
|
+
address(_accessLimits),
|
|
101
|
+
abi.encodeCall(
|
|
102
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
103
|
+
),
|
|
104
|
+
abi.encode(_limits)
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
// Accounting context: token has 6 decimals.
|
|
108
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
109
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 6, currency: _currency});
|
|
110
|
+
|
|
111
|
+
// Query surplus with 18 target decimals — triggers decimal adjustment overflow.
|
|
112
|
+
uint256 adjusted = uint256(amount) * 1e12;
|
|
113
|
+
vm.expectRevert(abi.encodeWithSelector(JBTerminalStore.JBTerminalStore_Uint224Overflow.selector, adjusted));
|
|
114
|
+
_store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/// @notice Verifies that currency conversion overflow reverts with Uint224Overflow.
|
|
118
|
+
/// A payout limit near type(uint224).max in currency A, converted to currency B at a very low price,
|
|
119
|
+
/// would overflow uint224.
|
|
120
|
+
function test_RevertWhen_CurrencyConversionOverflowsUint224() external {
|
|
121
|
+
// Set up a large balance.
|
|
122
|
+
_setBalance(address(_terminal), _projectId, address(_token), type(uint256).max);
|
|
123
|
+
|
|
124
|
+
_mockRulesetAndControllerCalls();
|
|
125
|
+
|
|
126
|
+
// Payout limit near uint224 max, in a DIFFERENT currency than the target.
|
|
127
|
+
uint32 _otherCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
|
|
128
|
+
JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
|
|
129
|
+
_limits[0] = JBCurrencyAmount({amount: type(uint224).max, currency: _otherCurrency});
|
|
130
|
+
|
|
131
|
+
// Mock payoutLimitsOf.
|
|
132
|
+
mockExpect(
|
|
133
|
+
address(_accessLimits),
|
|
134
|
+
abi.encodeCall(
|
|
135
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
136
|
+
),
|
|
137
|
+
abi.encode(_limits)
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// Mock price: very low price means large converted amount.
|
|
141
|
+
// pricePerUnitOf returns price with _MAX_FIXED_POINT_FIDELITY (18) decimals.
|
|
142
|
+
// A price of 1 (1 wei) means 1 unit of pricingCurrency = 10^18 units of unitCurrency.
|
|
143
|
+
mockExpect(
|
|
144
|
+
address(prices),
|
|
145
|
+
abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _otherCurrency, _currency, 18)),
|
|
146
|
+
abi.encode(uint256(1)) // extremely low price → huge conversion result
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
// Same decimals so no decimal adjustment.
|
|
150
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
151
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
|
|
152
|
+
|
|
153
|
+
// The conversion: mulDiv(type(uint224).max, 10^18, 1) = type(uint224).max * 10^18 → overflows uint224.
|
|
154
|
+
vm.expectRevert();
|
|
155
|
+
_store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/// @notice Verifies that normal amounts below uint224.max pass through without reverting.
|
|
159
|
+
function test_NormalAmountsDoNotRevert() external {
|
|
160
|
+
// Balance in 6-decimal terms: 100e6 = 100 units. Adjusted to 18 decimals = 100e18.
|
|
161
|
+
uint256 _balance = 100e6;
|
|
162
|
+
_setBalance(address(_terminal), _projectId, address(_token), _balance);
|
|
163
|
+
|
|
164
|
+
_mockRulesetAndControllerCalls();
|
|
165
|
+
|
|
166
|
+
// Normal payout limit: 50 units in 6-decimal token. Adjusted to 18 decimals = 50e18.
|
|
167
|
+
JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
|
|
168
|
+
_limits[0] = JBCurrencyAmount({amount: 50e6, currency: _currency});
|
|
169
|
+
|
|
170
|
+
// Mock payoutLimitsOf.
|
|
171
|
+
mockExpect(
|
|
172
|
+
address(_accessLimits),
|
|
173
|
+
abi.encodeCall(
|
|
174
|
+
IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
|
|
175
|
+
),
|
|
176
|
+
abi.encode(_limits)
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
// 6-decimal token queried as 18-decimal target.
|
|
180
|
+
// Balance: 100e6 → 100e18. Payout limit: 50e6 → 50e18. Surplus = 50e18.
|
|
181
|
+
JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
|
|
182
|
+
_contexts[0] = JBAccountingContext({token: address(_token), decimals: 6, currency: _currency});
|
|
183
|
+
|
|
184
|
+
uint256 surplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
|
|
185
|
+
assertEq(surplus, 50e18);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
Contract that deploys a target contract with other mock contracts to satisfy the constructor.
|
|
8
|
+
Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
|
|
9
|
+
*/
|
|
10
|
+
contract JBTokensSetup is JBTest {
|
|
11
|
+
// Mocks
|
|
12
|
+
IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
|
|
13
|
+
IJBToken public jbToken;
|
|
14
|
+
|
|
15
|
+
// Target Contract
|
|
16
|
+
IJBTokens public _tokens;
|
|
17
|
+
|
|
18
|
+
function tokensSetup() public virtual {
|
|
19
|
+
// Instantiate the contract being tested
|
|
20
|
+
jbToken = new JBERC20();
|
|
21
|
+
_tokens = new JBTokens(directory, jbToken);
|
|
22
|
+
}
|
|
23
|
+
}
|