@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,28 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.17;
|
|
3
|
+
|
|
4
|
+
import {mulDiv} from "@prb/math/src/Common.sol";
|
|
5
|
+
|
|
6
|
+
import {JBConstants} from "./../libraries/JBConstants.sol";
|
|
7
|
+
|
|
8
|
+
/// @notice Fee calculations.
|
|
9
|
+
library JBFees {
|
|
10
|
+
/// @notice Returns the fee amount that, when added to `amountAfterFee`, produces the gross amount needed to yield
|
|
11
|
+
/// `amountAfterFee` after the fee is deducted.
|
|
12
|
+
/// @dev Use this to back-calculate the fee from a desired post-fee payout.
|
|
13
|
+
/// @param amountAfterFee The desired post-fee amount, as a fixed point number.
|
|
14
|
+
/// @param feePercent The fee percent, out of `JBConstants.MAX_FEE`.
|
|
15
|
+
/// @return The fee amount, as a fixed point number with the same number of decimals as the provided `amount`.
|
|
16
|
+
function feeAmountResultingIn(uint256 amountAfterFee, uint256 feePercent) internal pure returns (uint256) {
|
|
17
|
+
return mulDiv(amountAfterFee, JBConstants.MAX_FEE, JBConstants.MAX_FEE - feePercent) - amountAfterFee;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/// @notice Returns the fee that would be taken from `amountBeforeFee`.
|
|
21
|
+
/// @dev Use this to forward-calculate the fee from a known pre-fee amount.
|
|
22
|
+
/// @param amountBeforeFee The amount before the fee is applied, as a fixed point number.
|
|
23
|
+
/// @param feePercent The fee percent, out of `JBConstants.MAX_FEE`.
|
|
24
|
+
/// @return The fee amount, as a fixed point number with the same number of decimals as the provided `amount`.
|
|
25
|
+
function feeAmountFrom(uint256 amountBeforeFee, uint256 feePercent) internal pure returns (uint256) {
|
|
26
|
+
return mulDiv(amountBeforeFee, feePercent, JBConstants.MAX_FEE);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.17;
|
|
3
|
+
|
|
4
|
+
library JBFixedPointNumber {
|
|
5
|
+
function adjustDecimals(uint256 value, uint256 decimals, uint256 targetDecimals) internal pure returns (uint256) {
|
|
6
|
+
// If decimals need adjusting, multiply or divide the price by the decimal adjuster to get the normalized
|
|
7
|
+
// result.
|
|
8
|
+
if (targetDecimals == decimals) return value;
|
|
9
|
+
else if (targetDecimals > decimals) return value * 10 ** (targetDecimals - decimals);
|
|
10
|
+
else return value / 10 ** (decimals - targetDecimals);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.17;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @notice Library to parse and create metadata to store {id: data} entries.
|
|
6
|
+
*
|
|
7
|
+
* @dev Metadata are built as:
|
|
8
|
+
* - 32B of reserved space for the protocol
|
|
9
|
+
* - a lookup table `Id: offset`, defining the offset of the data for a given 4 bytes id.
|
|
10
|
+
* The offset fits 1 bytes, the ID 4 bytes. This table is padded to 32B.
|
|
11
|
+
* - the data for each id, padded to 32B each
|
|
12
|
+
*
|
|
13
|
+
* +-----------------------+ offset: 0
|
|
14
|
+
* | 32B reserved |
|
|
15
|
+
* +-----------------------+ offset: 1 = end of first 32B
|
|
16
|
+
* | (ID1,offset1) |
|
|
17
|
+
* | (ID2,offset2) |
|
|
18
|
+
* | 0's padding |
|
|
19
|
+
* +-----------------------+ offset: offset1 = 1 + number of words taken by the padded table
|
|
20
|
+
* | id1 data1 |
|
|
21
|
+
* | 0's padding |
|
|
22
|
+
* +-----------------------+ offset: offset2 = offset1 + number of words taken by the data1
|
|
23
|
+
* | id2 data2 |
|
|
24
|
+
* | 0's padding |
|
|
25
|
+
* +-----------------------+
|
|
26
|
+
*/
|
|
27
|
+
library JBMetadataResolver {
|
|
28
|
+
error JBMetadataResolver_DataNotPadded();
|
|
29
|
+
error JBMetadataResolver_LengthMismatch();
|
|
30
|
+
error JBMetadataResolver_MetadataTooLong();
|
|
31
|
+
error JBMetadataResolver_MetadataTooShort();
|
|
32
|
+
|
|
33
|
+
// The various sizes used in bytes.
|
|
34
|
+
uint256 constant ID_SIZE = 4;
|
|
35
|
+
uint256 constant ID_OFFSET_SIZE = 1;
|
|
36
|
+
uint256 constant WORD_SIZE = 32;
|
|
37
|
+
|
|
38
|
+
// The size that an ID takes in the lookup table (Identifier + Offset).
|
|
39
|
+
uint256 constant TOTAL_ID_SIZE = 5; // ID_SIZE + ID_OFFSET_SIZE;
|
|
40
|
+
|
|
41
|
+
// The amount of bytes to go forward to get to the offset of the next ID (aka. the end of the offset of the current
|
|
42
|
+
// ID).
|
|
43
|
+
uint256 constant NEXT_ID_OFFSET = 9; // TOTAL_ID_SIZE + ID_SIZE;
|
|
44
|
+
|
|
45
|
+
// 1 word (32B) is reserved for the protocol .
|
|
46
|
+
uint256 constant RESERVED_SIZE = 32; // 1 * WORD_SIZE;
|
|
47
|
+
uint256 constant MIN_METADATA_LENGTH = 37; // RESERVED_SIZE + ID_SIZE + ID_OFFSET_SIZE;
|
|
48
|
+
|
|
49
|
+
/// @notice Add an {id: data} entry to an existing metadata. This is an append-only mechanism.
|
|
50
|
+
/// @param originalMetadata The original metadata
|
|
51
|
+
/// @param idToAdd The id to add
|
|
52
|
+
/// @param dataToAdd The data to add
|
|
53
|
+
/// @return newMetadata The new metadata with the entry added
|
|
54
|
+
function addToMetadata(
|
|
55
|
+
bytes memory originalMetadata,
|
|
56
|
+
bytes4 idToAdd,
|
|
57
|
+
bytes memory dataToAdd
|
|
58
|
+
)
|
|
59
|
+
internal
|
|
60
|
+
pure
|
|
61
|
+
returns (bytes memory newMetadata)
|
|
62
|
+
{
|
|
63
|
+
// Empty original metadata and maybe something in the first 32 bytes: create new metadata
|
|
64
|
+
if (originalMetadata.length <= RESERVED_SIZE) {
|
|
65
|
+
return abi.encodePacked(bytes32(originalMetadata), bytes32(abi.encodePacked(idToAdd, uint8(2))), dataToAdd);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// There is something in the table offset, but not a valid entry - avoid overwriting
|
|
69
|
+
if (originalMetadata.length < RESERVED_SIZE + ID_SIZE + 1) revert JBMetadataResolver_MetadataTooShort();
|
|
70
|
+
|
|
71
|
+
// Make sure the data is padded to 32 bytes.
|
|
72
|
+
if (dataToAdd.length < 32) revert JBMetadataResolver_DataNotPadded();
|
|
73
|
+
|
|
74
|
+
// Get the first data offset - upcast to avoid overflow (same for other offset)...
|
|
75
|
+
uint256 firstOffset = uint8(originalMetadata[RESERVED_SIZE + ID_SIZE]);
|
|
76
|
+
|
|
77
|
+
// ...go back to the beginning of the previous word (ie the last word of the table, as it can be padded)
|
|
78
|
+
uint256 lastWordOfTable = firstOffset - 1;
|
|
79
|
+
|
|
80
|
+
// The last offset stored in the table and its index
|
|
81
|
+
uint256 lastOffset;
|
|
82
|
+
|
|
83
|
+
// The number of words taken by the last data stored
|
|
84
|
+
uint256 numberOfWordslastData;
|
|
85
|
+
|
|
86
|
+
// Iterate to find the last entry of the table, lastOffset - we start from the end as the first value
|
|
87
|
+
// encountered
|
|
88
|
+
// will be the last offset
|
|
89
|
+
for (uint256 i = firstOffset * WORD_SIZE - 1; i > lastWordOfTable * WORD_SIZE - 1; i--) {
|
|
90
|
+
// If the byte is not 0, this is the last offset we're looking for
|
|
91
|
+
if (originalMetadata[i] != 0) {
|
|
92
|
+
lastOffset = uint8(originalMetadata[i]);
|
|
93
|
+
uint256 lastOffsetIndex = i;
|
|
94
|
+
|
|
95
|
+
// No rounding as this should be padded to 32B
|
|
96
|
+
numberOfWordslastData = (originalMetadata.length - lastOffset * WORD_SIZE) / WORD_SIZE;
|
|
97
|
+
|
|
98
|
+
// Copy the reserved word and the table and remove the previous padding
|
|
99
|
+
newMetadata = _sliceBytes(originalMetadata, 0, lastOffsetIndex + 1);
|
|
100
|
+
|
|
101
|
+
// Check if the new entry is still fitting in this word
|
|
102
|
+
if (i + TOTAL_ID_SIZE >= firstOffset * WORD_SIZE) {
|
|
103
|
+
// Increment every offset by 1 (as the table now takes one more word)
|
|
104
|
+
for (uint256 j = RESERVED_SIZE + ID_SIZE; j < lastOffsetIndex + 1; j += TOTAL_ID_SIZE) {
|
|
105
|
+
newMetadata[j] = bytes1(uint8(originalMetadata[j]) + 1);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Increment the last offset so the new offset will be properly set too
|
|
109
|
+
lastOffset++;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Add the new entry after the last entry of the table, the new offset is the last offset + the number of words
|
|
117
|
+
// taken by the last data
|
|
118
|
+
// M-21: Compute in uint256 first — casting directly to uint8 silently wraps offsets > 255.
|
|
119
|
+
uint256 newOffset = lastOffset + numberOfWordslastData;
|
|
120
|
+
if (newOffset > 255) revert JBMetadataResolver_MetadataTooLong();
|
|
121
|
+
newMetadata = abi.encodePacked(newMetadata, idToAdd, bytes1(uint8(newOffset)));
|
|
122
|
+
|
|
123
|
+
// Pad as needed - inlined for gas saving
|
|
124
|
+
uint256 paddedLength =
|
|
125
|
+
newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;
|
|
126
|
+
assembly {
|
|
127
|
+
mstore(newMetadata, paddedLength)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Add existing data at the end
|
|
131
|
+
newMetadata = abi.encodePacked(
|
|
132
|
+
newMetadata, _sliceBytes(originalMetadata, firstOffset * WORD_SIZE, originalMetadata.length)
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
// Pad as needed
|
|
136
|
+
paddedLength =
|
|
137
|
+
newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;
|
|
138
|
+
assembly {
|
|
139
|
+
mstore(newMetadata, paddedLength)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Append new data at the end
|
|
143
|
+
newMetadata = abi.encodePacked(newMetadata, dataToAdd);
|
|
144
|
+
|
|
145
|
+
// Pad again again as needed
|
|
146
|
+
paddedLength =
|
|
147
|
+
newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;
|
|
148
|
+
|
|
149
|
+
assembly {
|
|
150
|
+
mstore(newMetadata, paddedLength)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/// @notice Create the metadata for a list of {id:data}
|
|
155
|
+
/// @dev Intended for offchain use (gas heavy)
|
|
156
|
+
/// @param ids The list of ids
|
|
157
|
+
/// @param datas The list of corresponding datas
|
|
158
|
+
/// @return metadata The resulting metadata
|
|
159
|
+
function createMetadata(bytes4[] memory ids, bytes[] memory datas) internal pure returns (bytes memory metadata) {
|
|
160
|
+
if (ids.length != datas.length) revert JBMetadataResolver_LengthMismatch();
|
|
161
|
+
|
|
162
|
+
// Add a first empty 32B for the protocol reserved word
|
|
163
|
+
metadata = abi.encodePacked(bytes32(0));
|
|
164
|
+
|
|
165
|
+
// First offset for the data is after the first reserved word...
|
|
166
|
+
uint256 offset = 1;
|
|
167
|
+
|
|
168
|
+
// ... and after the id/offset lookup table, rounding up to 32 bytes words if not a multiple
|
|
169
|
+
offset += ((ids.length * JBMetadataResolver.TOTAL_ID_SIZE) - 1) / JBMetadataResolver.WORD_SIZE + 1;
|
|
170
|
+
|
|
171
|
+
// Keep a reference to the number of ids.
|
|
172
|
+
uint256 numberOfIds = ids.length;
|
|
173
|
+
|
|
174
|
+
// For each id, add it to the lookup table with the next free offset, then increment the offset by the data
|
|
175
|
+
// length (rounded up)
|
|
176
|
+
for (uint256 i; i < numberOfIds; ++i) {
|
|
177
|
+
// Set the data being iterated on.
|
|
178
|
+
bytes memory data = datas[i];
|
|
179
|
+
|
|
180
|
+
if (data.length < 32 || data.length % JBMetadataResolver.WORD_SIZE != 0) {
|
|
181
|
+
revert JBMetadataResolver_DataNotPadded();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
metadata = abi.encodePacked(metadata, ids[i], bytes1(uint8(offset)));
|
|
185
|
+
offset += data.length / JBMetadataResolver.WORD_SIZE;
|
|
186
|
+
|
|
187
|
+
// Overflowing a bytes1?
|
|
188
|
+
if (offset > 255) revert JBMetadataResolver_MetadataTooLong();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Pad the table to a multiple of 32B
|
|
192
|
+
uint256 paddedLength = metadata.length % JBMetadataResolver.WORD_SIZE == 0
|
|
193
|
+
? metadata.length
|
|
194
|
+
: (metadata.length / JBMetadataResolver.WORD_SIZE + 1) * JBMetadataResolver.WORD_SIZE;
|
|
195
|
+
assembly {
|
|
196
|
+
mstore(metadata, paddedLength)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Keep a reference to the number of datas.
|
|
200
|
+
uint256 numberOfDatas = datas.length;
|
|
201
|
+
|
|
202
|
+
// Add each metadata to the array, each padded to 32 bytes
|
|
203
|
+
for (uint256 i; i < numberOfDatas; i++) {
|
|
204
|
+
metadata = abi.encodePacked(metadata, datas[i]);
|
|
205
|
+
paddedLength = metadata.length % JBMetadataResolver.WORD_SIZE == 0
|
|
206
|
+
? metadata.length
|
|
207
|
+
: (metadata.length / JBMetadataResolver.WORD_SIZE + 1) * JBMetadataResolver.WORD_SIZE;
|
|
208
|
+
|
|
209
|
+
assembly {
|
|
210
|
+
mstore(metadata, paddedLength)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/// @notice Parse the metadata to find the data for a specific ID
|
|
216
|
+
/// @dev Returns false and an empty bytes if no data is found
|
|
217
|
+
/// @param id The ID to find.
|
|
218
|
+
/// @param metadata The metadata to parse.
|
|
219
|
+
/// @return found Whether the {id:data} was found
|
|
220
|
+
/// @return targetData The data for the ID (can be empty)
|
|
221
|
+
function getDataFor(bytes4 id, bytes memory metadata) internal pure returns (bool found, bytes memory targetData) {
|
|
222
|
+
// Either no data or empty one with only one selector (32+4+1)
|
|
223
|
+
if (metadata.length <= MIN_METADATA_LENGTH) return (false, "");
|
|
224
|
+
|
|
225
|
+
// Get the first data offset - upcast to avoid overflow (same for other offset)
|
|
226
|
+
uint256 firstOffset = uint8(metadata[RESERVED_SIZE + ID_SIZE]);
|
|
227
|
+
|
|
228
|
+
// Parse the id's to find id, stop when next offset == 0 or current = first offset
|
|
229
|
+
for (uint256 i = RESERVED_SIZE; metadata[i + ID_SIZE] != bytes1(0) && i < firstOffset * WORD_SIZE;) {
|
|
230
|
+
// Set the current offset.
|
|
231
|
+
uint256 currentOffset = uint256(uint8(metadata[i + ID_SIZE]));
|
|
232
|
+
|
|
233
|
+
bytes4 parsedId;
|
|
234
|
+
assembly {
|
|
235
|
+
parsedId := mload(add(add(metadata, 0x20), i))
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// _id found?
|
|
239
|
+
if (parsedId == id) {
|
|
240
|
+
// Are we at the end of the lookup table (either at the start of data's or next offset is 0/in the
|
|
241
|
+
// padding)
|
|
242
|
+
// If not, only return until from this offset to the begining of the next offset
|
|
243
|
+
uint256 end = (i + NEXT_ID_OFFSET >= firstOffset * WORD_SIZE || metadata[i + NEXT_ID_OFFSET] == 0)
|
|
244
|
+
? metadata.length
|
|
245
|
+
: uint256(uint8(metadata[i + NEXT_ID_OFFSET])) * WORD_SIZE;
|
|
246
|
+
|
|
247
|
+
return (true, _sliceBytes(metadata, currentOffset * WORD_SIZE, end));
|
|
248
|
+
}
|
|
249
|
+
unchecked {
|
|
250
|
+
i += TOTAL_ID_SIZE;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/// @notice Returns an unique id following a suggested format (`xor(address(this), purpose name)` where purpose name
|
|
256
|
+
/// is a string giving context to the id (Permit2, quoteForSwap, etc)
|
|
257
|
+
/// @param purpose A string describing the purpose associated with the id
|
|
258
|
+
/// @return id The resulting ID.
|
|
259
|
+
function getId(string memory purpose) internal view returns (bytes4) {
|
|
260
|
+
return getId(purpose, address(this));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/// @notice Returns an unique id following a suggested format (`xor(address(this), purpose name)` where purpose name
|
|
264
|
+
/// is a string giving context to the id (Permit2, quoteForSwap, etc)
|
|
265
|
+
/// @param purpose A string describing the purpose associated with the id
|
|
266
|
+
/// @param target The target which will use the metadata
|
|
267
|
+
/// @return id The resulting ID.
|
|
268
|
+
function getId(string memory purpose, address target) internal pure returns (bytes4) {
|
|
269
|
+
return bytes4(bytes20(target) ^ bytes20(keccak256(bytes(purpose))));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/// @notice Slice bytes from a start index to an end index.
|
|
273
|
+
/// @param data The bytes array to slice
|
|
274
|
+
/// @param start The start index to slice at.
|
|
275
|
+
/// @param end The end index to slice at.
|
|
276
|
+
/// @param slicedBytes The sliced array.
|
|
277
|
+
function _sliceBytes(bytes memory data, uint256 start, uint256 end)
|
|
278
|
+
private
|
|
279
|
+
pure
|
|
280
|
+
returns (bytes memory slicedBytes)
|
|
281
|
+
{
|
|
282
|
+
assembly {
|
|
283
|
+
let length := sub(end, start)
|
|
284
|
+
|
|
285
|
+
// M-20: Allocate memory at freemem — round up to 32-byte boundary so subsequent
|
|
286
|
+
// allocations do not overlap the tail of this buffer.
|
|
287
|
+
slicedBytes := mload(0x40)
|
|
288
|
+
mstore(0x40, and(add(add(add(slicedBytes, length), 0x20), 0x1f), not(0x1f)))
|
|
289
|
+
|
|
290
|
+
// Store the length (first element)
|
|
291
|
+
mstore(slicedBytes, length)
|
|
292
|
+
|
|
293
|
+
// compute the actual data first offset only once
|
|
294
|
+
let startBytes := add(add(data, 0x20), start)
|
|
295
|
+
|
|
296
|
+
// same for the out array
|
|
297
|
+
let sliceBytesStartOfData := add(slicedBytes, 0x20)
|
|
298
|
+
|
|
299
|
+
// M-20: Copy data — bound is `length` not `end`. Using `end` (an absolute source offset)
|
|
300
|
+
// would over-copy by `start` bytes past the allocated buffer.
|
|
301
|
+
for { let i := 0 } lt(i, length) { i := add(i, 0x20) } {
|
|
302
|
+
mstore(add(sliceBytesStartOfData, i), mload(add(startBytes, i)))
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.17;
|
|
3
|
+
|
|
4
|
+
import {JBRuleset} from "./../structs/JBRuleset.sol";
|
|
5
|
+
import {JBRulesetMetadata} from "./../structs/JBRulesetMetadata.sol";
|
|
6
|
+
|
|
7
|
+
library JBRulesetMetadataResolver {
|
|
8
|
+
function reservedPercent(JBRuleset memory ruleset) internal pure returns (uint16) {
|
|
9
|
+
return uint16(ruleset.metadata >> 4);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function cashOutTaxRate(JBRuleset memory ruleset) internal pure returns (uint16) {
|
|
13
|
+
// Cash out tax rate is a number 0-10000.
|
|
14
|
+
return uint16(ruleset.metadata >> 20);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function baseCurrency(JBRuleset memory ruleset) internal pure returns (uint32) {
|
|
18
|
+
// Currency is a number 0-4294967295.
|
|
19
|
+
return uint32(ruleset.metadata >> 36);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function pausePay(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
23
|
+
return ((ruleset.metadata >> 68) & 1) == 1;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function pauseCreditTransfers(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
27
|
+
return ((ruleset.metadata >> 69) & 1) == 1;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function allowOwnerMinting(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
31
|
+
return ((ruleset.metadata >> 70) & 1) == 1;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function allowSetCustomToken(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
35
|
+
return ((ruleset.metadata >> 71) & 1) == 1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function allowTerminalMigration(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
39
|
+
return ((ruleset.metadata >> 72) & 1) == 1;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function allowSetTerminals(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
43
|
+
return ((ruleset.metadata >> 73) & 1) == 1;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function allowSetController(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
47
|
+
return ((ruleset.metadata >> 74) & 1) == 1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function allowAddAccountingContext(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
51
|
+
return ((ruleset.metadata >> 75) & 1) == 1;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function allowAddPriceFeed(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
55
|
+
return ((ruleset.metadata >> 76) & 1) == 1;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function ownerMustSendPayouts(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
59
|
+
return ((ruleset.metadata >> 77) & 1) == 1;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function holdFees(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
63
|
+
return ((ruleset.metadata >> 78) & 1) == 1;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function useTotalSurplusForCashOuts(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
67
|
+
return ((ruleset.metadata >> 79) & 1) == 1;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function useDataHookForPay(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
71
|
+
return (ruleset.metadata >> 80) & 1 == 1;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function useDataHookForCashOut(JBRuleset memory ruleset) internal pure returns (bool) {
|
|
75
|
+
return (ruleset.metadata >> 81) & 1 == 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function dataHook(JBRuleset memory ruleset) internal pure returns (address) {
|
|
79
|
+
return address(uint160(ruleset.metadata >> 82));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function metadata(JBRuleset memory ruleset) internal pure returns (uint16) {
|
|
83
|
+
return uint16(ruleset.metadata >> 242);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/// @notice Pack the funding cycle metadata.
|
|
87
|
+
/// @param rulesetMetadata The ruleset metadata to validate and pack.
|
|
88
|
+
/// @return packed The packed uint256 of all metadata params. The first 8 bits specify the version.
|
|
89
|
+
function packRulesetMetadata(JBRulesetMetadata memory rulesetMetadata) internal pure returns (uint256 packed) {
|
|
90
|
+
// version 1 in the bits 0-3 (4 bits).
|
|
91
|
+
packed = 1;
|
|
92
|
+
// reserved percent in bits 4-19 (16 bits).
|
|
93
|
+
packed |= uint256(rulesetMetadata.reservedPercent) << 4;
|
|
94
|
+
// cash out tax rate in bits 20-35 (16 bits).
|
|
95
|
+
// cash out tax rate is a number 0-10000.
|
|
96
|
+
packed |= uint256(rulesetMetadata.cashOutTaxRate) << 20;
|
|
97
|
+
// base currency in bits 36-67 (32 bits).
|
|
98
|
+
// base currency is a number 0-4294967295.
|
|
99
|
+
packed |= uint256(rulesetMetadata.baseCurrency) << 36;
|
|
100
|
+
// pause pay in bit 68.
|
|
101
|
+
if (rulesetMetadata.pausePay) packed |= 1 << 68;
|
|
102
|
+
// pause credit transfers in bit 69.
|
|
103
|
+
if (rulesetMetadata.pauseCreditTransfers) packed |= 1 << 69;
|
|
104
|
+
// allow discretionary minting in bit 70.
|
|
105
|
+
if (rulesetMetadata.allowOwnerMinting) packed |= 1 << 70;
|
|
106
|
+
// allow a custom token to be set in bit 71.
|
|
107
|
+
if (rulesetMetadata.allowSetCustomToken) packed |= 1 << 71;
|
|
108
|
+
// allow terminal migration in bit 72.
|
|
109
|
+
if (rulesetMetadata.allowTerminalMigration) packed |= 1 << 72;
|
|
110
|
+
// allow set terminals in bit 73.
|
|
111
|
+
if (rulesetMetadata.allowSetTerminals) packed |= 1 << 73;
|
|
112
|
+
// allow set controller in bit 74.
|
|
113
|
+
if (rulesetMetadata.allowSetController) packed |= 1 << 74;
|
|
114
|
+
// allow add accounting context in bit 75.
|
|
115
|
+
if (rulesetMetadata.allowAddAccountingContext) packed |= 1 << 75;
|
|
116
|
+
// allow add price feed in bit 76.
|
|
117
|
+
if (rulesetMetadata.allowAddPriceFeed) packed |= 1 << 76;
|
|
118
|
+
// owner must send payouts in bit 77.
|
|
119
|
+
if (rulesetMetadata.ownerMustSendPayouts) packed |= 1 << 77;
|
|
120
|
+
// hold fees in bit 78.
|
|
121
|
+
if (rulesetMetadata.holdFees) packed |= 1 << 78;
|
|
122
|
+
// useTotalSurplusForCashOuts in bit 79.
|
|
123
|
+
if (rulesetMetadata.useTotalSurplusForCashOuts) packed |= 1 << 79;
|
|
124
|
+
// use pay data source in bit 80.
|
|
125
|
+
if (rulesetMetadata.useDataHookForPay) packed |= 1 << 80;
|
|
126
|
+
// use cash out data source in bit 81.
|
|
127
|
+
if (rulesetMetadata.useDataHookForCashOut) packed |= 1 << 81;
|
|
128
|
+
// data source address in bits 82-241.
|
|
129
|
+
packed |= uint256(uint160(address(rulesetMetadata.dataHook))) << 82;
|
|
130
|
+
// metadata in bits 242-255 (14 bits).
|
|
131
|
+
packed |= (uint256(rulesetMetadata.metadata) & 0x3FFF) << 242;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// @notice Expand the funding cycle metadata.
|
|
135
|
+
/// @param ruleset The funding cycle having its metadata expanded.
|
|
136
|
+
/// @return rulesetMetadata The ruleset's metadata object.
|
|
137
|
+
function expandMetadata(JBRuleset memory ruleset) internal pure returns (JBRulesetMetadata memory) {
|
|
138
|
+
return JBRulesetMetadata(
|
|
139
|
+
reservedPercent(ruleset),
|
|
140
|
+
cashOutTaxRate(ruleset),
|
|
141
|
+
baseCurrency(ruleset),
|
|
142
|
+
pausePay(ruleset),
|
|
143
|
+
pauseCreditTransfers(ruleset),
|
|
144
|
+
allowOwnerMinting(ruleset),
|
|
145
|
+
allowSetCustomToken(ruleset),
|
|
146
|
+
allowTerminalMigration(ruleset),
|
|
147
|
+
allowSetTerminals(ruleset),
|
|
148
|
+
allowSetController(ruleset),
|
|
149
|
+
allowAddAccountingContext(ruleset),
|
|
150
|
+
allowAddPriceFeed(ruleset),
|
|
151
|
+
ownerMustSendPayouts(ruleset),
|
|
152
|
+
holdFees(ruleset),
|
|
153
|
+
useTotalSurplusForCashOuts(ruleset),
|
|
154
|
+
useDataHookForPay(ruleset),
|
|
155
|
+
useDataHookForCashOut(ruleset),
|
|
156
|
+
dataHook(ruleset),
|
|
157
|
+
metadata(ruleset)
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.17;
|
|
3
|
+
|
|
4
|
+
import {IJBTerminal} from "../interfaces/IJBTerminal.sol";
|
|
5
|
+
import {JBAccountingContext} from "../structs/JBAccountingContext.sol";
|
|
6
|
+
|
|
7
|
+
/// @notice Surplus calculations.
|
|
8
|
+
library JBSurplus {
|
|
9
|
+
/// @notice Gets the total current surplus amount across all of a project's terminals.
|
|
10
|
+
/// @dev This amount changes as the value of the balances changes in relation to the currency being used to measure
|
|
11
|
+
/// the project's payout limits.
|
|
12
|
+
/// @param projectId The ID of the project to get the total surplus for.
|
|
13
|
+
/// @param terminals The terminals to look for surplus within.
|
|
14
|
+
/// @param accountingContexts The accounting contexts to use to calculate the surplus.
|
|
15
|
+
/// @param decimals The number of decimals that the fixed point surplus result should include.
|
|
16
|
+
/// @param currency The currency that the surplus result should be in terms of.
|
|
17
|
+
/// @return surplus The total surplus of a project's funds in terms of `currency`, as a fixed point number with the
|
|
18
|
+
/// specified number of decimals.
|
|
19
|
+
function currentSurplusOf(
|
|
20
|
+
uint256 projectId,
|
|
21
|
+
IJBTerminal[] memory terminals,
|
|
22
|
+
JBAccountingContext[] memory accountingContexts,
|
|
23
|
+
uint256 decimals,
|
|
24
|
+
uint256 currency
|
|
25
|
+
)
|
|
26
|
+
internal
|
|
27
|
+
view
|
|
28
|
+
returns (uint256 surplus)
|
|
29
|
+
{
|
|
30
|
+
// Keep a reference to the number of terminals.
|
|
31
|
+
uint256 numberOfTerminals = terminals.length;
|
|
32
|
+
|
|
33
|
+
// Add the current surplus for each terminal.
|
|
34
|
+
for (uint256 i; i < numberOfTerminals; i++) {
|
|
35
|
+
surplus += terminals[i].currentSurplusOf({
|
|
36
|
+
projectId: projectId, accountingContexts: accountingContexts, decimals: decimals, currency: currency
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.23;
|
|
3
|
+
|
|
4
|
+
import {IJBPriceFeed} from "src/interfaces/IJBPriceFeed.sol";
|
|
5
|
+
|
|
6
|
+
contract JBMatchingPriceFeed is IJBPriceFeed {
|
|
7
|
+
constructor() {}
|
|
8
|
+
|
|
9
|
+
/// @inheritdoc IJBPriceFeed
|
|
10
|
+
function currentUnitPrice(uint256 decimals) public view virtual override returns (uint256) {
|
|
11
|
+
return 10 ** decimals;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
/// @custom:member token The address of the token that accounting is being done with.
|
|
5
|
+
/// @custom:member decimals The number of decimals expected in that token's fixed point accounting.
|
|
6
|
+
/// @custom:member currency The currency that the token is priced in terms of. By convention, this is
|
|
7
|
+
/// `uint32(uint160(tokenAddress))` for tokens, or a constant ID from e.g. `JBCurrencyIds` for other currencies.
|
|
8
|
+
struct JBAccountingContext {
|
|
9
|
+
address token;
|
|
10
|
+
uint8 decimals;
|
|
11
|
+
uint32 currency;
|
|
12
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.0;
|
|
3
|
+
|
|
4
|
+
import {JBTokenAmount} from "./JBTokenAmount.sol";
|
|
5
|
+
|
|
6
|
+
/// @custom:member holder The holder of the tokens being cashed out.
|
|
7
|
+
/// @custom:member projectId The ID of the project being cashed out from.
|
|
8
|
+
/// @custom:member rulesetId The ID of the ruleset the cash out is being made during.
|
|
9
|
+
/// @custom:member cashOutCount The number of project tokens being cashed out.
|
|
10
|
+
/// @custom:member cashOutTaxRate The current ruleset's cash out tax rate.
|
|
11
|
+
/// @custom:member reclaimedAmount The token amount being reclaimed from the project's terminal balance. Includes the
|
|
12
|
+
/// token being
|
|
13
|
+
/// reclaimed, the value, the number of decimals included, and the currency of the amount.
|
|
14
|
+
/// @custom:member forwardedAmount The token amount being forwarded to the cash out hook. Includes the token
|
|
15
|
+
/// being forwarded, the value, the number of decimals included, and the currency of the amount.
|
|
16
|
+
/// @custom:member beneficiary The address the reclaimed amount will be sent to.
|
|
17
|
+
/// @custom:member hookMetadata Extra data specified by the data hook, which is sent to the cash out hook.
|
|
18
|
+
/// @custom:member cashOutMetadata Extra data specified by the account cashing out, which is sent to the cash out hook.
|
|
19
|
+
struct JBAfterCashOutRecordedContext {
|
|
20
|
+
address holder;
|
|
21
|
+
uint256 projectId;
|
|
22
|
+
uint256 rulesetId;
|
|
23
|
+
uint256 cashOutCount;
|
|
24
|
+
JBTokenAmount reclaimedAmount;
|
|
25
|
+
JBTokenAmount forwardedAmount;
|
|
26
|
+
uint256 cashOutTaxRate;
|
|
27
|
+
address payable beneficiary;
|
|
28
|
+
bytes hookMetadata;
|
|
29
|
+
bytes cashOutMetadata;
|
|
30
|
+
}
|