@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,125 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBSurplus} from "../../../../src/libraries/JBSurplus.sol";
6
+
7
+ /// @notice Mock terminal that returns a fixed surplus for testing JBSurplus.
8
+ contract MockSurplusTerminal is ERC165, IJBTerminal {
9
+ uint256 public surplusAmount;
10
+
11
+ constructor(uint256 _surplus) {
12
+ surplusAmount = _surplus;
13
+ }
14
+
15
+ function currentSurplusOf(
16
+ uint256,
17
+ JBAccountingContext[] memory,
18
+ uint256,
19
+ uint256
20
+ )
21
+ external
22
+ view
23
+ override
24
+ returns (uint256)
25
+ {
26
+ return surplusAmount;
27
+ }
28
+
29
+ function supportsInterface(bytes4 interfaceId) public view override(ERC165, IERC165) returns (bool) {
30
+ return interfaceId == type(IJBTerminal).interfaceId || super.supportsInterface(interfaceId);
31
+ }
32
+
33
+ // Stub implementations for IJBTerminal
34
+ function accountingContextForTokenOf(uint256, address)
35
+ external
36
+ pure
37
+ override
38
+ returns (JBAccountingContext memory)
39
+ {}
40
+ function accountingContextsOf(uint256) external pure override returns (JBAccountingContext[] memory) {}
41
+ function addAccountingContextsFor(uint256, JBAccountingContext[] calldata) external override {}
42
+ function addToBalanceOf(
43
+ uint256,
44
+ address,
45
+ uint256,
46
+ bool,
47
+ string calldata,
48
+ bytes calldata
49
+ )
50
+ external
51
+ payable
52
+ override
53
+ {}
54
+
55
+ function migrateBalanceOf(uint256, address, IJBTerminal) external override returns (uint256) {
56
+ return 0;
57
+ }
58
+
59
+ function pay(
60
+ uint256,
61
+ address,
62
+ uint256,
63
+ address,
64
+ uint256,
65
+ string calldata,
66
+ bytes calldata
67
+ )
68
+ external
69
+ payable
70
+ override
71
+ returns (uint256)
72
+ {
73
+ return 0;
74
+ }
75
+ }
76
+
77
+ /// @notice Fuzz tests for the JBSurplus library.
78
+ contract TestSurplusFuzz_Local is JBTest {
79
+ function setUp() external {}
80
+
81
+ /// @notice Surplus with no terminals is 0.
82
+ function testFuzz_noTerminals_returnsZero(uint256 projectId) external view {
83
+ IJBTerminal[] memory terminals = new IJBTerminal[](0);
84
+ JBAccountingContext[] memory contexts = new JBAccountingContext[](0);
85
+
86
+ uint256 surplus = JBSurplus.currentSurplusOf(projectId, terminals, contexts, 18, 1);
87
+ assertEq(surplus, 0, "surplus with no terminals should be 0");
88
+ }
89
+
90
+ /// @notice Surplus aggregates correctly across multiple terminals.
91
+ function testFuzz_multipleTerminals_aggregates(uint128 surplus1, uint128 surplus2) external {
92
+ MockSurplusTerminal terminal1 = new MockSurplusTerminal(surplus1);
93
+ MockSurplusTerminal terminal2 = new MockSurplusTerminal(surplus2);
94
+
95
+ IJBTerminal[] memory terminals = new IJBTerminal[](2);
96
+ terminals[0] = terminal1;
97
+ terminals[1] = terminal2;
98
+
99
+ JBAccountingContext[] memory contexts = new JBAccountingContext[](0);
100
+
101
+ uint256 total = JBSurplus.currentSurplusOf(1, terminals, contexts, 18, 1);
102
+ assertEq(total, uint256(surplus1) + uint256(surplus2), "surplus should be sum of all terminals");
103
+ }
104
+
105
+ /// @notice Surplus is monotonically increasing as terminal surpluses increase.
106
+ function testFuzz_monotonic(uint128 surplus1, uint128 surplus2) external {
107
+ vm.assume(surplus1 <= surplus2);
108
+
109
+ MockSurplusTerminal terminal1 = new MockSurplusTerminal(surplus1);
110
+ MockSurplusTerminal terminal2 = new MockSurplusTerminal(surplus2);
111
+
112
+ IJBTerminal[] memory terminals1 = new IJBTerminal[](1);
113
+ terminals1[0] = terminal1;
114
+
115
+ IJBTerminal[] memory terminals2 = new IJBTerminal[](1);
116
+ terminals2[0] = terminal2;
117
+
118
+ JBAccountingContext[] memory contexts = new JBAccountingContext[](0);
119
+
120
+ uint256 total1 = JBSurplus.currentSurplusOf(1, terminals1, contexts, 18, 1);
121
+ uint256 total2 = JBSurplus.currentSurplusOf(1, terminals2, contexts, 18, 1);
122
+
123
+ assertLe(total1, total2, "surplus should be monotonically increasing");
124
+ }
125
+ }
@@ -0,0 +1,23 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+
6
+ /*
7
+ Contract that deploys a target contract with other mock contracts to satisfy the constructor.
8
+ Tests relative to this contract will be dependent on mock calls/emits and stdStorage.
9
+ */
10
+ contract JBTerminalStoreSetup is JBTest {
11
+ // Mocks
12
+ IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
13
+ IJBRulesets public rulesets = IJBRulesets(makeAddr("rules"));
14
+ IJBPrices public prices = IJBPrices(makeAddr("prices"));
15
+
16
+ // Target Contract
17
+ IJBTerminalStore public _store;
18
+
19
+ function terminalStoreSetup() public virtual {
20
+ // Instantiate the contract being tested
21
+ _store = new JBTerminalStore(directory, prices, rulesets);
22
+ }
23
+ }
@@ -0,0 +1,434 @@
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
+ import {JBCashOuts} from "../../../../src/libraries/JBCashOuts.sol";
7
+
8
+ contract TestCurrentReclaimableSurplusOf_Local is JBTerminalStoreSetup {
9
+ using JBRulesetMetadataResolver for JBRulesetMetadata;
10
+
11
+ uint256 _projectId = 1;
12
+ uint256 _balance = 1e18;
13
+
14
+ // Mocks
15
+ IJBTerminal _terminal = IJBTerminal(makeAddr("terminal"));
16
+ IJBToken _token = IJBToken(makeAddr("token"));
17
+ IJBController _controller = IJBController(makeAddr("controller"));
18
+ IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
19
+
20
+ uint32 _currency = uint32(uint160(address(_token)));
21
+ uint256 _tokenCount = 1e18;
22
+
23
+ function setUp() public {
24
+ super.terminalStoreSetup();
25
+ }
26
+
27
+ modifier whenProjectHasBalance() {
28
+ // Find the storage slot
29
+ bytes32 balanceOfSlot = keccak256(abi.encode(address(_terminal), uint256(0)));
30
+ bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
31
+ bytes32 slot = keccak256(abi.encode(address(_token), uint256(projectSlot)));
32
+
33
+ bytes32 balanceBytes = bytes32(_balance);
34
+
35
+ // Set balance
36
+ vm.store(address(_store), slot, balanceBytes);
37
+
38
+ // Ensure balance is set correctly
39
+ uint256 _balanceCallReturn = _store.balanceOf(address(_terminal), _projectId, address(_token));
40
+ assertEq(_balanceCallReturn, _balance);
41
+ _;
42
+ }
43
+
44
+ function test_GivenCurrentSurplusEqZero() external {
45
+ // it will return zero
46
+
47
+ // setup calldata
48
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
49
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
50
+
51
+ // JBRulesets return calldata
52
+ JBRuleset memory _returnedRuleset = JBRuleset({
53
+ cycleNumber: uint48(block.timestamp),
54
+ id: uint48(block.timestamp),
55
+ basedOnId: 0,
56
+ start: uint48(block.timestamp),
57
+ duration: uint32(block.timestamp + 1000),
58
+ weight: 1e18,
59
+ weightCutPercent: 0,
60
+ approvalHook: IJBRulesetApprovalHook(address(0)),
61
+ metadata: 0
62
+ });
63
+
64
+ // mock call to JBRulesets currentOf
65
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
66
+
67
+ // mock current surplus as zero
68
+ mockExpect(
69
+ address(_terminal),
70
+ abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
71
+ abi.encode(0)
72
+ );
73
+
74
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
75
+ _terminals[0] = _terminal;
76
+ uint256 reclaimable =
77
+ _store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
78
+ assertEq(0, reclaimable);
79
+ }
80
+
81
+ function test_GivenCurrentSurplusGtZero() external whenProjectHasBalance {
82
+ // it will get the number of outstanding tokens and return the reclaimable surplus
83
+
84
+ // setup calldata
85
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
86
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
87
+
88
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
89
+ reservedPercent: 0,
90
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
91
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
92
+ pausePay: false,
93
+ pauseCreditTransfers: false,
94
+ allowOwnerMinting: false,
95
+ allowSetCustomToken: false,
96
+ allowTerminalMigration: false,
97
+ allowSetTerminals: false,
98
+ ownerMustSendPayouts: false,
99
+ allowSetController: false,
100
+ allowAddAccountingContext: true,
101
+ allowAddPriceFeed: false,
102
+ holdFees: false,
103
+ useTotalSurplusForCashOuts: false,
104
+ useDataHookForPay: false,
105
+ useDataHookForCashOut: false,
106
+ dataHook: address(0),
107
+ metadata: 0
108
+ });
109
+
110
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
111
+
112
+ // JBRulesets return calldata
113
+ JBRuleset memory _returnedRuleset = JBRuleset({
114
+ cycleNumber: uint48(block.timestamp),
115
+ id: uint48(block.timestamp),
116
+ basedOnId: 0,
117
+ start: uint48(block.timestamp),
118
+ duration: uint32(block.timestamp + 1000),
119
+ weight: 1e18,
120
+ weightCutPercent: 0,
121
+ approvalHook: IJBRulesetApprovalHook(address(0)),
122
+ metadata: _packedMetadata
123
+ });
124
+
125
+ // mock call to JBRulesets currentOf
126
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
127
+
128
+ // mock call to JBDirectory controllerOf
129
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
130
+
131
+ // "mock" payout amount since the currentSurplusOf call is mocked
132
+ uint224 _payout = 1e17;
133
+ uint256 _supply = 1e19;
134
+ uint256 _cashoutAmount = 1e18;
135
+
136
+ // surplus call to the terminal
137
+ mockExpect(
138
+ address(_terminal),
139
+ abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
140
+ abi.encode(_supply - _payout)
141
+ );
142
+
143
+ // mock JBController totalTokenSupplyWithReservedTokensOf
144
+ mockExpect(
145
+ address(_controller),
146
+ abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId)),
147
+ abi.encode(_supply)
148
+ );
149
+
150
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
151
+ _terminals[0] = _terminal;
152
+ uint256 reclaimable =
153
+ _store.currentReclaimableSurplusOf(_projectId, _cashoutAmount, _terminals, _contexts, 18, _currency);
154
+
155
+ // The above call should be calculating the reclaimable amount as we are here, so they will be congruent.
156
+ uint256 assumed =
157
+ JBCashOuts.cashOutFrom(_supply - _payout, _cashoutAmount, _supply, JBConstants.MAX_CASH_OUT_TAX_RATE / 2);
158
+
159
+ assertEq(assumed, reclaimable);
160
+ }
161
+
162
+ function test_GivenTokenCountIsEqToTotalSupply() external whenProjectHasBalance {
163
+ // it will return the rest of the surplus
164
+
165
+ // setup calldata
166
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
167
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
168
+
169
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
170
+ reservedPercent: 0,
171
+ cashOutTaxRate: 0,
172
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
173
+ pausePay: false,
174
+ pauseCreditTransfers: false,
175
+ allowOwnerMinting: false,
176
+ allowSetCustomToken: false,
177
+ allowTerminalMigration: false,
178
+ allowSetTerminals: false,
179
+ ownerMustSendPayouts: false,
180
+ allowSetController: false,
181
+ allowAddAccountingContext: true,
182
+ allowAddPriceFeed: false,
183
+ holdFees: false,
184
+ useTotalSurplusForCashOuts: false,
185
+ useDataHookForPay: false,
186
+ useDataHookForCashOut: false,
187
+ dataHook: address(0),
188
+ metadata: 0
189
+ });
190
+
191
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
192
+
193
+ // JBRulesets return calldata
194
+ JBRuleset memory _returnedRuleset = JBRuleset({
195
+ cycleNumber: uint48(block.timestamp),
196
+ id: uint48(block.timestamp),
197
+ basedOnId: 0,
198
+ start: uint48(block.timestamp),
199
+ duration: uint32(block.timestamp + 1000),
200
+ weight: 1e18,
201
+ weightCutPercent: 0,
202
+ approvalHook: IJBRulesetApprovalHook(address(0)),
203
+ metadata: _packedMetadata
204
+ });
205
+
206
+ // mock call to JBRulesets currentOf
207
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
208
+
209
+ // mock call to JBDirectory controllerOf
210
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
211
+
212
+ // mock call to get cumulative surplus
213
+ mockExpect(
214
+ address(_terminal),
215
+ abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
216
+ abi.encode(_tokenCount)
217
+ );
218
+
219
+ // mock JBController totalTokenSupplyWithReservedTokensOf
220
+ bytes memory _totalTokenCall = abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId));
221
+ bytes memory _tokenTotal = abi.encode(_tokenCount);
222
+ mockExpect(address(_controller), _totalTokenCall, _tokenTotal);
223
+
224
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
225
+ _terminals[0] = _terminal;
226
+ uint256 reclaimable =
227
+ _store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
228
+
229
+ // The tokenCount is equal to the total supply, so the reclaimable amount will be the same as the supply. We
230
+ // couldn't reclaim more.
231
+ assertEq(_tokenCount, reclaimable);
232
+ }
233
+
234
+ function test_GivenCashOutTaxRateEqZero() external whenProjectHasBalance {
235
+ // it will return zero
236
+
237
+ // setup calldata
238
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
239
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
240
+
241
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
242
+ reservedPercent: 0,
243
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE, // no surplus can be reclaimed.
244
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
245
+ pausePay: false,
246
+ pauseCreditTransfers: false,
247
+ allowOwnerMinting: false,
248
+ allowSetCustomToken: false,
249
+ allowTerminalMigration: false,
250
+ allowSetTerminals: false,
251
+ ownerMustSendPayouts: false,
252
+ allowSetController: false,
253
+ allowAddAccountingContext: true,
254
+ allowAddPriceFeed: false,
255
+ holdFees: false,
256
+ useTotalSurplusForCashOuts: false,
257
+ useDataHookForPay: false,
258
+ useDataHookForCashOut: false,
259
+ dataHook: address(0),
260
+ metadata: 0
261
+ });
262
+
263
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
264
+
265
+ // JBRulesets return calldata
266
+ JBRuleset memory _returnedRuleset = JBRuleset({
267
+ cycleNumber: uint48(block.timestamp),
268
+ id: uint48(block.timestamp),
269
+ basedOnId: 0,
270
+ start: uint48(block.timestamp),
271
+ duration: uint32(block.timestamp + 1000),
272
+ weight: 1e18,
273
+ weightCutPercent: 0,
274
+ approvalHook: IJBRulesetApprovalHook(address(0)),
275
+ metadata: _packedMetadata
276
+ });
277
+
278
+ // mock call to JBRulesets currentOf
279
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
280
+
281
+ // mock call to JBDirectory controllerOf
282
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
283
+
284
+ JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
285
+ _limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
286
+
287
+ // mock JBController totalTokenSupplyWithReservedTokensOf
288
+ bytes memory _totalTokenCall = abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId));
289
+ bytes memory _tokenTotal = abi.encode(1e18);
290
+ mockExpect(address(_controller), _totalTokenCall, _tokenTotal);
291
+
292
+ // mock current surplus
293
+ mockExpect(
294
+ address(_terminal),
295
+ abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
296
+ abi.encode(1e18)
297
+ );
298
+
299
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
300
+ _terminals[0] = _terminal;
301
+ uint256 reclaimable =
302
+ _store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
303
+
304
+ // No surplus can be reclaimed.
305
+ assertEq(0, reclaimable);
306
+ }
307
+
308
+ function test_GivenCashOutRateDneqMAX_CASH_OUT_RATE() external whenProjectHasBalance {
309
+ // it will return the calculated proportion
310
+
311
+ // setup calldata
312
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
313
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
314
+
315
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
316
+ reservedPercent: 0,
317
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
318
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
319
+ pausePay: false,
320
+ pauseCreditTransfers: false,
321
+ allowOwnerMinting: false,
322
+ allowSetCustomToken: false,
323
+ allowTerminalMigration: false,
324
+ allowSetTerminals: false,
325
+ ownerMustSendPayouts: false,
326
+ allowSetController: false,
327
+ allowAddAccountingContext: true,
328
+ allowAddPriceFeed: false,
329
+ holdFees: false,
330
+ useTotalSurplusForCashOuts: false,
331
+ useDataHookForPay: false,
332
+ useDataHookForCashOut: false,
333
+ dataHook: address(0),
334
+ metadata: 0
335
+ });
336
+
337
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
338
+
339
+ // JBRulesets return calldata
340
+ JBRuleset memory _returnedRuleset = JBRuleset({
341
+ cycleNumber: uint48(block.timestamp),
342
+ id: uint48(block.timestamp),
343
+ basedOnId: 0,
344
+ start: uint48(block.timestamp),
345
+ duration: uint32(block.timestamp + 1000),
346
+ weight: 1e18,
347
+ weightCutPercent: 0,
348
+ approvalHook: IJBRulesetApprovalHook(address(0)),
349
+ metadata: _packedMetadata
350
+ });
351
+
352
+ // mock call to JBRulesets currentOf
353
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
354
+
355
+ // mock call to JBDirectory controllerOf
356
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
357
+
358
+ // mock current surplus
359
+ mockExpect(
360
+ address(_terminal),
361
+ abi.encodeCall(IJBTerminal.currentSurplusOf, (_projectId, _contexts, 18, _currency)),
362
+ abi.encode(1e18)
363
+ );
364
+
365
+ // mock JBController totalTokenSupplyWithReservedTokensOf
366
+ bytes memory _totalTokenCall = abi.encodeCall(IJBController.totalTokenSupplyWithReservedTokensOf, (_projectId));
367
+ bytes memory _tokenTotal = abi.encode(1e18);
368
+ mockExpect(address(_controller), _totalTokenCall, _tokenTotal);
369
+
370
+ uint256 reclaimable;
371
+ {
372
+ IJBTerminal[] memory _terminals = new IJBTerminal[](1);
373
+ _terminals[0] = _terminal;
374
+ reclaimable =
375
+ _store.currentReclaimableSurplusOf(_projectId, _tokenCount, _terminals, _contexts, 18, _currency);
376
+ }
377
+
378
+ uint256 assumed = mulDiv(
379
+ 1e18,
380
+ 5000 + mulDiv(_tokenCount, JBConstants.MAX_CASH_OUT_TAX_RATE - 5000, 1e18),
381
+ JBConstants.MAX_CASH_OUT_TAX_RATE
382
+ );
383
+
384
+ assertEq(assumed, reclaimable);
385
+ }
386
+
387
+ function test_GivenNotOverloaded() external whenProjectHasBalance {
388
+ // it will get the current ruleset and proceed to return reclaimable as above
389
+
390
+ // Params
391
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
392
+ reservedPercent: 0,
393
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE / 2,
394
+ baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
395
+ pausePay: false,
396
+ pauseCreditTransfers: false,
397
+ allowOwnerMinting: false,
398
+ allowSetCustomToken: false,
399
+ allowTerminalMigration: false,
400
+ allowSetTerminals: false,
401
+ ownerMustSendPayouts: false,
402
+ allowSetController: false,
403
+ allowAddAccountingContext: true,
404
+ allowAddPriceFeed: false,
405
+ holdFees: false,
406
+ useTotalSurplusForCashOuts: false,
407
+ useDataHookForPay: false,
408
+ useDataHookForCashOut: false,
409
+ dataHook: address(0),
410
+ metadata: 0
411
+ });
412
+
413
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
414
+
415
+ // JBRulesets return calldata
416
+ JBRuleset memory _returnedRuleset = JBRuleset({
417
+ cycleNumber: uint48(block.timestamp),
418
+ id: uint48(block.timestamp),
419
+ basedOnId: 0,
420
+ start: uint48(block.timestamp),
421
+ duration: uint32(block.timestamp + 1000),
422
+ weight: 1e18,
423
+ weightCutPercent: 0,
424
+ approvalHook: IJBRulesetApprovalHook(address(0)),
425
+ metadata: _packedMetadata
426
+ });
427
+
428
+ // mock call to JBRulesets currentOf
429
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
430
+
431
+ uint256 reclaimable = _store.currentReclaimableSurplusOf(_projectId, _tokenCount, 1e18, 1e18);
432
+ assertEq(1e18, reclaimable);
433
+ }
434
+ }