@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,1025 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.6;
3
-
4
- import {TestBaseWorkflow} from "./helpers/TestBaseWorkflow.sol";
5
- import {JBController} from "../src/JBController.sol";
6
- import {JBDeadline} from "../src/JBDeadline.sol";
7
- import {JBRulesets} from "../src/JBRulesets.sol";
8
- import {JBApprovalStatus} from "../src/enums/JBApprovalStatus.sol";
9
- import {IJBController} from "../src/interfaces/IJBController.sol";
10
- import {IJBRulesetApprovalHook} from "../src/interfaces/IJBRulesetApprovalHook.sol";
11
- import {IJBTerminal} from "../src/interfaces/IJBTerminal.sol";
12
- import {JBConstants} from "../src/libraries/JBConstants.sol";
13
- import {JBAccountingContext} from "../src/structs/JBAccountingContext.sol";
14
- import {JBFundAccessLimitGroup} from "../src/structs/JBFundAccessLimitGroup.sol";
15
- import {JBRuleset} from "../src/structs/JBRuleset.sol";
16
- import {JBRulesetConfig} from "../src/structs/JBRulesetConfig.sol";
17
- import {JBRulesetMetadata} from "../src/structs/JBRulesetMetadata.sol";
18
- import {JBSplitGroup} from "../src/structs/JBSplitGroup.sol";
19
- import {JBTerminalConfig} from "../src/structs/JBTerminalConfig.sol";
20
-
21
- // A project's rulesets can be queued, and re-queued as long as the current ruleset approval hook approves.
22
- contract TestRulesetQueuing_Local is TestBaseWorkflow {
23
- IJBController private _controller;
24
- JBRulesetMetadata private _metadata;
25
- JBDeadline private _deadline;
26
- JBSplitGroup[] private _splitGroup;
27
- JBFundAccessLimitGroup[] private _fundAccessLimitGroup;
28
- IJBTerminal private _terminal;
29
- uint112 private _weight;
30
-
31
- // forge-lint: disable-next-line(mixed-case-variable)
32
- uint256 private _DEADLINE_DURATION = 3 days;
33
- // forge-lint: disable-next-line(mixed-case-variable)
34
- uint256 private _RULESET_DURATION_DAYS = 6;
35
- // forge-lint: disable-next-line(unsafe-typecast, mixed-case-variable)
36
- uint32 private _RULESET_DURATION = uint32(_RULESET_DURATION_DAYS * 1 days);
37
-
38
- function setUp() public override {
39
- super.setUp();
40
-
41
- // Foundry defaults block.timestamp to 1, which causes underflow in tests using past timestamps.
42
- vm.warp(1_000_001);
43
-
44
- _terminal = jbMultiTerminal();
45
- _controller = jbController();
46
-
47
- _deadline = new JBDeadline(_DEADLINE_DURATION);
48
- _weight = 1000 * 10 ** 18;
49
-
50
- _metadata = JBRulesetMetadata({
51
- reservedPercent: 0,
52
- cashOutTaxRate: 0,
53
- baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
54
- pausePay: false,
55
- pauseCreditTransfers: false,
56
- allowOwnerMinting: false,
57
- allowSetCustomToken: false,
58
- allowTerminalMigration: false,
59
- allowSetTerminals: false,
60
- ownerMustSendPayouts: false,
61
- allowSetController: false,
62
- allowAddAccountingContext: true,
63
- allowAddPriceFeed: false,
64
- holdFees: false,
65
- useTotalSurplusForCashOuts: false,
66
- useDataHookForPay: false,
67
- useDataHookForCashOut: false,
68
- dataHook: address(0),
69
- metadata: 0
70
- });
71
- }
72
-
73
- function launchProjectForTest() public returns (uint256) {
74
- // Package up ruleset configuration.
75
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
76
- _rulesetConfig[0].mustStartAtOrAfter = 0;
77
- _rulesetConfig[0].duration = _RULESET_DURATION;
78
- _rulesetConfig[0].weight = _weight;
79
- _rulesetConfig[0].weightCutPercent = 0;
80
- _rulesetConfig[0].approvalHook = _deadline;
81
- _rulesetConfig[0].metadata = _metadata;
82
- _rulesetConfig[0].splitGroups = new JBSplitGroup[](0);
83
- _rulesetConfig[0].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
84
-
85
- // Package up terminal configuration.
86
- JBTerminalConfig[] memory _terminalConfigurations = new JBTerminalConfig[](1);
87
- JBAccountingContext[] memory _tokensToAccept = new JBAccountingContext[](1);
88
- _tokensToAccept[0] = JBAccountingContext({
89
- token: JBConstants.NATIVE_TOKEN, decimals: 18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))
90
- });
91
- _terminalConfigurations[0] =
92
- JBTerminalConfig({terminal: _terminal, accountingContextsToAccept: _tokensToAccept});
93
-
94
- uint256 projectId = _controller.launchProjectFor({
95
- owner: address(multisig()),
96
- projectUri: "myIPFSHash",
97
- rulesetConfigurations: _rulesetConfig,
98
- terminalConfigurations: _terminalConfigurations,
99
- memo: ""
100
- });
101
-
102
- return projectId;
103
- }
104
-
105
- function launchProjectForTestWithThreeRulesets() public returns (uint256) {
106
- // Package up ruleset configuration.
107
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](3);
108
-
109
- // first ruleset
110
- _rulesetConfig[0].mustStartAtOrAfter = 0;
111
- _rulesetConfig[0].duration = 1 days;
112
- _rulesetConfig[0].weight = _weight;
113
- _rulesetConfig[0].weightCutPercent = 0;
114
- _rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
115
- _rulesetConfig[0].metadata = _metadata;
116
- _rulesetConfig[0].splitGroups = new JBSplitGroup[](0);
117
- _rulesetConfig[0].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
118
-
119
- // second
120
- _rulesetConfig[1].mustStartAtOrAfter = uint48(block.timestamp + 1 days);
121
- _rulesetConfig[1].duration = 1 days;
122
- _rulesetConfig[1].weight = _weight + 100;
123
- _rulesetConfig[1].weightCutPercent = 0;
124
- _rulesetConfig[1].approvalHook = IJBRulesetApprovalHook(address(0));
125
- _rulesetConfig[1].metadata = _metadata;
126
- _rulesetConfig[1].splitGroups = new JBSplitGroup[](0);
127
- _rulesetConfig[1].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
128
-
129
- // third
130
- _rulesetConfig[2].mustStartAtOrAfter = uint48(block.timestamp + 2 days);
131
- _rulesetConfig[2].duration = 1 days;
132
- _rulesetConfig[2].weight = _weight + 200;
133
- _rulesetConfig[2].weightCutPercent = 0;
134
- _rulesetConfig[2].approvalHook = IJBRulesetApprovalHook(address(0));
135
- _rulesetConfig[2].metadata = _metadata;
136
- _rulesetConfig[2].splitGroups = new JBSplitGroup[](0);
137
- _rulesetConfig[2].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
138
-
139
- // Package up terminal configuration.
140
- JBTerminalConfig[] memory _terminalConfigurations = new JBTerminalConfig[](1);
141
- JBAccountingContext[] memory _tokensToAccept = new JBAccountingContext[](1);
142
- _tokensToAccept[0] = JBAccountingContext({
143
- token: JBConstants.NATIVE_TOKEN, decimals: 18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))
144
- });
145
- _terminalConfigurations[0] =
146
- JBTerminalConfig({terminal: _terminal, accountingContextsToAccept: _tokensToAccept});
147
-
148
- uint256 projectId = _controller.launchProjectFor({
149
- owner: address(multisig()),
150
- projectUri: "myIPFSHash",
151
- rulesetConfigurations: _rulesetConfig,
152
- terminalConfigurations: _terminalConfigurations,
153
- memo: ""
154
- });
155
-
156
- return projectId;
157
- }
158
-
159
- function testEmptyConfig() public {
160
- // it will revert with JBController_RulesetsArrayEmpty
161
-
162
- // length of zero should revert
163
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](0);
164
-
165
- // Deploy a project.
166
- uint256 projectId = launchProjectForTest();
167
-
168
- vm.expectRevert(JBController.JBController_RulesetsArrayEmpty.selector);
169
-
170
- // call
171
- vm.prank(multisig());
172
- _controller.queueRulesetsOf(projectId, _rulesetConfig, "");
173
- }
174
-
175
- function testReconfigureProject() public {
176
- // Package a ruleset configuration.
177
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
178
- _rulesetConfig[0].mustStartAtOrAfter = 0;
179
- _rulesetConfig[0].duration = _RULESET_DURATION;
180
- _rulesetConfig[0].weight = _weight;
181
- _rulesetConfig[0].weightCutPercent = 0;
182
- _rulesetConfig[0].approvalHook = _deadline;
183
- _rulesetConfig[0].metadata = _metadata;
184
- _rulesetConfig[0].splitGroups = _splitGroup;
185
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
186
-
187
- // Deploy a project.
188
- uint256 projectId = launchProjectForTest();
189
-
190
- // Keep a reference to the current ruleset.
191
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
192
-
193
- // Make sure the ruleset has a cycle number of 1.
194
- assertEq(_ruleset.cycleNumber, 1);
195
- // Make sure the ruleset's weight matches.
196
- assertEq(_ruleset.weight, _weight);
197
-
198
- // Keep a reference to the ruleset's ID.
199
- uint256 _currentRulesetId = _ruleset.id;
200
-
201
- // Increment the weight to create a difference.
202
- _rulesetConfig[0].weight = _rulesetConfig[0].weight + 1;
203
-
204
- // Add a ruleset.
205
- vm.prank(multisig());
206
- _controller.queueRulesetsOf(projectId, _rulesetConfig, "");
207
-
208
- // Make sure the current ruleset hasn't changed.
209
- _ruleset = jbRulesets().currentOf(projectId);
210
- assertEq(_ruleset.cycleNumber, 1);
211
- assertEq(_ruleset.id, _currentRulesetId);
212
- assertEq(_ruleset.weight, _weight);
213
-
214
- // Go to the start of the next ruleset.
215
- vm.warp(_ruleset.start + _ruleset.duration);
216
-
217
- // Get the current ruleset.
218
- JBRuleset memory _newRuleset = jbRulesets().currentOf(projectId);
219
- // It should be the second cycle.
220
- assertEq(_newRuleset.cycleNumber, 2);
221
- assertEq(_newRuleset.weight, _weight + 1);
222
- assertEq(_newRuleset.basedOnId, _currentRulesetId);
223
- }
224
-
225
- function testReconfigureProjectWithWeightOfZero() public {
226
- // Package a ruleset configuration.
227
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
228
- _rulesetConfig[0].mustStartAtOrAfter = 0;
229
- _rulesetConfig[0].duration = _RULESET_DURATION;
230
- _rulesetConfig[0].weightCutPercent = 0;
231
- _rulesetConfig[0].approvalHook = _deadline;
232
- _rulesetConfig[0].metadata = _metadata;
233
- _rulesetConfig[0].splitGroups = _splitGroup;
234
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
235
-
236
- // Deploy a project.
237
- uint256 projectId = launchProjectForTest();
238
-
239
- // Keep a reference to the current ruleset.
240
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
241
-
242
- // Make sure the ruleset has a cycle number of 1.
243
- assertEq(_ruleset.cycleNumber, 1);
244
- // Make sure the ruleset's weight matches.
245
- assertEq(_ruleset.weight, _weight);
246
-
247
- // Keep a reference to the ruleset's ID.
248
- uint256 _currentRulesetId = _ruleset.id;
249
-
250
- // Increment the weight to create a difference.
251
- _rulesetConfig[0].weight = 0;
252
-
253
- // Add a ruleset.
254
- vm.prank(multisig());
255
- _controller.queueRulesetsOf(projectId, _rulesetConfig, "");
256
-
257
- // Make sure the current ruleset hasn't changed.
258
- _ruleset = jbRulesets().currentOf(projectId);
259
- assertEq(_ruleset.cycleNumber, 1);
260
- assertEq(_ruleset.id, _currentRulesetId);
261
- assertEq(_ruleset.weight, _weight);
262
-
263
- // Go to the start of the next ruleset.
264
- vm.warp(_ruleset.start + _ruleset.duration);
265
-
266
- // Get the current ruleset.
267
- JBRuleset memory _newRuleset = jbRulesets().currentOf(projectId);
268
-
269
- // It should be the second cycle.
270
- assertEq(_newRuleset.cycleNumber, 2);
271
- assertEq(_newRuleset.weight, 0);
272
- assertEq(_newRuleset.basedOnId, _currentRulesetId);
273
- }
274
-
275
- function testReconfigureProjectWithWeightOfOne() public {
276
- // Package a ruleset configuration.
277
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
278
- _rulesetConfig[0].mustStartAtOrAfter = 0;
279
- _rulesetConfig[0].duration = _RULESET_DURATION;
280
- _rulesetConfig[0].weightCutPercent = 0;
281
- _rulesetConfig[0].approvalHook = _deadline;
282
- _rulesetConfig[0].metadata = _metadata;
283
- _rulesetConfig[0].splitGroups = _splitGroup;
284
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
285
-
286
- // Deploy a project.
287
- uint256 projectId = launchProjectForTest();
288
-
289
- // Keep a reference to the current ruleset.
290
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
291
-
292
- // Make sure the ruleset has a cycle number of 1.
293
- assertEq(_ruleset.cycleNumber, 1);
294
- // Make sure the ruleset's weight matches.
295
- assertEq(_ruleset.weight, _weight);
296
-
297
- // Keep a reference to the ruleset's ID.
298
- uint256 _currentRulesetId = _ruleset.id;
299
-
300
- // Increment the weight to create a difference.
301
- _rulesetConfig[0].weight = 1;
302
- _rulesetConfig[0].weightCutPercent = 1_000_000_000 / 2;
303
- _rulesetConfig[0].duration = 1 days;
304
-
305
- // Add a ruleset.
306
- vm.prank(multisig());
307
- _controller.queueRulesetsOf(projectId, _rulesetConfig, "");
308
-
309
- // Make sure the current ruleset hasn't changed.
310
- _ruleset = jbRulesets().currentOf(projectId);
311
- assertEq(_ruleset.cycleNumber, 1);
312
- assertEq(_ruleset.id, _currentRulesetId);
313
- assertEq(_ruleset.weight, _weight);
314
- assertEq(_ruleset.weightCutPercent, 0);
315
-
316
- // Go to the start of the next ruleset.
317
- vm.warp(_ruleset.start + _ruleset.duration + 1 days);
318
-
319
- // Get the current ruleset.
320
- JBRuleset memory _newRuleset = jbRulesets().currentOf(projectId);
321
-
322
- // It should be the second cycle.
323
- assertEq(_newRuleset.cycleNumber, 3);
324
- assertEq(_newRuleset.weight, _weight / 2);
325
- assertEq(_newRuleset.basedOnId, _currentRulesetId);
326
- }
327
-
328
- function testMultipleQueuedOnCycledOver() public {
329
- // Keep references to two different weights.
330
- uint112 _weightFirstQueued = uint112(1234 * 10 ** 18);
331
- uint112 _weightSecondQueued = uint112(6969 * 10 ** 18);
332
-
333
- // Launch a project.
334
- uint256 projectId = launchProjectForTest();
335
-
336
- // Keep a reference to the current ruleset.
337
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
338
-
339
- // Make sure the ruleset is correct.
340
- assertEq(_ruleset.cycleNumber, 1);
341
- assertEq(_ruleset.weight, _weight);
342
-
343
- // Keep a reference to the current ruleset ID.
344
- uint256 _currentRulesetId = _ruleset.id;
345
-
346
- // Jump to the next ruleset.
347
- vm.warp(block.timestamp + _ruleset.duration);
348
-
349
- // Package up a first ruleset configuration to queue.
350
- JBRulesetConfig[] memory _firstQueued = new JBRulesetConfig[](1);
351
- _firstQueued[0].mustStartAtOrAfter = 0;
352
- _firstQueued[0].duration = _RULESET_DURATION;
353
- _firstQueued[0].weight = _weightFirstQueued;
354
- _firstQueued[0].weightCutPercent = 0;
355
- _firstQueued[0].approvalHook = _deadline; // 3 day deadline duration.
356
- _firstQueued[0].metadata = _metadata;
357
- _firstQueued[0].splitGroups = _splitGroup;
358
- _firstQueued[0].fundAccessLimitGroups = _fundAccessLimitGroup;
359
-
360
- // Queue.
361
- vm.prank(multisig());
362
- _controller.queueRulesetsOf(projectId, _firstQueued, "");
363
-
364
- // Package up another ruleset configuration to queue.
365
- JBRulesetConfig[] memory _secondQueued = new JBRulesetConfig[](1);
366
- _secondQueued[0].mustStartAtOrAfter = 0;
367
- _secondQueued[0].duration = _RULESET_DURATION;
368
- _secondQueued[0].weight = _weightSecondQueued;
369
- _secondQueued[0].weightCutPercent = 0;
370
- _secondQueued[0].approvalHook = _deadline; // 3 day deadline duration.
371
- _secondQueued[0].metadata = _metadata;
372
- _secondQueued[0].splitGroups = _splitGroup;
373
- _secondQueued[0].fundAccessLimitGroups = _fundAccessLimitGroup;
374
-
375
- // Queue again
376
- vm.prank(multisig());
377
- _controller.queueRulesetsOf(projectId, _secondQueued, "");
378
-
379
- // Since the second ruleset was queued during the same block as the one prior, increment the ruleset ID.
380
- uint256 secondRulesetId = block.timestamp + 1;
381
-
382
- // The current ruleset should not have changed, still in ruleset #2, cycled over from ruleset #1.
383
- _ruleset = jbRulesets().currentOf(projectId);
384
- assertEq(_ruleset.cycleNumber, 2);
385
- assertEq(_ruleset.id, _currentRulesetId);
386
- assertEq(_ruleset.weight, _weight);
387
-
388
- // Jump to after the deadline has passed, but before the next ruleset.
389
- vm.warp(_ruleset.start + _ruleset.duration - 1);
390
-
391
- // Make sure the queued ruleset is the second one queued.
392
- JBRuleset memory queuedRuleset = jbRulesets().upcomingOf(projectId);
393
- assertEq(queuedRuleset.cycleNumber, 3);
394
- assertEq(queuedRuleset.id, secondRulesetId);
395
- assertEq(queuedRuleset.weight, _weightSecondQueued);
396
-
397
- // Go the the start of the queued ruleset.
398
- vm.warp(_ruleset.start + _ruleset.duration);
399
-
400
- // Make sure the second queued is now the current ruleset.
401
- JBRuleset memory _newRuleset = jbRulesets().currentOf(projectId);
402
- assertEq(_newRuleset.cycleNumber, 3);
403
- assertEq(_newRuleset.id, secondRulesetId);
404
- assertEq(_newRuleset.weight, _weightSecondQueued);
405
- }
406
-
407
- function testMultipleReconfigure(uint8 _deadlineDuration) public {
408
- // Create a deadline with the provided deadline duration.
409
- _deadline = new JBDeadline(_deadlineDuration);
410
-
411
- // Package the ruleset data.
412
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
413
- _rulesetConfig[0].mustStartAtOrAfter = 0;
414
- _rulesetConfig[0].duration = _RULESET_DURATION;
415
- _rulesetConfig[0].weight = 10_000 ether;
416
- _rulesetConfig[0].weightCutPercent = 0;
417
- _rulesetConfig[0].approvalHook = _deadline;
418
- _rulesetConfig[0].metadata = _metadata;
419
- _rulesetConfig[0].splitGroups = _splitGroup;
420
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
421
-
422
- // Launch a project to test.
423
- uint256 projectId = launchProjectForTest();
424
-
425
- // Keep a reference to the initial, current, and queued rulesets.
426
- JBRuleset memory initialRuleset = jbRulesets().currentOf(projectId);
427
- JBRuleset memory currentRuleset = initialRuleset;
428
- JBRuleset memory upcomingRuleset = jbRulesets().upcomingOf(projectId);
429
-
430
- for (uint256 i = 0; i < _RULESET_DURATION_DAYS + 1; i++) {
431
- // If the deadline is less than the ruleset's duration, make sure the current ruleset's weight is linearly
432
- // decremented.
433
- if (_deadlineDuration + i * 1 days < currentRuleset.duration) {
434
- assertEq(currentRuleset.weight, initialRuleset.weight - i);
435
- }
436
-
437
- JBRulesetConfig[] memory _config = new JBRulesetConfig[](1);
438
- _config[0].mustStartAtOrAfter = 0;
439
- _config[0].duration = _RULESET_DURATION;
440
- // Package up a new ruleset with a decremented weight.
441
- _config[0].weight = uint112(initialRuleset.weight - (i + 1)); // i+1 -> next ruleset
442
- _config[0].weightCutPercent = 0;
443
- _config[0].approvalHook = _deadline;
444
- _config[0].metadata = _metadata;
445
- _config[0].splitGroups = _splitGroup;
446
- _config[0].fundAccessLimitGroups = _fundAccessLimitGroup;
447
-
448
- // Queue the ruleset.
449
- vm.prank(multisig());
450
- _controller.queueRulesetsOf(projectId, _config, "");
451
-
452
- // Get a reference to the current and upcoming rulesets.
453
- currentRuleset = jbRulesets().currentOf(projectId);
454
- upcomingRuleset = jbRulesets().upcomingOf(projectId);
455
-
456
- // Get a list of queued rulesets
457
- JBRuleset[] memory rulesetsOf = jbRulesets().allOf(projectId, 0, 1);
458
-
459
- // Make sure the upcoming ruleset is the ruleset currently under the approval hook.
460
- assertEq(upcomingRuleset.weight, _config[0].weight);
461
- assertEq(rulesetsOf[0].weight, _config[0].weight);
462
-
463
- // If the full deadline duration included in the ruleset.
464
- if (
465
- _deadlineDuration == 0
466
- || currentRuleset.duration % (_deadlineDuration + i * 1 days) < currentRuleset.duration
467
- ) {
468
- // Make sure the current ruleset's weight is still linearly decremented.
469
- assertEq(currentRuleset.weight, initialRuleset.weight - i);
470
-
471
- // Shift forward the start of the deadline into the ruleset, one day at a time, from ruleset to ruleset.
472
- vm.warp(currentRuleset.start + currentRuleset.duration + i * 1 days);
473
-
474
- // Make sure what was the upcoming ruleset is now current.
475
- currentRuleset = jbRulesets().currentOf(projectId);
476
- assertEq(currentRuleset.weight, _config[0].weight);
477
-
478
- // Make the upcoming is the cycled over version of current.
479
- upcomingRuleset = jbRulesets().upcomingOf(projectId);
480
- assertEq(upcomingRuleset.weight, _config[0].weight);
481
- }
482
- // If the deadline duration is across many rulesets.
483
- else {
484
- // Make sure the current ruleset has cycled over.
485
- vm.warp(currentRuleset.start + currentRuleset.duration);
486
- assertEq(currentRuleset.weight, initialRuleset.weight - i);
487
-
488
- // Make sure the new ruleset has started once the deadline duration has passed.
489
- vm.warp(currentRuleset.start + currentRuleset.duration + _deadlineDuration);
490
- currentRuleset = jbRulesets().currentOf(projectId);
491
- assertEq(currentRuleset.weight, _config[0].weight);
492
- }
493
- }
494
- }
495
-
496
- function testLaunchProjectWrongApprovalHook() public {
497
- /// Package the configuration.
498
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
499
- _rulesetConfig[0].mustStartAtOrAfter = 0;
500
- _rulesetConfig[0].duration = 0;
501
- _rulesetConfig[0].weight = _weight;
502
- _rulesetConfig[0].weightCutPercent = 0;
503
- _rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
504
- _rulesetConfig[0].metadata = _metadata;
505
- _rulesetConfig[0].splitGroups = _splitGroup;
506
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
507
-
508
- // Launch the project.
509
- uint256 projectId = launchProjectForTest();
510
-
511
- IJBRulesetApprovalHook invalidHook = IJBRulesetApprovalHook(address(6969));
512
-
513
- vm.prank(multisig());
514
- vm.expectRevert(abi.encodeWithSelector(JBRulesets.JBRulesets_InvalidRulesetApprovalHook.selector, invalidHook));
515
-
516
- JBRulesetConfig[] memory _config = new JBRulesetConfig[](1);
517
- _config[0].mustStartAtOrAfter = 0;
518
- _config[0].duration = _RULESET_DURATION;
519
- _config[0].weight = 12_345 * 10 ** 18;
520
- _config[0].weightCutPercent = 0;
521
- _config[0].approvalHook = invalidHook;
522
- _config[0].metadata = _metadata;
523
- _config[0].splitGroups = _splitGroup;
524
- _config[0].fundAccessLimitGroups = _fundAccessLimitGroup;
525
-
526
- _controller.queueRulesetsOf(projectId, _config, "");
527
- }
528
-
529
- function testQueueShortDurationProject() public {
530
- uint32 _shortDuration = 5 minutes;
531
-
532
- _weight = uint112(10_000 * 10 ** 18);
533
- _RULESET_DURATION = _shortDuration;
534
-
535
- // Launch a project to test.
536
- uint256 projectId = launchProjectForTest();
537
-
538
- // Get a reference to the current ruleset.
539
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
540
-
541
- // Make sure the current ruleset is correct.
542
- assertEq(_ruleset.cycleNumber, 1); // Ok.
543
- assertEq(_ruleset.weight, _weight);
544
-
545
- // Keep a reference to the current ruleset ID.
546
- uint256 _currentRulesetId = _ruleset.id;
547
-
548
- // Package up a reconfiguration.
549
- JBRulesetConfig[] memory _config = new JBRulesetConfig[](1);
550
- _config[0].mustStartAtOrAfter = 0;
551
- _config[0].duration = _RULESET_DURATION;
552
- _config[0].weight = 69 * 10 ** 18;
553
- _config[0].weightCutPercent = 0;
554
- _config[0].approvalHook = IJBRulesetApprovalHook(address(0));
555
- _config[0].metadata = _metadata;
556
- _config[0].splitGroups = _splitGroup;
557
- _config[0].fundAccessLimitGroups = _fundAccessLimitGroup;
558
-
559
- // Submit the reconfiguration.
560
- vm.prank(multisig());
561
- _controller.queueRulesetsOf(projectId, _config, "");
562
-
563
- // Make sure the ruleset hasn't changed.
564
- _ruleset = jbRulesets().currentOf(projectId);
565
- assertEq(_ruleset.cycleNumber, 1);
566
- assertEq(_ruleset.id, _currentRulesetId);
567
- assertEq(_ruleset.weight, _weight);
568
-
569
- // Go the the second ruleset.
570
- vm.warp(_ruleset.start + _ruleset.duration);
571
-
572
- // Make sure the ruleset cycled over.
573
- JBRuleset memory _newRuleset = jbRulesets().currentOf(projectId);
574
- assertEq(_newRuleset.cycleNumber, 2);
575
- assertEq(_newRuleset.weight, _weight);
576
-
577
- // Go to the end of the deadline duration.
578
- vm.warp(_ruleset.start + _ruleset.duration + _DEADLINE_DURATION);
579
-
580
- // Make sure the queued cycle is in effect.
581
- _newRuleset = jbRulesets().currentOf(projectId);
582
- assertEq(_newRuleset.cycleNumber, _ruleset.cycleNumber + (_DEADLINE_DURATION / _shortDuration) + 1);
583
- assertEq(_newRuleset.weight, _config[0].weight);
584
- }
585
-
586
- function testQueueWithoutApprovalHook() public {
587
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
588
- _rulesetConfig[0].mustStartAtOrAfter = 0;
589
- _rulesetConfig[0].duration = 5 minutes;
590
- _rulesetConfig[0].weight = 10_000 * 10 ** 18;
591
- _rulesetConfig[0].weightCutPercent = 0;
592
- _rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
593
- _rulesetConfig[0].metadata = _metadata;
594
- _rulesetConfig[0].splitGroups = _splitGroup;
595
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
596
-
597
- // Launch a project to test with.
598
- uint256 projectId = launchProjectForTest();
599
-
600
- // Get a reference to the current ruleset.
601
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
602
-
603
- // Make sure the ruleset is expected.
604
- assertEq(_ruleset.cycleNumber, 1);
605
- assertEq(_ruleset.weight, _weight);
606
-
607
- // Package a new config.
608
- JBRulesetConfig[] memory _config = new JBRulesetConfig[](1);
609
-
610
- _config[0].mustStartAtOrAfter = 0;
611
- _config[0].duration = _RULESET_DURATION;
612
- _config[0].weight = 69 * 10 ** 18;
613
- _config[0].weightCutPercent = 0;
614
- _config[0].approvalHook = IJBRulesetApprovalHook(address(0));
615
- _config[0].metadata = _metadata;
616
- _config[0].splitGroups = _splitGroup;
617
- _config[0].fundAccessLimitGroups = _fundAccessLimitGroup;
618
-
619
- vm.prank(multisig());
620
- _controller.queueRulesetsOf(projectId, _config, "");
621
-
622
- // Make sure the ruleset hasn't changed.
623
- _ruleset = jbRulesets().currentOf(projectId);
624
- assertEq(_ruleset.cycleNumber, 1);
625
- assertEq(_ruleset.weight, _weight);
626
-
627
- // Make sure the ruleset has changed once the ruleset is over.
628
- vm.warp(_ruleset.start + _ruleset.duration);
629
- _ruleset = jbRulesets().currentOf(projectId);
630
- assertEq(_ruleset.cycleNumber, 2);
631
- assertEq(_ruleset.weight, 69 * 10 ** 18);
632
- }
633
-
634
- function testMixedStarts() public {
635
- // Keep references to our different weights for assertions.
636
- uint112 _weightInitial = uint112(1000 * 10 ** 18);
637
- uint112 _weightFirstQueued = uint112(1234 * 10 ** 18);
638
- uint112 _weightSecondQueued = uint112(6969 * 10 ** 18);
639
-
640
- // Package up a config.
641
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
642
- _rulesetConfig[0].mustStartAtOrAfter = 0;
643
- _rulesetConfig[0].duration = _RULESET_DURATION;
644
- _rulesetConfig[0].weight = _weightInitial;
645
- _rulesetConfig[0].weightCutPercent = 0;
646
- _rulesetConfig[0].approvalHook = _deadline; // day deadline duration.
647
- _rulesetConfig[0].metadata = _metadata;
648
- _rulesetConfig[0].splitGroups = _splitGroup;
649
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
650
-
651
- // Launch the project to test with.
652
- uint256 projectId = launchProjectForTest();
653
-
654
- // Get the ruleset.
655
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
656
-
657
- // Keep a reference to the expected ruleset IDs (use returned id to avoid via_ir reordering of block.timestamp).
658
- uint256 _initialRulesetId = _ruleset.id;
659
-
660
- // Make sure the first ruleset has begun.
661
- assertEq(_ruleset.cycleNumber, 1);
662
- assertEq(_ruleset.weight, _weightInitial);
663
-
664
- // Package up a new config.
665
- JBRulesetConfig[] memory _firstQueued = new JBRulesetConfig[](1);
666
- _firstQueued[0].mustStartAtOrAfter = 0;
667
- _firstQueued[0].duration = _RULESET_DURATION;
668
- _firstQueued[0].weight = _weightFirstQueued;
669
- _firstQueued[0].weightCutPercent = 0;
670
- _firstQueued[0].approvalHook = _deadline; // 3 day deadline duration.
671
- _firstQueued[0].metadata = _metadata;
672
- _firstQueued[0].splitGroups = _splitGroup;
673
- _firstQueued[0].fundAccessLimitGroups = _fundAccessLimitGroup;
674
-
675
- // Queue a ruleset to be overridden (will be in `ApprovalExpected` status of the approval hook).
676
- vm.prank(multisig());
677
- _controller.queueRulesetsOf(projectId, _firstQueued, "");
678
-
679
- // Make sure the ruleset is queued.
680
- JBRuleset memory _queued = jbRulesets().upcomingOf(projectId);
681
- assertEq(_queued.cycleNumber, 2);
682
- assertEq(_queued.id, _initialRulesetId + 1);
683
- assertEq(_queued.weight, _weightFirstQueued);
684
-
685
- // Get a list of queued rulesets
686
- JBRuleset[] memory queuedRulesets = jbRulesets().allOf(projectId, 0, 1);
687
-
688
- // Ensure rulesetsOf is accurate
689
- assertEq(queuedRulesets[0].weight, _weightFirstQueued);
690
-
691
- // Package up another config.
692
- JBRulesetConfig[] memory _secondQueued = new JBRulesetConfig[](1);
693
- _secondQueued[0].mustStartAtOrAfter = uint48(block.timestamp + 9 days);
694
- _secondQueued[0].duration = _RULESET_DURATION;
695
- _secondQueued[0].weight = _weightSecondQueued;
696
- _secondQueued[0].weightCutPercent = 0;
697
- _secondQueued[0].approvalHook = _deadline;
698
- _secondQueued[0].metadata = _metadata;
699
- _secondQueued[0].splitGroups = _splitGroup;
700
- _secondQueued[0].fundAccessLimitGroups = _fundAccessLimitGroup;
701
-
702
- // Queue the ruleset.
703
- // Will follow the cycled over (ruleset #1) ruleset, after overriding the above config, because the first
704
- // ruleset queued is in `ApprovalExpected` status (the 3 day deadline has not passed).
705
- // Ruleset #1 rolls over because our `mustStartAtOrAfter` occurs later than when ruleset #1 ends.
706
- vm.prank(multisig());
707
- _controller.queueRulesetsOf(projectId, _secondQueued, "");
708
-
709
- // Make sure this latest queued ruleset implies a cycled over ruleset from ruleset #1.
710
- JBRuleset memory _requeued = jbRulesets().upcomingOf(projectId);
711
- assertEq(_requeued.cycleNumber, 2);
712
- assertEq(_requeued.id, _initialRulesetId);
713
- assertEq(_requeued.weight, _weightInitial);
714
-
715
- // Get a list of queued rulesets
716
- JBRuleset[] memory queuedRulesets2 = jbRulesets().allOf(projectId, 0, 1);
717
-
718
- // Ensure rulesetsOf is accurate
719
- assertEq(queuedRulesets2[0].weight, _weightSecondQueued);
720
-
721
- // Warp to when the initial ruleset rolls over and again becomes the current.
722
- vm.warp(block.timestamp + _RULESET_DURATION);
723
-
724
- // Make sure the new current is a rolled over ruleset.
725
- JBRuleset memory _initialIsCurrent = jbRulesets().currentOf(projectId);
726
- assertEq(_initialIsCurrent.cycleNumber, 2);
727
- assertEq(_initialIsCurrent.id, _initialRulesetId);
728
- assertEq(_initialIsCurrent.weight, _weightInitial);
729
-
730
- // Second queued ruleset that replaced our first queued ruleset.
731
- JBRuleset memory _requeued2 = jbRulesets().upcomingOf(projectId);
732
- assertEq(_requeued2.cycleNumber, 3);
733
- assertEq(_requeued2.id, _initialRulesetId + 2);
734
- assertEq(_requeued2.weight, _weightSecondQueued);
735
-
736
- // Get queued rulesets
737
- JBRuleset[] memory queuedRulesets3 = jbRulesets().allOf(projectId, 0, 1);
738
-
739
- // Ensure rulesetsOf is accurate
740
- assertEq(queuedRulesets3[0].weight, _weightSecondQueued);
741
- }
742
-
743
- function testSingleBlockOverwriteQueued() public {
744
- // Keep references to our different weights for assertions.
745
- uint112 _weightFirstQueued = uint112(1234 * 10 ** 18);
746
- uint112 _weightSecondQueued = uint112(6969 * 10 ** 18);
747
-
748
- // Keep a reference to the expected ruleset ID (timestamp) after queuing, starting now, incremented later
749
- // in-line for readability.
750
- uint256 _expectedRulesetId = block.timestamp;
751
-
752
- // Package up a config.
753
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](1);
754
- _rulesetConfig[0].mustStartAtOrAfter = 0;
755
- _rulesetConfig[0].duration = 0;
756
- _rulesetConfig[0].weight = _weight;
757
- _rulesetConfig[0].weightCutPercent = 0;
758
- _rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
759
- _rulesetConfig[0].metadata = _metadata;
760
- _rulesetConfig[0].splitGroups = _splitGroup;
761
- _rulesetConfig[0].fundAccessLimitGroups = _fundAccessLimitGroup;
762
-
763
- // Deploy a project to test.
764
- uint256 projectId = launchProjectForTest();
765
-
766
- // Keep a reference to the current ruleset.
767
- JBRuleset memory _ruleset = jbRulesets().currentOf(projectId);
768
-
769
- // Initial ruleset data: will have a `block.timestamp` (`rulesetId`) that is 2 less than the second queued
770
- // ruleset (`rulesetId` timestamps are incremented when queued in same block).
771
- assertEq(_ruleset.cycleNumber, 1);
772
- assertEq(_ruleset.weight, _weight);
773
-
774
- // Package up another config.
775
- JBRulesetConfig[] memory _firstQueued = new JBRulesetConfig[](1);
776
- _firstQueued[0].mustStartAtOrAfter = uint48(block.timestamp + 3 days);
777
- _firstQueued[0].duration = _RULESET_DURATION;
778
- _firstQueued[0].weight = _weightFirstQueued;
779
- _firstQueued[0].weightCutPercent = 0;
780
- _firstQueued[0].approvalHook = _deadline; // 3 day deadline duration.
781
- _firstQueued[0].metadata = _metadata;
782
- _firstQueued[0].splitGroups = _splitGroup;
783
- _firstQueued[0].fundAccessLimitGroups = _fundAccessLimitGroup;
784
-
785
- // Becomes queued & will be overwritten as 3 days will not pass and its status is `ApprovalExpected`.
786
- vm.prank(multisig());
787
- _controller.queueRulesetsOf(projectId, _firstQueued, "");
788
-
789
- // Get a reference to the queued cycle.
790
- JBRuleset memory queuedToOverwrite = jbRulesets().upcomingOf(projectId);
791
-
792
- assertEq(queuedToOverwrite.cycleNumber, 2);
793
- assertEq(queuedToOverwrite.id, _expectedRulesetId + 1);
794
- assertEq(queuedToOverwrite.weight, _weightFirstQueued);
795
-
796
- // Package up another config to overwrite.
797
- JBRulesetConfig[] memory _secondQueued = new JBRulesetConfig[](1);
798
-
799
- // forge-lint: disable-next-line(unsafe-typecast)
800
- _secondQueued[0].mustStartAtOrAfter = uint48(block.timestamp + _DEADLINE_DURATION);
801
- _secondQueued[0].duration = _RULESET_DURATION;
802
- _secondQueued[0].weight = _weightSecondQueued;
803
- _secondQueued[0].weightCutPercent = 0;
804
- _secondQueued[0].approvalHook = _deadline; // 3 day deadline duration.
805
- _secondQueued[0].metadata = _metadata;
806
- _secondQueued[0].splitGroups = _splitGroup;
807
- _secondQueued[0].fundAccessLimitGroups = _fundAccessLimitGroup;
808
-
809
- // Queuing the second ruleset will overwrite the first queued ruleset.
810
- vm.prank(multisig());
811
- _controller.queueRulesetsOf(projectId, _secondQueued, "");
812
-
813
- // Make sure it's overwritten.
814
- JBRuleset memory queued = jbRulesets().upcomingOf(projectId);
815
- assertEq(queued.cycleNumber, 2);
816
- assertEq(queued.id, _expectedRulesetId + 2);
817
- assertEq(queued.weight, _weightSecondQueued);
818
- }
819
-
820
- function testApprovalHook(uint256 _start, uint256 _rulesetId, uint256 _duration) public {
821
- _start = bound(_start, block.timestamp, block.timestamp + 1000 days);
822
- _rulesetId = bound(_rulesetId, block.timestamp, block.timestamp + 1000 days);
823
- _duration = bound(_duration, 1, block.timestamp);
824
-
825
- JBRuleset memory _ruleset = JBRuleset({
826
- // forge-lint: disable-next-line(unsafe-typecast)
827
- id: uint48(_rulesetId),
828
- basedOnId: 0,
829
- cycleNumber: 1,
830
- // forge-lint: disable-next-line(unsafe-typecast)
831
- start: uint48(_start),
832
- // forge-lint: disable-next-line(unsafe-typecast)
833
- duration: uint32(_duration),
834
- weight: 1,
835
- weightCutPercent: 0,
836
- metadata: 0,
837
- approvalHook: IJBRulesetApprovalHook(address(0))
838
- });
839
-
840
- JBDeadline deadline = new JBDeadline(_duration);
841
-
842
- JBApprovalStatus _currentStatus = deadline.approvalStatusOf(1, _ruleset); // 1 is the `projectId`,
843
- // unused
844
-
845
- // Ruleset ID (timestamp) is after deadline -> approval hook failed.
846
- if (_rulesetId > _start) {
847
- assertEq(uint256(_currentStatus), uint256(JBApprovalStatus.Failed));
848
- }
849
- // Deadline starts less than a `duration` away from the `rulesetId` -> failed (would start mid-ruleset).
850
- else if (_start - _duration < _rulesetId) {
851
- assertEq(uint256(_currentStatus), uint256(JBApprovalStatus.Failed));
852
- }
853
- // Deadline starts more than a `_duration` away (will be approved when enough time has passed) -> approval
854
- // expected.
855
- else if (block.timestamp + _duration < _start) {
856
- assertEq(uint256(_currentStatus), uint256(JBApprovalStatus.ApprovalExpected));
857
- }
858
- // If enough time has passed since deadline start, approved.
859
- else if (block.timestamp + _duration > _start) {
860
- assertEq(uint256(_currentStatus), uint256(JBApprovalStatus.Approved));
861
- }
862
- }
863
-
864
- function testRulesetViewAccuracy() public {
865
- // setup: deploy project and queue 2 rulesets atop the initial ruleset
866
- uint256 id = launchProjectForTestWithThreeRulesets();
867
-
868
- // Get a list of queued rulesets
869
- JBRuleset[] memory rulesetsOf = jbRulesets().allOf(id, 0, 3);
870
-
871
- // check: three rulesets returned
872
- assertEq(rulesetsOf.length, 3);
873
-
874
- // check: queued with furthest start time
875
- assertEq(rulesetsOf[0].weight, _weight + 200);
876
-
877
- // check: queued with nearest start time
878
- assertEq(rulesetsOf[1].weight, _weight + 100);
879
-
880
- // check: current with nearest start time
881
- assertEq(rulesetsOf[2].weight, _weight);
882
-
883
- // get the current ruleset
884
- JBRuleset memory currentRuleset = jbRulesets().currentOf(id);
885
-
886
- // check: current should be the initial ruleset
887
- assertEq(currentRuleset.weight, _weight);
888
-
889
- // get upcoming ruleset
890
- JBRuleset memory upcomingRuleset = jbRulesets().upcomingOf(id);
891
-
892
- // check: upcoming ruleset should be 2nd queued
893
- assertEq(upcomingRuleset.weight, _weight + 100);
894
-
895
- // Get a list of queued rulesets
896
- rulesetsOf = jbRulesets().allOf(id, 0, 3);
897
-
898
- // check: three rulesets returned again
899
- assertEq(rulesetsOf.length, 3);
900
-
901
- // check: queued with furthest start time
902
- assertEq(rulesetsOf[0].weight, _weight + 200);
903
-
904
- // check: current with nearest start time
905
- assertEq(rulesetsOf[1].weight, _weight + 100);
906
-
907
- // check: past with nearest start time
908
- assertEq(rulesetsOf[2].weight, _weight);
909
-
910
- // Get a list of queued rulesets
911
- rulesetsOf = jbRulesets().allOf(id, 0, 2);
912
-
913
- // check: two rulesets returned again
914
- assertEq(rulesetsOf.length, 2);
915
-
916
- // check: queued with furthest start time
917
- assertEq(rulesetsOf[0].weight, _weight + 200);
918
-
919
- // check: current with nearest start time
920
- assertEq(rulesetsOf[1].weight, _weight + 100);
921
-
922
- // Get a list of queued rulesets
923
- rulesetsOf = jbRulesets().allOf(id, upcomingRuleset.id, 2);
924
-
925
- // check: two rulesets returned again
926
- assertEq(rulesetsOf.length, 2);
927
-
928
- // check: current with nearest start time
929
- assertEq(rulesetsOf[0].weight, _weight + 100);
930
-
931
- // check: past with nearest start time
932
- assertEq(rulesetsOf[1].weight, _weight);
933
-
934
- // Get a list of queued rulesets
935
- rulesetsOf = jbRulesets().allOf(id, upcomingRuleset.id, 1);
936
-
937
- // check: one rulesets returned again
938
- assertEq(rulesetsOf.length, 1);
939
-
940
- // check: current with nearest start time
941
- assertEq(rulesetsOf[0].weight, _weight + 100);
942
-
943
- // Get a list of queued rulesets with a larger size than there are rulesets.
944
- rulesetsOf = jbRulesets().allOf(id, 0, 10);
945
-
946
- // check: three rulesets returned
947
- assertEq(rulesetsOf.length, 3);
948
-
949
- // check: queued with furthest start time
950
- assertEq(rulesetsOf[0].weight, _weight + 200);
951
-
952
- // check: queued with nearest start time
953
- assertEq(rulesetsOf[1].weight, _weight + 100);
954
-
955
- // check: current with nearest start time
956
- assertEq(rulesetsOf[2].weight, _weight);
957
- }
958
-
959
- function testWithThreeHistoricalRulesets() public {
960
- // Package up ruleset configuration.
961
- JBRulesetConfig[] memory _rulesetConfig = new JBRulesetConfig[](3);
962
-
963
- // first ruleset in the past
964
- _rulesetConfig[0].mustStartAtOrAfter = uint48(block.timestamp - 2 days);
965
- _rulesetConfig[0].duration = 1 hours;
966
- _rulesetConfig[0].weight = uint112(_weight);
967
- _rulesetConfig[0].weightCutPercent = 0;
968
- _rulesetConfig[0].approvalHook = IJBRulesetApprovalHook(address(0));
969
- _rulesetConfig[0].metadata = _metadata;
970
- _rulesetConfig[0].splitGroups = new JBSplitGroup[](0);
971
- _rulesetConfig[0].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
972
-
973
- // second ruleset started in the past but should still be active
974
- _rulesetConfig[1].mustStartAtOrAfter = uint48(block.timestamp - 2 hours);
975
- _rulesetConfig[1].duration = 1 hours;
976
- _rulesetConfig[1].weight = uint112(_weight + 100);
977
- _rulesetConfig[1].weightCutPercent = 0;
978
- _rulesetConfig[1].approvalHook = IJBRulesetApprovalHook(address(0));
979
- _rulesetConfig[1].metadata = _metadata;
980
- _rulesetConfig[1].splitGroups = new JBSplitGroup[](0);
981
- _rulesetConfig[1].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
982
-
983
- // third
984
- _rulesetConfig[2].mustStartAtOrAfter = uint48(block.timestamp + 1 days);
985
- _rulesetConfig[2].duration = 1 days;
986
- _rulesetConfig[2].weight = uint112(_weight + 200);
987
- _rulesetConfig[2].weightCutPercent = 0;
988
- _rulesetConfig[2].approvalHook = IJBRulesetApprovalHook(address(0));
989
- _rulesetConfig[2].metadata = _metadata;
990
- _rulesetConfig[2].splitGroups = new JBSplitGroup[](0);
991
- _rulesetConfig[2].fundAccessLimitGroups = new JBFundAccessLimitGroup[](0);
992
-
993
- // Package up terminal configuration.
994
- JBTerminalConfig[] memory _terminalConfigurations = new JBTerminalConfig[](1);
995
- JBAccountingContext[] memory _tokensToAccept = new JBAccountingContext[](1);
996
- _tokensToAccept[0] = JBAccountingContext({
997
- token: JBConstants.NATIVE_TOKEN, decimals: 18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))
998
- });
999
- _terminalConfigurations[0] =
1000
- JBTerminalConfig({terminal: _terminal, accountingContextsToAccept: _tokensToAccept});
1001
-
1002
- uint256 projectId = _controller.launchProjectFor({
1003
- owner: address(multisig()),
1004
- projectUri: "myIPFSHash",
1005
- rulesetConfigurations: _rulesetConfig,
1006
- terminalConfigurations: _terminalConfigurations,
1007
- memo: ""
1008
- });
1009
-
1010
- // Get a list of queued rulesets
1011
- JBRuleset[] memory rulesetsOf = jbRulesets().allOf(projectId, 0, 3);
1012
-
1013
- // check: three rulesets returned
1014
- assertEq(rulesetsOf.length, 3);
1015
-
1016
- // get the current ruleset
1017
- JBRuleset memory currentRuleset = jbRulesets().currentOf(projectId);
1018
-
1019
- // check: current should be the second ruleset
1020
- assertEq(currentRuleset.weight, _weight + 100);
1021
-
1022
- // check: current should be an iterated cycle.
1023
- assertEq(currentRuleset.cycleNumber, (2 days / 1 hours) + 1);
1024
- }
1025
- }