@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,428 @@
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 TestCurrentSurplusOf_Local is JBTerminalStoreSetup {
8
+ using JBRulesetMetadataResolver for JBRulesetMetadata;
9
+
10
+ uint256 _projectId = 1;
11
+ uint256 _balance = 1e18;
12
+
13
+ // Mocks
14
+ IJBTerminal _terminal = IJBTerminal(makeAddr("terminal"));
15
+ IJBToken _token = IJBToken(makeAddr("token"));
16
+ IJBController _controller = IJBController(makeAddr("controller"));
17
+ IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
18
+
19
+ uint32 _currency = uint32(uint160(address(_token)));
20
+ address _nativeAddress = JBConstants.NATIVE_TOKEN;
21
+ uint32 _nativeCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
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_GivenSurplusRequiresDecimalAdjustmentAndAccountingCurrencyMatchesTargetCurrency()
45
+ external
46
+ whenProjectHasBalance
47
+ {
48
+ // it will adjust surplus to target decimals without conversion
49
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
50
+
51
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
52
+
53
+ // JBRulesets calldata
54
+ JBRuleset memory _returnedRuleset = JBRuleset({
55
+ cycleNumber: uint48(block.timestamp),
56
+ id: uint48(block.timestamp),
57
+ basedOnId: 0,
58
+ start: uint48(block.timestamp),
59
+ duration: uint32(block.timestamp + 1000),
60
+ weight: 1e18,
61
+ weightCutPercent: 0,
62
+ approvalHook: IJBRulesetApprovalHook(address(0)),
63
+ metadata: 0
64
+ });
65
+
66
+ // mock call to JBRulesets currentOf
67
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
68
+
69
+ // mock call to JBDirectory controllerOf
70
+ mockExpect(
71
+ address(directory),
72
+ abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
73
+ abi.encode(address(_controller))
74
+ );
75
+
76
+ // mock call to controller FUND_ACCESS_LIMITS
77
+ mockExpect(
78
+ address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
79
+ );
80
+
81
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
82
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
83
+
84
+ // mock call to fundAccessLimits payoutLimitsOf
85
+ bytes memory _payoutLimitsCall = abi.encodeCall(
86
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
87
+ );
88
+ bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
89
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
90
+
91
+ uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 6, _currency);
92
+
93
+ // assert correct calcs
94
+ uint256 expectedSurplus = (1e18 - 1e17) / 10 ** (18 - 6);
95
+ assertEq(expectedSurplus, currentSurplus);
96
+ }
97
+
98
+ function test_GivenSurplusRequiresDecimalAdjustmentAndAccountingCurrencyDoesNotMatchTargetCurrency()
99
+ external
100
+ whenProjectHasBalance
101
+ {
102
+ // it will convert surplus to target currency with decimal adjustment
103
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
104
+
105
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
106
+
107
+ // JBRulesets calldata
108
+ JBRuleset memory _returnedRuleset = JBRuleset({
109
+ cycleNumber: uint48(block.timestamp),
110
+ id: uint48(block.timestamp),
111
+ basedOnId: 0,
112
+ start: uint48(block.timestamp),
113
+ duration: uint32(block.timestamp + 1000),
114
+ weight: 1e18,
115
+ weightCutPercent: 0,
116
+ approvalHook: IJBRulesetApprovalHook(address(0)),
117
+ metadata: 0
118
+ });
119
+
120
+ // mock call to JBRulesets currentOf
121
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
122
+
123
+ // mock call to JBDirectory controllerOf
124
+ mockExpect(
125
+ address(directory),
126
+ abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
127
+ abi.encode(address(_controller))
128
+ );
129
+
130
+ // mock call to controller FUND_ACCESS_LIMITS
131
+ bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
132
+ bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
133
+ mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
134
+
135
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
136
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
137
+
138
+ // mock call to fundAccessLimits payoutLimitsOf
139
+ bytes memory _payoutLimitsCall = abi.encodeCall(
140
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
141
+ );
142
+ bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
143
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
144
+
145
+ // mock call to JBPrices pricePerUnitOf
146
+ bytes memory _pricePerCall =
147
+ abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
148
+ bytes memory _pricePerReturn = abi.encode(uint256(1));
149
+ mockExpect(address(prices), _pricePerCall, _pricePerReturn);
150
+
151
+ uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 6, _nativeCurrency);
152
+
153
+ // assert correct calcs
154
+ uint256 expectedSurplus = ((1e18 - 1e17) * 1e18) / 10 ** (18 - 6);
155
+ assertEq(expectedSurplus, currentSurplus);
156
+ }
157
+
158
+ function test_GivenAccountingCurrencyMatchesTargetCurrency() external whenProjectHasBalance {
159
+ // it will return standard surplus
160
+
161
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
162
+
163
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
164
+
165
+ // JBRulesets calldata
166
+ JBRuleset memory _returnedRuleset = JBRuleset({
167
+ cycleNumber: uint48(block.timestamp),
168
+ id: uint48(block.timestamp),
169
+ basedOnId: 0,
170
+ start: uint48(block.timestamp),
171
+ duration: uint32(block.timestamp + 1000),
172
+ weight: 1e18,
173
+ weightCutPercent: 0,
174
+ approvalHook: IJBRulesetApprovalHook(address(0)),
175
+ metadata: 0
176
+ });
177
+
178
+ // mock call to JBRulesets currentOf
179
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
180
+
181
+ // mock call to JBDirectory controllerOf
182
+ mockExpect(
183
+ address(directory),
184
+ abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
185
+ abi.encode(address(_controller))
186
+ );
187
+
188
+ // mock call to controller FUND_ACCESS_LIMITS
189
+ mockExpect(
190
+ address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
191
+ );
192
+
193
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
194
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
195
+
196
+ // mock call to fundAccessLimits payoutLimitsOf
197
+ bytes memory _payoutLimitsCall = abi.encodeCall(
198
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
199
+ );
200
+ bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
201
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
202
+
203
+ uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
204
+
205
+ // assert correct calcs
206
+ uint256 expectedSurplus = 1e18 - 1e17;
207
+ assertEq(expectedSurplus, currentSurplus);
208
+ }
209
+
210
+ function test_GivenAccountingCurrencyDoesNotMatchTargetCurrency() external whenProjectHasBalance {
211
+ // it will convert surplus to target currency without decimal adjustment
212
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
213
+
214
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
215
+
216
+ // JBRulesets calldata
217
+ JBRuleset memory _returnedRuleset = JBRuleset({
218
+ cycleNumber: uint48(block.timestamp),
219
+ id: uint48(block.timestamp),
220
+ basedOnId: 0,
221
+ start: uint48(block.timestamp),
222
+ duration: uint32(block.timestamp + 1000),
223
+ weight: 1e18,
224
+ weightCutPercent: 0,
225
+ approvalHook: IJBRulesetApprovalHook(address(0)),
226
+ metadata: 0
227
+ });
228
+
229
+ // mock call to JBRulesets currentOf
230
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
231
+
232
+ // mock call to JBDirectory controllerOf
233
+ mockExpect(
234
+ address(directory),
235
+ abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
236
+ abi.encode(address(_controller))
237
+ );
238
+
239
+ // mock call to controller FUND_ACCESS_LIMITS
240
+ bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
241
+ bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
242
+ mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
243
+
244
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
245
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
246
+
247
+ // mock call to fundAccessLimits payoutLimitsOf
248
+ bytes memory _payoutLimitsCall = abi.encodeCall(
249
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
250
+ );
251
+ bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
252
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
253
+
254
+ // mock call to JBPrices pricePerUnitOf
255
+ bytes memory _pricePerCall =
256
+ abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
257
+ bytes memory _pricePerReturn = abi.encode(uint256(1));
258
+ mockExpect(address(prices), _pricePerCall, _pricePerReturn);
259
+
260
+ uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _nativeCurrency);
261
+
262
+ // assert correct calcs
263
+ uint256 expectedSurplus = (1e18 - 1e17) * 1e18;
264
+ assertEq(expectedSurplus, currentSurplus);
265
+ }
266
+
267
+ function test_GivenPayoutLimitCurrencyMatchesTargetCurrency() external whenProjectHasBalance {
268
+ // it will return standard surplus
269
+
270
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
271
+
272
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
273
+
274
+ // JBRulesets calldata
275
+ JBRuleset memory _returnedRuleset = JBRuleset({
276
+ cycleNumber: uint48(block.timestamp),
277
+ id: uint48(block.timestamp),
278
+ basedOnId: 0,
279
+ start: uint48(block.timestamp),
280
+ duration: uint32(block.timestamp + 1000),
281
+ weight: 1e18,
282
+ weightCutPercent: 0,
283
+ approvalHook: IJBRulesetApprovalHook(address(0)),
284
+ metadata: 0
285
+ });
286
+
287
+ // mock call to JBRulesets currentOf
288
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
289
+
290
+ // mock call to JBDirectory controllerOf
291
+ mockExpect(
292
+ address(directory),
293
+ abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
294
+ abi.encode(address(_controller))
295
+ );
296
+
297
+ // mock call to controller FUND_ACCESS_LIMITS
298
+ bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
299
+ bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
300
+ mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
301
+
302
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
303
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
304
+
305
+ // mock call to fundAccessLimits payoutLimitsOf
306
+ bytes memory _payoutLimitsCall = abi.encodeCall(
307
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
308
+ );
309
+ bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
310
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
311
+
312
+ uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
313
+
314
+ // assert correct calcs
315
+ uint256 expectedSurplus = (1e18 - 1e17);
316
+ assertEq(expectedSurplus, currentSurplus);
317
+ }
318
+
319
+ function test_GivenPayoutLimitCurrencyDoesNotMatchTargetCurrency() external whenProjectHasBalance {
320
+ // it will convert payout limit target currency without decimal adjustment
321
+
322
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
323
+
324
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _nativeCurrency});
325
+
326
+ // JBRulesets calldata
327
+ JBRuleset memory _returnedRuleset = JBRuleset({
328
+ cycleNumber: uint48(block.timestamp),
329
+ id: uint48(block.timestamp),
330
+ basedOnId: 0,
331
+ start: uint48(block.timestamp),
332
+ duration: uint32(block.timestamp + 1000),
333
+ weight: 1e18,
334
+ weightCutPercent: 0,
335
+ approvalHook: IJBRulesetApprovalHook(address(0)),
336
+ metadata: 0
337
+ });
338
+
339
+ // mock call to JBRulesets currentOf
340
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
341
+
342
+ // mock call to JBDirectory controllerOf
343
+ mockExpect(
344
+ address(directory),
345
+ abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
346
+ abi.encode(address(_controller))
347
+ );
348
+
349
+ // mock call to controller FUND_ACCESS_LIMITS
350
+ bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
351
+ bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
352
+ mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
353
+
354
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
355
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e17, currency: _currency});
356
+
357
+ // mock call to fundAccessLimits payoutLimitsOf
358
+ bytes memory _payoutLimitsCall = abi.encodeCall(
359
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
360
+ );
361
+ bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
362
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
363
+
364
+ // mock call to JBPrices pricePerUnitOf
365
+ bytes memory _pricePerCall =
366
+ abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
367
+ bytes memory _pricePerReturn = abi.encode(uint256(1e18));
368
+ mockExpect(address(prices), _pricePerCall, _pricePerReturn);
369
+
370
+ uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _nativeCurrency);
371
+
372
+ // assert correct calcs
373
+ uint256 expectedSurplus = 1e18 - 1e17;
374
+ assertEq(expectedSurplus, currentSurplus);
375
+ }
376
+
377
+ function test_GivenCumulativeBalanceNotGreaterThanCumulativePayoutLimit() external whenProjectHasBalance {
378
+ // it will return zero
379
+
380
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
381
+
382
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
383
+
384
+ // JBRulesets calldata
385
+ JBRuleset memory _returnedRuleset = JBRuleset({
386
+ cycleNumber: uint48(block.timestamp),
387
+ id: uint48(block.timestamp),
388
+ basedOnId: 0,
389
+ start: uint48(block.timestamp),
390
+ duration: uint32(block.timestamp + 1000),
391
+ weight: 1e18,
392
+ weightCutPercent: 0,
393
+ approvalHook: IJBRulesetApprovalHook(address(0)),
394
+ metadata: 0
395
+ });
396
+
397
+ // mock call to JBRulesets currentOf
398
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
399
+
400
+ // mock call to JBDirectory controllerOf
401
+ mockExpect(
402
+ address(directory),
403
+ abi.encodeCall(IJBDirectory.controllerOf, (_projectId)),
404
+ abi.encode(address(_controller))
405
+ );
406
+
407
+ // mock call to controller FUND_ACCESS_LIMITS
408
+ bytes memory _accessLimitsCall = abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ());
409
+ bytes memory _accessLimitsReturn = abi.encode(_accessLimits);
410
+ mockExpect(address(_controller), _accessLimitsCall, _accessLimitsReturn);
411
+
412
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
413
+ _payoutLimits[0] = JBCurrencyAmount({amount: 1e19, currency: _currency});
414
+
415
+ // mock call to fundAccessLimits payoutLimitsOf
416
+ bytes memory _payoutLimitsCall = abi.encodeCall(
417
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
418
+ );
419
+ bytes memory _payoutLimitsReturn = abi.encode(_payoutLimits);
420
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
421
+
422
+ uint256 currentSurplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
423
+
424
+ // assert correct calcs
425
+ uint256 expectedSurplus = 0;
426
+ assertEq(expectedSurplus, currentSurplus);
427
+ }
428
+ }
@@ -0,0 +1,65 @@
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 TestCurrentTotalSurplusOf_Local is JBTerminalStoreSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _decimals = 18;
10
+ uint256 _currency = uint32(uint160(makeAddr("token")));
11
+
12
+ // Mocks
13
+ IJBTerminal _terminal1 = IJBTerminal(makeAddr("terminal1"));
14
+ IJBTerminal _terminal2 = IJBTerminal(makeAddr("terminal2"));
15
+
16
+ function setUp() public {
17
+ super.terminalStoreSetup();
18
+ }
19
+
20
+ function test_WhenTerminalsAreConfiguredInJBDirectory() external {
21
+ // it will return the cumulative surplus
22
+
23
+ // return data for mock call
24
+ IJBTerminal[] memory _terminals = new IJBTerminal[](2);
25
+ _terminals[0] = _terminal1;
26
+ _terminals[1] = _terminal2;
27
+
28
+ // mock call to JBDirectory terminalsOf
29
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
30
+ bytes memory _returned = abi.encode(_terminals);
31
+ mockExpect(address(directory), _directoryCall, _returned);
32
+
33
+ // mock call to first terminal currentSurplusOf
34
+ bytes memory _terminal1Call = abi.encodeCall(
35
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
36
+ );
37
+ bytes memory _terminal1Return = abi.encode(1e18);
38
+ mockExpect(address(_terminal1), _terminal1Call, _terminal1Return);
39
+
40
+ // mock call to first terminal currentSurplusOf
41
+ bytes memory _terminal2Call = abi.encodeCall(
42
+ IJBTerminal.currentSurplusOf, (_projectId, new JBAccountingContext[](0), _decimals, _currency)
43
+ );
44
+ bytes memory _terminal2Return = abi.encode(2e18);
45
+ mockExpect(address(_terminal2), _terminal2Call, _terminal2Return);
46
+
47
+ uint256 sum = _store.currentTotalSurplusOf(_projectId, _decimals, _currency);
48
+ assertEq(3e18, sum);
49
+ }
50
+
51
+ function test_WhenTerminalsAreNotConfiguredInJBDirectory() external {
52
+ // it will return zero
53
+
54
+ // return data for mock call
55
+ IJBTerminal[] memory _terminals = new IJBTerminal[](0);
56
+
57
+ // mock call to JBDirectory terminalsOf
58
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.terminalsOf, (_projectId));
59
+ bytes memory _returned = abi.encode(_terminals);
60
+ mockExpect(address(directory), _directoryCall, _returned);
61
+
62
+ uint256 sum = _store.currentTotalSurplusOf(_projectId, _decimals, _currency);
63
+ assertEq(0, sum);
64
+ }
65
+ }