@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
@@ -1,223 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBTest} from "../../../helpers/JBTest.sol";
5
- import {JBChainlinkV3PriceFeed} from "../../../../src/JBChainlinkV3PriceFeed.sol";
6
- import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
7
- import {JBFixedPointNumber} from "../../../../src/libraries/JBFixedPointNumber.sol";
8
-
9
- /// @notice Mock Chainlink AggregatorV3Interface for testing.
10
- contract MockAggregator {
11
- int256 public price;
12
- uint8 public decimals_;
13
- uint256 public updatedAt_;
14
- uint80 public roundId_;
15
-
16
- function setPrice(int256 _price) external {
17
- price = _price;
18
- }
19
-
20
- function setDecimals(uint8 _decimals) external {
21
- decimals_ = _decimals;
22
- }
23
-
24
- function setUpdatedAt(uint256 _updatedAt) external {
25
- updatedAt_ = _updatedAt;
26
- }
27
-
28
- function setRoundId(uint80 _roundId) external {
29
- roundId_ = _roundId;
30
- }
31
-
32
- function decimals() external view returns (uint8) {
33
- return decimals_;
34
- }
35
-
36
- function latestRoundData()
37
- external
38
- view
39
- returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
40
- {
41
- return (roundId_, price, block.timestamp, updatedAt_, roundId_);
42
- }
43
- }
44
-
45
- /// @notice Tests for JBChainlinkV3PriceFeed.
46
- contract TestPriceFeed_Local is JBTest {
47
- using JBFixedPointNumber for uint256;
48
-
49
- MockAggregator mockFeed;
50
- JBChainlinkV3PriceFeed priceFeed;
51
-
52
- uint256 constant THRESHOLD = 1 hours;
53
-
54
- function setUp() external {
55
- // Foundry defaults block.timestamp to 1, which causes underflow in stale-price tests.
56
- vm.warp(THRESHOLD + 1 days);
57
-
58
- mockFeed = new MockAggregator();
59
- mockFeed.setDecimals(8);
60
- mockFeed.setPrice(200_000_000_000); // $2000 with 8 decimals
61
- mockFeed.setUpdatedAt(block.timestamp);
62
- mockFeed.setRoundId(1);
63
-
64
- priceFeed = new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(mockFeed)), THRESHOLD);
65
- }
66
-
67
- //*********************************************************************//
68
- // --- Normal Operation --------------------------------------------- //
69
- //*********************************************************************//
70
-
71
- /// @notice Price is returned correctly with same decimals as feed.
72
- function test_normalPrice_sameDecimals() external view {
73
- uint256 price = priceFeed.currentUnitPrice(8);
74
- assertEq(price, 200_000_000_000, "price should be 2000e8");
75
- }
76
-
77
- /// @notice Price is adjusted when requesting more decimals than the feed.
78
- function test_normalPrice_scaleUp() external view {
79
- uint256 price = priceFeed.currentUnitPrice(18);
80
- assertEq(price, 2_000_000_000_000_000_000_000, "price should be 2000e18");
81
- }
82
-
83
- /// @notice Price is adjusted when requesting fewer decimals than the feed.
84
- function test_normalPrice_scaleDown() external view {
85
- uint256 price = priceFeed.currentUnitPrice(6);
86
- assertEq(price, 2_000_000_000, "price should be 2000e6");
87
- }
88
-
89
- /// @notice Price of 1 (minimum positive) is returned.
90
- function test_normalPrice_minimumPositive() external {
91
- mockFeed.setPrice(1);
92
- uint256 price = priceFeed.currentUnitPrice(8);
93
- assertEq(price, 1, "minimum positive price should be 1");
94
- }
95
-
96
- //*********************************************************************//
97
- // --- Stale Price -------------------------------------------------- //
98
- //*********************************************************************//
99
-
100
- /// @notice Reverts when price is older than threshold.
101
- function test_stalePrice_reverts() external {
102
- // Set updatedAt to a time older than threshold
103
- mockFeed.setUpdatedAt(block.timestamp - THRESHOLD - 1);
104
-
105
- vm.expectRevert(
106
- abi.encodeWithSelector(
107
- JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_StalePrice.selector,
108
- block.timestamp,
109
- THRESHOLD,
110
- block.timestamp - THRESHOLD - 1
111
- )
112
- );
113
- priceFeed.currentUnitPrice(18);
114
- }
115
-
116
- /// @notice Does not revert when price is exactly at the threshold boundary.
117
- function test_stalePrice_atBoundary_succeeds() external {
118
- // Set updatedAt exactly at the threshold
119
- mockFeed.setUpdatedAt(block.timestamp - THRESHOLD);
120
- uint256 price = priceFeed.currentUnitPrice(8);
121
- assertEq(price, 200_000_000_000, "price at boundary should succeed");
122
- }
123
-
124
- //*********************************************************************//
125
- // --- Incomplete Round --------------------------------------------- //
126
- //*********************************************************************//
127
-
128
- /// @notice Reverts when updatedAt is 0 (incomplete round).
129
- /// @dev Note: the stale check fires first when block.timestamp > THRESHOLD.
130
- /// To test the IncompleteRound path, we use a priceFeed with THRESHOLD > block.timestamp.
131
- function test_incompleteRound_reverts() external {
132
- // Create a price feed with a huge threshold so stale check passes
133
- JBChainlinkV3PriceFeed largeThrPriceFeed =
134
- new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(mockFeed)), type(uint256).max);
135
- mockFeed.setUpdatedAt(0);
136
-
137
- vm.expectRevert(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_IncompleteRound.selector);
138
- largeThrPriceFeed.currentUnitPrice(18);
139
- }
140
-
141
- //*********************************************************************//
142
- // --- Negative / Zero Price ---------------------------------------- //
143
- //*********************************************************************//
144
-
145
- /// @notice Reverts when price is 0.
146
- function test_zeroPrice_reverts() external {
147
- mockFeed.setPrice(0);
148
-
149
- vm.expectRevert(
150
- abi.encodeWithSelector(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_NegativePrice.selector, int256(0))
151
- );
152
- priceFeed.currentUnitPrice(18);
153
- }
154
-
155
- /// @notice Reverts when price is negative.
156
- function test_negativePrice_reverts() external {
157
- mockFeed.setPrice(-100);
158
-
159
- vm.expectRevert(
160
- abi.encodeWithSelector(JBChainlinkV3PriceFeed.JBChainlinkV3PriceFeed_NegativePrice.selector, int256(-100))
161
- );
162
- priceFeed.currentUnitPrice(18);
163
- }
164
-
165
- //*********************************************************************//
166
- // --- Fuzz Tests --------------------------------------------------- //
167
- //*********************************************************************//
168
-
169
- /// @notice Decimal adjustment is consistent with JBFixedPointNumber.
170
- function testFuzz_decimalsAdjustment(uint128 rawPrice, uint8 feedDecimals, uint8 requestedDecimals) external {
171
- rawPrice = uint128(bound(uint256(rawPrice), 1, type(uint128).max));
172
- feedDecimals = uint8(bound(uint256(feedDecimals), 0, 18));
173
- requestedDecimals = uint8(bound(uint256(requestedDecimals), 0, 36));
174
-
175
- MockAggregator fuzzFeed = new MockAggregator();
176
- fuzzFeed.setDecimals(feedDecimals);
177
- fuzzFeed.setPrice(int256(uint256(rawPrice)));
178
- fuzzFeed.setUpdatedAt(block.timestamp);
179
- fuzzFeed.setRoundId(1);
180
-
181
- JBChainlinkV3PriceFeed fuzzPriceFeed =
182
- new JBChainlinkV3PriceFeed(AggregatorV3Interface(address(fuzzFeed)), THRESHOLD);
183
-
184
- uint256 price = fuzzPriceFeed.currentUnitPrice(requestedDecimals);
185
- uint256 expected = uint256(rawPrice).adjustDecimals({decimals: feedDecimals, targetDecimals: requestedDecimals});
186
- assertEq(price, expected, "price should match JBFixedPointNumber.adjustDecimals");
187
- }
188
-
189
- /// @notice Fresh prices never revert (for valid price ranges).
190
- function testFuzz_freshPrice_doesNotRevert(uint128 rawPrice) external {
191
- rawPrice = uint128(bound(uint256(rawPrice), 1, type(uint128).max));
192
-
193
- mockFeed.setPrice(int256(uint256(rawPrice)));
194
- mockFeed.setUpdatedAt(block.timestamp);
195
-
196
- // Should not revert
197
- priceFeed.currentUnitPrice(18);
198
- }
199
-
200
- /// @notice Stale prices always revert.
201
- function testFuzz_stalePrice_alwaysReverts(uint256 delay) external {
202
- delay = bound(delay, THRESHOLD + 1, block.timestamp);
203
-
204
- mockFeed.setUpdatedAt(block.timestamp - delay);
205
-
206
- vm.expectRevert();
207
- priceFeed.currentUnitPrice(18);
208
- }
209
-
210
- //*********************************************************************//
211
- // --- Immutable Properties ----------------------------------------- //
212
- //*********************************************************************//
213
-
214
- /// @notice FEED is set correctly.
215
- function test_feedIsSet() external view {
216
- assertEq(address(priceFeed.FEED()), address(mockFeed), "FEED should match mock");
217
- }
218
-
219
- /// @notice THRESHOLD is set correctly.
220
- function test_thresholdIsSet() external view {
221
- assertEq(priceFeed.THRESHOLD(), THRESHOLD, "THRESHOLD should match");
222
- }
223
- }
@@ -1,50 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBController} from "../../../../src/JBController.sol";
5
- import {IJBController} from "../../../../src/interfaces/IJBController.sol";
6
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
7
- import {IJBFundAccessLimits} from "../../../../src/interfaces/IJBFundAccessLimits.sol";
8
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
9
- import {IJBPrices} from "../../../../src/interfaces/IJBPrices.sol";
10
- import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
11
- import {IJBRulesets} from "../../../../src/interfaces/IJBRulesets.sol";
12
- import {IJBSplits} from "../../../../src/interfaces/IJBSplits.sol";
13
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
14
- import {JBTest} from "../../../helpers/JBTest.sol";
15
-
16
- /*
17
- Contract that deploys a target contract with other mock contracts to satisfy the constructor.
18
- Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
19
- */
20
- contract JBControllerSetup is JBTest {
21
- // Target Contract
22
- IJBController public _controller;
23
-
24
- // Mocks
25
- IJBPermissions public permissions = IJBPermissions(makeAddr("permissions"));
26
- IJBProjects public projects = IJBProjects(makeAddr("projects"));
27
- IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
28
- IJBRulesets public rulesets = IJBRulesets(makeAddr("rulesets"));
29
- IJBTokens public tokens = IJBTokens(makeAddr("tokens"));
30
- IJBPrices public prices = IJBPrices(makeAddr("prices"));
31
- IJBSplits public splits = IJBSplits(makeAddr("splits"));
32
- IJBFundAccessLimits public fundAccessLimits = IJBFundAccessLimits(makeAddr("limits"));
33
- address public trustedForwarder = makeAddr("forwarder");
34
-
35
- function controllerSetup() public virtual {
36
- // Instantiate the contract being tested
37
- _controller = new JBController(
38
- directory,
39
- fundAccessLimits,
40
- permissions,
41
- prices,
42
- projects,
43
- rulesets,
44
- splits,
45
- tokens,
46
- address(0),
47
- trustedForwarder
48
- );
49
- }
50
- }
@@ -1,114 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBController} from "../../../../src/JBController.sol";
5
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
6
- import {IJBController} from "../../../../src/interfaces/IJBController.sol";
7
- import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
8
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
9
- import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
10
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
11
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
12
- import {JBControllerSetup} from "./JBControllerSetup.sol";
13
-
14
- contract TestBurnTokensOf_Local is JBControllerSetup {
15
- uint256 _projectId = 1;
16
- uint256 _rootProjectId = 0;
17
- uint256 _validCount = 1;
18
- uint256 _invalidCount = 0;
19
- string _memo = "JUICAY";
20
- address _holder = makeAddr("hodl");
21
-
22
- function setUp() public {
23
- super.controllerSetup();
24
- }
25
-
26
- function test_WhenCallerIsNotPermissionedOrTerminal() external {
27
- // it should revert UNAUTHORIZED()
28
-
29
- // it will call directory to check if caller is terminal first
30
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
31
- bytes memory _directoryReturned = abi.encode(false);
32
- mockExpect(address(directory), _directoryCall, _directoryReturned);
33
-
34
- // it will call permissions after to first check permissions over the specific project
35
- bytes memory _permCall = abi.encodeCall(
36
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
37
- );
38
- bytes memory _permReturn = abi.encode(false);
39
- mockExpect(address(permissions), _permCall, _permReturn);
40
-
41
- vm.expectRevert(
42
- abi.encodeWithSelector(
43
- JBPermissioned.JBPermissioned_Unauthorized.selector,
44
- _holder,
45
- address(this),
46
- _projectId,
47
- JBPermissionIds.BURN_TOKENS
48
- )
49
- );
50
- _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
51
- }
52
-
53
- function test_WhenCallerIsTerminalAndTokenCountGtZero() external {
54
- // it should burn and emit BurnTokens
55
-
56
- // it will call directory to check if caller is terminal first
57
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
58
- bytes memory _directoryReturned = abi.encode(true);
59
- mockExpect(address(directory), _directoryCall, _directoryReturned);
60
-
61
- // since we spoofed a terminal it will call JBTokens to burn
62
- bytes memory _burnFromCall = abi.encodeCall(IJBTokens.burnFrom, (_holder, _projectId, _validCount));
63
- bytes memory _burnFromReturn = "";
64
- mockExpect(address(tokens), _burnFromCall, _burnFromReturn);
65
-
66
- vm.expectEmit();
67
- emit IJBController.BurnTokens(_holder, _projectId, _validCount, _memo, address(this));
68
- _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
69
- }
70
-
71
- function test_WhenCallerHasRootPermissionAndTokenCountGtZero() external {
72
- // it should burn and emit BurnTokens
73
-
74
- // it will call directory to check if caller is terminal first
75
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
76
- bytes memory _directoryReturned = abi.encode(false);
77
- mockExpect(address(directory), _directoryCall, _directoryReturned);
78
-
79
- // it will call permissions after to first check permissions over the specific project
80
- bytes memory _permCall = abi.encodeCall(
81
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
82
- );
83
- bytes memory _permReturn = abi.encode(true);
84
- mockExpect(address(permissions), _permCall, _permReturn);
85
-
86
- // it will call JBTokens to burn
87
- bytes memory _burnFromCall = abi.encodeCall(IJBTokens.burnFrom, (_holder, _projectId, _validCount));
88
- bytes memory _burnFromReturn = "";
89
- mockExpect(address(tokens), _burnFromCall, _burnFromReturn);
90
-
91
- vm.expectEmit();
92
- emit IJBController.BurnTokens(_holder, _projectId, _validCount, _memo, address(this));
93
- _controller.burnTokensOf(_holder, _projectId, _validCount, _memo);
94
- }
95
-
96
- function test_WhenTokenCountEqZero() external {
97
- // it should revert NO_BURNABLE_TOKENS
98
-
99
- // it will call directory to check if caller is terminal first
100
- bytes memory _directoryCall = abi.encodeCall(IJBDirectory.isTerminalOf, (1, IJBTerminal(address(this))));
101
- bytes memory _directoryReturned = abi.encode(false);
102
- mockExpect(address(directory), _directoryCall, _directoryReturned);
103
-
104
- // it will call permissions after to first check permissions over the specific project
105
- bytes memory _permCall = abi.encodeCall(
106
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.BURN_TOKENS, true, true)
107
- );
108
- bytes memory _permReturn = abi.encode(true);
109
- mockExpect(address(permissions), _permCall, _permReturn);
110
-
111
- vm.expectRevert(JBController.JBController_ZeroTokensToBurn.selector);
112
- _controller.burnTokensOf(_holder, _projectId, _invalidCount, _memo);
113
- }
114
- }
@@ -1,63 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
5
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
6
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
7
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
8
- import {JBControllerSetup} from "./JBControllerSetup.sol";
9
-
10
- contract TestClaimTokensFor_Local is JBControllerSetup {
11
- address _holder = makeAddr("hodler");
12
- uint256 _projectId = 1;
13
- uint256 _rootId = 0;
14
- uint256 _amount = 1e18;
15
- address _beneficiary = makeAddr("bene");
16
-
17
- function setUp() public {
18
- super.controllerSetup();
19
- }
20
-
21
- function test_WhenCallerIsPermissioned() external {
22
- // it should call JBTokens to claim on behalf of holder
23
-
24
- // it will call permissions
25
- bytes memory _permCall = abi.encodeCall(
26
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.CLAIM_TOKENS, true, true)
27
- );
28
- bytes memory _permReturn = abi.encode(true);
29
- mockExpect(address(permissions), _permCall, _permReturn);
30
-
31
- // it will call JBTokens to claim when permissioned
32
- bytes memory _tokensCall =
33
- abi.encodeCall(IJBTokens.claimTokensFor, (_holder, _projectId, _amount, _beneficiary));
34
- bytes memory _tokensReturn = "";
35
- mockExpect(address(tokens), _tokensCall, _tokensReturn);
36
-
37
- // will succeed
38
- _controller.claimTokensFor(_holder, _projectId, _amount, _beneficiary);
39
- }
40
-
41
- function test_WhenCallerIsNotPermissioned() external {
42
- // it should revert UNAUTHORIZED
43
-
44
- // it will call permissions
45
- bytes memory _permCall = abi.encodeCall(
46
- IJBPermissions.hasPermission, (address(this), _holder, _projectId, JBPermissionIds.CLAIM_TOKENS, true, true)
47
- );
48
- bytes memory _permReturn = abi.encode(false);
49
- mockExpect(address(permissions), _permCall, _permReturn);
50
-
51
- // will revert
52
- vm.expectRevert(
53
- abi.encodeWithSelector(
54
- JBPermissioned.JBPermissioned_Unauthorized.selector,
55
- _holder,
56
- address(this),
57
- _projectId,
58
- JBPermissionIds.CLAIM_TOKENS
59
- )
60
- );
61
- _controller.claimTokensFor(_holder, _projectId, _amount, _beneficiary);
62
- }
63
- }
@@ -1,86 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity 0.8.28;
3
-
4
- import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
5
- import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
6
- import {IJBToken} from "../../../../src/interfaces/IJBToken.sol";
7
- import {IJBTokens} from "../../../../src/interfaces/IJBTokens.sol";
8
- import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
9
- import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
10
- import {JBControllerSetup} from "./JBControllerSetup.sol";
11
-
12
- contract TestDeployERC20For_Local is JBControllerSetup {
13
- uint256 _projectId = 1;
14
- IJBToken _token = IJBToken(makeAddr("token"));
15
- string _name = "Juice";
16
- string _symbol = "JCY";
17
- bytes32 _salt = bytes32(0);
18
-
19
- function setUp() public {
20
- super.controllerSetup();
21
- }
22
-
23
- function test_WhenCallerIsPermissioned() external {
24
- // it will deploy ERC20 and return IJBToken
25
-
26
- // mock call to JBProjects ownerOf which will give permission
27
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
28
- bytes memory _projectsCallReturn = abi.encode(address(this));
29
- mockExpect(address(projects), _projectsCall, _projectsCallReturn);
30
-
31
- // mock the call to JBTokens deployERC20For
32
- bytes memory _deployCall = abi.encodeCall(IJBTokens.deployERC20For, (_projectId, _name, _symbol, _salt));
33
- bytes memory _deployCallReturn = abi.encode(_token);
34
- mockExpect(address(tokens), _deployCall, _deployCallReturn);
35
-
36
- _controller.deployERC20For(_projectId, _name, _symbol, _salt);
37
- }
38
-
39
- function test_WhenCallerIsPermissionedAndSaltIsNonZero() external {
40
- // it will deploy ERC20 and return IJBToken
41
-
42
- // forge-lint: disable-next-line(unsafe-typecast)
43
- bytes32 _nonZeroSalt = bytes32("somesalt");
44
- bytes32 _encodedSalt = keccak256(abi.encodePacked(address(this), _nonZeroSalt));
45
-
46
- // mock call to JBProjects ownerOf which will give permission
47
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
48
- bytes memory _projectsCallReturn = abi.encode(address(this));
49
- mockExpect(address(projects), _projectsCall, _projectsCallReturn);
50
-
51
- // mock the call to JBTokens deployERC20For
52
- bytes memory _deployCall = abi.encodeCall(IJBTokens.deployERC20For, (_projectId, _name, _symbol, _encodedSalt));
53
- bytes memory _deployCallReturn = abi.encode(_token);
54
- mockExpect(address(tokens), _deployCall, _deployCallReturn);
55
-
56
- _controller.deployERC20For(_projectId, _name, _symbol, _nonZeroSalt);
57
- }
58
-
59
- function test_WhenCallerIsNotPermissioned() external {
60
- // it will revert UNAUTHORIZED
61
-
62
- // mock call to JBProjects ownerOf which will give permission
63
- bytes memory _projectsCall = abi.encodeCall(IERC721.ownerOf, (_projectId));
64
- address _projectsCallReturn = address(0);
65
- mockExpect(address(projects), _projectsCall, abi.encode(_projectsCallReturn));
66
-
67
- // mock call for projects permission
68
- bytes memory _permissionCall1 = abi.encodeCall(
69
- IJBPermissions.hasPermission,
70
- (address(this), address(0), _projectId, JBPermissionIds.DEPLOY_ERC20, true, true)
71
- );
72
- bytes memory _permissionCallReturn1 = abi.encode(false);
73
- mockExpect(address(permissions), _permissionCall1, _permissionCallReturn1);
74
-
75
- vm.expectRevert(
76
- abi.encodeWithSelector(
77
- JBPermissioned.JBPermissioned_Unauthorized.selector,
78
- _projectsCallReturn,
79
- address(this),
80
- _projectId,
81
- JBPermissionIds.DEPLOY_ERC20
82
- )
83
- );
84
- _controller.deployERC20For(_projectId, _name, _symbol, _salt);
85
- }
86
- }