@bananapus/core-v6 0.0.37 → 0.0.39

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