@bananapus/core-v6 0.0.36 → 0.0.38
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/foundry.lock +1 -7
- package/foundry.toml +1 -1
- package/package.json +19 -7
- package/src/JBController.sol +26 -5
- package/src/JBMultiTerminal.sol +85 -47
- package/src/JBTerminalStore.sol +6 -6
- package/src/interfaces/IJBController.sol +4 -1
- package/src/libraries/JBFees.sol +47 -9
- package/src/libraries/JBPayoutSplitGroupLib.sol +2 -2
- package/src/periphery/JBMatchingPriceFeed.sol +1 -1
- package/test/mock/MockMaliciousBeneficiary.sol +15 -15
- package/ADMINISTRATION.md +0 -103
- package/ARCHITECTURE.md +0 -133
- package/AUDIT_INSTRUCTIONS.md +0 -139
- package/RISKS.md +0 -215
- package/SKILLS.md +0 -55
- package/STYLE_GUIDE.md +0 -610
- package/USER_JOURNEYS.md +0 -215
- package/script/Deploy.s.sol +0 -124
- package/script/DeployPeriphery.s.sol +0 -354
- package/slither-ci.config.json +0 -10
- package/test/AuditFixes.t.sol +0 -808
- package/test/ComprehensiveInvariant.t.sol +0 -306
- package/test/CoreExploitTests.t.sol +0 -2741
- package/test/EconomicSimulation.t.sol +0 -348
- package/test/EntryPointPermutations.t.sol +0 -684
- package/test/FlashLoanAttacks.t.sol +0 -797
- package/test/PermissionEscalation.t.sol +0 -711
- package/test/PermissionsInvariant.t.sol +0 -403
- package/test/RulesetTransitions.t.sol +0 -713
- package/test/SplitLoopTests.t.sol +0 -752
- package/test/TestAccessToFunds.sol +0 -2683
- package/test/TestAuditResponseDesignProofs.sol +0 -434
- package/test/TestCashOut.sol +0 -198
- package/test/TestCashOutCountFor.sol +0 -271
- package/test/TestCashOutHooks.sol +0 -351
- package/test/TestCashOutTimingEdge.sol +0 -241
- package/test/TestDataHookFuzzing.sol +0 -524
- package/test/TestDurationUnderflow.sol +0 -233
- package/test/TestFeeFreeCashOutBypass.sol +0 -949
- package/test/TestFeeProcessingFailure.sol +0 -218
- package/test/TestFees.sol +0 -619
- package/test/TestForwardedTokenConsumption.sol +0 -425
- package/test/TestInterfaceSupport.sol +0 -81
- package/test/TestJBERC20Inheritance.sol +0 -103
- package/test/TestL2SequencerPriceFeed.sol +0 -292
- package/test/TestLaunchProject.sol +0 -188
- package/test/TestMetaTx.sol +0 -217
- package/test/TestMetadataOffsetOverflow.sol +0 -179
- package/test/TestMetadataParserLib.sol +0 -471
- package/test/TestMigrationHeldFees.sol +0 -255
- package/test/TestMintTokensOf.sol +0 -185
- package/test/TestMultiTerminalSurplus.sol +0 -348
- package/test/TestMultiTokenSurplus.sol +0 -202
- package/test/TestMultipleAccessLimits.sol +0 -664
- package/test/TestPayBurnRedeemFlow.sol +0 -195
- package/test/TestPayHooks.sol +0 -209
- package/test/TestPermissions.sol +0 -324
- package/test/TestPermissionsEdge.sol +0 -290
- package/test/TestPermit2DataHook.t.sol +0 -360
- package/test/TestPermit2Terminal.sol +0 -372
- package/test/TestRulesetQueueing.sol +0 -1025
- package/test/TestRulesetQueuingStress.sol +0 -806
- package/test/TestRulesetWeightCaching.sol +0 -178
- package/test/TestSplits.sol +0 -391
- package/test/TestTerminalMigration.sol +0 -274
- package/test/TestTerminalPreviewParity.sol +0 -208
- package/test/TestTokenFlow.sol +0 -191
- package/test/TestWeightCacheStaleAfterRejection.sol +0 -303
- package/test/WeirdTokenTests.t.sol +0 -817
- package/test/audit/CashOutReenterPay.t.sol +0 -501
- package/test/audit/CodexHeldFeeRounding.t.sol +0 -159
- package/test/audit/CrossTerminalSurplusSpoof.t.sol +0 -140
- package/test/audit/CycledSurplusAllowanceReset.t.sol +0 -184
- package/test/audit/FeeFreeSurplusLifecycle.t.sol +0 -399
- package/test/audit/FeeFreeSurplusStale.t.sol +0 -248
- package/test/audit/USDTVoidReturnCompat.t.sol +0 -525
- package/test/fork/TestChainlinkPriceFeedFork.sol +0 -254
- package/test/fork/TestSequencerPriceFeedFork.sol +0 -168
- package/test/fork/TestTerminalPreviewParityFork.sol +0 -108
- package/test/formal/BondingCurveProperties.t.sol +0 -420
- package/test/formal/FeeProperties.t.sol +0 -252
- package/test/invariants/Phase3DeepInvariant.t.sol +0 -412
- package/test/invariants/RulesetsInvariant.t.sol +0 -125
- package/test/invariants/TerminalStoreInvariant.t.sol +0 -227
- package/test/invariants/TokensInvariant.t.sol +0 -195
- package/test/invariants/handlers/ComprehensiveHandler.sol +0 -303
- package/test/invariants/handlers/EconomicHandler.sol +0 -377
- package/test/invariants/handlers/Phase3Handler.sol +0 -443
- package/test/invariants/handlers/RulesetsHandler.sol +0 -115
- package/test/invariants/handlers/TerminalStoreHandler.sol +0 -151
- package/test/invariants/handlers/TokensHandler.sol +0 -126
- package/test/regression/HoldFeesCashOutReserved.t.sol +0 -415
- package/test/regression/WeightCacheBoundary.t.sol +0 -291
- package/test/trees/JBController/burnTokensOf.tree +0 -9
- package/test/trees/JBController/claimTokensFor.tree +0 -5
- package/test/trees/JBController/deployERC20For.tree +0 -5
- package/test/trees/JBController/getRulesetOf.tree +0 -5
- package/test/trees/JBController/launchProjectFor.tree +0 -12
- package/test/trees/JBController/launchRulesetsFor.tree +0 -8
- package/test/trees/JBController/migrateController.tree +0 -12
- package/test/trees/JBController/mintTokensOf.tree +0 -12
- package/test/trees/JBController/payReservedTokenToTerminal.tree +0 -8
- package/test/trees/JBController/receiveMigrationFrom.tree +0 -4
- package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +0 -12
- package/test/trees/JBController/setMetadataOf.tree +0 -5
- package/test/trees/JBController/setSplitGroupsOf.tree +0 -5
- package/test/trees/JBController/setTokenFor.tree +0 -5
- package/test/trees/JBController/transferCreditsFrom.tree +0 -8
- package/test/trees/JBDirectory/primaryTerminalOf.tree +0 -8
- package/test/trees/JBDirectory/setControllerOf.tree +0 -11
- package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +0 -15
- package/test/trees/JBDirectory/setTerminalsOf.tree +0 -11
- package/test/trees/JBERC20/initialize.tree +0 -7
- package/test/trees/JBERC20/name.tree +0 -5
- package/test/trees/JBERC20/nonces.tree +0 -5
- package/test/trees/JBERC20/symbol.tree +0 -5
- package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +0 -5
- package/test/trees/JBFeelessAddresses/supportsInterface.tree +0 -5
- package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +0 -5
- package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +0 -8
- package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +0 -18
- package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +0 -5
- package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +0 -8
- package/test/trees/JBMetadataResolver/getDataFor.tree +0 -8
- package/test/trees/JBMultiTerminal/accountingContextsOf.tree +0 -5
- package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +0 -10
- package/test/trees/JBMultiTerminal/addToBalanceOf.tree +0 -23
- package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +0 -23
- package/test/trees/JBMultiTerminal/executePayout.tree +0 -32
- package/test/trees/JBMultiTerminal/executeProcessFee.tree +0 -14
- package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +0 -12
- package/test/trees/JBMultiTerminal/pay.tree +0 -23
- package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +0 -8
- package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +0 -34
- package/test/trees/JBMultiTerminal/useAllowanceOf.tree +0 -16
- package/test/trees/JBPermissions/hasPermission.tree +0 -8
- package/test/trees/JBPermissions/hasPermissions.tree +0 -8
- package/test/trees/JBPermissions/setPermissionsFor.tree +0 -5
- package/test/trees/JBPrices/addPriceFeedFor.tree +0 -14
- package/test/trees/JBPrices/pricePerUnitOf.tree +0 -11
- package/test/trees/JBProjects/createFor.tree +0 -11
- package/test/trees/JBProjects/setTokenUriResolver.tree +0 -5
- package/test/trees/JBProjects/supportsInterface.tree +0 -9
- package/test/trees/JBProjects/tokenURI.tree +0 -5
- package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +0 -8
- package/test/trees/JBRulesets/currentOf.tree +0 -12
- package/test/trees/JBRulesets/getRulesetOf.tree +0 -5
- package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +0 -10
- package/test/trees/JBRulesets/rulesetsOf.tree +0 -11
- package/test/trees/JBRulesets/upcomingRulesetOf.tree +0 -20
- package/test/trees/JBRulesets/updateRulesetWeightCache.tree +0 -5
- package/test/trees/JBSplits/setSplitGroupsOf.tree +0 -17
- package/test/trees/JBSplits/splitsOf.tree +0 -5
- package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +0 -16
- package/test/trees/JBTerminalStore/currentSurplusOf.tree +0 -25
- package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +0 -5
- package/test/trees/JBTerminalStore/recordCashOutsFor.tree +0 -16
- package/test/trees/JBTerminalStore/recordPaymentFrom.tree +0 -14
- package/test/trees/JBTerminalStore/recordPayoutFor.tree +0 -10
- package/test/trees/JBTerminalStore/recordTerminalMigration.tree +0 -5
- package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +0 -10
- package/test/trees/JBTokens/burnFrom.tree +0 -10
- package/test/trees/JBTokens/claimTokensFor.tree +0 -10
- package/test/trees/JBTokens/deployERC20For.tree +0 -12
- package/test/trees/JBTokens/mintFor.tree +0 -10
- package/test/trees/JBTokens/setTokenFor.tree +0 -11
- package/test/trees/JBTokens/totalBalanceOf.tree +0 -5
- package/test/trees/JBTokens/totalSupplyOf.tree +0 -5
- package/test/trees/JBTokens/transferCreditsFrom.tree +0 -8
- package/test/trees/mintTokensOf.tree +0 -12
- package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +0 -223
- package/test/units/static/JBController/JBControllerSetup.sol +0 -50
- package/test/units/static/JBController/TestBurnTokensOf.sol +0 -114
- package/test/units/static/JBController/TestClaimTokensFor.sol +0 -63
- package/test/units/static/JBController/TestDeployErc20For.sol +0 -86
- package/test/units/static/JBController/TestLaunchProjectFor.sol +0 -302
- package/test/units/static/JBController/TestLaunchRulesetsFor.sol +0 -342
- package/test/units/static/JBController/TestMigrateController.sol +0 -157
- package/test/units/static/JBController/TestMintTokensOfUnits.sol +0 -111
- package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +0 -324
- package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +0 -74
- package/test/units/static/JBController/TestPreviewMintOf.sol +0 -117
- package/test/units/static/JBController/TestReceiveMigrationFrom.sol +0 -99
- package/test/units/static/JBController/TestRulesetViews.sol +0 -225
- package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +0 -615
- package/test/units/static/JBController/TestSetSplitGroupsOf.sol +0 -68
- package/test/units/static/JBController/TestSetTokenFor.sol +0 -239
- package/test/units/static/JBController/TestSetUriOf.sol +0 -57
- package/test/units/static/JBController/TestTransferCreditsFrom.sol +0 -169
- package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +0 -211
- package/test/units/static/JBDirectory/JBDirectorySetup.sol +0 -26
- package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +0 -126
- package/test/units/static/JBDirectory/TestSetControllerOf.sol +0 -183
- package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +0 -104
- package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +0 -179
- package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +0 -137
- package/test/units/static/JBERC20/JBERC20Setup.sol +0 -34
- package/test/units/static/JBERC20/SigUtils.sol +0 -36
- package/test/units/static/JBERC20/TestInitialize.sol +0 -60
- package/test/units/static/JBERC20/TestName.sol +0 -30
- package/test/units/static/JBERC20/TestNonces.sol +0 -62
- package/test/units/static/JBERC20/TestSymbol.sol +0 -31
- package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +0 -22
- package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +0 -30
- package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +0 -35
- package/test/units/static/JBFees/TestFeesFuzz.sol +0 -79
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +0 -16
- package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +0 -71
- package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +0 -24
- package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +0 -163
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +0 -59
- package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +0 -101
- package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +0 -189
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +0 -64
- package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +0 -102
- package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +0 -90
- package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +0 -247
- package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +0 -229
- package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +0 -50
- package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +0 -72
- package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +0 -289
- package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +0 -474
- package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +0 -624
- package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +0 -578
- package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +0 -202
- package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +0 -222
- package/test/units/static/JBMultiTerminal/TestPay.sol +0 -604
- package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +0 -117
- package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +0 -114
- package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +0 -228
- package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +0 -55
- package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +0 -257
- package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +0 -611
- package/test/units/static/JBPermissions/JBPermissionsSetup.sol +0 -20
- package/test/units/static/JBPermissions/TestHasPermission.sol +0 -50
- package/test/units/static/JBPermissions/TestHasPermissions.sol +0 -93
- package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +0 -64
- package/test/units/static/JBPrices/JBPricesSetup.sol +0 -32
- package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +0 -107
- package/test/units/static/JBPrices/TestPricePerUnitOf.sol +0 -132
- package/test/units/static/JBPrices/TestPrices.sol +0 -265
- package/test/units/static/JBProjects/JBProjectsSetup.sol +0 -22
- package/test/units/static/JBProjects/TestCreateFor.sol +0 -71
- package/test/units/static/JBProjects/TestInitialProject.sol +0 -21
- package/test/units/static/JBProjects/TestInterfaces.sol +0 -26
- package/test/units/static/JBProjects/TestSetResolver.sol +0 -37
- package/test/units/static/JBProjects/TestTokenUri.sol +0 -40
- package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +0 -108
- package/test/units/static/JBRulesets/JBRulesetsSetup.sol +0 -24
- package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +0 -265
- package/test/units/static/JBRulesets/TestCurrentOf.sol +0 -242
- package/test/units/static/JBRulesets/TestGetRulesetOf.sol +0 -100
- package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +0 -260
- package/test/units/static/JBRulesets/TestRulesets.sol +0 -632
- package/test/units/static/JBRulesets/TestRulesetsOf.sol +0 -37
- package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +0 -522
- package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +0 -96
- package/test/units/static/JBSplits/JBSplitsSetup.sol +0 -26
- package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +0 -552
- package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +0 -377
- package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +0 -267
- package/test/units/static/JBSplits/TestSplitsOf.sol +0 -24
- package/test/units/static/JBSplits/TestSplitsPacking.sol +0 -36
- package/test/units/static/JBSurplus/TestSurplusFuzz.sol +0 -160
- package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +0 -45
- package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +0 -536
- package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +0 -463
- package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +0 -135
- package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +0 -476
- package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +0 -494
- package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +0 -652
- package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +0 -744
- package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +0 -289
- package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +0 -138
- package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +0 -415
- package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +0 -219
- package/test/units/static/JBTokens/JBTokensSetup.sol +0 -32
- package/test/units/static/JBTokens/TestBurnFrom.sol +0 -107
- package/test/units/static/JBTokens/TestClaimTokensFor.sol +0 -110
- package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +0 -92
- package/test/units/static/JBTokens/TestMintFor.sol +0 -100
- package/test/units/static/JBTokens/TestSetTokenFor.sol +0 -98
- package/test/units/static/JBTokens/TestTotalBalanceOf.sol +0 -65
- package/test/units/static/JBTokens/TestTotalSupplyOf.sol +0 -56
- package/test/units/static/JBTokens/TestTransferCreditsFrom.sol +0 -56
package/ADMINISTRATION.md
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
# Administration
|
|
2
|
-
|
|
3
|
-
## At A Glance
|
|
4
|
-
|
|
5
|
-
| Item | Details |
|
|
6
|
-
| --- | --- |
|
|
7
|
-
| Scope | Core Juicebox V6 control plane: directory, controller, terminals, permissions, prices, and global protocol switches |
|
|
8
|
-
| Control posture | Mixed protocol-owner, project-owner, delegated-operator, controller, and terminal control |
|
|
9
|
-
| Highest-risk actions | Controller migration, terminal migration, token binding, price-feed installation, and broad permission grants |
|
|
10
|
-
| Recovery posture | Project-local mistakes may be fixable if rulesets allow it; immutable infra mistakes usually require replacement and migration |
|
|
11
|
-
|
|
12
|
-
## Purpose
|
|
13
|
-
|
|
14
|
-
`nana-core-v6` is the main control plane in the stack. It mixes protocol-owned contracts, project-local ownership, delegated operators through `JBPermissions`, and ruleset flags that allow or block changes. This file explains who can still change project behavior after core is live.
|
|
15
|
-
|
|
16
|
-
## Control Model
|
|
17
|
-
|
|
18
|
-
- Protocol-wide `Ownable` surfaces exist on `JBDirectory`, `JBProjects`, `JBPrices`, and `JBFeelessAddresses`.
|
|
19
|
-
- Project-local control comes from the project NFT owner in `JBProjects`.
|
|
20
|
-
- Fine-grained operator delegation comes from `JBPermissions`.
|
|
21
|
-
- Controllers and terminals become privileged system callers once the directory points to them.
|
|
22
|
-
- The current ruleset can further allow or deny owner or operator actions.
|
|
23
|
-
|
|
24
|
-
## Roles
|
|
25
|
-
|
|
26
|
-
| Role | How Assigned | Scope | Notes |
|
|
27
|
-
| --- | --- | --- | --- |
|
|
28
|
-
| Project owner | `JBProjects.ownerOf(projectId)` | Per project | Main human control surface |
|
|
29
|
-
| Project operator | `JBPermissions` grant | Per project or wildcard | Can be narrow or dangerously broad |
|
|
30
|
-
| Controller | `JBDirectory.controllerOf(projectId)` | Per project | Manages rulesets, token setup, splits, and fund-access config |
|
|
31
|
-
| Terminal | `JBDirectory` terminal set | Per project | Moves funds through `JBTerminalStore` and terminal entrypoints |
|
|
32
|
-
| Protocol owner | `Ownable(owner)` on protocol-wide contracts | Global | Different contracts can have different owners |
|
|
33
|
-
| Omnichain ruleset operator | `JBController` constructor immutable | Global or broad | Bypasses some owner checks for synchronized ruleset flows |
|
|
34
|
-
|
|
35
|
-
## Privileged Surfaces
|
|
36
|
-
|
|
37
|
-
High-value admin functions include:
|
|
38
|
-
|
|
39
|
-
- `JBDirectory.setControllerOf(...)`, `setTerminalsOf(...)`, `setPrimaryTerminalOf(...)`
|
|
40
|
-
- `JBController.queueRulesetsOf(...)`, `launchRulesetsFor(...)`, `setSplitGroupsOf(...)`, `deployERC20For(...)`, `setTokenFor(...)`, `setUriOf(...)`, `addPriceFeedFor(...)`
|
|
41
|
-
- `JBMultiTerminal.useAllowanceOf(...)`, `migrateBalanceOf(...)`, `cashOutTokensOf(...)` when permission-gated by the holder or delegated authority
|
|
42
|
-
- `JBPermissions.setPermissionsFor(...)`
|
|
43
|
-
- `JBPrices.addPriceFeedFor(...)` for protocol defaults or project-local feeds
|
|
44
|
-
- `JBFeelessAddresses.setFeelessAddress(...)`
|
|
45
|
-
- `JBProjects.setTokenUriResolver(...)`
|
|
46
|
-
|
|
47
|
-
The practical split is simple:
|
|
48
|
-
|
|
49
|
-
- protocol owners change global infrastructure or defaults
|
|
50
|
-
- project owners and operators change project configuration
|
|
51
|
-
- controllers and terminals act with the authority core gives them
|
|
52
|
-
|
|
53
|
-
## Immutable And One-Way Decisions
|
|
54
|
-
|
|
55
|
-
- Default or project-specific price feeds are write-once for a given pair.
|
|
56
|
-
- ERC-20 token binding for a project is effectively one-time.
|
|
57
|
-
- The fee beneficiary project ID inside `JBMultiTerminal` is hardcoded.
|
|
58
|
-
- Constructor immutables on controller, directory, terminal, store, prices, and tokens cannot be patched.
|
|
59
|
-
|
|
60
|
-
## Operational Notes
|
|
61
|
-
|
|
62
|
-
- Use narrow project-scoped permissions instead of wildcard or ROOT permissions when possible.
|
|
63
|
-
- Check whether the active ruleset allows the change before assuming the owner or operator can make it.
|
|
64
|
-
- Treat controller migration, terminal migration, token deployment, and price-feed installation as high-blast-radius control-plane changes.
|
|
65
|
-
- Read both the permission check and the current ruleset flags before concluding an action is allowed.
|
|
66
|
-
- Keep fee-route and payout-path failure semantics in mind. Some failures restore project balance instead of trapping funds.
|
|
67
|
-
|
|
68
|
-
## Machine Notes
|
|
69
|
-
|
|
70
|
-
- Do not infer authority from project ownership alone. Many paths also depend on the active ruleset and permission bitmap.
|
|
71
|
-
- Treat `JBDirectory`, `JBController`, `JBMultiTerminal`, `JBPermissions`, `JBPrices`, `JBFeelessAddresses`, and `JBProjects` as the minimum control-plane source set.
|
|
72
|
-
- If a controller, terminal, or price-feed action is not backed by the exact current directory entry, stop and resolve the mismatch first.
|
|
73
|
-
- If a permission is not named explicitly in the call path, inspect the contract check before assuming delegated authority exists.
|
|
74
|
-
- If a fee route or split payout failed, check whether core restored balance or left a retry path before calling it a permanent loss.
|
|
75
|
-
|
|
76
|
-
## Recovery
|
|
77
|
-
|
|
78
|
-
- Wrong immutable infrastructure usually means deploying a new controller, terminal, store, or price layer and then migrating.
|
|
79
|
-
- Wrong project-local config can often be corrected if the current ruleset still allows it.
|
|
80
|
-
- Wrong wildcard permissions are fixed by updating the permission bitmap, but they are dangerous because of what can happen before revocation.
|
|
81
|
-
- Some fee-route and payout-route failures are recoverable in place because core prefers liveness over trapped funds.
|
|
82
|
-
|
|
83
|
-
## Admin Boundaries
|
|
84
|
-
|
|
85
|
-
- Protocol owners cannot directly rewrite project economics without going through the contracts and ruleset constraints that enforce those changes.
|
|
86
|
-
- Project owners cannot bypass immutable constructor references or rewrite existing price-feed entries.
|
|
87
|
-
- Controllers and terminals only have the authority given by the directory and core contracts.
|
|
88
|
-
- Nobody can change the hardcoded fee beneficiary or patch immutable deployment mistakes in place.
|
|
89
|
-
|
|
90
|
-
## Source Map
|
|
91
|
-
|
|
92
|
-
- `src/JBDirectory.sol`
|
|
93
|
-
- `src/JBController.sol`
|
|
94
|
-
- `src/JBMultiTerminal.sol`
|
|
95
|
-
- `src/JBPermissions.sol`
|
|
96
|
-
- `src/JBPrices.sol`
|
|
97
|
-
- `src/JBFeelessAddresses.sol`
|
|
98
|
-
- `src/JBProjects.sol`
|
|
99
|
-
- `test/units/static/JBController/`
|
|
100
|
-
- `test/units/static/JBDirectory/`
|
|
101
|
-
- `test/units/static/JBMultiTerminal/`
|
|
102
|
-
- `test/units/static/JBPermissions/`
|
|
103
|
-
- `test/units/static/JBPrices/`
|
package/ARCHITECTURE.md
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# Architecture
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
`nana-core-v6` is the root of the V6 stack. It owns project identity, rulesets, permissions, treasury balances, token issuance, fee behavior, payout limits, and the hook interfaces that extension repos use.
|
|
6
|
-
|
|
7
|
-
If a change affects accounting, token supply, fees, terminal routing, or permission semantics, this repo is the source of truth.
|
|
8
|
-
|
|
9
|
-
## System Overview
|
|
10
|
-
|
|
11
|
-
`JBController`, `JBMultiTerminal`, and `JBTerminalStore` form the main execution and accounting path. `JBDirectory`, `JBRulesets`, `JBProjects`, `JBTokens`, `JBPermissions`, `JBSplits`, and related contracts provide routing, identity, and shared state for downstream repos.
|
|
12
|
-
|
|
13
|
-
`JBTerminalStore` is terminal-scoped through `msg.sender`, so each terminal tracks its own balances and usage while sharing the same ruleset and price surfaces. Hooks can change economics or add side effects, but they should not create a second ledger.
|
|
14
|
-
|
|
15
|
-
## Core Invariants
|
|
16
|
-
|
|
17
|
-
- Preview functions should stay aligned with the state-changing functions they mirror.
|
|
18
|
-
- Data hooks run before settlement and may change economics. Pay and cash-out hooks run after settlement.
|
|
19
|
-
- Reserved tokens and other pending supply affect supply-sensitive math before distribution.
|
|
20
|
-
- Terminal balances, fee accounting, reclaim math, and surplus calculations must agree.
|
|
21
|
-
- Fee logic taxes value leaving the system, not every internal rebalance.
|
|
22
|
-
- Rulesets are time-ordered and approval-aware, and downstream deployers depend on predictable ID progression.
|
|
23
|
-
- Permission checks are protocol safety checks, not just UI hints.
|
|
24
|
-
|
|
25
|
-
## Modules
|
|
26
|
-
|
|
27
|
-
| Module | Responsibility | Notes |
|
|
28
|
-
| --- | --- | --- |
|
|
29
|
-
| `JBMultiTerminal` | Payment, cash-out, payout, allowance, and fee entrypoints | Execution surface |
|
|
30
|
-
| `JBTerminalStore` | Shared accounting and preview math | Economic source of truth |
|
|
31
|
-
| `JBController` | Launch, queue rulesets, mint, burn, and update split groups | Supply and configuration |
|
|
32
|
-
| `JBDirectory`, `JBRulesets` | Project routing and time-based ruleset lifecycle | Coordination layer |
|
|
33
|
-
| `JBProjects`, `JBTokens`, `JBERC20` | Identity and token surfaces | Ownership and tokenization |
|
|
34
|
-
| `JBPermissions`, `JBSplits`, `JBFundAccessLimits`, `JBPrices` | Shared authorization and configuration state | Cross-repo dependencies |
|
|
35
|
-
|
|
36
|
-
## Trust Boundaries
|
|
37
|
-
|
|
38
|
-
- This repo owns the canonical balance and supply transitions.
|
|
39
|
-
- Hook repos may change inputs and post-settlement behavior, but they should not replace the core ledger.
|
|
40
|
-
- External price feeds, Permit2, and ERC-20 behavior matter, but accounting truth still lives here.
|
|
41
|
-
|
|
42
|
-
## Critical Flows
|
|
43
|
-
|
|
44
|
-
### Payment
|
|
45
|
-
|
|
46
|
-
```text
|
|
47
|
-
terminal receives funds
|
|
48
|
-
-> terminal store reads the active ruleset and optional data hooks
|
|
49
|
-
-> before-pay data hook can change weight and return pay-hook specs
|
|
50
|
-
-> terminal store records the payment in the terminal-scoped ledger
|
|
51
|
-
-> controller mints beneficiary tokens and accrues reserved tokens
|
|
52
|
-
-> pay hooks run after settlement
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Cash Out
|
|
56
|
-
|
|
57
|
-
```text
|
|
58
|
-
holder requests redemption
|
|
59
|
-
-> terminal store reads the current ruleset, balances, and supply inputs
|
|
60
|
-
-> before-cash-out data hook can change reclaim inputs and hook specs
|
|
61
|
-
-> terminal store records the cash out in the terminal-scoped ledger
|
|
62
|
-
-> controller burns tokens
|
|
63
|
-
-> terminal pays reclaim value and routes protocol fees
|
|
64
|
-
-> cash-out hooks run after settlement
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Launch And Queue Rulesets
|
|
68
|
-
|
|
69
|
-
```text
|
|
70
|
-
owner, operator, or omnichain ruleset operator
|
|
71
|
-
-> controller launches or queues rulesets
|
|
72
|
-
-> launch also sets the controller in the directory and configures terminals
|
|
73
|
-
-> rulesets become the source of truth for later pay, cash-out, and admin constraints
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Payouts And Allowances
|
|
77
|
-
|
|
78
|
-
```text
|
|
79
|
-
authorized caller
|
|
80
|
-
-> consumes payout limits or surplus allowances
|
|
81
|
-
-> funds move to splits, projects, hooks, or direct recipients
|
|
82
|
-
-> same-terminal project payouts stay inside terminal accounting and may add fee-free surplus
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## Accounting Model
|
|
86
|
-
|
|
87
|
-
This repo owns the canonical ledger for balances, fees, supply-sensitive reclaim math, payout limits, allowances, reserved tokens, and preview calculations. Other repos may wrap or influence these values, but they should not duplicate them.
|
|
88
|
-
|
|
89
|
-
`JBTerminalStore` keeps terminal balances, payout-limit usage, and surplus-allowance usage. Those reset boundaries are not the same:
|
|
90
|
-
|
|
91
|
-
- payout-limit usage is tracked by ruleset cycle number
|
|
92
|
-
- surplus-allowance usage is tracked by `ruleset.id`
|
|
93
|
-
|
|
94
|
-
If a duration-based ruleset auto-cycles without a new ruleset ID, payout-limit usage resets but allowance usage does not.
|
|
95
|
-
|
|
96
|
-
## Security Model
|
|
97
|
-
|
|
98
|
-
- Review `JBMultiTerminal`, `JBTerminalStore`, and `JBController` as one pipeline.
|
|
99
|
-
- `JBTerminalStore` uses shared logic with terminal-scoped state. Misreading that split leads to bad accounting assumptions.
|
|
100
|
-
- Small changes in fee or surplus logic can affect every downstream repo.
|
|
101
|
-
- Same-terminal project payouts, fee-free surplus capping, and migration cleanup are coupled.
|
|
102
|
-
- `allowOwnerMinting` is not a universal mint kill switch. Other allowed paths can still mint.
|
|
103
|
-
- Hook ordering and preview-execution alignment are ongoing maintenance requirements.
|
|
104
|
-
|
|
105
|
-
## Safe Change Guide
|
|
106
|
-
|
|
107
|
-
- Trace both the preview path and the state-changing path for any nontrivial change.
|
|
108
|
-
- Read downstream hook repos before changing hook metadata or interface expectations.
|
|
109
|
-
- Keep fee logic, balance logic, reclaim math, and surplus math in sync.
|
|
110
|
-
- If you change same-terminal payouts between projects, re-check self-pay reverts, fee-free surplus accumulation, and post-pay caps.
|
|
111
|
-
- If you change ruleset rollover semantics, re-check which counters reset on cycle progression versus new ruleset IDs.
|
|
112
|
-
- If permissions change, update shared docs and downstream assumptions at the same time.
|
|
113
|
-
|
|
114
|
-
## Canonical Checks
|
|
115
|
-
|
|
116
|
-
- fee-free surplus and same-terminal payout behavior:
|
|
117
|
-
`test/TestFeeFreeCashOutBypass.sol`
|
|
118
|
-
- migration and terminal-accounting continuity:
|
|
119
|
-
`test/TestTerminalMigration.sol`
|
|
120
|
-
- ruleset ordering and transition behavior:
|
|
121
|
-
`test/RulesetTransitions.t.sol`
|
|
122
|
-
|
|
123
|
-
## Source Map
|
|
124
|
-
|
|
125
|
-
- `src/JBController.sol`
|
|
126
|
-
- `src/JBMultiTerminal.sol`
|
|
127
|
-
- `src/JBTerminalStore.sol`
|
|
128
|
-
- `src/JBDirectory.sol`
|
|
129
|
-
- `src/JBRulesets.sol`
|
|
130
|
-
- `src/JBPermissions.sol`
|
|
131
|
-
- `test/TestFeeFreeCashOutBypass.sol`
|
|
132
|
-
- `test/TestTerminalMigration.sol`
|
|
133
|
-
- `test/RulesetTransitions.t.sol`
|
package/AUDIT_INSTRUCTIONS.md
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
# Audit Instructions
|
|
2
|
-
|
|
3
|
-
This is the core Juicebox V6 protocol. Most ecosystem invariants eventually reduce to this repo.
|
|
4
|
-
|
|
5
|
-
## Audit Objective
|
|
6
|
-
|
|
7
|
-
Find issues that:
|
|
8
|
-
|
|
9
|
-
- break terminal solvency or internal accounting
|
|
10
|
-
- let projects extract more than payout or surplus-allowance limits
|
|
11
|
-
- miscompute payment minting, reserved tokens, or cash-out reclaim amounts
|
|
12
|
-
- corrupt ruleset transitions, approvals, or decay behavior
|
|
13
|
-
- bypass the permission model, migrations, or fee lifecycle
|
|
14
|
-
|
|
15
|
-
## Scope
|
|
16
|
-
|
|
17
|
-
In scope:
|
|
18
|
-
|
|
19
|
-
- all Solidity under `src/`
|
|
20
|
-
- deployment scripts in `script/`
|
|
21
|
-
- price-feed setup and periphery contracts under `src/periphery/`
|
|
22
|
-
|
|
23
|
-
Especially critical contracts:
|
|
24
|
-
|
|
25
|
-
- `JBMultiTerminal`
|
|
26
|
-
- `JBTerminalStore`
|
|
27
|
-
- `JBController`
|
|
28
|
-
- `JBRulesets`
|
|
29
|
-
- `JBTokens`
|
|
30
|
-
- `JBPermissions`
|
|
31
|
-
- `JBPrices`
|
|
32
|
-
- `JBSplits`
|
|
33
|
-
- `JBFundAccessLimits`
|
|
34
|
-
|
|
35
|
-
## Start Here
|
|
36
|
-
|
|
37
|
-
For the fastest serious review, read in this order:
|
|
38
|
-
|
|
39
|
-
- `JBTerminalStore`
|
|
40
|
-
- `JBMultiTerminal`
|
|
41
|
-
- `JBController`
|
|
42
|
-
- `JBRulesets`
|
|
43
|
-
- `JBPermissions`
|
|
44
|
-
- `JBPrices`
|
|
45
|
-
|
|
46
|
-
That order mirrors how most high-severity issues appear:
|
|
47
|
-
|
|
48
|
-
- accounting is computed
|
|
49
|
-
- funds move
|
|
50
|
-
- tokens mint or burn
|
|
51
|
-
- permissions and price context determine whether the move is allowed
|
|
52
|
-
|
|
53
|
-
## Security Model
|
|
54
|
-
|
|
55
|
-
Core roles:
|
|
56
|
-
|
|
57
|
-
- `JBMultiTerminal`: holds funds and executes pay, payout, cash-out, allowance, and fee-processing flows
|
|
58
|
-
- `JBTerminalStore`: owns accounting and surplus logic
|
|
59
|
-
- `JBController`: owns project lifecycle, token mint and burn, and permission-sensitive operations
|
|
60
|
-
- `JBRulesets`: stores current and queued economic parameters
|
|
61
|
-
- `JBTokens`: handles ERC-20 and credit accounting
|
|
62
|
-
- `JBPermissions`: provides the access-control backbone
|
|
63
|
-
|
|
64
|
-
Extension points:
|
|
65
|
-
|
|
66
|
-
- data hooks
|
|
67
|
-
- pay hooks
|
|
68
|
-
- cash-out hooks
|
|
69
|
-
- split hooks
|
|
70
|
-
- approval hooks
|
|
71
|
-
|
|
72
|
-
Ordering to keep in mind:
|
|
73
|
-
|
|
74
|
-
- the store records accounting before terminal fulfillment is finished
|
|
75
|
-
- controller mint and burn operations happen inside terminal flows, not in a separate settlement layer
|
|
76
|
-
- hooks can turn a simple pay or cash-out into a multi-contract flow
|
|
77
|
-
|
|
78
|
-
## Roles And Privileges
|
|
79
|
-
|
|
80
|
-
| Role | Powers | How constrained |
|
|
81
|
-
|------|--------|-----------------|
|
|
82
|
-
| Project owner and operators | Configure rulesets, limits, routing, and permissions | Must stay inside the explicit permission model |
|
|
83
|
-
| Terminal | Hold funds and execute settlement | Must stay solvent relative to internal accounting |
|
|
84
|
-
| Controller | Mint, burn, and manage project lifecycle | Must not bypass project-scoped authorization |
|
|
85
|
-
| Hooks and splits | Extend pay and cash-out behavior | Must not make previews and accounting irreconcilable |
|
|
86
|
-
|
|
87
|
-
## Integration Assumptions
|
|
88
|
-
|
|
89
|
-
| Dependency | Assumption | What breaks if wrong |
|
|
90
|
-
|------------|------------|----------------------|
|
|
91
|
-
| Price feeds | Currency conversions are fresh and coherent | Cross-currency flows misprice |
|
|
92
|
-
| Hook ecosystem | External hooks obey documented interfaces | Settlement becomes unsafe after control transfer |
|
|
93
|
-
| Directory and migration surfaces | Canonical routing changes are authentic | Funds or permissions shift to the wrong place |
|
|
94
|
-
|
|
95
|
-
## Critical Invariants
|
|
96
|
-
|
|
97
|
-
1. Terminal solvency
|
|
98
|
-
Internal balances and held-fee obligations must reconcile with actual terminal token balances.
|
|
99
|
-
2. No over-withdrawal
|
|
100
|
-
Payouts and allowance usage must never exceed configured per-cycle limits.
|
|
101
|
-
3. Cash-out correctness
|
|
102
|
-
Surplus, total supply, tax rate, fee treatment, and hook overrides must combine into the intended reclaim amount.
|
|
103
|
-
4. Ruleset integrity
|
|
104
|
-
The active ruleset and any fallback or cycling behavior must match exact timing and approval-hook semantics.
|
|
105
|
-
5. Token accounting consistency
|
|
106
|
-
Credits, ERC-20 total supply, reserved token balance, and burn/mint paths must stay coherent.
|
|
107
|
-
6. Privilege containment
|
|
108
|
-
Permissions, wildcard grants, controller migration, and terminal routing must not allow unauthorized control or fund movement.
|
|
109
|
-
7. Held-fee correctness
|
|
110
|
-
Deferred fees must not be accidentally forgiven, duplicated, or charged to the wrong place.
|
|
111
|
-
8. Preview coherence
|
|
112
|
-
`previewPayFor` and `previewCashOutFrom` should not drift from execution in ways downstream repos can exploit.
|
|
113
|
-
|
|
114
|
-
## Attack Surfaces
|
|
115
|
-
|
|
116
|
-
- `pay`, `cashOutTokensOf`, `sendPayoutsOf`, and `useAllowanceOf`
|
|
117
|
-
- `preview*` paths when downstream repos treat them as execution truth
|
|
118
|
-
- held-fee lifecycle and `_processFee`
|
|
119
|
-
- surplus aggregation across terminals
|
|
120
|
-
- controller migration and terminal migration
|
|
121
|
-
- `setPermissionsFor` and wildcard semantics
|
|
122
|
-
|
|
123
|
-
Replay these sequences:
|
|
124
|
-
|
|
125
|
-
1. `pay` with a data hook that changes weight or hook specs and then reenters through a pay hook
|
|
126
|
-
2. `cashOutTokensOf` when cross-terminal surplus and `useTotalSurplusForCashOuts` matter
|
|
127
|
-
3. `sendPayoutsOf` into splits that route to another project, hook, or failing beneficiary
|
|
128
|
-
4. held-fee accumulation followed by migration or balance depletion
|
|
129
|
-
5. permission grants involving operators, wildcard project IDs, or later controller changes
|
|
130
|
-
|
|
131
|
-
## Accepted Risks Or Behaviors
|
|
132
|
-
|
|
133
|
-
- Hooks are intentionally powerful. Safety comes from clear ordering and bounded trust, not from avoiding composition.
|
|
134
|
-
|
|
135
|
-
## Verification
|
|
136
|
-
|
|
137
|
-
- `npm install`
|
|
138
|
-
- `forge build`
|
|
139
|
-
- `forge test`
|
package/RISKS.md
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
# Juicebox Core Risk Register
|
|
2
|
-
|
|
3
|
-
This file covers the main accounting, permission, and liveness risks in the core protocol contracts that the rest of V6 builds on.
|
|
4
|
-
|
|
5
|
-
## How To Use This File
|
|
6
|
-
|
|
7
|
-
- Read `Priority risks` first. Those are the failures with the widest blast radius.
|
|
8
|
-
- Use the later sections when you need detail on accounting, reentrancy, access control, previews, or integrations.
|
|
9
|
-
- Treat `Invariants to verify` as core properties, not optional test ideas.
|
|
10
|
-
|
|
11
|
-
## Priority Risks
|
|
12
|
-
|
|
13
|
-
| Priority | Risk | Why it matters | Primary controls |
|
|
14
|
-
|----------|------|----------------|------------------|
|
|
15
|
-
| P0 | Core accounting corruption | Terminal, store, and controller accounting define balances, surplus, fees, and supply for the whole ecosystem. | Invariant tests, preview/settlement alignment, and conservative integrations. |
|
|
16
|
-
| P0 | Permission or migration mistakes | Controllers, terminals, and operators can redirect authority or value if checks or sequencing are wrong. | Permission review, migration tests, and scrutiny of wildcard or root-like authority. |
|
|
17
|
-
| P1 | Preview or settlement drift | Hooks and routers often depend on previews being close to execution. | Preview analysis, regression tests, and downstream composition review. |
|
|
18
|
-
|
|
19
|
-
## 1. Trust Assumptions
|
|
20
|
-
|
|
21
|
-
- **Hooks are not exploiting reentrancy.** Core does not use `ReentrancyGuard`. Safety depends on call ordering and the `JBTerminalStore_InadequateTerminalStoreBalance` backstop.
|
|
22
|
-
- **Data hooks are highly trusted.** A data hook can change payment weight, cash-out tax rate, `effectiveTotalSupply`, `effectiveCashOutCount`, and hook-forwarding amounts. The protocol only bounds the final amounts.
|
|
23
|
-
- **Price feeds are honest enough.** Surplus, payout conversions, and allowance math depend on `JBPrices`. Stale or manipulated feeds misprice the system.
|
|
24
|
-
- **Accepted ERC-20s behave like standard tokens.** Inbound fee-on-transfer handling is safer than outbound handling. Rebasing or nonstandard outbound behavior can still break accounting assumptions.
|
|
25
|
-
- **Accepted tokens are not actively adversarial.** Core does not harden against tokens that reenter or distort balance observations during transfer.
|
|
26
|
-
- **The trusted forwarder is not compromised.** If it is, `_msgSender()` can be spoofed across permission-gated contracts.
|
|
27
|
-
- **Project `#1` fee routing stays live enough.** If fee processing into project `#1` fails, core favors liveness and returns value to the originating project instead of trapping it. That can forgive fees.
|
|
28
|
-
- **`OMNICHAIN_RULESET_OPERATOR` is trusted.** This address can bypass some owner checks for ruleset flows and is a broad trust point.
|
|
29
|
-
|
|
30
|
-
## 2. Economic Risks
|
|
31
|
-
|
|
32
|
-
### Bonding Curve
|
|
33
|
-
|
|
34
|
-
- **Zero cash-out guard.** `cashOutFrom` returns `0` when `cashOutCount == 0`. Verify no path bypasses that guard.
|
|
35
|
-
- **Pending reserved tokens lower cash-out value.** `totalTokenSupplyWithReservedTokensOf()` includes `pendingReservedTokenBalanceOf`, which can reduce per-token reclaim value until reserves are distributed.
|
|
36
|
-
- **External token supply only affects that project.** If a project uses `setTokenFor(...)`, the external token's `totalSupply()` feeds that project's cash-out math.
|
|
37
|
-
- **`mulDiv` rounding exists.** Split cash outs can differ slightly from a combined cash out because of floor rounding.
|
|
38
|
-
- **`minCashOutCountFor` uses binary search.** Large supplies increase loop count. Gas should stay bounded.
|
|
39
|
-
|
|
40
|
-
### Fee Arithmetic
|
|
41
|
-
|
|
42
|
-
- **Forward and backward fee math round differently.** `feeAmountFrom` and `feeAmountResultingIn` are close but not identical under rounding. Their interaction matters in held-fee paths.
|
|
43
|
-
- **Held fee entries are mutated in place.** If the accounting is off by even one unit in the wrong direction, `_returnHeldFees` can corrupt the entry.
|
|
44
|
-
|
|
45
|
-
### Weight Decay
|
|
46
|
-
|
|
47
|
-
- **Stale weight cache can block a project.** Short-duration rulesets with nonzero `weightCutPercent` can hit `WeightCacheRequired` after enough cycles.
|
|
48
|
-
- **Weight-cache correctness matters more than overflow.** Overflow is already bounded at queue time. The real risk is stale or wrongly-updated cache state.
|
|
49
|
-
|
|
50
|
-
### Surplus Manipulation
|
|
51
|
-
|
|
52
|
-
- **Cross-terminal surplus is a trust boundary.** When `useTotalSurplusForCashOuts` is enabled, one terminal can price a cash out using value reported by other terminals.
|
|
53
|
-
- **Cross-terminal price-feed mismatch changes reclaim values.** If feeds differ or go stale across terminals, aggregated surplus can be wrong.
|
|
54
|
-
|
|
55
|
-
## 3. Reentrancy Surface
|
|
56
|
-
|
|
57
|
-
Core does not use `ReentrancyGuard`. It relies on state ordering plus `InadequateTerminalStoreBalance` as the last balance-extraction backstop.
|
|
58
|
-
|
|
59
|
-
### External Call Map
|
|
60
|
-
|
|
61
|
-
| Function | State Changes Before External Call | External Calls | Risk |
|
|
62
|
-
|----------|-----------------------------------|----------------|------|
|
|
63
|
-
| `_pay` | `STORE.recordPaymentFrom`, `controller.mintTokensOf` | Pay hooks | LOW |
|
|
64
|
-
| `_cashOutTokensOf` | `STORE.recordCashOutFor`, `controller.burnTokensOf`, beneficiary transfer | Cash-out hooks, then fee processing | MEDIUM |
|
|
65
|
-
| `executePayout` | `STORE.recordPayoutFor` already consumed payout limit | Split hooks, terminal pay/addToBalance | MEDIUM |
|
|
66
|
-
| `processHeldFeesOf` | Held-fee entry deleted and index advanced | `_processFee` -> `this.executeProcessFee` -> `terminal.pay` | LOW |
|
|
67
|
-
| `_sendReservedTokensToSplitsOf` | Pending reserved balance zeroed, tokens minted | Split hooks, terminal payments | LOW |
|
|
68
|
-
| `_useAllowanceOf` | `STORE.recordUsedAllowanceOf` | Fee processing, beneficiary transfer | LOW |
|
|
69
|
-
| `migrateBalanceOf` | `STORE.recordTerminalMigration` | `to.addToBalanceOf` | LOW |
|
|
70
|
-
|
|
71
|
-
### Cross-Function Reentrancy To Explore
|
|
72
|
-
|
|
73
|
-
- **Pay hook -> `cashOutTokensOf`.** The hook sees post-payment balance and post-mint supply.
|
|
74
|
-
- **Cash-out hook -> `pay`.** The hook runs after burn and payout but before fee processing completes.
|
|
75
|
-
- **Split hook -> `pay` on the same project.** Core now reverts same-project intra-terminal self-pay minting, but the path is still worth checking.
|
|
76
|
-
- **Reserved-token split hook reentry.** Hooks see post-mint state after pending reserved balance is zeroed.
|
|
77
|
-
- **Fee processing reentry.** `_processFee` makes an external fee payment into project `#1`; hook behavior there still matters.
|
|
78
|
-
|
|
79
|
-
### Key Backstop
|
|
80
|
-
|
|
81
|
-
`JBTerminalStore_InadequateTerminalStoreBalance` should stop any path from pulling more than the terminal's recorded balance. Auditors should verify no caller can inflate that recorded balance without the terminal actually holding the funds.
|
|
82
|
-
|
|
83
|
-
## 4. Access Control
|
|
84
|
-
|
|
85
|
-
### Permission System
|
|
86
|
-
|
|
87
|
-
- **ROOT grants all permissions.** That includes permissions added in the future.
|
|
88
|
-
- **ROOT plus wildcard is allowed only for self-grants.** An account can delegate broad power over its own projects, but third parties should not be able to escalate into it.
|
|
89
|
-
- **Empty permission arrays pass `hasPermissions`.** Callers must check for non-empty arrays if that matters to their logic.
|
|
90
|
-
- **`OMNICHAIN_RULESET_OPERATOR` is a broad bypass.** It can queue or launch rulesets for any project.
|
|
91
|
-
|
|
92
|
-
### Directory Terminal Addition
|
|
93
|
-
|
|
94
|
-
- **`setPrimaryTerminalOf` can also add a terminal.** When the terminal is not already installed, the call must satisfy `ADD_TERMINALS` as well as the primary-terminal permission.
|
|
95
|
-
|
|
96
|
-
### Migration
|
|
97
|
-
|
|
98
|
-
- **Controller migration depends on ruleset permission.** `allowSetController` must be active, and migration fails if reserved tokens are still pending.
|
|
99
|
-
- **Terminal migration also depends on ruleset permission.** Held fees are not migrated, and migration into a non-feeless terminal charges the normal protocol fee.
|
|
100
|
-
- **Directory updates are high-impact.** `setTerminalsOf` and `setControllerOf` can redirect a project's fund and authority flow.
|
|
101
|
-
|
|
102
|
-
### Ruleset Queuing
|
|
103
|
-
|
|
104
|
-
- Only the current controller can call `RULESETS.queueFor()`.
|
|
105
|
-
- The controller lets the owner, an allowed operator, or `OMNICHAIN_RULESET_OPERATOR` queue rulesets.
|
|
106
|
-
- For `duration = 0` projects, a queued ruleset can take effect immediately.
|
|
107
|
-
|
|
108
|
-
## 5. DoS Vectors
|
|
109
|
-
|
|
110
|
-
### Unbounded Arrays
|
|
111
|
-
|
|
112
|
-
| Array | Growth Mechanism | Cleanup | Risk |
|
|
113
|
-
|-------|-----------------|---------|------|
|
|
114
|
-
| `_heldFeesOf[projectId][token]` | Each held-fee payout appends | Index pointer skips processed entries | MODERATE |
|
|
115
|
-
| `splits[]` | Set by project owner per ruleset | Replaced wholesale | MODERATE |
|
|
116
|
-
| `_accountingContextsOf[projectId]` | `addAccountingContextsFor` append-only | Never shrinks | LOW |
|
|
117
|
-
| Payout limits / surplus allowances | Set per ruleset | Replaced per ruleset | LOW |
|
|
118
|
-
| `_terminalsOf[projectId]` | `setTerminalsOf` replace-only | Replaced | LOW |
|
|
119
|
-
|
|
120
|
-
### Price Feed Reverts
|
|
121
|
-
|
|
122
|
-
- Stale or incomplete Chainlink data can block multi-currency operations.
|
|
123
|
-
- L2 sequencer downtime can also block feeds behind a sequencer-check wrapper.
|
|
124
|
-
- Single-currency projects are unaffected when they do not need conversion.
|
|
125
|
-
- Price feeds are immutable once set in `JBPrices`.
|
|
126
|
-
|
|
127
|
-
### Approval Hook Griefing
|
|
128
|
-
|
|
129
|
-
- A reverting approval hook is caught and treated as failed approval.
|
|
130
|
-
- A gas-burning approval hook can still DoS `currentOf()` by exhausting gas.
|
|
131
|
-
- Repeated approval-hook rejection at a ruleset boundary can create complex fallback behavior that needs testing.
|
|
132
|
-
|
|
133
|
-
### Other DoS Surfaces
|
|
134
|
-
|
|
135
|
-
- Failed split payouts consume payout limit even when value is returned to project balance.
|
|
136
|
-
- `addAccountingContextsFor` is append-only, so projects that add many contexts over time can make some loops more expensive.
|
|
137
|
-
|
|
138
|
-
## 6. Preview Functions
|
|
139
|
-
|
|
140
|
-
`JBMultiTerminal.previewPayFor`, `JBMultiTerminal.previewCashOutFrom`, and `JBController.previewMintOf` are read-only simulations of state-changing operations.
|
|
141
|
-
|
|
142
|
-
- **Previews call data hooks.** A reverting or gas-heavy hook can break previews.
|
|
143
|
-
- **Store previews require the correct terminal input.** Passing the wrong terminal gives the wrong answer.
|
|
144
|
-
- **Previews do not mutate state.** They cannot consume limits, move funds, or mint and burn tokens.
|
|
145
|
-
- **Preview and execution can still drift.** Shared logic helps, but state can change between calls and hooks can be stateful.
|
|
146
|
-
- **Some read-only surplus views are not hook-aware.** `currentReclaimableSurplusOf` and `currentTotalReclaimableSurplusOf` intentionally skip data hooks.
|
|
147
|
-
|
|
148
|
-
## 7. Integration Risks
|
|
149
|
-
|
|
150
|
-
### Non-Standard ERC-20s
|
|
151
|
-
|
|
152
|
-
- **Fee-on-transfer tokens.** Inbound handling is safer than outbound handling. Outbound transfer fees can leave store accounting higher than real holdings.
|
|
153
|
-
- **Reentrant transfer hooks.** Core treats them as an accepted integration risk, not a hardened invariant.
|
|
154
|
-
- **Rebasing tokens.** Positive or negative rebases can desync terminal balances from store balances.
|
|
155
|
-
- **Blocklist tokens.** Beneficiary-specific transfer failures can revert user cash outs or return payout value to the project.
|
|
156
|
-
- **Low-decimal tokens.** Fixed-point conversions can lose meaningful precision.
|
|
157
|
-
|
|
158
|
-
### Permit2 Interactions
|
|
159
|
-
|
|
160
|
-
- Permit2 is only used for inbound transfers.
|
|
161
|
-
- Outbound transfers never rely on Permit2.
|
|
162
|
-
- The `uint160` cast in `_acceptFundsFor` caps Permit2 transfer size.
|
|
163
|
-
|
|
164
|
-
### Cross-Terminal Surplus Aggregation
|
|
165
|
-
|
|
166
|
-
- `JBSurplus.currentSurplusOf` makes external view calls into each terminal with no gas cap.
|
|
167
|
-
- Aggregated surplus also compounds price-conversion rounding across terminals.
|
|
168
|
-
|
|
169
|
-
### `addToBalanceOf` Metadata
|
|
170
|
-
|
|
171
|
-
- `addToBalanceOf` accepts arbitrary metadata.
|
|
172
|
-
- Core ignores that metadata directly, but hooks may interpret it.
|
|
173
|
-
|
|
174
|
-
### `recordAddedBalanceFor` Access Control
|
|
175
|
-
|
|
176
|
-
- `JBTerminalStore.recordAddedBalanceFor` has no explicit access control.
|
|
177
|
-
- The balance key includes `msg.sender`, so only a terminal can inflate its own recorded balance.
|
|
178
|
-
- A buggy or malicious terminal can still lie about funds it received.
|
|
179
|
-
|
|
180
|
-
### Split And Owner-Payout Failure Semantics
|
|
181
|
-
|
|
182
|
-
- Failed split payouts still consume payout limit.
|
|
183
|
-
- Failed owner payouts also still consume payout limit.
|
|
184
|
-
- Reserved-token split hook reverts can strand tokens at the hook after transfer.
|
|
185
|
-
|
|
186
|
-
## 8. Accepted Behaviors
|
|
187
|
-
|
|
188
|
-
### 8.1 Cross-terminal surplus is opt-in shared trust
|
|
189
|
-
|
|
190
|
-
When a project enables `useTotalSurplusForCashOuts`, it is choosing shared treasury semantics across terminals. That can improve pricing, but it also means each listed terminal is part of the trust boundary.
|
|
191
|
-
|
|
192
|
-
### 8.2 Failed fee routing is intentionally fail-open
|
|
193
|
-
|
|
194
|
-
If project `#1` cannot accept a fee payment, core prefers liveness over strict fee collection. For held fees, a failed processing attempt can forgive the fee permanently.
|
|
195
|
-
|
|
196
|
-
### 8.3 Surplus allowance is keyed by ruleset, not by an abstract cycle
|
|
197
|
-
|
|
198
|
-
`usedSurplusAllowanceOf` is keyed by `ruleset.id`. If a ruleset auto-rolls without a new ID, allowance usage carries forward.
|
|
199
|
-
|
|
200
|
-
### 8.4 Fee routing starts fail-open until the wider deployment is wired
|
|
201
|
-
|
|
202
|
-
Core can be deployed before project `#1` is fully ready. During that period, fee-bearing flows may forgive fees instead of trapping funds.
|
|
203
|
-
|
|
204
|
-
## 9. Invariants To Verify
|
|
205
|
-
|
|
206
|
-
- **Balance conservation:** `terminal.balance(token) >= sum(store.balanceOf(projectId, terminal, token))` for projects sharing a terminal.
|
|
207
|
-
- **Fund conservation:** project inflows should cover project outflows plus fees, with rounding favoring the protocol.
|
|
208
|
-
- **Fee monotonicity:** project `#1` should only gain protocol fees through normal mechanics.
|
|
209
|
-
- **Token supply consistency:** protocol credit supply, ERC-20 supply, and pending reserved supply should reconcile.
|
|
210
|
-
- **Payout-limit enforcement:** `usedPayoutLimitOf(...)` must stay `<= payoutLimitOf(...)`.
|
|
211
|
-
- **Surplus-allowance enforcement:** `usedSurplusAllowanceOf(...)` must stay `<= surplusAllowanceOf(...)`.
|
|
212
|
-
- **Cash-out bound:** reclaim plus hook-forwarded amounts must not exceed recorded balance.
|
|
213
|
-
- **Ruleset existence:** after launch, `RULESETS.currentOf(projectId)` should not accidentally go empty.
|
|
214
|
-
- **No flash-loan profit:** `pay()` followed by `cashOutTokensOf()` in one transaction should not be profitable after fees.
|
|
215
|
-
- **Held-fee integrity:** active held-fee entries plus processed fees should equal all fees ever taken under held-fee mode.
|
package/SKILLS.md
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# Juicebox Core
|
|
2
|
-
|
|
3
|
-
## Use This File For
|
|
4
|
-
|
|
5
|
-
- Use this file when the task touches core protocol behavior: payments, cash outs, terminals, controller actions, rulesets, splits, tokens, permissions, or price feeds.
|
|
6
|
-
- Start here when you know the issue is in core. Then narrow it to one state transition before reading more broadly.
|
|
7
|
-
|
|
8
|
-
## Read This Next
|
|
9
|
-
|
|
10
|
-
| If you need... | Open this next |
|
|
11
|
-
|---|---|
|
|
12
|
-
| Repo overview and protocol framing | [`README.md`](./README.md), [`ARCHITECTURE.md`](./ARCHITECTURE.md) |
|
|
13
|
-
| Controller and project lifecycle behavior | [`src/JBController.sol`](./src/JBController.sol), [`src/JBProjects.sol`](./src/JBProjects.sol), [`src/JBTokens.sol`](./src/JBTokens.sol) |
|
|
14
|
-
| Payment, cash-out, surplus, and fee accounting | [`src/JBMultiTerminal.sol`](./src/JBMultiTerminal.sol), [`src/JBTerminalStore.sol`](./src/JBTerminalStore.sol), [`src/JBFundAccessLimits.sol`](./src/JBFundAccessLimits.sol) |
|
|
15
|
-
| Rulesets, permissions, directory, and prices | [`src/JBRulesets.sol`](./src/JBRulesets.sol), [`src/JBPermissions.sol`](./src/JBPermissions.sol), [`src/JBDirectory.sol`](./src/JBDirectory.sol), [`src/JBPrices.sol`](./src/JBPrices.sol) |
|
|
16
|
-
| Shared math, metadata parsing, and constants | [`src/libraries/`](./src/libraries/), [`src/structs/`](./src/structs/), [`src/enums/`](./src/enums/) |
|
|
17
|
-
| Periphery helpers and deployment | [`src/periphery/`](./src/periphery/), [`script/Deploy.s.sol`](./script/Deploy.s.sol), [`script/DeployPeriphery.s.sol`](./script/DeployPeriphery.s.sol) |
|
|
18
|
-
| Payment and cash-out entrypoints | [`references/entrypoints.md`](./references/entrypoints.md) |
|
|
19
|
-
| Packed metadata, errors, events, and hook return shapes | [`references/types-errors-events.md`](./references/types-errors-events.md) |
|
|
20
|
-
| Payment and cash-out behavior in tests | [`test/TestPayBurnRedeemFlow.sol`](./test/TestPayBurnRedeemFlow.sol), [`test/TestCashOut.sol`](./test/TestCashOut.sol), [`test/TestMultiTerminalSurplus.sol`](./test/TestMultiTerminalSurplus.sol), [`test/TestTerminalPreviewParity.sol`](./test/TestTerminalPreviewParity.sol) |
|
|
21
|
-
| Permissions, rulesets, and invariants | [`test/TestPermissions.sol`](./test/TestPermissions.sol), [`test/PermissionEscalation.t.sol`](./test/PermissionEscalation.t.sol), [`test/TestRulesetQueueing.sol`](./test/TestRulesetQueueing.sol), [`test/ComprehensiveInvariant.t.sol`](./test/ComprehensiveInvariant.t.sol), [`test/PermissionsInvariant.t.sol`](./test/PermissionsInvariant.t.sol) |
|
|
22
|
-
| Economic and exploit coverage | [`test/EconomicSimulation.t.sol`](./test/EconomicSimulation.t.sol), [`test/CoreExploitTests.t.sol`](./test/CoreExploitTests.t.sol), [`test/FlashLoanAttacks.t.sol`](./test/FlashLoanAttacks.t.sol), [`test/WeirdTokenTests.t.sol`](./test/WeirdTokenTests.t.sol), [`test/AuditFixes.t.sol`](./test/AuditFixes.t.sol) |
|
|
23
|
-
|
|
24
|
-
## Repo Map
|
|
25
|
-
|
|
26
|
-
| Area | Where to look |
|
|
27
|
-
|---|---|
|
|
28
|
-
| Main contracts | [`src/`](./src/) |
|
|
29
|
-
| Libraries, types, and enums | [`src/libraries/`](./src/libraries/), [`src/structs/`](./src/structs/), [`src/interfaces/`](./src/interfaces/), [`src/enums/`](./src/enums/) |
|
|
30
|
-
| Periphery | [`src/periphery/`](./src/periphery/) |
|
|
31
|
-
| Tests | [`test/`](./test/) |
|
|
32
|
-
|
|
33
|
-
## Purpose
|
|
34
|
-
|
|
35
|
-
This is the core Juicebox V6 protocol on EVM. It lets projects launch treasury-backed tokens with configurable rulesets for payments, payouts, cash outs, and token issuance.
|
|
36
|
-
|
|
37
|
-
## Reference Files
|
|
38
|
-
|
|
39
|
-
| If you need... | Open this next |
|
|
40
|
-
|---|---|
|
|
41
|
-
| Contract map and callable entrypoints | [`references/entrypoints.md`](./references/entrypoints.md) |
|
|
42
|
-
| Types, constants, gotchas, permissions, common errors, events, and hook return shapes | [`references/types-errors-events.md`](./references/types-errors-events.md) |
|
|
43
|
-
|
|
44
|
-
## Working Rules
|
|
45
|
-
|
|
46
|
-
- Open the source before relying on any summary here.
|
|
47
|
-
- For runtime bugs, start from the terminal, controller, or store contract that owns the state transition.
|
|
48
|
-
- `JBMultiTerminal` and `JBTerminalStore` should usually be read together.
|
|
49
|
-
- Payment and cash-out previews are part of the protocol surface. Keep them aligned with execution.
|
|
50
|
-
- Payout limits reset by ruleset cycle number. Surplus allowances are keyed by `ruleset.id`. They do not always reset together.
|
|
51
|
-
- Fee handling is subtle. Re-check held fees, fee-free surplus tracking, and feeless-address behavior before changing payout or cash-out logic.
|
|
52
|
-
- Fee-free surplus is a bounded anti-bypass mechanism, not a general exemption bucket.
|
|
53
|
-
- For config or metadata-shape issues, open `references/types-errors-events.md` before changing structs or packed metadata.
|
|
54
|
-
- If previews, accounting, or fee behavior change, verify the other two as well.
|
|
55
|
-
- If a bug looks cross-repo, prove it is not caused by a hook, router, or deployer before patching core.
|