@bananapus/core-v6 0.0.1

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 (436) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/SKILLS.md +151 -0
  4. package/docs/book.css +13 -0
  5. package/docs/book.toml +12 -0
  6. package/docs/solidity.min.js +74 -0
  7. package/docs/src/README.md +703 -0
  8. package/docs/src/SUMMARY.md +94 -0
  9. package/docs/src/src/JBChainlinkV3PriceFeed.sol/contract.JBChainlinkV3PriceFeed.md +83 -0
  10. package/docs/src/src/JBChainlinkV3SequencerPriceFeed.sol/contract.JBChainlinkV3SequencerPriceFeed.md +88 -0
  11. package/docs/src/src/JBController.sol/contract.JBController.md +1121 -0
  12. package/docs/src/src/JBDeadline.sol/contract.JBDeadline.md +84 -0
  13. package/docs/src/src/JBDirectory.sol/contract.JBDirectory.md +294 -0
  14. package/docs/src/src/JBERC20.sol/contract.JBERC20.md +190 -0
  15. package/docs/src/src/JBFeelessAddresses.sol/contract.JBFeelessAddresses.md +80 -0
  16. package/docs/src/src/JBFundAccessLimits.sol/contract.JBFundAccessLimits.md +253 -0
  17. package/docs/src/src/JBMultiTerminal.sol/contract.JBMultiTerminal.md +1472 -0
  18. package/docs/src/src/JBPermissions.sol/contract.JBPermissions.md +199 -0
  19. package/docs/src/src/JBPrices.sol/contract.JBPrices.md +154 -0
  20. package/docs/src/src/JBProjects.sol/contract.JBProjects.md +131 -0
  21. package/docs/src/src/JBRulesets.sol/contract.JBRulesets.md +677 -0
  22. package/docs/src/src/JBSplits.sol/contract.JBSplits.md +237 -0
  23. package/docs/src/src/JBTerminalStore.sol/contract.JBTerminalStore.md +591 -0
  24. package/docs/src/src/JBTokens.sol/contract.JBTokens.md +353 -0
  25. package/docs/src/src/README.md +25 -0
  26. package/docs/src/src/abstract/JBControlled.sol/abstract.JBControlled.md +64 -0
  27. package/docs/src/src/abstract/JBPermissioned.sol/abstract.JBPermissioned.md +84 -0
  28. package/docs/src/src/abstract/README.md +5 -0
  29. package/docs/src/src/enums/JBApprovalStatus.sol/enum.JBApprovalStatus.md +17 -0
  30. package/docs/src/src/enums/README.md +4 -0
  31. package/docs/src/src/interfaces/IJBCashOutHook.sol/interface.IJBCashOutHook.md +29 -0
  32. package/docs/src/src/interfaces/IJBCashOutTerminal.sol/interface.IJBCashOutTerminal.md +57 -0
  33. package/docs/src/src/interfaces/IJBControlled.sol/interface.IJBControlled.md +12 -0
  34. package/docs/src/src/interfaces/IJBController.sol/interface.IJBController.md +334 -0
  35. package/docs/src/src/interfaces/IJBDirectory.sol/interface.IJBDirectory.md +108 -0
  36. package/docs/src/src/interfaces/IJBDirectoryAccessControl.sol/interface.IJBDirectoryAccessControl.md +19 -0
  37. package/docs/src/src/interfaces/IJBFeeTerminal.sol/interface.IJBFeeTerminal.md +91 -0
  38. package/docs/src/src/interfaces/IJBFeelessAddresses.sol/interface.IJBFeelessAddresses.md +26 -0
  39. package/docs/src/src/interfaces/IJBFundAccessLimits.sol/interface.IJBFundAccessLimits.md +88 -0
  40. package/docs/src/src/interfaces/IJBMigratable.sol/interface.IJBMigratable.md +29 -0
  41. package/docs/src/src/interfaces/IJBMultiTerminal.sol/interface.IJBMultiTerminal.md +50 -0
  42. package/docs/src/src/interfaces/IJBPayHook.sol/interface.IJBPayHook.md +28 -0
  43. package/docs/src/src/interfaces/IJBPayoutTerminal.sol/interface.IJBPayoutTerminal.md +105 -0
  44. package/docs/src/src/interfaces/IJBPermissioned.sol/interface.IJBPermissioned.md +12 -0
  45. package/docs/src/src/interfaces/IJBPermissions.sol/interface.IJBPermissions.md +74 -0
  46. package/docs/src/src/interfaces/IJBPermitTerminal.sol/interface.IJBPermitTerminal.md +15 -0
  47. package/docs/src/src/interfaces/IJBPriceFeed.sol/interface.IJBPriceFeed.md +12 -0
  48. package/docs/src/src/interfaces/IJBPrices.sol/interface.IJBPrices.md +74 -0
  49. package/docs/src/src/interfaces/IJBProjectUriRegistry.sol/interface.IJBProjectUriRegistry.md +19 -0
  50. package/docs/src/src/interfaces/IJBProjects.sol/interface.IJBProjects.md +49 -0
  51. package/docs/src/src/interfaces/IJBRulesetApprovalHook.sol/interface.IJBRulesetApprovalHook.md +35 -0
  52. package/docs/src/src/interfaces/IJBRulesetDataHook.sol/interface.IJBRulesetDataHook.md +97 -0
  53. package/docs/src/src/interfaces/IJBRulesets.sol/interface.IJBRulesets.md +165 -0
  54. package/docs/src/src/interfaces/IJBSplitHook.sol/interface.IJBSplitHook.md +31 -0
  55. package/docs/src/src/interfaces/IJBSplits.sol/interface.IJBSplits.md +35 -0
  56. package/docs/src/src/interfaces/IJBTerminal.sol/interface.IJBTerminal.md +141 -0
  57. package/docs/src/src/interfaces/IJBTerminalStore.sol/interface.IJBTerminalStore.md +198 -0
  58. package/docs/src/src/interfaces/IJBToken.sol/interface.IJBToken.md +54 -0
  59. package/docs/src/src/interfaces/IJBTokenUriResolver.sol/interface.IJBTokenUriResolver.md +12 -0
  60. package/docs/src/src/interfaces/IJBTokens.sol/interface.IJBTokens.md +151 -0
  61. package/docs/src/src/interfaces/README.md +33 -0
  62. package/docs/src/src/libraries/JBCashOuts.sol/library.JBCashOuts.md +40 -0
  63. package/docs/src/src/libraries/JBConstants.sol/library.JBConstants.md +52 -0
  64. package/docs/src/src/libraries/JBCurrencyIds.sol/library.JBCurrencyIds.md +19 -0
  65. package/docs/src/src/libraries/JBFees.sol/library.JBFees.md +52 -0
  66. package/docs/src/src/libraries/JBFixedPointNumber.sol/library.JBFixedPointNumber.md +12 -0
  67. package/docs/src/src/libraries/JBMetadataResolver.sol/library.JBMetadataResolver.md +242 -0
  68. package/docs/src/src/libraries/JBRulesetMetadataResolver.sol/library.JBRulesetMetadataResolver.md +180 -0
  69. package/docs/src/src/libraries/JBSplitGroupIds.sol/library.JBSplitGroupIds.md +14 -0
  70. package/docs/src/src/libraries/JBSurplus.sol/library.JBSurplus.md +44 -0
  71. package/docs/src/src/libraries/README.md +12 -0
  72. package/docs/src/src/periphery/JBDeadline1Day.sol/contract.JBDeadline1Day.md +15 -0
  73. package/docs/src/src/periphery/JBDeadline3Days.sol/contract.JBDeadline3Days.md +15 -0
  74. package/docs/src/src/periphery/JBDeadline3Hours.sol/contract.JBDeadline3Hours.md +15 -0
  75. package/docs/src/src/periphery/JBDeadline7Days.sol/contract.JBDeadline7Days.md +15 -0
  76. package/docs/src/src/periphery/JBMatchingPriceFeed.sol/contract.JBMatchingPriceFeed.md +22 -0
  77. package/docs/src/src/periphery/README.md +8 -0
  78. package/docs/src/src/structs/JBAccountingContext.sol/struct.JBAccountingContext.md +20 -0
  79. package/docs/src/src/structs/JBAfterCashOutRecordedContext.sol/struct.JBAfterCashOutRecordedContext.md +43 -0
  80. package/docs/src/src/structs/JBAfterPayRecordedContext.sol/struct.JBAfterPayRecordedContext.md +42 -0
  81. package/docs/src/src/structs/JBBeforeCashOutRecordedContext.sol/struct.JBBeforeCashOutRecordedContext.md +45 -0
  82. package/docs/src/src/structs/JBBeforePayRecordedContext.sol/struct.JBBeforePayRecordedContext.md +41 -0
  83. package/docs/src/src/structs/JBCashOutHookSpecification.sol/struct.JBCashOutHookSpecification.md +22 -0
  84. package/docs/src/src/structs/JBCurrencyAmount.sol/struct.JBCurrencyAmount.md +17 -0
  85. package/docs/src/src/structs/JBFee.sol/struct.JBFee.md +20 -0
  86. package/docs/src/src/structs/JBFundAccessLimitGroup.sol/struct.JBFundAccessLimitGroup.md +39 -0
  87. package/docs/src/src/structs/JBPayHookSpecification.sol/struct.JBPayHookSpecification.md +22 -0
  88. package/docs/src/src/structs/JBPermissionsData.sol/struct.JBPermissionsData.md +21 -0
  89. package/docs/src/src/structs/JBRuleset.sol/struct.JBRuleset.md +55 -0
  90. package/docs/src/src/structs/JBRulesetConfig.sol/struct.JBRulesetConfig.md +51 -0
  91. package/docs/src/src/structs/JBRulesetMetadata.sol/struct.JBRulesetMetadata.md +79 -0
  92. package/docs/src/src/structs/JBRulesetWeightCache.sol/struct.JBRulesetWeightCache.md +16 -0
  93. package/docs/src/src/structs/JBRulesetWithMetadata.sol/struct.JBRulesetWithMetadata.md +16 -0
  94. package/docs/src/src/structs/JBSingleAllowance.sol/struct.JBSingleAllowance.md +26 -0
  95. package/docs/src/src/structs/JBSplit.sol/struct.JBSplit.md +49 -0
  96. package/docs/src/src/structs/JBSplitGroup.sol/struct.JBSplitGroup.md +17 -0
  97. package/docs/src/src/structs/JBSplitHookContext.sol/struct.JBSplitHookContext.md +29 -0
  98. package/docs/src/src/structs/JBTerminalConfig.sol/struct.JBTerminalConfig.md +16 -0
  99. package/docs/src/src/structs/JBTokenAmount.sol/struct.JBTokenAmount.md +23 -0
  100. package/docs/src/src/structs/README.md +25 -0
  101. package/foundry.lock +11 -0
  102. package/foundry.toml +41 -0
  103. package/package.json +38 -0
  104. package/remappings.txt +1 -0
  105. package/script/Deploy.s.sol +111 -0
  106. package/script/DeployPeriphery.s.sol +287 -0
  107. package/script/helpers/CoreDeploymentLib.sol +121 -0
  108. package/slither-ci.config.json +10 -0
  109. package/sphinx.lock +507 -0
  110. package/src/JBChainlinkV3PriceFeed.sol +77 -0
  111. package/src/JBChainlinkV3SequencerPriceFeed.sol +75 -0
  112. package/src/JBController.sol +1186 -0
  113. package/src/JBDeadline.sol +73 -0
  114. package/src/JBDirectory.sol +343 -0
  115. package/src/JBERC20.sol +131 -0
  116. package/src/JBFeelessAddresses.sol +54 -0
  117. package/src/JBFundAccessLimits.sol +308 -0
  118. package/src/JBMultiTerminal.sol +2024 -0
  119. package/src/JBPermissions.sol +252 -0
  120. package/src/JBPrices.sol +227 -0
  121. package/src/JBProjects.sol +126 -0
  122. package/src/JBRulesets.sol +1093 -0
  123. package/src/JBSplits.sol +324 -0
  124. package/src/JBTerminalStore.sol +908 -0
  125. package/src/JBTokens.sol +376 -0
  126. package/src/abstract/JBControlled.sol +48 -0
  127. package/src/abstract/JBPermissioned.sol +77 -0
  128. package/src/enums/JBApprovalStatus.sol +12 -0
  129. package/src/interfaces/IJBCashOutHook.sol +15 -0
  130. package/src/interfaces/IJBCashOutTerminal.sol +51 -0
  131. package/src/interfaces/IJBControlled.sol +10 -0
  132. package/src/interfaces/IJBController.sol +280 -0
  133. package/src/interfaces/IJBDirectory.sol +69 -0
  134. package/src/interfaces/IJBDirectoryAccessControl.sol +15 -0
  135. package/src/interfaces/IJBFeeTerminal.sol +61 -0
  136. package/src/interfaces/IJBFeelessAddresses.sol +17 -0
  137. package/src/interfaces/IJBFundAccessLimits.sol +94 -0
  138. package/src/interfaces/IJBMigratable.sol +24 -0
  139. package/src/interfaces/IJBMultiTerminal.sol +36 -0
  140. package/src/interfaces/IJBPayHook.sol +14 -0
  141. package/src/interfaces/IJBPayoutTerminal.sol +92 -0
  142. package/src/interfaces/IJBPermissioned.sol +10 -0
  143. package/src/interfaces/IJBPermissions.sol +71 -0
  144. package/src/interfaces/IJBPermitTerminal.sol +14 -0
  145. package/src/interfaces/IJBPriceFeed.sol +10 -0
  146. package/src/interfaces/IJBPrices.sol +65 -0
  147. package/src/interfaces/IJBProjectUriRegistry.sol +15 -0
  148. package/src/interfaces/IJBProjects.sol +27 -0
  149. package/src/interfaces/IJBRulesetApprovalHook.sol +21 -0
  150. package/src/interfaces/IJBRulesetDataHook.sol +56 -0
  151. package/src/interfaces/IJBRulesets.sol +151 -0
  152. package/src/interfaces/IJBSplitHook.sol +16 -0
  153. package/src/interfaces/IJBSplits.sol +28 -0
  154. package/src/interfaces/IJBTerminal.sol +120 -0
  155. package/src/interfaces/IJBTerminalStore.sol +225 -0
  156. package/src/interfaces/IJBToken.sol +39 -0
  157. package/src/interfaces/IJBTokenUriResolver.sol +10 -0
  158. package/src/interfaces/IJBTokens.sol +113 -0
  159. package/src/libraries/JBCashOuts.sol +120 -0
  160. package/src/libraries/JBConstants.sol +14 -0
  161. package/src/libraries/JBCurrencyIds.sol +7 -0
  162. package/src/libraries/JBFees.sol +28 -0
  163. package/src/libraries/JBFixedPointNumber.sol +12 -0
  164. package/src/libraries/JBMetadataResolver.sol +306 -0
  165. package/src/libraries/JBRulesetMetadataResolver.sol +160 -0
  166. package/src/libraries/JBSplitGroupIds.sol +7 -0
  167. package/src/libraries/JBSurplus.sol +40 -0
  168. package/src/periphery/JBDeadline1Day.sol +8 -0
  169. package/src/periphery/JBDeadline3Days.sol +8 -0
  170. package/src/periphery/JBDeadline3Hours.sol +8 -0
  171. package/src/periphery/JBDeadline7Days.sol +8 -0
  172. package/src/periphery/JBMatchingPriceFeed.sol +13 -0
  173. package/src/structs/JBAccountingContext.sol +12 -0
  174. package/src/structs/JBAfterCashOutRecordedContext.sol +30 -0
  175. package/src/structs/JBAfterPayRecordedContext.sol +29 -0
  176. package/src/structs/JBBeforeCashOutRecordedContext.sol +31 -0
  177. package/src/structs/JBBeforePayRecordedContext.sol +28 -0
  178. package/src/structs/JBCashOutHookSpecification.sol +15 -0
  179. package/src/structs/JBCurrencyAmount.sol +10 -0
  180. package/src/structs/JBFee.sol +12 -0
  181. package/src/structs/JBFundAccessLimitGroup.sol +28 -0
  182. package/src/structs/JBPayHookSpecification.sol +15 -0
  183. package/src/structs/JBPermissionsData.sol +13 -0
  184. package/src/structs/JBRuleset.sol +42 -0
  185. package/src/structs/JBRulesetConfig.sol +43 -0
  186. package/src/structs/JBRulesetMetadata.sol +56 -0
  187. package/src/structs/JBRulesetWeightCache.sol +9 -0
  188. package/src/structs/JBRulesetWithMetadata.sol +12 -0
  189. package/src/structs/JBSingleAllowance.sol +16 -0
  190. package/src/structs/JBSplit.sol +37 -0
  191. package/src/structs/JBSplitGroup.sol +12 -0
  192. package/src/structs/JBSplitHookContext.sol +20 -0
  193. package/src/structs/JBTerminalConfig.sol +12 -0
  194. package/src/structs/JBTokenAmount.sol +14 -0
  195. package/test/AuditExploits.t.sol +2710 -0
  196. package/test/ComprehensiveInvariant.t.sol +298 -0
  197. package/test/EconomicSimulation.t.sol +340 -0
  198. package/test/EntryPointPermutations.t.sol +671 -0
  199. package/test/FlashLoanAttacks.t.sol +792 -0
  200. package/test/PermissionEscalation.t.sol +679 -0
  201. package/test/RulesetTransitions.t.sol +699 -0
  202. package/test/SplitLoopTests.t.sol +731 -0
  203. package/test/TestAccessToFunds.sol +2644 -0
  204. package/test/TestCashOut.sol +185 -0
  205. package/test/TestCashOutCountFor.sol +272 -0
  206. package/test/TestCashOutHooks.sol +317 -0
  207. package/test/TestCashOutTimingEdge.sol +229 -0
  208. package/test/TestDurationUnderflow.sol +220 -0
  209. package/test/TestFeeProcessingFailure.sol +208 -0
  210. package/test/TestFees.sol +604 -0
  211. package/test/TestInterfaceSupport.sol +62 -0
  212. package/test/TestJBERC20Inheritance.sol +91 -0
  213. package/test/TestLaunchProject.sol +176 -0
  214. package/test/TestMetaTx.sol +203 -0
  215. package/test/TestMetadataParserLib.sol +438 -0
  216. package/test/TestMigrationHeldFees.sol +249 -0
  217. package/test/TestMintTokensOf.sol +172 -0
  218. package/test/TestMultiTokenSurplus.sol +206 -0
  219. package/test/TestMultipleAccessLimits.sol +642 -0
  220. package/test/TestPayBurnRedeemFlow.sol +180 -0
  221. package/test/TestPayHooks.sol +190 -0
  222. package/test/TestPermissions.sol +305 -0
  223. package/test/TestPermissionsEdge.sol +286 -0
  224. package/test/TestPermit2Terminal.sol +339 -0
  225. package/test/TestRulesetQueueing.sol +1001 -0
  226. package/test/TestRulesetQueuingStress.sol +778 -0
  227. package/test/TestRulesetWeightCaching.sol +177 -0
  228. package/test/TestSplits.sol +369 -0
  229. package/test/TestTerminalMigration.sol +167 -0
  230. package/test/TestTokenFlow.sol +174 -0
  231. package/test/WeirdTokenTests.t.sol +764 -0
  232. package/test/formal/BondingCurveProperties.t.sol +411 -0
  233. package/test/formal/FeeProperties.t.sol +246 -0
  234. package/test/helpers/JBTest.sol +129 -0
  235. package/test/helpers/MetadataResolverHelper.sol +116 -0
  236. package/test/helpers/TestBaseWorkflow.sol +317 -0
  237. package/test/invariants/Phase3DeepInvariant.t.sol +404 -0
  238. package/test/invariants/RulesetsInvariant.t.sol +115 -0
  239. package/test/invariants/TerminalStoreInvariant.t.sol +220 -0
  240. package/test/invariants/TokensInvariant.t.sol +184 -0
  241. package/test/invariants/handlers/ComprehensiveHandler.sol +285 -0
  242. package/test/invariants/handlers/EconomicHandler.sol +347 -0
  243. package/test/invariants/handlers/Phase3Handler.sol +414 -0
  244. package/test/invariants/handlers/RulesetsHandler.sol +111 -0
  245. package/test/invariants/handlers/TerminalStoreHandler.sol +146 -0
  246. package/test/invariants/handlers/TokensHandler.sol +127 -0
  247. package/test/mock/ERC2771ForwarderMock.sol +37 -0
  248. package/test/mock/MockERC20.sol +18 -0
  249. package/test/mock/MockMaliciousBeneficiary.sol +67 -0
  250. package/test/mock/MockMaliciousSplitHook.sol +42 -0
  251. package/test/mock/MockPriceFeed.sol +20 -0
  252. package/test/trees/JBController/burnTokensOf.tree +9 -0
  253. package/test/trees/JBController/claimTokensFor.tree +5 -0
  254. package/test/trees/JBController/deployERC20For.tree +5 -0
  255. package/test/trees/JBController/getRulesetOf.tree +5 -0
  256. package/test/trees/JBController/launchProjectFor.tree +12 -0
  257. package/test/trees/JBController/launchRulesetsFor.tree +8 -0
  258. package/test/trees/JBController/migrateController.tree +12 -0
  259. package/test/trees/JBController/mintTokensOf.tree +12 -0
  260. package/test/trees/JBController/payReservedTokenToTerminal.tree +8 -0
  261. package/test/trees/JBController/receiveMigrationFrom.tree +4 -0
  262. package/test/trees/JBController/sendReservedTokensToSplitsOf.tree +12 -0
  263. package/test/trees/JBController/setMetadataOf.tree +5 -0
  264. package/test/trees/JBController/setSplitGroupsOf.tree +5 -0
  265. package/test/trees/JBController/setTokenFor.tree +5 -0
  266. package/test/trees/JBController/transferCreditsFrom.tree +8 -0
  267. package/test/trees/JBDirectory/primaryTerminalOf.tree +8 -0
  268. package/test/trees/JBDirectory/setControllerOf.tree +11 -0
  269. package/test/trees/JBDirectory/setPrimaryTerminalOf.tree +15 -0
  270. package/test/trees/JBDirectory/setTerminalsOf.tree +11 -0
  271. package/test/trees/JBERC20/initialize.tree +7 -0
  272. package/test/trees/JBERC20/name.tree +5 -0
  273. package/test/trees/JBERC20/nonces.tree +5 -0
  274. package/test/trees/JBERC20/symbol.tree +5 -0
  275. package/test/trees/JBFeelessAddresses/setFeelessAddress.tree +5 -0
  276. package/test/trees/JBFeelessAddresses/supportsInterface.tree +5 -0
  277. package/test/trees/JBFundAccessLimits/payoutLimitOf.tree +5 -0
  278. package/test/trees/JBFundAccessLimits/payoutLimitsOf.tree +8 -0
  279. package/test/trees/JBFundAccessLimits/setFundAccessLimitsFor.tree +18 -0
  280. package/test/trees/JBFundAccessLimits/surplusAllowanceOf.tree +5 -0
  281. package/test/trees/JBFundAccessLimits/surplusAllowancesOf.tree +8 -0
  282. package/test/trees/JBMetadataResolver/getDataFor.tree +8 -0
  283. package/test/trees/JBMultiTerminal/accountingContextsOf.tree +5 -0
  284. package/test/trees/JBMultiTerminal/addAccountingContextsFor.tree +10 -0
  285. package/test/trees/JBMultiTerminal/addToBalanceOf.tree +23 -0
  286. package/test/trees/JBMultiTerminal/cashOutTokensOf.tree +23 -0
  287. package/test/trees/JBMultiTerminal/executePayout.tree +32 -0
  288. package/test/trees/JBMultiTerminal/executeProcessFee.tree +14 -0
  289. package/test/trees/JBMultiTerminal/migrateBalanceOf.tree +12 -0
  290. package/test/trees/JBMultiTerminal/pay.tree +23 -0
  291. package/test/trees/JBMultiTerminal/processHeldFeesOf.tree +8 -0
  292. package/test/trees/JBMultiTerminal/sendPayoutsOf.tree +34 -0
  293. package/test/trees/JBMultiTerminal/useAllowanceOf.tree +16 -0
  294. package/test/trees/JBPermissions/hasPermission.tree +8 -0
  295. package/test/trees/JBPermissions/hasPermissions.tree +8 -0
  296. package/test/trees/JBPermissions/setPermissionsFor.tree +5 -0
  297. package/test/trees/JBPrices/addPriceFeedFor.tree +14 -0
  298. package/test/trees/JBPrices/pricePerUnitOf.tree +11 -0
  299. package/test/trees/JBProjects/createFor.tree +11 -0
  300. package/test/trees/JBProjects/setTokenUriResolver.tree +5 -0
  301. package/test/trees/JBProjects/supportsInterface.tree +9 -0
  302. package/test/trees/JBProjects/tokenURI.tree +5 -0
  303. package/test/trees/JBRulesets/currentApprovalStatusForLatestRulesetOf.tree +8 -0
  304. package/test/trees/JBRulesets/currentOf.tree +12 -0
  305. package/test/trees/JBRulesets/getRulesetOf.tree +5 -0
  306. package/test/trees/JBRulesets/latestQueuedRulesetOf.tree +10 -0
  307. package/test/trees/JBRulesets/rulesetsOf.tree +11 -0
  308. package/test/trees/JBRulesets/upcomingRulesetOf.tree +20 -0
  309. package/test/trees/JBRulesets/updateRulesetWeightCache.tree +5 -0
  310. package/test/trees/JBSplits/setSplitGroupsOf.tree +17 -0
  311. package/test/trees/JBSplits/splitsOf.tree +5 -0
  312. package/test/trees/JBTerminalStore/currentReclaimableSurplusOf.tree +16 -0
  313. package/test/trees/JBTerminalStore/currentSurplusOf.tree +25 -0
  314. package/test/trees/JBTerminalStore/currentTotalSurplusOf.tree +5 -0
  315. package/test/trees/JBTerminalStore/recordCashOutsFor.tree +16 -0
  316. package/test/trees/JBTerminalStore/recordPaymentFrom.tree +14 -0
  317. package/test/trees/JBTerminalStore/recordPayoutFor.tree +10 -0
  318. package/test/trees/JBTerminalStore/recordTerminalMigration.tree +5 -0
  319. package/test/trees/JBTerminalStore/recordUsedAllowanceOf.tree +10 -0
  320. package/test/trees/JBTokens/burnFrom.tree +10 -0
  321. package/test/trees/JBTokens/claimTokensFor.tree +10 -0
  322. package/test/trees/JBTokens/deployERC20For.tree +12 -0
  323. package/test/trees/JBTokens/mintFor.tree +10 -0
  324. package/test/trees/JBTokens/setTokenFor.tree +11 -0
  325. package/test/trees/JBTokens/totalBalanceOf.tree +5 -0
  326. package/test/trees/JBTokens/totalSupplyOf.tree +5 -0
  327. package/test/trees/JBTokens/transferCreditsFrom.tree +8 -0
  328. package/test/trees/mintTokensOf.tree +12 -0
  329. package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +220 -0
  330. package/test/units/static/JBController/JBControllerSetup.sol +40 -0
  331. package/test/units/static/JBController/TestBurnTokensOf.sol +107 -0
  332. package/test/units/static/JBController/TestClaimTokensFor.sol +60 -0
  333. package/test/units/static/JBController/TestDeployErc20For.sol +80 -0
  334. package/test/units/static/JBController/TestLaunchProjectFor.sol +282 -0
  335. package/test/units/static/JBController/TestLaunchRulesetsFor.sol +322 -0
  336. package/test/units/static/JBController/TestMigrateController.sol +148 -0
  337. package/test/units/static/JBController/TestMintTokensOfUnits.sol +102 -0
  338. package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +71 -0
  339. package/test/units/static/JBController/TestReceiveMigrationFrom.sol +95 -0
  340. package/test/units/static/JBController/TestRulesetViews.sol +219 -0
  341. package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +595 -0
  342. package/test/units/static/JBController/TestSetSplitGroupsOf.sol +63 -0
  343. package/test/units/static/JBController/TestSetTokenFor.sol +227 -0
  344. package/test/units/static/JBController/TestSetUriOf.sol +53 -0
  345. package/test/units/static/JBController/TestTransferCreditsFrom.sol +159 -0
  346. package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +194 -0
  347. package/test/units/static/JBDirectory/JBDirectorySetup.sol +22 -0
  348. package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +122 -0
  349. package/test/units/static/JBDirectory/TestSetControllerOf.sol +173 -0
  350. package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +98 -0
  351. package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +169 -0
  352. package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +128 -0
  353. package/test/units/static/JBERC20/JBERC20Setup.sol +20 -0
  354. package/test/units/static/JBERC20/SigUtils.sol +34 -0
  355. package/test/units/static/JBERC20/TestInitialize.sol +54 -0
  356. package/test/units/static/JBERC20/TestName.sol +30 -0
  357. package/test/units/static/JBERC20/TestNonces.sol +59 -0
  358. package/test/units/static/JBERC20/TestSymbol.sol +31 -0
  359. package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +20 -0
  360. package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +29 -0
  361. package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +35 -0
  362. package/test/units/static/JBFees/TestFeesFuzz.sol +78 -0
  363. package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +16 -0
  364. package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +71 -0
  365. package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +21 -0
  366. package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +159 -0
  367. package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +56 -0
  368. package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +94 -0
  369. package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +182 -0
  370. package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +61 -0
  371. package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +96 -0
  372. package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +89 -0
  373. package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +227 -0
  374. package/test/units/static/JBMetadataResolver/TestMetadataResolverM20M21.sol +245 -0
  375. package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +39 -0
  376. package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +65 -0
  377. package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +313 -0
  378. package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +432 -0
  379. package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +478 -0
  380. package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +577 -0
  381. package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +176 -0
  382. package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +190 -0
  383. package/test/units/static/JBMultiTerminal/TestPay.sol +514 -0
  384. package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +29 -0
  385. package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +243 -0
  386. package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +310 -0
  387. package/test/units/static/JBPermissions/JBPermissionsSetup.sol +18 -0
  388. package/test/units/static/JBPermissions/TestHasPermission.sol +50 -0
  389. package/test/units/static/JBPermissions/TestHasPermissions.sol +93 -0
  390. package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +62 -0
  391. package/test/units/static/JBPrices/JBPricesSetup.sol +26 -0
  392. package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +102 -0
  393. package/test/units/static/JBPrices/TestPricePerUnitOf.sol +129 -0
  394. package/test/units/static/JBPrices/TestPrices.sol +262 -0
  395. package/test/units/static/JBProjects/JBProjectsSetup.sol +20 -0
  396. package/test/units/static/JBProjects/TestCreateFor.sol +69 -0
  397. package/test/units/static/JBProjects/TestInitialProject.sol +19 -0
  398. package/test/units/static/JBProjects/TestInterfaces.sol +27 -0
  399. package/test/units/static/JBProjects/TestSetResolver.sol +36 -0
  400. package/test/units/static/JBProjects/TestTokenUri.sol +38 -0
  401. package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +99 -0
  402. package/test/units/static/JBRulesets/JBRulesetsSetup.sol +21 -0
  403. package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +257 -0
  404. package/test/units/static/JBRulesets/TestCurrentOf.sol +231 -0
  405. package/test/units/static/JBRulesets/TestGetRulesetOf.sol +94 -0
  406. package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +252 -0
  407. package/test/units/static/JBRulesets/TestRulesets.sol +617 -0
  408. package/test/units/static/JBRulesets/TestRulesetsOf.sol +37 -0
  409. package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +526 -0
  410. package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +91 -0
  411. package/test/units/static/JBSplits/JBSplitsSetup.sol +23 -0
  412. package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +502 -0
  413. package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +370 -0
  414. package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +262 -0
  415. package/test/units/static/JBSplits/TestSplitsOf.sol +24 -0
  416. package/test/units/static/JBSplits/TestSplitsPacking.sol +33 -0
  417. package/test/units/static/JBSurplus/TestSurplusFuzz.sol +125 -0
  418. package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +23 -0
  419. package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +434 -0
  420. package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +428 -0
  421. package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +65 -0
  422. package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +479 -0
  423. package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +508 -0
  424. package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +257 -0
  425. package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +131 -0
  426. package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +390 -0
  427. package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +187 -0
  428. package/test/units/static/JBTokens/JBTokensSetup.sol +23 -0
  429. package/test/units/static/JBTokens/TestBurnFrom.sol +104 -0
  430. package/test/units/static/JBTokens/TestClaimTokensFor.sol +107 -0
  431. package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +89 -0
  432. package/test/units/static/JBTokens/TestMintFor.sol +97 -0
  433. package/test/units/static/JBTokens/TestSetTokenFor.sol +95 -0
  434. package/test/units/static/JBTokens/TestTotalBalanceOf.sol +65 -0
  435. package/test/units/static/JBTokens/TestTotalSupplyOf.sol +56 -0
  436. package/test/units/static/JBTokens/TestTransferCreditsFrom.sol +54 -0
