@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,20 @@
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 JBERC20Setup is JBTest {
11
+ address _owner = makeAddr("owner");
12
+
13
+ // Target Contract
14
+ IJBToken public _erc20;
15
+
16
+ function erc20Setup() public virtual {
17
+ // Instantiate the contract being tested
18
+ _erc20 = new JBERC20();
19
+ }
20
+ }
@@ -0,0 +1,34 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ contract SigUtils {
5
+ bytes32 internal DOMAIN_SEPARATOR;
6
+
7
+ constructor(bytes32 _DOMAIN_SEPARATOR) {
8
+ DOMAIN_SEPARATOR = _DOMAIN_SEPARATOR;
9
+ }
10
+
11
+ // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
12
+ bytes32 private constant PERMIT_TYPEHASH =
13
+ keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
14
+
15
+ struct Permit {
16
+ address owner;
17
+ address spender;
18
+ uint256 value;
19
+ uint256 nonce;
20
+ uint256 deadline;
21
+ }
22
+
23
+ // computes the hash of a permit
24
+ function getStructHash(Permit memory _permit) internal pure returns (bytes32) {
25
+ return keccak256(
26
+ abi.encode(PERMIT_TYPEHASH, _permit.owner, _permit.spender, _permit.value, _permit.nonce, _permit.deadline)
27
+ );
28
+ }
29
+
30
+ // computes the hash of the fully encoded EIP-712 message for the domain, which can be used to recover the signer
31
+ function getTypedDataHash(Permit memory _permit) public view returns (bytes32) {
32
+ return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getStructHash(_permit)));
33
+ }
34
+ }
@@ -0,0 +1,54 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBERC20Setup} from "./JBERC20Setup.sol";
6
+ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
7
+
8
+ contract TestInitialize_Local is JBERC20Setup {
9
+ string _name = "Nana";
10
+ string _symbol = "NANA";
11
+
12
+ function setUp() public {
13
+ super.erc20Setup();
14
+ }
15
+
16
+ function test_WhenANameIsAlreadySet() external {
17
+ // it will revert
18
+
19
+ _erc20.initialize(_name, _symbol, _owner);
20
+
21
+ // ensure ownership transferred
22
+ address newOwner = Ownable(address(_erc20)).owner();
23
+ assertEq(newOwner, _owner);
24
+
25
+ // will fail as internal name is no longer zero length
26
+ vm.expectRevert();
27
+ _erc20.initialize(_name, _symbol, _owner);
28
+ }
29
+
30
+ function test_WhenName_EQNothing() external {
31
+ // it will revert
32
+
33
+ // will fail as internal name is no longer than zero length
34
+ vm.expectRevert();
35
+ _erc20.initialize("", _symbol, _owner);
36
+ }
37
+
38
+ function test_WhenNameIsValidAndNotAlreadySet() external {
39
+ // it will set the name and symbol and transfer ownership
40
+
41
+ _erc20.initialize(_name, _symbol, _owner);
42
+
43
+ // ensure ownership transferred
44
+ address newOwner = Ownable(address(_erc20)).owner();
45
+ assertEq(newOwner, _owner);
46
+
47
+ // name is set
48
+ string memory _setName = IERC20Metadata(address(_erc20)).name();
49
+ string memory _setSymbol = IERC20Metadata(address(_erc20)).symbol();
50
+
51
+ assertEq(_setName, _name);
52
+ assertEq(_setSymbol, _symbol);
53
+ }
54
+ }
@@ -0,0 +1,30 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBERC20Setup} from "./JBERC20Setup.sol";
6
+
7
+ contract TestName_Local is JBERC20Setup {
8
+ IERC20Metadata _token;
9
+
10
+ function setUp() public {
11
+ super.erc20Setup();
12
+
13
+ _token = IERC20Metadata(address(_erc20));
14
+ }
15
+
16
+ function test_WhenANameIsSet() external {
17
+ // it will return the name
18
+ _erc20.initialize("NANAPUS", "NANA", _owner);
19
+
20
+ string memory _setName = _token.name();
21
+ assertEq(_setName, "NANAPUS");
22
+ }
23
+
24
+ function test_WhenANameIsNotSet() external view {
25
+ // it will return an empty string
26
+
27
+ string memory _storedName = _token.name();
28
+ assertEq(_storedName, "");
29
+ }
30
+ }
@@ -0,0 +1,59 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBERC20Setup} from "./JBERC20Setup.sol";
6
+ import {SigUtils} from "./SigUtils.sol";
7
+
8
+ contract TestNonces_Local is JBERC20Setup {
9
+ IERC20Permit _token;
10
+ SigUtils sigUtils;
11
+
12
+ bytes32 private immutable _hashedName = keccak256(bytes("JBToken"));
13
+ bytes32 private immutable _hashedVersion = keccak256(bytes("1"));
14
+
15
+ bytes32 _domain;
16
+
17
+ bytes32 private constant TYPE_HASH =
18
+ keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
19
+
20
+ function setUp() public {
21
+ super.erc20Setup();
22
+
23
+ _token = IERC20Permit(address(_erc20));
24
+ _domain = keccak256(abi.encode(TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(_token)));
25
+ sigUtils = new SigUtils(_domain);
26
+ }
27
+
28
+ function test_WhenAUserHasNotCalledPermit() external view {
29
+ // it will return zero
30
+
31
+ uint256 _nonce = _token.nonces(_owner);
32
+
33
+ assertEq(_nonce, 0);
34
+ }
35
+
36
+ function test_WhenAUserHasCalledPermit() external {
37
+ // it will return a nonce GT zero
38
+
39
+ (address holder, uint256 holderPk) = makeAddrAndKey("hodler");
40
+
41
+ SigUtils.Permit memory permit = SigUtils.Permit({
42
+ owner: holder,
43
+ spender: address(this),
44
+ value: 1,
45
+ nonce: _token.nonces(holder),
46
+ deadline: block.timestamp + 1 days
47
+ });
48
+
49
+ bytes32 digest = sigUtils.getTypedDataHash(permit);
50
+
51
+ (uint8 v, bytes32 r, bytes32 s) = vm.sign(holderPk, digest);
52
+
53
+ vm.prank(holder);
54
+ _token.permit(holder, address(this), 1, block.timestamp + 1 days, v, r, s);
55
+
56
+ uint256 _nonce = _token.nonces(holder);
57
+ assertEq(_nonce, 1);
58
+ }
59
+ }
@@ -0,0 +1,31 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBERC20Setup} from "./JBERC20Setup.sol";
6
+
7
+ contract TestSymbol_Local is JBERC20Setup {
8
+ IERC20Metadata _token;
9
+
10
+ function setUp() public {
11
+ super.erc20Setup();
12
+
13
+ _token = IERC20Metadata(address(_erc20));
14
+ }
15
+
16
+ function test_WhenASymbolIsSet() external {
17
+ // it will return a non-empty string
18
+
19
+ _erc20.initialize("NANAPUS", "NANA", _owner);
20
+
21
+ string memory _setSymbol = _token.symbol();
22
+ assertEq(_setSymbol, "NANA");
23
+ }
24
+
25
+ function test_WhenASymbolIsNotSet() external view {
26
+ // it will return an empty string
27
+
28
+ string memory _setSymbol = _token.symbol();
29
+ assertEq(_setSymbol, "");
30
+ }
31
+ }
@@ -0,0 +1,20 @@
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 JBFeelessSetup is JBTest {
11
+ address _owner = makeAddr("owner");
12
+
13
+ // Target Contract
14
+ IJBFeelessAddresses public _feelessAddresses;
15
+
16
+ function feelessAddressesSetup() public virtual {
17
+ // Instantiate the contract being tested
18
+ _feelessAddresses = new JBFeelessAddresses(_owner);
19
+ }
20
+ }
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFeelessSetup} from "./JBFeelessSetup.sol";
6
+
7
+ contract TestSupportsInterface_Local is JBFeelessSetup {
8
+ function setUp() public {
9
+ super.feelessAddressesSetup();
10
+ }
11
+
12
+ function test_WhenItSupportsEitherIJBFeelessAddressesOrIERC165() external view {
13
+ // it should return true
14
+ bool result1 = IERC165(address(_feelessAddresses)).supportsInterface(type(IJBFeelessAddresses).interfaceId);
15
+ assertEq(result1, true);
16
+
17
+ bool result2 = IERC165(address(_feelessAddresses)).supportsInterface(type(IERC165).interfaceId);
18
+ assertEq(result2, true);
19
+ }
20
+
21
+ function test_WhenAskedIfSupportsNonIJBFeelessAddressesOrIERC165() external view {
22
+ // it should return false
23
+ bool result1 = IERC165(address(_feelessAddresses)).supportsInterface(0x12345678);
24
+ assertEq(result1, false);
25
+
26
+ bool result2 = IERC165(address(_feelessAddresses)).supportsInterface(0x12345679);
27
+ assertEq(result2, false);
28
+ }
29
+ }
@@ -0,0 +1,35 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFeelessSetup} from "./JBFeelessSetup.sol";
6
+
7
+ contract TestSetFeelessAddress_Local is JBFeelessSetup {
8
+ address _feeLess = makeAddr("something");
9
+
10
+ function setUp() public {
11
+ super.feelessAddressesSetup();
12
+ }
13
+
14
+ function test_WhenCallerIsOwner() external {
15
+ // it should set isFeeless and emit SetFeelessAddress
16
+ vm.expectEmit();
17
+ emit IJBFeelessAddresses.SetFeelessAddress(_feeLess, true, address(_owner));
18
+
19
+ vm.prank(_owner);
20
+ _feelessAddresses.setFeelessAddress(_feeLess, true);
21
+
22
+ bool result = _feelessAddresses.isFeeless(_feeLess);
23
+ assertEq(result, true);
24
+ }
25
+
26
+ function test_RevertIf_RevertWhen_CallerIsNotOwner() external {
27
+ address _multisig = makeAddr("multisig");
28
+ vm.prank(_multisig);
29
+ // it should revert 0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496
30
+ bytes4 selector = bytes4(keccak256("OwnableUnauthorizedAccount(address)"));
31
+ bytes memory expectedError = abi.encodeWithSelector(selector, _multisig);
32
+ vm.expectRevert(expectedError);
33
+ _feelessAddresses.setFeelessAddress(_feeLess, true);
34
+ }
35
+ }
@@ -0,0 +1,78 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFees} from "../../../../src/libraries/JBFees.sol";
6
+
7
+ /// @notice Fuzz tests for the JBFees library.
8
+ contract TestFeesFuzz_Local is JBTest {
9
+ function setUp() external {}
10
+
11
+ /// @notice feeAmountFrom with feePercent=0 returns 0.
12
+ function testFuzz_feeAmountFrom_zeroPercent(uint256 amount) external pure {
13
+ amount = bound(amount, 0, type(uint128).max);
14
+ uint256 fee = JBFees.feeAmountFrom(amount, 0);
15
+ assertEq(fee, 0, "fee with 0% should be 0");
16
+ }
17
+
18
+ /// @notice feeAmountFrom with amount=0 returns 0.
19
+ function testFuzz_feeAmountFrom_zeroAmount(uint256 feePercent) external pure {
20
+ feePercent = bound(feePercent, 0, JBConstants.MAX_FEE);
21
+ uint256 fee = JBFees.feeAmountFrom(0, feePercent);
22
+ assertEq(fee, 0, "fee on 0 amount should be 0");
23
+ }
24
+
25
+ /// @notice fee + remainder == amount (conservation).
26
+ /// @dev feeAmountFrom(amount, percent) + (amount - feeAmountFrom(amount, percent)) == amount
27
+ function testFuzz_feeAmountFrom_conservation(uint256 amount, uint256 feePercent) external pure {
28
+ amount = bound(amount, 0, type(uint128).max);
29
+ feePercent = bound(feePercent, 0, JBConstants.MAX_FEE);
30
+
31
+ uint256 fee = JBFees.feeAmountFrom(amount, feePercent);
32
+ uint256 remainder = amount - fee;
33
+
34
+ assertEq(fee + remainder, amount, "fee + remainder must equal amount");
35
+ assertLe(fee, amount, "fee must not exceed amount");
36
+ }
37
+
38
+ /// @notice fee is monotonically increasing with amount (for fixed percent).
39
+ function testFuzz_feeAmountFrom_monotonic(uint256 amount1, uint256 amount2, uint256 feePercent) external pure {
40
+ amount1 = bound(amount1, 0, type(uint64).max);
41
+ amount2 = bound(amount2, amount1, type(uint64).max);
42
+ feePercent = bound(feePercent, 0, JBConstants.MAX_FEE);
43
+
44
+ uint256 fee1 = JBFees.feeAmountFrom(amount1, feePercent);
45
+ uint256 fee2 = JBFees.feeAmountFrom(amount2, feePercent);
46
+
47
+ assertLe(fee1, fee2, "fee should be monotonically increasing with amount");
48
+ }
49
+
50
+ /// @notice feeAmountFrom and feeAmountResultingIn are directionally consistent.
51
+ /// @dev feeAmountResultingIn(afterFee, percent) >= fee from feeAmountFrom.
52
+ /// The reverse operation should always produce a fee that covers the forward fee.
53
+ function testFuzz_feeSymmetry(uint256 amount, uint256 feePercent) external pure {
54
+ amount = bound(amount, 1, type(uint64).max);
55
+ feePercent = bound(feePercent, 1, JBConstants.MAX_FEE - 1); // Avoid 0% and 100%
56
+
57
+ // Forward: calculate fee from amount
58
+ uint256 fee = JBFees.feeAmountFrom(amount, feePercent);
59
+ uint256 afterFee = amount - fee;
60
+
61
+ // Reverse: from afterFee, what fee would produce afterFee as the result?
62
+ uint256 reverseFee = JBFees.feeAmountResultingIn(afterFee, feePercent);
63
+
64
+ // The reverse fee should always be >= the forward fee (it rounds up to ensure
65
+ // the total with fee >= the original amount).
66
+ assertGe(reverseFee, fee, "reverse fee should be >= forward fee");
67
+
68
+ // And the total should be >= the original amount (reverse is conservative)
69
+ assertGe(reverseFee + afterFee, amount, "reverse fee + afterFee should be >= amount");
70
+ }
71
+
72
+ /// @notice feeAmountFrom with MAX_FEE returns the full amount.
73
+ function testFuzz_feeAmountFrom_maxPercent(uint256 amount) external pure {
74
+ amount = bound(amount, 0, type(uint128).max);
75
+ uint256 fee = JBFees.feeAmountFrom(amount, JBConstants.MAX_FEE);
76
+ assertEq(fee, amount, "fee at MAX_FEE should equal amount");
77
+ }
78
+ }
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFixedPointNumber} from "../../../../src/libraries/JBFixedPointNumber.sol";
6
+
7
+ contract TestAdjustDecimals_Local is JBTest {
8
+ function setUp() external {}
9
+
10
+ function testWhenTargetEqDecimals() external pure {
11
+ // it will return the value parameter provided
12
+
13
+ uint256 returned = JBFixedPointNumber.adjustDecimals(1e18, 6, 6);
14
+ assertEq(returned, 1e18);
15
+ }
16
+ }
@@ -0,0 +1,71 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFixedPointNumber} from "../../../../src/libraries/JBFixedPointNumber.sol";
6
+
7
+ /// @notice Fuzz tests for JBFixedPointNumber.adjustDecimals.
8
+ contract TestAdjustDecimalsFuzz_Local is JBTest {
9
+ function setUp() external {}
10
+
11
+ /// @notice Same decimals returns the value unchanged.
12
+ function testFuzz_sameDecimals(uint256 value, uint8 decimals) external pure {
13
+ decimals = uint8(bound(uint256(decimals), 0, 36));
14
+ uint256 result = JBFixedPointNumber.adjustDecimals(value, decimals, decimals);
15
+ assertEq(result, value, "same decimals should return value unchanged");
16
+ }
17
+
18
+ /// @notice Scale up then down round-trip preserves value (modulo rounding loss).
19
+ function testFuzz_roundTrip_upThenDown(uint256 value, uint8 fromDecimals, uint8 toDecimals) external pure {
20
+ fromDecimals = uint8(bound(uint256(fromDecimals), 0, 18));
21
+ toDecimals = uint8(bound(uint256(toDecimals), fromDecimals, 36));
22
+
23
+ // Avoid overflow: value * 10^(toDecimals - fromDecimals) must fit in uint256
24
+ uint256 scaleFactor = 10 ** (toDecimals - fromDecimals);
25
+ if (scaleFactor > 0 && value > type(uint256).max / scaleFactor) return;
26
+
27
+ uint256 scaled = JBFixedPointNumber.adjustDecimals(value, fromDecimals, toDecimals);
28
+ uint256 restored = JBFixedPointNumber.adjustDecimals(scaled, toDecimals, fromDecimals);
29
+
30
+ assertEq(restored, value, "round trip (up then down) should restore original value");
31
+ }
32
+
33
+ /// @notice Scale down then up loses precision but never exceeds original.
34
+ function testFuzz_roundTrip_downThenUp(uint256 value, uint8 fromDecimals, uint8 toDecimals) external pure {
35
+ fromDecimals = uint8(bound(uint256(fromDecimals), 0, 36));
36
+ toDecimals = uint8(bound(uint256(toDecimals), 0, fromDecimals));
37
+
38
+ uint256 scaled = JBFixedPointNumber.adjustDecimals(value, fromDecimals, toDecimals);
39
+
40
+ // Scale back up
41
+ uint256 scaleFactor = 10 ** (fromDecimals - toDecimals);
42
+ if (scaleFactor > 0 && scaled > type(uint256).max / scaleFactor) return;
43
+
44
+ uint256 restored = JBFixedPointNumber.adjustDecimals(scaled, toDecimals, fromDecimals);
45
+
46
+ assertLe(restored, value, "round trip (down then up) should not exceed original");
47
+ }
48
+
49
+ /// @notice Scaling up increases value when decimals differ.
50
+ function testFuzz_scaleUp_increases(uint256 value, uint8 fromDecimals, uint8 toDecimals) external pure {
51
+ value = bound(value, 1, 1e36);
52
+ fromDecimals = uint8(bound(uint256(fromDecimals), 0, 18));
53
+ toDecimals = uint8(bound(uint256(toDecimals), fromDecimals + 1, 36));
54
+
55
+ uint256 result = JBFixedPointNumber.adjustDecimals(value, fromDecimals, toDecimals);
56
+ assertGt(result, value, "scaling up with more decimals should increase value");
57
+ }
58
+
59
+ /// @notice Scaling down returns zero for small values.
60
+ function testFuzz_scaleDown_smallValue(uint8 fromDecimals, uint8 toDecimals) external pure {
61
+ fromDecimals = uint8(bound(uint256(fromDecimals), 1, 36));
62
+ toDecimals = uint8(bound(uint256(toDecimals), 0, fromDecimals - 1));
63
+
64
+ uint256 scaleFactor = 10 ** (fromDecimals - toDecimals);
65
+ // Value smaller than the scale factor should round to 0
66
+ uint256 value = scaleFactor - 1;
67
+
68
+ uint256 result = JBFixedPointNumber.adjustDecimals(value, fromDecimals, toDecimals);
69
+ assertEq(result, 0, "value below scale factor should round to 0");
70
+ }
71
+ }
@@ -0,0 +1,21 @@
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 JBFundAccessSetup is JBTest {
11
+ // Target Contract
12
+ IJBFundAccessLimits public _fundAccess;
13
+
14
+ // Mocks
15
+ IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
16
+
17
+ function fundAccessSetup() public virtual {
18
+ // Instantiate the contract being tested
19
+ _fundAccess = new JBFundAccessLimits(directory);
20
+ }
21
+ }
@@ -0,0 +1,159 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+
6
+ /// @notice Edge case tests for JBFundAccessLimits append behavior and packing.
7
+ /// The key finding is that setFundAccessLimitsFor uses .push() (append), not replace.
8
+ /// If called twice for the same rulesetId, limits accumulate rather than being replaced.
9
+ contract TestFundAccessLimitsEdge_Local is JBTest {
10
+ IJBDirectory public directory = IJBDirectory(makeAddr("directory"));
11
+ JBFundAccessLimits public limits;
12
+
13
+ uint256 constant PROJECT_ID = 1;
14
+ uint256 constant RULESET_ID = 100;
15
+ address constant TERMINAL = address(0xBEEF);
16
+ address constant TOKEN = address(0xCAFE);
17
+
18
+ function setUp() public {
19
+ limits = new JBFundAccessLimits(directory);
20
+
21
+ // Mock controllerOf to return this contract (so we can call setFundAccessLimitsFor).
22
+ vm.mockCall(
23
+ address(directory), abi.encodeCall(IJBDirectory.controllerOf, (PROJECT_ID)), abi.encode(address(this))
24
+ );
25
+ }
26
+
27
+ // ───────────────────── Append-not-replace bug
28
+ // ─────────────────────
29
+
30
+ /// @notice BUG: Calling setFundAccessLimitsFor twice accumulates limits instead of replacing.
31
+ /// If a controller ever calls this twice for the same rulesetId (e.g., custom controller,
32
+ /// reentrancy, or migration bug), limits double.
33
+ function test_doubleSetting_accumulatesLimits() external {
34
+ JBCurrencyAmount[] memory payoutLimits = new JBCurrencyAmount[](1);
35
+ payoutLimits[0] = JBCurrencyAmount({amount: 1000, currency: 1});
36
+
37
+ JBFundAccessLimitGroup[] memory groups = new JBFundAccessLimitGroup[](1);
38
+ groups[0] = JBFundAccessLimitGroup({
39
+ terminal: TERMINAL, token: TOKEN, payoutLimits: payoutLimits, surplusAllowances: new JBCurrencyAmount[](0)
40
+ });
41
+
42
+ // First call — sets limit to 1000.
43
+ limits.setFundAccessLimitsFor(PROJECT_ID, RULESET_ID, groups);
44
+
45
+ // Verify first limit.
46
+ uint256 limit1 = limits.payoutLimitOf(PROJECT_ID, RULESET_ID, TERMINAL, TOKEN, 1);
47
+ assertEq(limit1, 1000, "First limit should be 1000");
48
+
49
+ // Second call with SAME rulesetId — BUG: this APPENDS, not replaces.
50
+ limits.setFundAccessLimitsFor(PROJECT_ID, RULESET_ID, groups);
51
+
52
+ // Query all limits — should have 2 entries now (both with currency=1, amount=1000).
53
+ JBCurrencyAmount[] memory allLimits = limits.payoutLimitsOf(PROJECT_ID, RULESET_ID, TERMINAL, TOKEN);
54
+
55
+ // BUG CONFIRMED: Two entries instead of one.
56
+ assertEq(allLimits.length, 2, "BUG: Limits accumulated instead of being replaced");
57
+ assertEq(allLimits[0].amount, 1000, "First accumulated limit");
58
+ assertEq(allLimits[1].amount, 1000, "Second accumulated limit");
59
+
60
+ // The payoutLimitOf function returns the FIRST match, so it still returns 1000.
61
+ // But the surplus calculation iterates ALL limits, effectively doubling the payout limit.
62
+ uint256 limitQuery = limits.payoutLimitOf(PROJECT_ID, RULESET_ID, TERMINAL, TOKEN, 1);
63
+ assertEq(limitQuery, 1000, "Query returns first match only");
64
+ }
65
+
66
+ // ───────────────────── Zero amount skipped
67
+ // ─────────────────────
68
+
69
+ /// @notice Zero-amount limits are not stored (filtered by amount > 0 check).
70
+ function test_zeroAmount_skipped() external {
71
+ JBCurrencyAmount[] memory payoutLimits = new JBCurrencyAmount[](2);
72
+ payoutLimits[0] = JBCurrencyAmount({amount: 0, currency: 1}); // Should be skipped.
73
+ payoutLimits[1] = JBCurrencyAmount({amount: 500, currency: 2});
74
+
75
+ JBFundAccessLimitGroup[] memory groups = new JBFundAccessLimitGroup[](1);
76
+ groups[0] = JBFundAccessLimitGroup({
77
+ terminal: TERMINAL, token: TOKEN, payoutLimits: payoutLimits, surplusAllowances: new JBCurrencyAmount[](0)
78
+ });
79
+
80
+ limits.setFundAccessLimitsFor(PROJECT_ID, RULESET_ID, groups);
81
+
82
+ // Only the non-zero limit should be stored.
83
+ JBCurrencyAmount[] memory allLimits = limits.payoutLimitsOf(PROJECT_ID, RULESET_ID, TERMINAL, TOKEN);
84
+ assertEq(allLimits.length, 1, "Zero-amount limit should not be stored");
85
+ assertEq(allLimits[0].amount, 500, "Only non-zero limit stored");
86
+ assertEq(allLimits[0].currency, 2, "Correct currency stored");
87
+ }
88
+
89
+ // ───────────────────── Currency ordering validation
90
+ // ─────────────────────
91
+
92
+ /// @notice Duplicate currencies in payout limits should revert.
93
+ function test_currencyOrdering_rejectsEqual() external {
94
+ JBCurrencyAmount[] memory payoutLimits = new JBCurrencyAmount[](2);
95
+ payoutLimits[0] = JBCurrencyAmount({amount: 100, currency: 1});
96
+ payoutLimits[1] = JBCurrencyAmount({amount: 200, currency: 1}); // Same currency!
97
+
98
+ JBFundAccessLimitGroup[] memory groups = new JBFundAccessLimitGroup[](1);
99
+ groups[0] = JBFundAccessLimitGroup({
100
+ terminal: TERMINAL, token: TOKEN, payoutLimits: payoutLimits, surplusAllowances: new JBCurrencyAmount[](0)
101
+ });
102
+
103
+ vm.expectRevert(JBFundAccessLimits.JBFundAccessLimits_InvalidPayoutLimitCurrencyOrdering.selector);
104
+ limits.setFundAccessLimitsFor(PROJECT_ID, RULESET_ID, groups);
105
+ }
106
+
107
+ /// @notice Descending currency order should revert.
108
+ function test_currencyOrdering_rejectsDescending() external {
109
+ JBCurrencyAmount[] memory payoutLimits = new JBCurrencyAmount[](2);
110
+ payoutLimits[0] = JBCurrencyAmount({amount: 100, currency: 2});
111
+ payoutLimits[1] = JBCurrencyAmount({amount: 200, currency: 1}); // Descending!
112
+
113
+ JBFundAccessLimitGroup[] memory groups = new JBFundAccessLimitGroup[](1);
114
+ groups[0] = JBFundAccessLimitGroup({
115
+ terminal: TERMINAL, token: TOKEN, payoutLimits: payoutLimits, surplusAllowances: new JBCurrencyAmount[](0)
116
+ });
117
+
118
+ vm.expectRevert(JBFundAccessLimits.JBFundAccessLimits_InvalidPayoutLimitCurrencyOrdering.selector);
119
+ limits.setFundAccessLimitsFor(PROJECT_ID, RULESET_ID, groups);
120
+ }
121
+
122
+ // ───────────────────── Packing round-trip
123
+ // ─────────────────────
124
+
125
+ /// @notice Fuzz: packed amount + currency unpack correctly for all inputs.
126
+ function testFuzz_packingRoundTrip(uint224 amount, uint32 currency) external {
127
+ // Skip zero amounts (they're filtered out).
128
+ vm.assume(amount > 0);
129
+ // Skip currency 0 since ordering requires > 0 for the first element.
130
+ vm.assume(currency > 0);
131
+
132
+ JBCurrencyAmount[] memory payoutLimits = new JBCurrencyAmount[](1);
133
+ payoutLimits[0] = JBCurrencyAmount({amount: amount, currency: currency});
134
+
135
+ JBFundAccessLimitGroup[] memory groups = new JBFundAccessLimitGroup[](1);
136
+ groups[0] = JBFundAccessLimitGroup({
137
+ terminal: TERMINAL, token: TOKEN, payoutLimits: payoutLimits, surplusAllowances: new JBCurrencyAmount[](0)
138
+ });
139
+
140
+ // Use a unique rulesetId for each fuzz run to avoid accumulation bug.
141
+ uint256 rulesetId = uint256(keccak256(abi.encode(amount, currency)));
142
+ limits.setFundAccessLimitsFor(PROJECT_ID, rulesetId, groups);
143
+
144
+ // Verify round-trip.
145
+ JBCurrencyAmount[] memory result = limits.payoutLimitsOf(PROJECT_ID, rulesetId, TERMINAL, TOKEN);
146
+ assertEq(result.length, 1, "Should have exactly one limit");
147
+ assertEq(result[0].amount, amount, "Amount should round-trip correctly");
148
+ assertEq(result[0].currency, currency, "Currency should round-trip correctly");
149
+ }
150
+
151
+ // ───────────────────── Query nonexistent returns zero
152
+ // ─────────────────────
153
+
154
+ /// @notice Querying a currency with no limit returns 0 (implicit default).
155
+ function test_queryNonexistentCurrency_returnsZero() external view {
156
+ uint256 limit = limits.payoutLimitOf(PROJECT_ID, RULESET_ID, TERMINAL, TOKEN, 999);
157
+ assertEq(limit, 0, "Nonexistent currency should return 0");
158
+ }
159
+ }