@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,390 @@
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 TestRecordUsedAllowanceOf_Local is JBTerminalStoreSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _decimals = 18;
10
+ uint256 _defaultAmount = 1e18;
11
+ uint256 _balance = 1e19;
12
+ uint256 _payoutLimit = 2e18;
13
+
14
+ // Mocks
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 whenAmountIsWithinRangeToUseSurplusAllowance() {
28
+ // Find the storage slot
29
+ bytes32 balanceOfSlot = keccak256(abi.encode(address(this), 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(this), _projectId, address(_token));
40
+ assertEq(_balanceCallReturn, _balance);
41
+
42
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
43
+ reservedPercent: 0,
44
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
45
+ baseCurrency: uint32(uint160(_nativeAddress)),
46
+ pausePay: false,
47
+ pauseCreditTransfers: false,
48
+ allowOwnerMinting: false,
49
+ allowSetCustomToken: false,
50
+ allowTerminalMigration: false,
51
+ allowSetTerminals: false,
52
+ ownerMustSendPayouts: false,
53
+ allowSetController: false,
54
+ allowAddAccountingContext: true,
55
+ allowAddPriceFeed: false,
56
+ holdFees: false,
57
+ useTotalSurplusForCashOuts: false,
58
+ useDataHookForPay: false,
59
+ useDataHookForCashOut: false,
60
+ dataHook: address(0),
61
+ metadata: 0
62
+ });
63
+
64
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
65
+
66
+ // JBRulesets return calldata
67
+ JBRuleset memory _returnedRuleset = JBRuleset({
68
+ cycleNumber: uint48(block.timestamp),
69
+ id: uint48(block.timestamp),
70
+ basedOnId: 0,
71
+ start: uint48(block.timestamp),
72
+ duration: uint32(block.timestamp + 1000),
73
+ weight: 1e18,
74
+ weightCutPercent: 0,
75
+ approvalHook: IJBRulesetApprovalHook(address(0)),
76
+ metadata: _packedMetadata
77
+ });
78
+
79
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
80
+ bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
81
+ mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
82
+
83
+ // mock call to JBDirectory controllerOf
84
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.controllerOf, (_projectId));
85
+ bytes memory _returned = abi.encode(_controller);
86
+ mockExpect(address(directory), _directoryCall, _returned);
87
+
88
+ // mock call to get JBFundAccessLimits address
89
+ mockExpect(
90
+ address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
91
+ );
92
+
93
+ // mock call to JBFundAccessLimits surplusAllowanceOf
94
+ mockExpect(
95
+ address(_accessLimits),
96
+ abi.encodeCall(
97
+ IJBFundAccessLimits.surplusAllowanceOf,
98
+ (_projectId, block.timestamp, address(this), address(_token), _currency)
99
+ ),
100
+ abi.encode(1e19)
101
+ );
102
+
103
+ JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
104
+ _limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
105
+
106
+ // mock JBFundAccessLimits call to payoutLimitsOf
107
+ bytes memory _payoutLimitsCall = abi.encodeCall(
108
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(this), address(_token))
109
+ );
110
+ bytes memory _payoutLimitsReturn = abi.encode(_limits);
111
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
112
+
113
+ _;
114
+ }
115
+
116
+ function test_GivenCallingCurrencyEqAccountingCurrency() external whenAmountIsWithinRangeToUseSurplusAllowance {
117
+ // it will not convert prices
118
+
119
+ // setup calldata
120
+ JBAccountingContext memory _context =
121
+ JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
122
+
123
+ (, uint256 usedAmount) = _store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
124
+ assertEq(usedAmount, _defaultAmount);
125
+ }
126
+
127
+ function test_GivenCallingCurrencyDneqAccountingCurrency() external {
128
+ // it will convert prices
129
+
130
+ // Find the storage slot
131
+ bytes32 balanceOfSlot = keccak256(abi.encode(address(this), uint256(0)));
132
+ bytes32 projectSlot = keccak256(abi.encode(_projectId, uint256(balanceOfSlot)));
133
+ bytes32 slot = keccak256(abi.encode(address(_nativeAddress), uint256(projectSlot)));
134
+
135
+ bytes32 balanceBytes = bytes32(_balance);
136
+
137
+ // Set balance
138
+ vm.store(address(_store), slot, balanceBytes);
139
+
140
+ // Ensure balance is set correctly
141
+ uint256 _balanceCallReturn = _store.balanceOf(address(this), _projectId, address(_nativeAddress));
142
+ assertEq(_balanceCallReturn, _balance);
143
+
144
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
145
+ reservedPercent: 0,
146
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
147
+ baseCurrency: uint32(uint160(_nativeAddress)),
148
+ pausePay: false,
149
+ pauseCreditTransfers: false,
150
+ allowOwnerMinting: false,
151
+ allowSetCustomToken: false,
152
+ allowTerminalMigration: false,
153
+ allowSetTerminals: false,
154
+ ownerMustSendPayouts: false,
155
+ allowSetController: false,
156
+ allowAddAccountingContext: true,
157
+ allowAddPriceFeed: false,
158
+ holdFees: false,
159
+ useTotalSurplusForCashOuts: false,
160
+ useDataHookForPay: false,
161
+ useDataHookForCashOut: false,
162
+ dataHook: address(0),
163
+ metadata: 0
164
+ });
165
+
166
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
167
+
168
+ // JBRulesets return calldata
169
+ JBRuleset memory _returnedRuleset = JBRuleset({
170
+ cycleNumber: uint48(block.timestamp),
171
+ id: uint48(block.timestamp),
172
+ basedOnId: 0,
173
+ start: uint48(block.timestamp),
174
+ duration: uint32(block.timestamp + 1000),
175
+ weight: 1e18,
176
+ weightCutPercent: 0,
177
+ approvalHook: IJBRulesetApprovalHook(address(0)),
178
+ metadata: _packedMetadata
179
+ });
180
+
181
+ // mock call to JBRulesets currentOf
182
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
183
+
184
+ // mock call to JBDirectory controllerOf
185
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
186
+
187
+ // mock call to get JBFundAccessLimits address
188
+ mockExpect(
189
+ address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
190
+ );
191
+
192
+ // mock call to JBFundAccessLimits surplusAllowanceOf
193
+ mockExpect(
194
+ address(_accessLimits),
195
+ abi.encodeCall(
196
+ IJBFundAccessLimits.surplusAllowanceOf,
197
+ (_projectId, block.timestamp, address(this), address(_nativeAddress), _currency)
198
+ ),
199
+ abi.encode(1e19)
200
+ );
201
+
202
+ JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](2);
203
+ _limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
204
+ _limits[1] = JBCurrencyAmount({amount: 0, currency: _nativeCurrency});
205
+
206
+ // mock JBFundAccessLimits call to payoutLimitsOf
207
+ mockExpect(
208
+ address(_accessLimits),
209
+ abi.encodeCall(
210
+ IJBFundAccessLimits.payoutLimitsOf,
211
+ (_projectId, block.timestamp, address(this), address(_nativeAddress))
212
+ ),
213
+ abi.encode(_limits)
214
+ );
215
+
216
+ // mock call to JBPrices pricePerUnitOf
217
+ bytes memory _pricePerCall =
218
+ abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _currency, _nativeCurrency, 18));
219
+ mockExpect(address(prices), _pricePerCall, abi.encode(1e18));
220
+
221
+ // setup calldata
222
+ JBAccountingContext memory _context =
223
+ JBAccountingContext({token: address(_nativeAddress), decimals: 18, currency: _nativeCurrency});
224
+
225
+ // price is 1:1
226
+ (, uint256 usedAmount) = _store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
227
+ assertEq(usedAmount, _defaultAmount);
228
+ }
229
+
230
+ function test_GivenThereIsInadequateBalance() external {
231
+ // it will revert INADEQUATE_TERMINAL_STORE_BALANCE
232
+
233
+ // do not set a balance (will be zero)
234
+
235
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
236
+ reservedPercent: 0,
237
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
238
+ baseCurrency: uint32(uint160(_currency)),
239
+ pausePay: false,
240
+ pauseCreditTransfers: false,
241
+ allowOwnerMinting: false,
242
+ allowSetCustomToken: false,
243
+ allowTerminalMigration: false,
244
+ allowSetTerminals: false,
245
+ ownerMustSendPayouts: false,
246
+ allowSetController: false,
247
+ allowAddAccountingContext: true,
248
+ allowAddPriceFeed: false,
249
+ holdFees: false,
250
+ useTotalSurplusForCashOuts: false,
251
+ useDataHookForPay: false,
252
+ useDataHookForCashOut: false,
253
+ dataHook: address(0),
254
+ metadata: 0
255
+ });
256
+
257
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
258
+
259
+ // JBRulesets return calldata
260
+ JBRuleset memory _returnedRuleset = JBRuleset({
261
+ cycleNumber: uint48(block.timestamp),
262
+ id: uint48(block.timestamp),
263
+ basedOnId: 0,
264
+ start: uint48(block.timestamp),
265
+ duration: uint32(block.timestamp + 1000),
266
+ weight: 1e18,
267
+ weightCutPercent: 0,
268
+ approvalHook: IJBRulesetApprovalHook(address(0)),
269
+ metadata: _packedMetadata
270
+ });
271
+
272
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
273
+ bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
274
+ mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
275
+
276
+ // mock call to JBDirectory controllerOf
277
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.controllerOf, (_projectId));
278
+ bytes memory _returned = abi.encode(_controller);
279
+ mockExpect(address(directory), _directoryCall, _returned);
280
+
281
+ // mock call to get JBFundAccessLimits address
282
+ mockExpect(
283
+ address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
284
+ );
285
+
286
+ JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
287
+ _limits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
288
+
289
+ // mock JBFundAccessLimits call to payoutLimitsOf
290
+ bytes memory _payoutLimitsCall = abi.encodeCall(
291
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(this), address(_token))
292
+ );
293
+ bytes memory _payoutLimitsReturn = abi.encode(_limits);
294
+ mockExpect(address(_accessLimits), _payoutLimitsCall, _payoutLimitsReturn);
295
+
296
+ // setup calldata
297
+ JBAccountingContext memory _context =
298
+ JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
299
+
300
+ vm.expectRevert(
301
+ abi.encodeWithSelector(
302
+ JBTerminalStore.JBTerminalStore_InadequateTerminalStoreBalance.selector, _defaultAmount, 0
303
+ )
304
+ );
305
+ _store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
306
+ }
307
+
308
+ function test_WhenAmountIsNotWithinRangeToUseSurplusAllowance() external {
309
+ // it will revert JBTerminalStore_InadequateTerminalStoreBalance
310
+
311
+ // do not set a balance (will be zero)
312
+
313
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
314
+ reservedPercent: 0,
315
+ cashOutTaxRate: JBConstants.MAX_CASH_OUT_TAX_RATE,
316
+ baseCurrency: uint32(uint160(_currency)),
317
+ pausePay: false,
318
+ pauseCreditTransfers: false,
319
+ allowOwnerMinting: false,
320
+ allowSetCustomToken: false,
321
+ allowTerminalMigration: false,
322
+ allowSetTerminals: false,
323
+ ownerMustSendPayouts: false,
324
+ allowSetController: false,
325
+ allowAddAccountingContext: true,
326
+ allowAddPriceFeed: false,
327
+ holdFees: false,
328
+ useTotalSurplusForCashOuts: false,
329
+ useDataHookForPay: false,
330
+ useDataHookForCashOut: false,
331
+ dataHook: address(0),
332
+ metadata: 0
333
+ });
334
+
335
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
336
+
337
+ // JBRulesets return calldata
338
+ JBRuleset memory _returnedRuleset = JBRuleset({
339
+ cycleNumber: uint48(block.timestamp),
340
+ id: uint48(block.timestamp),
341
+ basedOnId: 0,
342
+ start: uint48(block.timestamp),
343
+ duration: uint32(block.timestamp + 1000),
344
+ weight: 1e18,
345
+ weightCutPercent: 0,
346
+ approvalHook: IJBRulesetApprovalHook(address(0)),
347
+ metadata: _packedMetadata
348
+ });
349
+
350
+ bytes memory _currentOfCall = abi.encodeCall(IJBRulesets.currentOf, (_projectId));
351
+ bytes memory _currentOfReturn = abi.encode(_returnedRuleset);
352
+ mockExpect(address(rulesets), _currentOfCall, _currentOfReturn);
353
+
354
+ // mock call to JBDirectory controllerOf
355
+ bytes memory _directoryCall = abi.encodeCall(IJBDirectory.controllerOf, (_projectId));
356
+ bytes memory _returned = abi.encode(_controller);
357
+ mockExpect(address(directory), _directoryCall, _returned);
358
+
359
+ // mock call to get JBFundAccessLimits address
360
+ mockExpect(
361
+ address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
362
+ );
363
+
364
+ // Return data for next mock
365
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
366
+ _payoutLimits[0] = JBCurrencyAmount({amount: 0, currency: _currency});
367
+
368
+ // mock call to JBFundAccessLimits payoutLimitsOf
369
+ mockExpect(
370
+ address(_accessLimits),
371
+ abi.encodeCall(
372
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(this), address(_token))
373
+ ),
374
+ abi.encode(_payoutLimits)
375
+ );
376
+
377
+ // setup calldata
378
+ JBAccountingContext memory _context =
379
+ JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
380
+
381
+ vm.expectRevert(
382
+ abi.encodeWithSelector(
383
+ JBTerminalStore.JBTerminalStore_InadequateTerminalStoreBalance.selector,
384
+ _defaultAmount,
385
+ 0 // no balance
386
+ )
387
+ );
388
+ _store.recordUsedAllowanceOf(_projectId, _context, _defaultAmount, _currency);
389
+ }
390
+ }
@@ -0,0 +1,187 @@
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 TestUint224Overflow_Local is JBTerminalStoreSetup {
8
+ using JBRulesetMetadataResolver for JBRulesetMetadata;
9
+
10
+ uint256 _projectId = 1;
11
+
12
+ // Mocks
13
+ IJBTerminal _terminal = IJBTerminal(makeAddr("terminal"));
14
+ IJBToken _token = IJBToken(makeAddr("token"));
15
+ IJBController _controller = IJBController(makeAddr("controller"));
16
+ IJBFundAccessLimits _accessLimits = IJBFundAccessLimits(makeAddr("funds"));
17
+
18
+ uint32 _currency = uint32(uint160(address(_token)));
19
+
20
+ function setUp() public {
21
+ super.terminalStoreSetup();
22
+ }
23
+
24
+ /// @notice Helper to set balance for a terminal/project/token via vm.store.
25
+ function _setBalance(address terminal, uint256 projectId, address token, uint256 balance) internal {
26
+ bytes32 balanceOfSlot = keccak256(abi.encode(terminal, uint256(0)));
27
+ bytes32 projectSlot = keccak256(abi.encode(projectId, uint256(balanceOfSlot)));
28
+ bytes32 slot = keccak256(abi.encode(token, uint256(projectSlot)));
29
+ vm.store(address(_store), slot, bytes32(balance));
30
+ }
31
+
32
+ /// @notice Helper to create a standard ruleset with packed metadata.
33
+ function _mockRulesetAndControllerCalls() internal {
34
+ JBRulesetMetadata memory _metadata = JBRulesetMetadata({
35
+ reservedPercent: 0,
36
+ cashOutTaxRate: 0,
37
+ baseCurrency: _currency,
38
+ pausePay: false,
39
+ pauseCreditTransfers: false,
40
+ allowOwnerMinting: false,
41
+ allowSetCustomToken: false,
42
+ allowTerminalMigration: false,
43
+ allowSetTerminals: false,
44
+ ownerMustSendPayouts: false,
45
+ allowSetController: false,
46
+ allowAddAccountingContext: true,
47
+ allowAddPriceFeed: false,
48
+ holdFees: false,
49
+ useTotalSurplusForCashOuts: false,
50
+ useDataHookForPay: false,
51
+ useDataHookForCashOut: false,
52
+ dataHook: address(0),
53
+ metadata: 0
54
+ });
55
+
56
+ uint256 _packedMetadata = JBRulesetMetadataResolver.packRulesetMetadata(_metadata);
57
+
58
+ JBRuleset memory _returnedRuleset = JBRuleset({
59
+ cycleNumber: uint48(block.timestamp),
60
+ id: uint48(block.timestamp),
61
+ basedOnId: 0,
62
+ start: uint48(block.timestamp),
63
+ duration: uint32(block.timestamp + 1000),
64
+ weight: 1e18,
65
+ weightCutPercent: 0,
66
+ approvalHook: IJBRulesetApprovalHook(address(0)),
67
+ metadata: _packedMetadata
68
+ });
69
+
70
+ // Mock rulesets.currentOf
71
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(_returnedRuleset));
72
+
73
+ // Mock directory.controllerOf
74
+ mockExpect(address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(_controller));
75
+
76
+ // Mock controller.FUND_ACCESS_LIMITS
77
+ mockExpect(
78
+ address(_controller), abi.encodeCall(IJBController.FUND_ACCESS_LIMITS, ()), abi.encode(_accessLimits)
79
+ );
80
+ }
81
+
82
+ /// @notice Verifies that decimal adjustment overflow reverts with Uint224Overflow.
83
+ /// A payout limit that fits in uint224 but overflows when adjusted from 6 to 18 decimals.
84
+ function test_RevertWhen_DecimalAdjustmentOverflowsUint224() external {
85
+ // Balance must be large enough (after decimal adjustment) to exceed the payout limit,
86
+ // but not so large that the balance itself overflows during adjustment.
87
+ // Balance in 6-decimal terms: 1e62 → adjusted to 18 decimals = 1e74 (fits uint256).
88
+ _setBalance(address(_terminal), _projectId, address(_token), 1e62);
89
+
90
+ _mockRulesetAndControllerCalls();
91
+
92
+ // Amount that fits in uint224 but when multiplied by 10^12 (6→18 decimal adjustment) exceeds uint224.
93
+ // type(uint224).max / 1e6 ≈ 2.7e61. Multiplied by 1e12 → ≈ 2.7e73, exceeds uint224 but fits uint256.
94
+ uint224 amount = type(uint224).max / 1e6;
95
+ JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
96
+ _limits[0] = JBCurrencyAmount({amount: amount, currency: _currency});
97
+
98
+ // Mock payoutLimitsOf to return the large limit.
99
+ mockExpect(
100
+ address(_accessLimits),
101
+ abi.encodeCall(
102
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
103
+ ),
104
+ abi.encode(_limits)
105
+ );
106
+
107
+ // Accounting context: token has 6 decimals.
108
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
109
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 6, currency: _currency});
110
+
111
+ // Query surplus with 18 target decimals — triggers decimal adjustment overflow.
112
+ uint256 adjusted = uint256(amount) * 1e12;
113
+ vm.expectRevert(abi.encodeWithSelector(JBTerminalStore.JBTerminalStore_Uint224Overflow.selector, adjusted));
114
+ _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
115
+ }
116
+
117
+ /// @notice Verifies that currency conversion overflow reverts with Uint224Overflow.
118
+ /// A payout limit near type(uint224).max in currency A, converted to currency B at a very low price,
119
+ /// would overflow uint224.
120
+ function test_RevertWhen_CurrencyConversionOverflowsUint224() external {
121
+ // Set up a large balance.
122
+ _setBalance(address(_terminal), _projectId, address(_token), type(uint256).max);
123
+
124
+ _mockRulesetAndControllerCalls();
125
+
126
+ // Payout limit near uint224 max, in a DIFFERENT currency than the target.
127
+ uint32 _otherCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
128
+ JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
129
+ _limits[0] = JBCurrencyAmount({amount: type(uint224).max, currency: _otherCurrency});
130
+
131
+ // Mock payoutLimitsOf.
132
+ mockExpect(
133
+ address(_accessLimits),
134
+ abi.encodeCall(
135
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
136
+ ),
137
+ abi.encode(_limits)
138
+ );
139
+
140
+ // Mock price: very low price means large converted amount.
141
+ // pricePerUnitOf returns price with _MAX_FIXED_POINT_FIDELITY (18) decimals.
142
+ // A price of 1 (1 wei) means 1 unit of pricingCurrency = 10^18 units of unitCurrency.
143
+ mockExpect(
144
+ address(prices),
145
+ abi.encodeCall(IJBPrices.pricePerUnitOf, (_projectId, _otherCurrency, _currency, 18)),
146
+ abi.encode(uint256(1)) // extremely low price → huge conversion result
147
+ );
148
+
149
+ // Same decimals so no decimal adjustment.
150
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
151
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 18, currency: _currency});
152
+
153
+ // The conversion: mulDiv(type(uint224).max, 10^18, 1) = type(uint224).max * 10^18 → overflows uint224.
154
+ vm.expectRevert();
155
+ _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
156
+ }
157
+
158
+ /// @notice Verifies that normal amounts below uint224.max pass through without reverting.
159
+ function test_NormalAmountsDoNotRevert() external {
160
+ // Balance in 6-decimal terms: 100e6 = 100 units. Adjusted to 18 decimals = 100e18.
161
+ uint256 _balance = 100e6;
162
+ _setBalance(address(_terminal), _projectId, address(_token), _balance);
163
+
164
+ _mockRulesetAndControllerCalls();
165
+
166
+ // Normal payout limit: 50 units in 6-decimal token. Adjusted to 18 decimals = 50e18.
167
+ JBCurrencyAmount[] memory _limits = new JBCurrencyAmount[](1);
168
+ _limits[0] = JBCurrencyAmount({amount: 50e6, currency: _currency});
169
+
170
+ // Mock payoutLimitsOf.
171
+ mockExpect(
172
+ address(_accessLimits),
173
+ abi.encodeCall(
174
+ IJBFundAccessLimits.payoutLimitsOf, (_projectId, block.timestamp, address(_terminal), address(_token))
175
+ ),
176
+ abi.encode(_limits)
177
+ );
178
+
179
+ // 6-decimal token queried as 18-decimal target.
180
+ // Balance: 100e6 → 100e18. Payout limit: 50e6 → 50e18. Surplus = 50e18.
181
+ JBAccountingContext[] memory _contexts = new JBAccountingContext[](1);
182
+ _contexts[0] = JBAccountingContext({token: address(_token), decimals: 6, currency: _currency});
183
+
184
+ uint256 surplus = _store.currentSurplusOf(address(_terminal), _projectId, _contexts, 18, _currency);
185
+ assertEq(surplus, 50e18);
186
+ }
187
+ }
@@ -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 JBTokensSetup is JBTest {
11
+ // Mocks
12
+ IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
13
+ IJBToken public jbToken;
14
+
15
+ // Target Contract
16
+ IJBTokens public _tokens;
17
+
18
+ function tokensSetup() public virtual {
19
+ // Instantiate the contract being tested
20
+ jbToken = new JBERC20();
21
+ _tokens = new JBTokens(directory, jbToken);
22
+ }
23
+ }