@@ -0,0 +1,479 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBTerminalStoreSetup} from "./JBTerminalStoreSetup.sol";
6
+
7
+ contract TestRecordCashOutsFor_Local is JBTerminalStoreSetup {
8
+ uint64 _projectId = 1;
9
+ uint256 _decimals = 18;
10
+ uint256 _balance = 10e18;
11
+ uint256 _totalSupply = 20e18;
12
+ uint256 _currentSurplus = 3e18;
13
+
14
+ // Mocks
15
+ IJBTerminal _terminal1 = IJBTerminal(makeAddr("terminal1"));
16
+ IJBTerminal _terminal2 = IJBTerminal(makeAddr("terminal2"));
17
+ IJBToken _token = IJBToken(makeAddr("token"));
18
+ IJBController _controller = IJBController(makeAddr("controller"));
19
+ IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
20
+ IJBRulesetDataHook _dataHook = IJBRulesetDataHook(makeAddr("dataHook"));
21
+ IJBCashOutHook _cashOutHook = IJBCashOutHook(makeAddr("cashOutHook"));
22
+
23
+ uint32 _currency = uint32(uint160(address(_token)));
24
+ address _nativeAddress = JBConstants.NATIVE_TOKEN;
25
+ uint32 _nativeCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
26
+
27
+ function setUp() public {
28
+ super.terminalStoreSetup();
29
+ }
30
+
31
+ modifier whenCurrentRulesetUseTotalSurplusForCashOutsEqTrue() {
32
+ // Find the storage slot
33
+ bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
34
+ bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
35
+ bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
36
+
37
+ bytes32 balanceBytes = bytes32(_balance);
38
+
39
+ // Set balance
40
+ vm.store(address(_store), slot, balanceBytes);
41
+
42
+ // Ensure balance is set correctly
43
+ uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_token));
44
+ assertEq(_balanceCallReturn, _balance);
45
+
46
+ // return data for mock call
47
+ IJBTerminal[] memory _terminals = new IJBTerminal[](2);
48
+ _terminals[0] = _terminal1;
49
+ _terminals[1] = _terminal2;
50
+
51
+ // mock call to JBDirectory terminalsOf
52
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
53
+ bytes memory _returned = abi.encode(_terminals);
54
+ mockExpect(address(directory), _directoryCall, _returned);
55
+
56
+ // mock call to first terminal currentSurplusOf
57
+ bytes memory _terminal1Call = abi.encodeCall(
58
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
59
+ );
60
+ bytes memory _terminal1Return = abi.encode(1e18);
61
+ mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
62
+
63
+ // mock call to first terminal currentSurplusOf
64
+ bytes memory _terminal2Call = abi.encodeCall(
65
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
66
+ );
67
+ bytes memory _terminal2Return = abi.encode(2e18);
68
+ mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
69
+
70
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
71
+ reservedPercent: 0,
72
+ cashOutTaxRate: 0,
73
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
74
+ pausePay: true,
75
+ pauseCreditTransfers: false,
76
+ allowOwnerMinting: false,
77
+ allowSetCustomToken: false,
78
+ allowTerminalMigration: false,
79
+ allowSetTerminals: false,
80
+ ownerMustSendPayouts: false,
81
+ allowSetController: false,
82
+ allowAddAccountingContext: true,
83
+ allowAddPriceFeed: false,
84
+ holdFees: false,
85
+ useTotalSurplusForCashOuts: true,
86
+ useDataHookForPay: false,
87
+ useDataHookForCashOut: false,
88
+ dataHook: address(0),
89
+ metadata: 0
90
+ });
91
+
92
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
93
+
94
+ // JBRulesets return calldata
95
+ JBRuleset memory _returnedRuleset = JBRuleset({
96
+ cycleNumber: uint48(block.timestamp),
97
+ id: uint48(block.timestamp),
98
+ basedOnId: 0,
99
+ start: uint48(block.timestamp),
100
+ duration: uint32(block.timestamp + 1000),
101
+ weight: 1e18,
102
+ weightCutPercent: 0,
103
+ approvalHook: IJBRulesetApprovalHook(address(0)),
104
+ metadata: _packedMetadata
105
+ });
106
+
107
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
108
+ bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
109
+ mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
110
+
111
+ // mock call to JBDirectory controllerOf
112
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
113
+ _;
114
+ }
115
+
116
+ modifier whenCallerBalanceIsZero() {
117
+ // Find the storage slot
118
+ bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
119
+ bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
120
+ bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
121
+
122
+ bytes32 balanceBytes = bytes32(0);
123
+
124
+ // Set balance
125
+ vm.store(address(_store), slot, balanceBytes);
126
+
127
+ // Ensure balance is set correctly
128
+ uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_token));
129
+ assertEq(_balanceCallReturn, 0);
130
+
131
+ // return data for mock call
132
+ IJBTerminal[] memory _terminals = new IJBTerminal[](2);
133
+ _terminals[0] = _terminal1;
134
+ _terminals[1] = _terminal2;
135
+
136
+ // mock call to JBDirectory terminalsOf
137
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
138
+ bytes memory _returned = abi.encode(_terminals);
139
+ mockExpect(address(directory), _directoryCall, _returned);
140
+
141
+ // mock call to first terminal currentSurplusOf
142
+ bytes memory _terminal1Call = abi.encodeCall(
143
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
144
+ );
145
+ bytes memory _terminal1Return = abi.encode(1e18);
146
+ mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
147
+
148
+ // mock call to first terminal currentSurplusOf
149
+ bytes memory _terminal2Call = abi.encodeCall(
150
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
151
+ );
152
+ bytes memory _terminal2Return = abi.encode(2e18);
153
+ mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
154
+
155
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
156
+ reservedPercent: 0,
157
+ cashOutTaxRate: 0,
158
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
159
+ pausePay: true,
160
+ pauseCreditTransfers: false,
161
+ allowOwnerMinting: false,
162
+ allowSetCustomToken: false,
163
+ allowTerminalMigration: false,
164
+ allowSetTerminals: false,
165
+ ownerMustSendPayouts: false,
166
+ allowSetController: false,
167
+ allowAddAccountingContext: true,
168
+ allowAddPriceFeed: false,
169
+ holdFees: false,
170
+ useTotalSurplusForCashOuts: true,
171
+ useDataHookForPay: false,
172
+ useDataHookForCashOut: false,
173
+ dataHook: address(0),
174
+ metadata: 0
175
+ });
176
+
177
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
178
+
179
+ // JBRulesets return calldata
180
+ JBRuleset memory _returnedRuleset = JBRuleset({
181
+ cycleNumber: uint48(block.timestamp),
182
+ id: uint48(block.timestamp),
183
+ basedOnId: 0,
184
+ start: uint48(block.timestamp),
185
+ duration: uint32(block.timestamp + 1000),
186
+ weight: 1e18,
187
+ weightCutPercent: 0,
188
+ approvalHook: IJBRulesetApprovalHook(address(0)),
189
+ metadata: _packedMetadata
190
+ });
191
+
192
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
193
+ bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
194
+ mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
195
+
196
+ // mock call to JBDirectory controllerOf
197
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
198
+ _;
199
+ }
200
+
201
+ modifier whenCurrentRulesetUseTotalSurplusForCashOutsEqTrueWithHook() {
202
+ // Find the storage slot
203
+ bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
204
+ bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
205
+ bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
206
+
207
+ bytes32 balanceBytes = bytes32(_balance);
208
+
209
+ // Set balance
210
+ vm.store(address(_store), slot, balanceBytes);
211
+
212
+ // Ensure balance is set correctly
213
+ uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_token));
214
+ assertEq(_balanceCallReturn, _balance);
215
+
216
+ // return data for mock call
217
+ IJBTerminal[] memory _terminals = new IJBTerminal[](2);
218
+ _terminals[0] = _terminal1;
219
+ _terminals[1] = _terminal2;
220
+
221
+ // mock call to JBDirectory terminalsOf
222
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
223
+ bytes memory _returned = abi.encode(_terminals);
224
+ mockExpect(address(directory), _directoryCall, _returned);
225
+
226
+ // mock call to first terminal currentSurplusOf
227
+ bytes memory _terminal1Call = abi.encodeCall(
228
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
229
+ );
230
+ bytes memory _terminal1Return = abi.encode(1e18);
231
+ mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
232
+
233
+ // mock call to first terminal currentSurplusOf
234
+ bytes memory _terminal2Call = abi.encodeCall(
235
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
236
+ );
237
+ bytes memory _terminal2Return = abi.encode(2e18);
238
+ mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
239
+
240
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
241
+ reservedPercent: 0,
242
+ cashOutTaxRate: 0,
243
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
244
+ pausePay: true,
245
+ pauseCreditTransfers: false,
246
+ allowOwnerMinting: false,
247
+ allowSetCustomToken: false,
248
+ allowTerminalMigration: false,
249
+ allowSetTerminals: false,
250
+ ownerMustSendPayouts: false,
251
+ allowSetController: false,
252
+ allowAddAccountingContext: true,
253
+ allowAddPriceFeed: false,
254
+ holdFees: false,
255
+ useTotalSurplusForCashOuts: true,
256
+ useDataHookForPay: false,
257
+ useDataHookForCashOut: true,
258
+ dataHook: address(_dataHook),
259
+ metadata: 0
260
+ });
261
+
262
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
263
+
264
+ // JBRulesets return calldata
265
+ JBRuleset memory _returnedRuleset = JBRuleset({
266
+ cycleNumber: uint48(block.timestamp),
267
+ id: uint48(block.timestamp),
268
+ basedOnId: 0,
269
+ start: uint48(block.timestamp),
270
+ duration: uint32(block.timestamp + 1000),
271
+ weight: 1e18,
272
+ weightCutPercent: 0,
273
+ approvalHook: IJBRulesetApprovalHook(address(0)),
274
+ metadata: _packedMetadata
275
+ });
276
+
277
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
278
+ bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
279
+ mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
280
+
281
+ // mock call to JBDirectory controllerOf
282
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
283
+
284
+ _;
285
+ }
286
+
287
+ function test_GivenTheCashOutCountGtTotalSupply() external whenCurrentRulesetUseTotalSurplusForCashOutsEqTrue {
288
+ // it will revert INSUFFICIENT_TOKENS
289
+
290
+ uint256 _supply = 1e18;
291
+
292
+ // mock JBController totalTokenSupplyWithReservedTokensOf
293
+ mockExpect(
294
+ address(_controller),
295
+ abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
296
+ abi.encode(_supply)
297
+ );
298
+
299
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
300
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
301
+
302
+ // call params
303
+ JBAccountingContext memory _accountingContexts =
304
+ JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
305
+ JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
306
+
307
+ _balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
308
+
309
+ uint256 _cashOutCount = 4e18; // greater than token total supply
310
+
311
+ vm.expectRevert(
312
+ abi.encodeWithSelector(JBTerminalStore.JBTerminalStore_InsufficientTokens.selector, _cashOutCount, _supply)
313
+ );
314
+ _store.recordCashOutFor({
315
+ holder: address(this),
316
+ projectId: _projectId,
317
+ cashOutCount: _cashOutCount,
318
+ accountingContext: _accountingContexts,
319
+ balanceAccountingContexts: _balanceContexts,
320
+ metadata: ""
321
+ });
322
+ }
323
+
324
+ function test_GivenTheCurrentSurplusGtZero() external whenCurrentRulesetUseTotalSurplusForCashOutsEqTrue {
325
+ // it will set reclaim amount using the currentSurplus
326
+
327
+ // mock JBController totalTokenSupplyWithReservedTokensOf
328
+ mockExpect(
329
+ address(_controller),
330
+ abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
331
+ abi.encode(_totalSupply)
332
+ );
333
+
334
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
335
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
336
+
337
+ // call params
338
+ JBAccountingContext memory _accountingContexts =
339
+ JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
340
+ JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
341
+
342
+ _balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
343
+
344
+ uint256 _cashOutCount = 6; // within balance bounds
345
+ uint256 expectedCashOuts = mulDiv(3e18, _cashOutCount, _totalSupply);
346
+
347
+ (, uint256 reclaimed,,) = _store.recordCashOutFor({
348
+ holder: address(this),
349
+ projectId: _projectId,
350
+ cashOutCount: _cashOutCount,
351
+ accountingContext: _accountingContexts,
352
+ balanceAccountingContexts: _balanceContexts,
353
+ metadata: ""
354
+ });
355
+
356
+ assertEq(expectedCashOuts, reclaimed);
357
+ }
358
+
359
+ function test_GivenCurrentRulesetUseDataHookForCashOutEqTrue()
360
+ external
361
+ whenCurrentRulesetUseTotalSurplusForCashOutsEqTrueWithHook
362
+ {
363
+ // it will call the dataHook for the reclaim amount and hookSpecs
364
+
365
+ // mock JBController totalTokenSupplyWithReservedTokensOf
366
+ mockExpect(
367
+ address(_controller),
368
+ abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
369
+ abi.encode(_totalSupply)
370
+ );
371
+
372
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
373
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
374
+
375
+ // call params
376
+ JBAccountingContext memory _accountingContexts =
377
+ JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
378
+ JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
379
+
380
+ _balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
381
+
382
+ uint256 _cashOutCount = 1e18; // within balance bounds
383
+ uint256 expectedCashOuts = mulDiv(3e18, _cashOutCount, _totalSupply);
384
+
385
+ // Create the struct that describes the amount being reclaimed.
386
+ JBTokenAmount memory _reclaimedTokenAmount = JBTokenAmount({
387
+ token: _accountingContexts.token,
388
+ value: 3e18,
389
+ decimals: _accountingContexts.decimals,
390
+ currency: _accountingContexts.currency
391
+ });
392
+
393
+ // Create the cash out context that'll be sent to the data hook.
394
+ JBBeforeCashOutRecordedContext memory _context = JBBeforeCashOutRecordedContext({
395
+ terminal: address(this),
396
+ holder: address(this),
397
+ projectId: _projectId,
398
+ rulesetId: uint48(block.timestamp),
399
+ cashOutCount: _cashOutCount,
400
+ totalSupply: _totalSupply,
401
+ surplus: _reclaimedTokenAmount,
402
+ useTotalSurplus: true,
403
+ cashOutTaxRate: 0,
404
+ metadata: ""
405
+ });
406
+
407
+ // return data
408
+ JBCashOutHookSpecification[] memory _spec = new JBCashOutHookSpecification[](1);
409
+ _spec[0] = JBCashOutHookSpecification({hook: _cashOutHook, amount: 0, metadata: ""});
410
+
411
+ // mock call to data hook beforeCashOutRecordedWith
412
+ mockExpect(
413
+ address(_dataHook),
414
+ abi.encodeCall(IJBRulesetDataHook.beforeCashOutRecordedWith, (_context)),
415
+ abi.encode(0, 1e18, _totalSupply, _spec)
416
+ );
417
+
418
+ uint256 balanceBefore = _store.balanceOf(address(this), _projectId, _accountingContexts.token);
419
+
420
+ (, uint256 reclaimed,,) = _store.recordCashOutFor({
421
+ holder: address(this),
422
+ projectId: _projectId,
423
+ cashOutCount: _cashOutCount,
424
+ accountingContext: _accountingContexts,
425
+ balanceAccountingContexts: _balanceContexts,
426
+ metadata: ""
427
+ });
428
+
429
+ // covers GivenTheBalanceDiffGtZero()
430
+ assertEq(
431
+ balanceBefore - expectedCashOuts, _store.balanceOf(address(this), _projectId, _accountingContexts.token)
432
+ );
433
+
434
+ assertEq(expectedCashOuts, reclaimed);
435
+ }
436
+
437
+ function test_GivenTheAmountReclaimedGtCallerBalance() external whenCallerBalanceIsZero {
438
+ // it will revert INADEQUATE_TERMINAL_STORE_BALANCE
439
+
440
+ uint256 _totalTokens = 10e18;
441
+
442
+ // mock JBController totalTokenSupplyWithReservedTokensOf
443
+ mockExpect(
444
+ address(_controller),
445
+ abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
446
+ abi.encode(_totalTokens)
447
+ );
448
+
449
+ // call params
450
+ JBAccountingContext memory _accountingContexts =
451
+ JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
452
+ JBAccountingContext[] memory _balanceContexts = new JBAccountingContext[](1);
453
+
454
+ _balanceContexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
455
+
456
+ uint256 _cashOutCount = 4e18; // greater than caller balance
457
+
458
+ uint256 reclaimAmount = mulDiv(_currentSurplus, _cashOutCount, _totalTokens);
459
+
460
+ vm.expectRevert(
461
+ abi.encodeWithSelector(
462
+ JBTerminalStore.JBTerminalStore_InadequateTerminalStoreBalance.selector, reclaimAmount, 0
463
+ )
464
+ );
465
+ _store.recordCashOutFor({
466
+ holder: address(this),
467
+ projectId: _projectId,
468
+ cashOutCount: _cashOutCount,
469
+ accountingContext: _accountingContexts,
470
+ balanceAccountingContexts: _balanceContexts,
471
+ metadata: ""
472
+ });
473
+ }
474
+
475
+ // Probably unnecessary even though it may give us a bit of cov %.. skipping for now
476
+ /* function test_WhenTheCurrentRulesetUseTotalSurplusForCashOutsEqFalse() external {
477
+ // it will use the standard surplus calculation
478
+ } */
479
+ }