@bananapus/core-v6 0.0.37 → 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.
Files changed (287) hide show
  1. package/foundry.lock +1 -7
  2. package/foundry.toml +1 -1
  3. package/package.json +19 -7
  4. package/src/JBController.sol +19 -1
  5. package/src/JBMultiTerminal.sol +68 -34
  6. package/src/JBTerminalStore.sol +6 -6
  7. package/src/interfaces/IJBController.sol +4 -1
  8. package/src/libraries/JBFees.sol +47 -9
  9. package/src/libraries/JBPayoutSplitGroupLib.sol +2 -2
  10. package/src/periphery/JBMatchingPriceFeed.sol +1 -1
  11. package/test/mock/MockMaliciousBeneficiary.sol +15 -15
  12. package/ADMINISTRATION.md +0 -103
  13. package/ARCHITECTURE.md +0 -133
  14. package/AUDIT_INSTRUCTIONS.md +0 -139
  15. package/RISKS.md +0 -215
  16. package/SKILLS.md +0 -55
  17. package/STYLE_GUIDE.md +0 -610
  18. package/USER_JOURNEYS.md +0 -215
  19. package/script/Deploy.s.sol +0 -124
  20. package/script/DeployPeriphery.s.sol +0 -354
  21. package/slither-ci.config.json +0 -10
  22. package/test/AuditFixes.t.sol +0 -808
  23. package/test/ComprehensiveInvariant.t.sol +0 -306
  24. package/test/CoreExploitTests.t.sol +0 -2741
  25. package/test/EconomicSimulation.t.sol +0 -348
  26. package/test/EntryPointPermutations.t.sol +0 -684
  27. package/test/FlashLoanAttacks.t.sol +0 -797
  28. package/test/PermissionEscalation.t.sol +0 -711
  29. package/test/PermissionsInvariant.t.sol +0 -403
  30. package/test/RulesetTransitions.t.sol +0 -713
  31. package/test/SplitLoopTests.t.sol +0 -752
  32. package/test/TestAccessToFunds.sol +0 -2683
  33. package/test/TestAuditResponseDesignProofs.sol +0 -434
  34. package/test/TestCashOut.sol +0 -198
  35. package/test/TestCashOutCountFor.sol +0 -271
  36. package/test/TestCashOutHooks.sol +0 -351
  37. package/test/TestCashOutTimingEdge.sol +0 -241
  38. package/test/TestDataHookFuzzing.sol +0 -524
  39. package/test/TestDurationUnderflow.sol +0 -233
  40. package/test/TestFeeFreeCashOutBypass.sol +0 -949
  41. package/test/TestFeeProcessingFailure.sol +0 -218
  42. package/test/TestFees.sol +0 -619
  43. package/test/TestForwardedTokenConsumption.sol +0 -425
  44. package/test/TestInterfaceSupport.sol +0 -81
  45. package/test/TestJBERC20Inheritance.sol +0 -103
  46. package/test/TestL2SequencerPriceFeed.sol +0 -292
  47. package/test/TestLaunchProject.sol +0 -188
  48. package/test/TestMetaTx.sol +0 -217
  49. package/test/TestMetadataOffsetOverflow.sol +0 -179
  50. package/test/TestMetadataParserLib.sol +0 -471
  51. package/test/TestMigrationHeldFees.sol +0 -255
  52. package/test/TestMintTokensOf.sol +0 -185
  53. package/test/TestMultiTerminalSurplus.sol +0 -348
  54. package/test/TestMultiTokenSurplus.sol +0 -202
  55. package/test/TestMultipleAccessLimits.sol +0 -664
  56. package/test/TestPayBurnRedeemFlow.sol +0 -195
  57. package/test/TestPayHooks.sol +0 -209
  58. package/test/TestPermissions.sol +0 -324
  59. package/test/TestPermissionsEdge.sol +0 -290
  60. package/test/TestPermit2DataHook.t.sol +0 -360
  61. package/test/TestPermit2Terminal.sol +0 -372
  62. package/test/TestRulesetQueueing.sol +0 -1025
  63. package/test/TestRulesetQueuingStress.sol +0 -806
  64. package/test/TestRulesetWeightCaching.sol +0 -178
  65. package/test/TestSplits.sol +0 -391
  66. package/test/TestTerminalMigration.sol +0 -274
  67. package/test/TestTerminalPreviewParity.sol +0 -208
  68. package/test/TestTokenFlow.sol +0 -191
  69. package/test/TestWeightCacheStaleAfterRejection.sol +0 -303
  70. package/test/WeirdTokenTests.t.sol +0 -817
  71. package/test/audit/CashOutReenterPay.t.sol +0 -501
  72. package/test/audit/CodexHeldFeeRounding.t.sol +0 -159
  73. package/test/audit/CodexMigrationFeeFailure.t.sol +0 -163
  74. package/test/audit/CrossTerminalSurplusSpoof.t.sol +0 -140
  75. package/test/audit/CycledSurplusAllowanceReset.t.sol +0 -184
  76. package/test/audit/FeeFreeSurplusLifecycle.t.sol +0 -399
  77. package/test/audit/FeeFreeSurplusStale.t.sol +0 -248
  78. package/test/audit/USDTVoidReturnCompat.t.sol +0 -525
  79. package/test/fork/TestChainlinkPriceFeedFork.sol +0 -254
  80. package/test/fork/TestSequencerPriceFeedFork.sol +0 -168
  81. package/test/fork/TestTerminalPreviewParityFork.sol +0 -108
  82. package/test/formal/BondingCurveProperties.t.sol +0 -420
  83. package/test/formal/FeeProperties.t.sol +0 -252
  84. package/test/invariants/Phase3DeepInvariant.t.sol +0 -412
  85. package/test/invariants/RulesetsInvariant.t.sol +0 -125
  86. package/test/invariants/TerminalStoreInvariant.t.sol +0 -227
  87. package/test/invariants/TokensInvariant.t.sol +0 -195
  88. package/test/invariants/handlers/ComprehensiveHandler.sol +0 -303
  89. package/test/invariants/handlers/EconomicHandler.sol +0 -377
  90. package/test/invariants/handlers/Phase3Handler.sol +0 -443
  91. package/test/invariants/handlers/RulesetsHandler.sol +0 -115
  92. package/test/invariants/handlers/TerminalStoreHandler.sol +0 -151
  93. package/test/invariants/handlers/TokensHandler.sol +0 -126
  94. package/test/regression/HoldFeesCashOutReserved.t.sol +0 -415
  95. package/test/regression/WeightCacheBoundary.t.sol +0 -291
  96. package/test/trees/JBController/burnTokensOf.tree +0 -9
  97. package/test/trees/JBController/claimTokensFor.tree +0 -5
  98. package/test/trees/JBController/deployERC20For.tree +0 -5
  99. package/test/trees/JBController/getRulesetOf.tree +0 -5
  100. package/test/trees/JBController/launchProjectFor.tree +0 -12
  101. package/test/trees/JBController/launchRulesetsFor.tree +0 -8
  102. package/test/trees/JBController/migrateController.tree +0 -12
  103. package/test/trees/JBController/mintTokensOf.tree +0 -12
  104. package/test/trees/JBController/payReservedTokenToTerminal.tree +0 -8
  105. package/test/trees/JBController/receiveMigrationFrom.tree +0 -4
  106. package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +0 -12
  107. package/test/trees/JBController/setMetadataOf.tree +0 -5
  108. package/test/trees/JBController/setSplitGroupsOf.tree +0 -5
  109. package/test/trees/JBController/setTokenFor.tree +0 -5
  110. package/test/trees/JBController/transferCreditsFrom.tree +0 -8
  111. package/test/trees/JBDirectory/primaryTerminalOf.tree +0 -8
  112. package/test/trees/JBDirectory/setControllerOf.tree +0 -11
  113. package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +0 -15
  114. package/test/trees/JBDirectory/setTerminalsOf.tree +0 -11
  115. package/test/trees/JBERC20/initialize.tree +0 -7
  116. package/test/trees/JBERC20/name.tree +0 -5
  117. package/test/trees/JBERC20/nonces.tree +0 -5
  118. package/test/trees/JBERC20/symbol.tree +0 -5
  119. package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +0 -5
  120. package/test/trees/JBFeelessAddresses/supportsInterface.tree +0 -5
  121. package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +0 -5
  122. package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +0 -8
  123. package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +0 -18
  124. package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +0 -5
  125. package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +0 -8
  126. package/test/trees/JBMetadataResolver/getDataFor.tree +0 -8
  127. package/test/trees/JBMultiTerminal/accountingContextsOf.tree +0 -5
  128. package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +0 -10
  129. package/test/trees/JBMultiTerminal/addToBalanceOf.tree +0 -23
  130. package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +0 -23
  131. package/test/trees/JBMultiTerminal/executePayout.tree +0 -32
  132. package/test/trees/JBMultiTerminal/executeProcessFee.tree +0 -14
  133. package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +0 -12
  134. package/test/trees/JBMultiTerminal/pay.tree +0 -23
  135. package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +0 -8
  136. package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +0 -34
  137. package/test/trees/JBMultiTerminal/useAllowanceOf.tree +0 -16
  138. package/test/trees/JBPermissions/hasPermission.tree +0 -8
  139. package/test/trees/JBPermissions/hasPermissions.tree +0 -8
  140. package/test/trees/JBPermissions/setPermissionsFor.tree +0 -5
  141. package/test/trees/JBPrices/addPriceFeedFor.tree +0 -14
  142. package/test/trees/JBPrices/pricePerUnitOf.tree +0 -11
  143. package/test/trees/JBProjects/createFor.tree +0 -11
  144. package/test/trees/JBProjects/setTokenUriResolver.tree +0 -5
  145. package/test/trees/JBProjects/supportsInterface.tree +0 -9
  146. package/test/trees/JBProjects/tokenURI.tree +0 -5
  147. package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +0 -8
  148. package/test/trees/JBRulesets/currentOf.tree +0 -12
  149. package/test/trees/JBRulesets/getRulesetOf.tree +0 -5
  150. package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +0 -10
  151. package/test/trees/JBRulesets/rulesetsOf.tree +0 -11
  152. package/test/trees/JBRulesets/upcomingRulesetOf.tree +0 -20
  153. package/test/trees/JBRulesets/updateRulesetWeightCache.tree +0 -5
  154. package/test/trees/JBSplits/setSplitGroupsOf.tree +0 -17
  155. package/test/trees/JBSplits/splitsOf.tree +0 -5
  156. package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +0 -16
  157. package/test/trees/JBTerminalStore/currentSurplusOf.tree +0 -25
  158. package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +0 -5
  159. package/test/trees/JBTerminalStore/recordCashOutsFor.tree +0 -16
  160. package/test/trees/JBTerminalStore/recordPaymentFrom.tree +0 -14
  161. package/test/trees/JBTerminalStore/recordPayoutFor.tree +0 -10
  162. package/test/trees/JBTerminalStore/recordTerminalMigration.tree +0 -5
  163. package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +0 -10
  164. package/test/trees/JBTokens/burnFrom.tree +0 -10
  165. package/test/trees/JBTokens/claimTokensFor.tree +0 -10
  166. package/test/trees/JBTokens/deployERC20For.tree +0 -12
  167. package/test/trees/JBTokens/mintFor.tree +0 -10
  168. package/test/trees/JBTokens/setTokenFor.tree +0 -11
  169. package/test/trees/JBTokens/totalBalanceOf.tree +0 -5
  170. package/test/trees/JBTokens/totalSupplyOf.tree +0 -5
  171. package/test/trees/JBTokens/transferCreditsFrom.tree +0 -8
  172. package/test/trees/mintTokensOf.tree +0 -12
  173. package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +0 -223
  174. package/test/units/static/JBController/JBControllerSetup.sol +0 -50
  175. package/test/units/static/JBController/TestBurnTokensOf.sol +0 -114
  176. package/test/units/static/JBController/TestClaimTokensFor.sol +0 -63
  177. package/test/units/static/JBController/TestDeployErc20For.sol +0 -86
  178. package/test/units/static/JBController/TestLaunchProjectFor.sol +0 -302
  179. package/test/units/static/JBController/TestLaunchRulesetsFor.sol +0 -342
  180. package/test/units/static/JBController/TestMigrateController.sol +0 -157
  181. package/test/units/static/JBController/TestMintTokensOfUnits.sol +0 -111
  182. package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +0 -324
  183. package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +0 -74
  184. package/test/units/static/JBController/TestPreviewMintOf.sol +0 -117
  185. package/test/units/static/JBController/TestReceiveMigrationFrom.sol +0 -99
  186. package/test/units/static/JBController/TestRulesetViews.sol +0 -225
  187. package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +0 -615
  188. package/test/units/static/JBController/TestSetSplitGroupsOf.sol +0 -68
  189. package/test/units/static/JBController/TestSetTokenFor.sol +0 -239
  190. package/test/units/static/JBController/TestSetUriOf.sol +0 -57
  191. package/test/units/static/JBController/TestTransferCreditsFrom.sol +0 -169
  192. package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +0 -211
  193. package/test/units/static/JBDirectory/JBDirectorySetup.sol +0 -26
  194. package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +0 -126
  195. package/test/units/static/JBDirectory/TestSetControllerOf.sol +0 -183
  196. package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +0 -104
  197. package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +0 -179
  198. package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +0 -137
  199. package/test/units/static/JBERC20/JBERC20Setup.sol +0 -34
  200. package/test/units/static/JBERC20/SigUtils.sol +0 -36
  201. package/test/units/static/JBERC20/TestInitialize.sol +0 -60
  202. package/test/units/static/JBERC20/TestName.sol +0 -30
  203. package/test/units/static/JBERC20/TestNonces.sol +0 -62
  204. package/test/units/static/JBERC20/TestSymbol.sol +0 -31
  205. package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +0 -22
  206. package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +0 -30
  207. package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +0 -35
  208. package/test/units/static/JBFees/TestFeesFuzz.sol +0 -79
  209. package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +0 -16
  210. package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +0 -71
  211. package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +0 -24
  212. package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +0 -163
  213. package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +0 -59
  214. package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +0 -101
  215. package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +0 -189
  216. package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +0 -64
  217. package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +0 -102
  218. package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +0 -90
  219. package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +0 -247
  220. package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +0 -229
  221. package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +0 -50
  222. package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +0 -72
  223. package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +0 -289
  224. package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +0 -474
  225. package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +0 -624
  226. package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +0 -578
  227. package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +0 -202
  228. package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +0 -222
  229. package/test/units/static/JBMultiTerminal/TestPay.sol +0 -604
  230. package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +0 -117
  231. package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +0 -114
  232. package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +0 -228
  233. package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +0 -55
  234. package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +0 -257
  235. package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +0 -611
  236. package/test/units/static/JBPermissions/JBPermissionsSetup.sol +0 -20
  237. package/test/units/static/JBPermissions/TestHasPermission.sol +0 -50
  238. package/test/units/static/JBPermissions/TestHasPermissions.sol +0 -93
  239. package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +0 -64
  240. package/test/units/static/JBPrices/JBPricesSetup.sol +0 -32
  241. package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +0 -107
  242. package/test/units/static/JBPrices/TestPricePerUnitOf.sol +0 -132
  243. package/test/units/static/JBPrices/TestPrices.sol +0 -265
  244. package/test/units/static/JBProjects/JBProjectsSetup.sol +0 -22
  245. package/test/units/static/JBProjects/TestCreateFor.sol +0 -71
  246. package/test/units/static/JBProjects/TestInitialProject.sol +0 -21
  247. package/test/units/static/JBProjects/TestInterfaces.sol +0 -26
  248. package/test/units/static/JBProjects/TestSetResolver.sol +0 -37
  249. package/test/units/static/JBProjects/TestTokenUri.sol +0 -40
  250. package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +0 -108
  251. package/test/units/static/JBRulesets/JBRulesetsSetup.sol +0 -24
  252. package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +0 -265
  253. package/test/units/static/JBRulesets/TestCurrentOf.sol +0 -242
  254. package/test/units/static/JBRulesets/TestGetRulesetOf.sol +0 -100
  255. package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +0 -260
  256. package/test/units/static/JBRulesets/TestRulesets.sol +0 -632
  257. package/test/units/static/JBRulesets/TestRulesetsOf.sol +0 -37
  258. package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +0 -522
  259. package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +0 -96
  260. package/test/units/static/JBSplits/JBSplitsSetup.sol +0 -26
  261. package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +0 -552
  262. package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +0 -377
  263. package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +0 -267
  264. package/test/units/static/JBSplits/TestSplitsOf.sol +0 -24
  265. package/test/units/static/JBSplits/TestSplitsPacking.sol +0 -36
  266. package/test/units/static/JBSurplus/TestSurplusFuzz.sol +0 -160
  267. package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +0 -45
  268. package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +0 -536
  269. package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +0 -463
  270. package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +0 -135
  271. package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +0 -476
  272. package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +0 -494
  273. package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +0 -652
  274. package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +0 -744
  275. package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +0 -289
  276. package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +0 -138
  277. package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +0 -415
  278. package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +0 -219
  279. package/test/units/static/JBTokens/JBTokensSetup.sol +0 -32
  280. package/test/units/static/JBTokens/TestBurnFrom.sol +0 -107
  281. package/test/units/static/JBTokens/TestClaimTokensFor.sol +0 -110
  282. package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +0 -92
  283. package/test/units/static/JBTokens/TestMintFor.sol +0 -100
  284. package/test/units/static/JBTokens/TestSetTokenFor.sol +0 -98
  285. package/test/units/static/JBTokens/TestTotalBalanceOf.sol +0 -65
  286. package/test/units/static/JBTokens/TestTotalSupplyOf.sol +0 -56
  287. 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`
@@ -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 20,000 elapsed cycles (`_WEIGHT_CUT_MULTIPLE_CACHE_LOOKUP_THRESHOLD`). Projects approaching this limit must call `updateRulesetWeightCache()` to pre-cache decayed weights.
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.