@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,56 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFundAccessSetup} from "./JBFundAccessSetup.sol";
6
+
7
+ contract TestPayoutLimitOf_Local is JBFundAccessSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _ruleset = block.timestamp;
10
+ uint224 _payoutLimit = 1e18;
11
+ uint32 _currency = uint32(uint160(JBConstants.NATIVE_TOKEN));
12
+ address _terminal = address(1);
13
+ address _token = JBConstants.NATIVE_TOKEN;
14
+
15
+ function setUp() public {
16
+ super.fundAccessSetup();
17
+
18
+ // Fund Access config
19
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](1);
20
+ {
21
+ // Specify a payout limit.
22
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
23
+ _payoutLimits[0] =
24
+ JBCurrencyAmount({amount: _payoutLimit, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
25
+
26
+ // Specify a surplus allowance.
27
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](0);
28
+
29
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
30
+ terminal: address(_terminal),
31
+ token: JBConstants.NATIVE_TOKEN,
32
+ payoutLimits: _payoutLimits,
33
+ surplusAllowances: _surplusAllowances
34
+ });
35
+ }
36
+
37
+ bytes memory _controllerCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
38
+ bytes memory _return = abi.encode(address(this));
39
+
40
+ mockExpect(address(directory), _controllerCall, _return);
41
+
42
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset, _fundAccessLimitGroup);
43
+ }
44
+
45
+ function test_WhenTheProjectHasTheSpecificPayoutLimit() external view {
46
+ // it will return the uint256 payoutLimit
47
+ uint256 _returnedLimit = _fundAccess.payoutLimitOf(_projectId, _ruleset, _terminal, _token, _currency);
48
+ assertEq(_returnedLimit, _payoutLimit);
49
+ }
50
+
51
+ function test_WhenTheProjectDoesntHaveTheSpecificPayoutLimit() external view {
52
+ // it will return 0
53
+ uint256 empty = _fundAccess.payoutLimitOf(1, 1, address(1), address(2), 1);
54
+ assertEq(empty, 0);
55
+ }
56
+ }
@@ -0,0 +1,94 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFundAccessSetup} from "./JBFundAccessSetup.sol";
6
+
7
+ contract TestPayoutLimitsOf_Local is JBFundAccessSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _ruleset = block.timestamp;
10
+ uint224 _payoutLimit = 1e18;
11
+ uint224 _payoutLimit2 = 1e6;
12
+ uint32 _currency = uint32(uint160(JBConstants.NATIVE_TOKEN));
13
+ address _terminal = address(1);
14
+ address _terminal2 = address(2);
15
+ address _someToken = makeAddr("sometoken");
16
+
17
+ function setUp() public {
18
+ super.fundAccessSetup();
19
+ }
20
+
21
+ modifier whenAProjectHasPayoutLimits() {
22
+ // Fund Access config
23
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
24
+ {
25
+ // Specify a payout limit.
26
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](2);
27
+ _payoutLimits[0] =
28
+ JBCurrencyAmount({amount: _payoutLimit, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
29
+
30
+ // Specify a second payout limit.
31
+ _payoutLimits[1] = JBCurrencyAmount({amount: _payoutLimit2, currency: uint32(uint160(_someToken))});
32
+
33
+ // Specify a surplus allowance.
34
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](0);
35
+
36
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
37
+ terminal: address(_terminal),
38
+ token: JBConstants.NATIVE_TOKEN,
39
+ payoutLimits: _payoutLimits,
40
+ surplusAllowances: _surplusAllowances
41
+ });
42
+
43
+ _fundAccessLimitGroup[1] = JBFundAccessLimitGroup({
44
+ terminal: address(_terminal2),
45
+ token: JBConstants.NATIVE_TOKEN,
46
+ payoutLimits: _payoutLimits,
47
+ surplusAllowances: _surplusAllowances
48
+ });
49
+ }
50
+
51
+ bytes memory _controllerCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
52
+ bytes memory _return = abi.encode(address(this));
53
+
54
+ mockExpect(address(directory), _controllerCall, _return);
55
+
56
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset, _fundAccessLimitGroup);
57
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset + 1, _fundAccessLimitGroup);
58
+ _;
59
+ }
60
+
61
+ function test_GivenTheyAreConfiguredForASpecificToken() external whenAProjectHasPayoutLimits {
62
+ // it will return them
63
+
64
+ JBCurrencyAmount[] memory payoutLimits =
65
+ _fundAccess.payoutLimitsOf(_projectId, _ruleset, _terminal, JBConstants.NATIVE_TOKEN);
66
+
67
+ assertEq(payoutLimits[0].currency, uint32(uint160(JBConstants.NATIVE_TOKEN)));
68
+ assertEq(payoutLimits[0].amount, _payoutLimit);
69
+ assertEq(payoutLimits[1].currency, uint32(uint160(_someToken)));
70
+ assertEq(payoutLimits[1].amount, _payoutLimit2);
71
+ }
72
+
73
+ function test_GivenTheyAreConfiguredForASpecificTerminal() external whenAProjectHasPayoutLimits {
74
+ // it will return them
75
+ JBCurrencyAmount[] memory payoutLimits =
76
+ _fundAccess.payoutLimitsOf(_projectId, _ruleset, _terminal2, JBConstants.NATIVE_TOKEN);
77
+
78
+ assertEq(payoutLimits[0].currency, uint32(uint160(JBConstants.NATIVE_TOKEN)));
79
+ assertEq(payoutLimits[0].amount, _payoutLimit);
80
+ assertEq(payoutLimits[1].currency, uint32(uint160(_someToken)));
81
+ assertEq(payoutLimits[1].amount, _payoutLimit2);
82
+ }
83
+
84
+ function test_GivenTheyAreConfiguredForASpecificRulesetId() external whenAProjectHasPayoutLimits {
85
+ // it will return them
86
+ JBCurrencyAmount[] memory payoutLimits =
87
+ _fundAccess.payoutLimitsOf(_projectId, _ruleset + 1, _terminal2, JBConstants.NATIVE_TOKEN);
88
+
89
+ assertEq(payoutLimits[0].currency, uint32(uint160(JBConstants.NATIVE_TOKEN)));
90
+ assertEq(payoutLimits[0].amount, _payoutLimit);
91
+ assertEq(payoutLimits[1].currency, uint32(uint160(_someToken)));
92
+ assertEq(payoutLimits[1].amount, _payoutLimit2);
93
+ }
94
+ }
@@ -0,0 +1,182 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFundAccessSetup} from "./JBFundAccessSetup.sol";
6
+
7
+ contract TestSetFundAccessLimitsFor_Local is JBFundAccessSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _ruleset = block.timestamp;
10
+ uint32 _validCurrency = uint32(uint160(JBConstants.NATIVE_TOKEN));
11
+ address _terminal = address(1);
12
+ address _terminal2 = address(2);
13
+ address _someToken = makeAddr("sometoken");
14
+ uint224 _validLimit = 1e18;
15
+
16
+ function setUp() public {
17
+ super.fundAccessSetup();
18
+ }
19
+
20
+ function test_WhenCallerIsNotController() external {
21
+ // it will revert
22
+
23
+ bytes memory _controllerCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
24
+ bytes memory _return = abi.encode(address(makeAddr("notThisContract")));
25
+
26
+ mockExpect(address(directory), _controllerCall, _return);
27
+
28
+ // Fund Access config
29
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
30
+
31
+ vm.expectRevert(
32
+ abi.encodeWithSelector(
33
+ JBControlled.JBControlled_ControllerUnauthorized.selector, address(makeAddr("notThisContract"))
34
+ )
35
+ );
36
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset, _fundAccessLimitGroup);
37
+ }
38
+
39
+ modifier whenCallerIsControllerOfProject() {
40
+ bytes memory _controllerCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
41
+ bytes memory _return = abi.encode(address(this));
42
+
43
+ mockExpect(address(directory), _controllerCall, _return);
44
+ _;
45
+ }
46
+
47
+ function test_GivenPayoutLimitCurrencyIsNotGivenInAscendingOrder() external whenCallerIsControllerOfProject {
48
+ // it will revert INVALID_PAYOUT_LIMIT_CURRENCY_ORDERING
49
+
50
+ // Fund Access config
51
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
52
+ {
53
+ // Specify a payout limit.
54
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](2);
55
+ _payoutLimits[0] = JBCurrencyAmount({amount: _validLimit, currency: type(uint32).max});
56
+
57
+ // Specify a second payout limit.
58
+ _payoutLimits[1] =
59
+ JBCurrencyAmount({amount: _validLimit, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
60
+
61
+ // Specify a surplus allowance.
62
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](0);
63
+
64
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
65
+ terminal: address(_terminal),
66
+ token: JBConstants.NATIVE_TOKEN,
67
+ payoutLimits: _payoutLimits,
68
+ surplusAllowances: _surplusAllowances
69
+ });
70
+ }
71
+
72
+ vm.expectRevert(JBFundAccessLimits.JBFundAccessLimits_InvalidPayoutLimitCurrencyOrdering.selector);
73
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset, _fundAccessLimitGroup);
74
+ }
75
+
76
+ function test_GivenSurplusAllowanceCurrenciesAreNotAscendingOrder() external whenCallerIsControllerOfProject {
77
+ // it will revert INVALID_SURPLUS_ALLOWANCE_CURRENCY_ORDERING
78
+
79
+ // Fund Access config
80
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
81
+ {
82
+ // Specify a payout limit.
83
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
84
+ _payoutLimits[0] = JBCurrencyAmount({amount: _validLimit, currency: _validCurrency});
85
+
86
+ // Specify a surplus allowance.
87
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](2);
88
+ _surplusAllowances[0] = JBCurrencyAmount({amount: _validLimit, currency: type(uint32).max});
89
+
90
+ _surplusAllowances[1] = JBCurrencyAmount({amount: _validLimit, currency: _validCurrency});
91
+
92
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
93
+ terminal: address(_terminal),
94
+ token: JBConstants.NATIVE_TOKEN,
95
+ payoutLimits: _payoutLimits,
96
+ surplusAllowances: _surplusAllowances
97
+ });
98
+ }
99
+
100
+ vm.expectRevert(JBFundAccessLimits.JBFundAccessLimits_InvalidSurplusAllowanceCurrencyOrdering.selector);
101
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset, _fundAccessLimitGroup);
102
+ }
103
+
104
+ function test_GivenValidConfig() external whenCallerIsControllerOfProject {
105
+ // it will set packed properties and emit SetFundAccessLimits
106
+
107
+ // Fund Access config
108
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
109
+ {
110
+ // Specify a payout limit.
111
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](2);
112
+ _payoutLimits[0] =
113
+ JBCurrencyAmount({amount: _validLimit, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
114
+
115
+ // Specify a second payout limit.
116
+ _payoutLimits[1] = JBCurrencyAmount({amount: _validLimit, currency: uint32(uint160(_someToken))});
117
+
118
+ // Specify a surplus allowance.
119
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](0);
120
+
121
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
122
+ terminal: address(_terminal),
123
+ token: JBConstants.NATIVE_TOKEN,
124
+ payoutLimits: _payoutLimits,
125
+ surplusAllowances: _surplusAllowances
126
+ });
127
+
128
+ _fundAccessLimitGroup[1] = JBFundAccessLimitGroup({
129
+ terminal: address(_terminal2),
130
+ token: JBConstants.NATIVE_TOKEN,
131
+ payoutLimits: _payoutLimits,
132
+ surplusAllowances: _surplusAllowances
133
+ });
134
+ }
135
+
136
+ vm.expectEmit();
137
+ emit IJBFundAccessLimits.SetFundAccessLimits(_ruleset, _projectId, _fundAccessLimitGroup[0], address(this));
138
+
139
+ vm.expectEmit();
140
+ emit IJBFundAccessLimits.SetFundAccessLimits(_ruleset, _projectId, _fundAccessLimitGroup[1], address(this));
141
+
142
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset, _fundAccessLimitGroup);
143
+ }
144
+
145
+ function test_GivenValidConfigWithLimitsZero() external whenCallerIsControllerOfProject {
146
+ // it will set packed properties and emit SetFundAccessLimits
147
+
148
+ // Fund Access config
149
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
150
+ {
151
+ // Specify a payout limit.
152
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](1);
153
+ _payoutLimits[0] = JBCurrencyAmount({amount: 0, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
154
+
155
+ // Specify a surplus allowance.
156
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](1);
157
+ _surplusAllowances[0] = JBCurrencyAmount({amount: 0, currency: type(uint32).max});
158
+
159
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
160
+ terminal: address(_terminal),
161
+ token: JBConstants.NATIVE_TOKEN,
162
+ payoutLimits: _payoutLimits,
163
+ surplusAllowances: _surplusAllowances
164
+ });
165
+
166
+ _fundAccessLimitGroup[1] = JBFundAccessLimitGroup({
167
+ terminal: address(_terminal2),
168
+ token: JBConstants.NATIVE_TOKEN,
169
+ payoutLimits: _payoutLimits,
170
+ surplusAllowances: _surplusAllowances
171
+ });
172
+ }
173
+
174
+ vm.expectEmit();
175
+ emit IJBFundAccessLimits.SetFundAccessLimits(_ruleset, _projectId, _fundAccessLimitGroup[0], address(this));
176
+
177
+ vm.expectEmit();
178
+ emit IJBFundAccessLimits.SetFundAccessLimits(_ruleset, _projectId, _fundAccessLimitGroup[1], address(this));
179
+
180
+ _fundAccess.setFundAccessLimitsFor(_projectId, _ruleset, _fundAccessLimitGroup);
181
+ }
182
+ }
@@ -0,0 +1,61 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFundAccessSetup} from "./JBFundAccessSetup.sol";
6
+
7
+ contract TestSurplusAllowanceOf_Local is JBFundAccessSetup {
8
+ uint256 _projectId = 1;
9
+ address _terminal = address(1);
10
+
11
+ function setUp() public {
12
+ super.fundAccessSetup();
13
+ }
14
+
15
+ modifier whenCallerIsControllerOfProject() {
16
+ bytes memory _controllerCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
17
+ bytes memory _return = abi.encode(address(this));
18
+
19
+ mockExpect(address(directory), _controllerCall, _return);
20
+ _;
21
+ }
22
+
23
+ function test_WhenAProjectHasTheSpecificSurplusConfigured() external whenCallerIsControllerOfProject {
24
+ // it will return uint256 surplusAllowance
25
+
26
+ // Fund Access config
27
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
28
+ {
29
+ // Specify a payout limit.
30
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](0);
31
+
32
+ // Specify a surplus allowance.
33
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](1);
34
+ _surplusAllowances[0] =
35
+ JBCurrencyAmount({amount: 1e18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
36
+
37
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
38
+ terminal: _terminal,
39
+ token: JBConstants.NATIVE_TOKEN,
40
+ payoutLimits: _payoutLimits,
41
+ surplusAllowances: _surplusAllowances
42
+ });
43
+ }
44
+
45
+ _fundAccess.setFundAccessLimitsFor(_projectId, block.timestamp, _fundAccessLimitGroup);
46
+
47
+ uint256 _returned = _fundAccess.surplusAllowanceOf(
48
+ _projectId, block.timestamp, _terminal, JBConstants.NATIVE_TOKEN, uint32(uint160(JBConstants.NATIVE_TOKEN))
49
+ );
50
+ assertEq(_returned, 1e18);
51
+ }
52
+
53
+ function test_WhenItDoesntHaveTheSpecificSurplusConfigured() external view {
54
+ // it will return 0
55
+
56
+ uint256 _returned = _fundAccess.surplusAllowanceOf(
57
+ _projectId, block.timestamp, _terminal, JBConstants.NATIVE_TOKEN, uint32(uint160(JBConstants.NATIVE_TOKEN))
58
+ );
59
+ assertEq(_returned, 0);
60
+ }
61
+ }
@@ -0,0 +1,96 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBFundAccessSetup} from "./JBFundAccessSetup.sol";
6
+
7
+ contract TestSurplusAllowancesOf_Local is JBFundAccessSetup {
8
+ uint256 _projectId = 1;
9
+ address _terminal = address(1);
10
+ address _terminal2 = address(2);
11
+ address _someToken = makeAddr("someToken");
12
+
13
+ function setUp() public {
14
+ super.fundAccessSetup();
15
+ }
16
+
17
+ modifier whenAProjectHasSpecifiedSurplusAllowances() {
18
+ bytes memory _controllerCall = abi.encodeCall(IJBDirectory.controllerOf, (1));
19
+ bytes memory _return = abi.encode(address(this));
20
+
21
+ mockExpect(address(directory), _controllerCall, _return);
22
+
23
+ // Fund Access config
24
+ JBFundAccessLimitGroup[] memory _fundAccessLimitGroup = new JBFundAccessLimitGroup[](2);
25
+ {
26
+ // Specify a payout limit.
27
+ JBCurrencyAmount[] memory _payoutLimits = new JBCurrencyAmount[](0);
28
+
29
+ // Specify a surplus allowance.
30
+ JBCurrencyAmount[] memory _surplusAllowances = new JBCurrencyAmount[](2);
31
+ _surplusAllowances[0] =
32
+ JBCurrencyAmount({amount: 1e18, currency: uint32(uint160(JBConstants.NATIVE_TOKEN))});
33
+
34
+ _surplusAllowances[1] = JBCurrencyAmount({amount: 2e18, currency: uint32(uint160(_someToken))});
35
+
36
+ _fundAccessLimitGroup[0] = JBFundAccessLimitGroup({
37
+ terminal: _terminal,
38
+ token: JBConstants.NATIVE_TOKEN,
39
+ payoutLimits: _payoutLimits,
40
+ surplusAllowances: _surplusAllowances
41
+ });
42
+
43
+ _fundAccessLimitGroup[1] = JBFundAccessLimitGroup({
44
+ terminal: _terminal2,
45
+ token: _someToken,
46
+ payoutLimits: _payoutLimits,
47
+ surplusAllowances: _surplusAllowances
48
+ });
49
+ }
50
+
51
+ _fundAccess.setFundAccessLimitsFor(_projectId, block.timestamp, _fundAccessLimitGroup);
52
+ _fundAccess.setFundAccessLimitsFor(_projectId, block.timestamp + 1, _fundAccessLimitGroup);
53
+
54
+ _;
55
+ }
56
+
57
+ function test_GivenTheyAreSpecifiedForASpecificRuleset() external whenAProjectHasSpecifiedSurplusAllowances {
58
+ // it will return them
59
+
60
+ JBCurrencyAmount[] memory surplusLimits =
61
+ _fundAccess.surplusAllowancesOf(_projectId, block.timestamp, _terminal, JBConstants.NATIVE_TOKEN);
62
+
63
+ JBCurrencyAmount[] memory surplusLimits2 =
64
+ _fundAccess.surplusAllowancesOf(_projectId, block.timestamp + 1, _terminal, JBConstants.NATIVE_TOKEN);
65
+
66
+ assertEq(surplusLimits[0].currency, uint32(uint160(JBConstants.NATIVE_TOKEN)));
67
+ assertEq(surplusLimits[0].amount, 1e18);
68
+ assertEq(surplusLimits[1].currency, uint32(uint160(_someToken)));
69
+ assertEq(surplusLimits[1].amount, 2e18);
70
+
71
+ assertEq(surplusLimits2[0].currency, uint32(uint160(JBConstants.NATIVE_TOKEN)));
72
+ assertEq(surplusLimits2[0].amount, 1e18);
73
+ assertEq(surplusLimits2[1].currency, uint32(uint160(_someToken)));
74
+ assertEq(surplusLimits2[1].amount, 2e18);
75
+ }
76
+
77
+ function test_GivenTheyAreSpecifiedForASpecificTerminal() external whenAProjectHasSpecifiedSurplusAllowances {
78
+ // it will return them
79
+
80
+ JBCurrencyAmount[] memory surplusLimits =
81
+ _fundAccess.surplusAllowancesOf(_projectId, block.timestamp, _terminal2, _someToken);
82
+
83
+ assertEq(surplusLimits[0].currency, uint32(uint160(JBConstants.NATIVE_TOKEN)));
84
+ assertEq(surplusLimits[0].amount, 1e18);
85
+ }
86
+
87
+ function test_GivenTheyAreSpecifiedForASpecificToken() external whenAProjectHasSpecifiedSurplusAllowances {
88
+ // it will return them
89
+
90
+ JBCurrencyAmount[] memory surplusLimits =
91
+ _fundAccess.surplusAllowancesOf(_projectId, block.timestamp, _terminal, JBConstants.NATIVE_TOKEN);
92
+
93
+ assertEq(surplusLimits[0].currency, uint32(uint160(JBConstants.NATIVE_TOKEN)));
94
+ assertEq(surplusLimits[0].amount, 1e18);
95
+ }
96
+ }
@@ -0,0 +1,89 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBMetadataResolver} from "../../../../src/libraries/JBMetadataResolver.sol";
6
+
7
+ contract TestGetDataFor_Local is JBTest {
8
+ bytes4 _id1 = bytes4(0x10101010);
9
+ bytes4 _id2 = bytes4(0x20202020);
10
+
11
+ function setUp() external {}
12
+
13
+ function test_WhenMetadataLengthLTEQMIN_METADATA_LENGTH() external view {
14
+ // it will return false and empty bytes
15
+
16
+ // malformed data only contains the padding intended for the protocol
17
+ bytes memory _malformed = abi.encodePacked(bytes32(uint256(type(uint256).max)));
18
+
19
+ (bool _found, bytes memory _data) = JBMetadataResolver.getDataFor(_id1, _malformed);
20
+
21
+ // check
22
+ assertEq(_found, false);
23
+ assertEq("", _data);
24
+ }
25
+
26
+ modifier whenMetadataLengthGTMIN_METADATA_LENGTH() {
27
+ _;
28
+ }
29
+
30
+ function test_GivenIdIsFound() external view whenMetadataLengthGTMIN_METADATA_LENGTH {
31
+ // it will return found EQ true and targetData
32
+
33
+ uint256 _data1 = 10_000_000;
34
+ bytes memory _data2 = new bytes(100);
35
+
36
+ // malformed data only contains the padding intended for the protocol
37
+ bytes memory _metadata = abi.encodePacked(
38
+ // -- offset 0 --
39
+ bytes32(uint256(type(uint256).max)), // First 32B reserved
40
+ // -- offset 1 --
41
+ _id1, // First id
42
+ uint8(2), // First data offset == 2
43
+ _id2, // Second id == _id
44
+ uint8(3), // Second data offset == 3
45
+ bytes22(0), // Rest of the word is 0-padded
46
+ // -- offset 2 --
47
+ _data1, // First data
48
+ // -- offset 3 --
49
+ _data2 // Second data
50
+ );
51
+
52
+ (bool _found, bytes memory _returnedData) = JBMetadataResolver.getDataFor(_id1, _metadata);
53
+
54
+ // check
55
+ assertEq(_found, true);
56
+ assertEq(abi.decode(_returnedData, (uint256)), _data1);
57
+ }
58
+
59
+ function test_GivenIdIsNotFound() external view whenMetadataLengthGTMIN_METADATA_LENGTH {
60
+ // it will return found EQ false and empty bytes targetData
61
+
62
+ uint256 _data1 = 10_000_000;
63
+ bytes memory _data2 = new bytes(100);
64
+
65
+ // malformed data only contains the padding intended for the protocol
66
+ bytes memory _metadata = abi.encodePacked(
67
+ // -- offset 0 --
68
+ bytes32(uint256(type(uint256).max)), // First 32B reserved
69
+ // -- offset 1 --
70
+ _id1, // First id
71
+ uint8(2), // First data offset == 2
72
+ _id2, // Second id == _id
73
+ uint8(3), // Second data offset == 3
74
+ bytes22(0), // Rest of the word is 0-padded
75
+ // -- offset 2 --
76
+ _data1, // First data
77
+ // -- offset 3 --
78
+ _data2 // Second data
79
+ );
80
+
81
+ bytes4 _invalidId = bytes4(0x40404040);
82
+
83
+ (bool _found, bytes memory _returnedData) = JBMetadataResolver.getDataFor(_invalidId, _metadata);
84
+
85
+ // check
86
+ assertEq(_found, false);
87
+ assertEq("", _returnedData);
88
+ }
89
+ }