@bananapus/core-v6 0.0.36 → 0.0.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) 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 +26 -5
  5. package/src/JBMultiTerminal.sol +85 -47
  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/CrossTerminalSurplusSpoof.t.sol +0 -140
  74. package/test/audit/CycledSurplusAllowanceReset.t.sol +0 -184
  75. package/test/audit/FeeFreeSurplusLifecycle.t.sol +0 -399
  76. package/test/audit/FeeFreeSurplusStale.t.sol +0 -248
  77. package/test/audit/USDTVoidReturnCompat.t.sol +0 -525
  78. package/test/fork/TestChainlinkPriceFeedFork.sol +0 -254
  79. package/test/fork/TestSequencerPriceFeedFork.sol +0 -168
  80. package/test/fork/TestTerminalPreviewParityFork.sol +0 -108
  81. package/test/formal/BondingCurveProperties.t.sol +0 -420
  82. package/test/formal/FeeProperties.t.sol +0 -252
  83. package/test/invariants/Phase3DeepInvariant.t.sol +0 -412
  84. package/test/invariants/RulesetsInvariant.t.sol +0 -125
  85. package/test/invariants/TerminalStoreInvariant.t.sol +0 -227
  86. package/test/invariants/TokensInvariant.t.sol +0 -195
  87. package/test/invariants/handlers/ComprehensiveHandler.sol +0 -303
  88. package/test/invariants/handlers/EconomicHandler.sol +0 -377
  89. package/test/invariants/handlers/Phase3Handler.sol +0 -443
  90. package/test/invariants/handlers/RulesetsHandler.sol +0 -115
  91. package/test/invariants/handlers/TerminalStoreHandler.sol +0 -151
  92. package/test/invariants/handlers/TokensHandler.sol +0 -126
  93. package/test/regression/HoldFeesCashOutReserved.t.sol +0 -415
  94. package/test/regression/WeightCacheBoundary.t.sol +0 -291
  95. package/test/trees/JBController/burnTokensOf.tree +0 -9
  96. package/test/trees/JBController/claimTokensFor.tree +0 -5
  97. package/test/trees/JBController/deployERC20For.tree +0 -5
  98. package/test/trees/JBController/getRulesetOf.tree +0 -5
  99. package/test/trees/JBController/launchProjectFor.tree +0 -12
  100. package/test/trees/JBController/launchRulesetsFor.tree +0 -8
  101. package/test/trees/JBController/migrateController.tree +0 -12
  102. package/test/trees/JBController/mintTokensOf.tree +0 -12
  103. package/test/trees/JBController/payReservedTokenToTerminal.tree +0 -8
  104. package/test/trees/JBController/receiveMigrationFrom.tree +0 -4
  105. package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +0 -12
  106. package/test/trees/JBController/setMetadataOf.tree +0 -5
  107. package/test/trees/JBController/setSplitGroupsOf.tree +0 -5
  108. package/test/trees/JBController/setTokenFor.tree +0 -5
  109. package/test/trees/JBController/transferCreditsFrom.tree +0 -8
  110. package/test/trees/JBDirectory/primaryTerminalOf.tree +0 -8
  111. package/test/trees/JBDirectory/setControllerOf.tree +0 -11
  112. package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +0 -15
  113. package/test/trees/JBDirectory/setTerminalsOf.tree +0 -11
  114. package/test/trees/JBERC20/initialize.tree +0 -7
  115. package/test/trees/JBERC20/name.tree +0 -5
  116. package/test/trees/JBERC20/nonces.tree +0 -5
  117. package/test/trees/JBERC20/symbol.tree +0 -5
  118. package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +0 -5
  119. package/test/trees/JBFeelessAddresses/supportsInterface.tree +0 -5
  120. package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +0 -5
  121. package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +0 -8
  122. package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +0 -18
  123. package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +0 -5
  124. package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +0 -8
  125. package/test/trees/JBMetadataResolver/getDataFor.tree +0 -8
  126. package/test/trees/JBMultiTerminal/accountingContextsOf.tree +0 -5
  127. package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +0 -10
  128. package/test/trees/JBMultiTerminal/addToBalanceOf.tree +0 -23
  129. package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +0 -23
  130. package/test/trees/JBMultiTerminal/executePayout.tree +0 -32
  131. package/test/trees/JBMultiTerminal/executeProcessFee.tree +0 -14
  132. package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +0 -12
  133. package/test/trees/JBMultiTerminal/pay.tree +0 -23
  134. package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +0 -8
  135. package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +0 -34
  136. package/test/trees/JBMultiTerminal/useAllowanceOf.tree +0 -16
  137. package/test/trees/JBPermissions/hasPermission.tree +0 -8
  138. package/test/trees/JBPermissions/hasPermissions.tree +0 -8
  139. package/test/trees/JBPermissions/setPermissionsFor.tree +0 -5
  140. package/test/trees/JBPrices/addPriceFeedFor.tree +0 -14
  141. package/test/trees/JBPrices/pricePerUnitOf.tree +0 -11
  142. package/test/trees/JBProjects/createFor.tree +0 -11
  143. package/test/trees/JBProjects/setTokenUriResolver.tree +0 -5
  144. package/test/trees/JBProjects/supportsInterface.tree +0 -9
  145. package/test/trees/JBProjects/tokenURI.tree +0 -5
  146. package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +0 -8
  147. package/test/trees/JBRulesets/currentOf.tree +0 -12
  148. package/test/trees/JBRulesets/getRulesetOf.tree +0 -5
  149. package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +0 -10
  150. package/test/trees/JBRulesets/rulesetsOf.tree +0 -11
  151. package/test/trees/JBRulesets/upcomingRulesetOf.tree +0 -20
  152. package/test/trees/JBRulesets/updateRulesetWeightCache.tree +0 -5
  153. package/test/trees/JBSplits/setSplitGroupsOf.tree +0 -17
  154. package/test/trees/JBSplits/splitsOf.tree +0 -5
  155. package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +0 -16
  156. package/test/trees/JBTerminalStore/currentSurplusOf.tree +0 -25
  157. package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +0 -5
  158. package/test/trees/JBTerminalStore/recordCashOutsFor.tree +0 -16
  159. package/test/trees/JBTerminalStore/recordPaymentFrom.tree +0 -14
  160. package/test/trees/JBTerminalStore/recordPayoutFor.tree +0 -10
  161. package/test/trees/JBTerminalStore/recordTerminalMigration.tree +0 -5
  162. package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +0 -10
  163. package/test/trees/JBTokens/burnFrom.tree +0 -10
  164. package/test/trees/JBTokens/claimTokensFor.tree +0 -10
  165. package/test/trees/JBTokens/deployERC20For.tree +0 -12
  166. package/test/trees/JBTokens/mintFor.tree +0 -10
  167. package/test/trees/JBTokens/setTokenFor.tree +0 -11
  168. package/test/trees/JBTokens/totalBalanceOf.tree +0 -5
  169. package/test/trees/JBTokens/totalSupplyOf.tree +0 -5
  170. package/test/trees/JBTokens/transferCreditsFrom.tree +0 -8
  171. package/test/trees/mintTokensOf.tree +0 -12
  172. package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +0 -223
  173. package/test/units/static/JBController/JBControllerSetup.sol +0 -50
  174. package/test/units/static/JBController/TestBurnTokensOf.sol +0 -114
  175. package/test/units/static/JBController/TestClaimTokensFor.sol +0 -63
  176. package/test/units/static/JBController/TestDeployErc20For.sol +0 -86
  177. package/test/units/static/JBController/TestLaunchProjectFor.sol +0 -302
  178. package/test/units/static/JBController/TestLaunchRulesetsFor.sol +0 -342
  179. package/test/units/static/JBController/TestMigrateController.sol +0 -157
  180. package/test/units/static/JBController/TestMintTokensOfUnits.sol +0 -111
  181. package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +0 -324
  182. package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +0 -74
  183. package/test/units/static/JBController/TestPreviewMintOf.sol +0 -117
  184. package/test/units/static/JBController/TestReceiveMigrationFrom.sol +0 -99
  185. package/test/units/static/JBController/TestRulesetViews.sol +0 -225
  186. package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +0 -615
  187. package/test/units/static/JBController/TestSetSplitGroupsOf.sol +0 -68
  188. package/test/units/static/JBController/TestSetTokenFor.sol +0 -239
  189. package/test/units/static/JBController/TestSetUriOf.sol +0 -57
  190. package/test/units/static/JBController/TestTransferCreditsFrom.sol +0 -169
  191. package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +0 -211
  192. package/test/units/static/JBDirectory/JBDirectorySetup.sol +0 -26
  193. package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +0 -126
  194. package/test/units/static/JBDirectory/TestSetControllerOf.sol +0 -183
  195. package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +0 -104
  196. package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +0 -179
  197. package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +0 -137
  198. package/test/units/static/JBERC20/JBERC20Setup.sol +0 -34
  199. package/test/units/static/JBERC20/SigUtils.sol +0 -36
  200. package/test/units/static/JBERC20/TestInitialize.sol +0 -60
  201. package/test/units/static/JBERC20/TestName.sol +0 -30
  202. package/test/units/static/JBERC20/TestNonces.sol +0 -62
  203. package/test/units/static/JBERC20/TestSymbol.sol +0 -31
  204. package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +0 -22
  205. package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +0 -30
  206. package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +0 -35
  207. package/test/units/static/JBFees/TestFeesFuzz.sol +0 -79
  208. package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +0 -16
  209. package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +0 -71
  210. package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +0 -24
  211. package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +0 -163
  212. package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +0 -59
  213. package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +0 -101
  214. package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +0 -189
  215. package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +0 -64
  216. package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +0 -102
  217. package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +0 -90
  218. package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +0 -247
  219. package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +0 -229
  220. package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +0 -50
  221. package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +0 -72
  222. package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +0 -289
  223. package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +0 -474
  224. package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +0 -624
  225. package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +0 -578
  226. package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +0 -202
  227. package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +0 -222
  228. package/test/units/static/JBMultiTerminal/TestPay.sol +0 -604
  229. package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +0 -117
  230. package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +0 -114
  231. package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +0 -228
  232. package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +0 -55
  233. package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +0 -257
  234. package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +0 -611
  235. package/test/units/static/JBPermissions/JBPermissionsSetup.sol +0 -20
  236. package/test/units/static/JBPermissions/TestHasPermission.sol +0 -50
  237. package/test/units/static/JBPermissions/TestHasPermissions.sol +0 -93
  238. package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +0 -64
  239. package/test/units/static/JBPrices/JBPricesSetup.sol +0 -32
  240. package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +0 -107
  241. package/test/units/static/JBPrices/TestPricePerUnitOf.sol +0 -132
  242. package/test/units/static/JBPrices/TestPrices.sol +0 -265
  243. package/test/units/static/JBProjects/JBProjectsSetup.sol +0 -22
  244. package/test/units/static/JBProjects/TestCreateFor.sol +0 -71
  245. package/test/units/static/JBProjects/TestInitialProject.sol +0 -21
  246. package/test/units/static/JBProjects/TestInterfaces.sol +0 -26
  247. package/test/units/static/JBProjects/TestSetResolver.sol +0 -37
  248. package/test/units/static/JBProjects/TestTokenUri.sol +0 -40
  249. package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +0 -108
  250. package/test/units/static/JBRulesets/JBRulesetsSetup.sol +0 -24
  251. package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +0 -265
  252. package/test/units/static/JBRulesets/TestCurrentOf.sol +0 -242
  253. package/test/units/static/JBRulesets/TestGetRulesetOf.sol +0 -100
  254. package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +0 -260
  255. package/test/units/static/JBRulesets/TestRulesets.sol +0 -632
  256. package/test/units/static/JBRulesets/TestRulesetsOf.sol +0 -37
  257. package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +0 -522
  258. package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +0 -96
  259. package/test/units/static/JBSplits/JBSplitsSetup.sol +0 -26
  260. package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +0 -552
  261. package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +0 -377
  262. package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +0 -267
  263. package/test/units/static/JBSplits/TestSplitsOf.sol +0 -24
  264. package/test/units/static/JBSplits/TestSplitsPacking.sol +0 -36
  265. package/test/units/static/JBSurplus/TestSurplusFuzz.sol +0 -160
  266. package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +0 -45
  267. package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +0 -536
  268. package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +0 -463
  269. package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +0 -135
  270. package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +0 -476
  271. package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +0 -494
  272. package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +0 -652
  273. package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +0 -744
  274. package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +0 -289
  275. package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +0 -138
  276. package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +0 -415
  277. package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +0 -219
  278. package/test/units/static/JBTokens/JBTokensSetup.sol +0 -32
  279. package/test/units/static/JBTokens/TestBurnFrom.sol +0 -107
  280. package/test/units/static/JBTokens/TestClaimTokensFor.sol +0 -110
  281. package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +0 -92
  282. package/test/units/static/JBTokens/TestMintFor.sol +0 -100
  283. package/test/units/static/JBTokens/TestSetTokenFor.sol +0 -98
  284. package/test/units/static/JBTokens/TestTotalBalanceOf.sol +0 -65
  285. package/test/units/static/JBTokens/TestTotalSupplyOf.sol +0 -56
  286. 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
- }