@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,243 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBMultiTerminalSetup} from "./JBMultiTerminalSetup.sol";
6
+
7
+ contract TestSendPayoutsOf_Local is JBMultiTerminalSetup {
8
+ uint256 _projectId = 1;
9
+ uint256 _defaultAmount = 1e18;
10
+
11
+ function setUp() public {
12
+ super.multiTerminalSetup();
13
+ }
14
+
15
+ function test_WhenAmountPaidOutLtMinTokensPaidOut() external {
16
+ // it will revert UNDER_MIN_TOKENS_PAID_OUT
17
+
18
+ // needed for terminal store mock call
19
+ JBRuleset memory returnedRuleset = JBRuleset({
20
+ cycleNumber: 1,
21
+ id: 1,
22
+ basedOnId: 0,
23
+ start: 0,
24
+ duration: 0,
25
+ weight: 0,
26
+ weightCutPercent: 0,
27
+ approvalHook: IJBRulesetApprovalHook(address(0)),
28
+ metadata: 0
29
+ });
30
+
31
+ JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
32
+
33
+ // record payout mock call
34
+ mockExpect(
35
+ address(store),
36
+ abi.encodeCall(IJBTerminalStore.recordPayoutFor, (_projectId, mockTokenContext, 0, 0)),
37
+ abi.encode(returnedRuleset, 0)
38
+ );
39
+
40
+ // projects owner of
41
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
42
+
43
+ // needed for splits return call
44
+ JBSplit[] memory returnedSplits = new JBSplit[](0);
45
+
46
+ // mock splits of call
47
+ mockExpect(
48
+ address(splits),
49
+ abi.encodeCall(IJBSplits.splitsOf, (_projectId, returnedRuleset.id, 0)),
50
+ abi.encode(returnedSplits)
51
+ );
52
+
53
+ // mock directory call for fee processing
54
+ mockExpect(
55
+ address(directory),
56
+ abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, address(0))),
57
+ abi.encode(address(_terminal))
58
+ );
59
+
60
+ vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_UnderMinTokensPaidOut.selector, 0, 1));
61
+ _terminal.sendPayoutsOf(_projectId, address(0), 0, 0, 1);
62
+ }
63
+
64
+ function test_WhenOwnerMustSendPayoutsButCallerDNEQOwner() external {
65
+ // it will check permissions
66
+
67
+ // needed for terminal store mock call
68
+ JBRuleset memory returnedRuleset = generateUnfriendlyRuleset();
69
+
70
+ JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
71
+
72
+ // record payout mock call
73
+ mockExpect(
74
+ address(store),
75
+ abi.encodeCall(IJBTerminalStore.recordPayoutFor, (_projectId, mockTokenContext, 0, 0)),
76
+ abi.encode(returnedRuleset, 0)
77
+ );
78
+
79
+ address owner = makeAddr("owner");
80
+
81
+ // projects owner of
82
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(owner));
83
+
84
+ // mock permissions call
85
+ bytes memory _permCall = abi.encodeCall(
86
+ IJBPermissions.hasPermission, (address(this), owner, _projectId, JBPermissionIds.SEND_PAYOUTS, true, true)
87
+ );
88
+ mockExpect(address(permissions), _permCall, abi.encode(false));
89
+
90
+ vm.expectRevert(
91
+ abi.encodeWithSelector(
92
+ JBPermissioned.JBPermissioned_Unauthorized.selector,
93
+ owner,
94
+ address(this),
95
+ _projectId,
96
+ JBPermissionIds.SEND_PAYOUTS
97
+ )
98
+ );
99
+ _terminal.sendPayoutsOf(_projectId, address(0), 0, 0, 1);
100
+ }
101
+
102
+ function test_WhenExecutePayoutFails() external {
103
+ // it will revert PayoutReverted
104
+
105
+ // needed for terminal store mock call
106
+ JBRuleset memory returnedRuleset = JBRuleset({
107
+ cycleNumber: 1,
108
+ id: 1,
109
+ basedOnId: 0,
110
+ start: 0,
111
+ duration: 0,
112
+ weight: 0,
113
+ weightCutPercent: 0,
114
+ approvalHook: IJBRulesetApprovalHook(address(0)),
115
+ metadata: 0
116
+ });
117
+
118
+ JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
119
+
120
+ // record payout mock call
121
+ mockExpect(
122
+ address(store),
123
+ abi.encodeCall(IJBTerminalStore.recordPayoutFor, (_projectId, mockTokenContext, 0, 0)),
124
+ abi.encode(returnedRuleset, 0)
125
+ );
126
+
127
+ // projects owner of
128
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
129
+
130
+ // needed for splits return call
131
+ // invalid data to ensure revert
132
+ JBSplit[] memory returnedSplits = new JBSplit[](1);
133
+ returnedSplits[0] = JBSplit({
134
+ preferAddToBalance: false,
135
+ percent: 0,
136
+ projectId: 0,
137
+ beneficiary: payable(address(this)),
138
+ lockedUntil: uint48(block.timestamp + 1),
139
+ hook: IJBSplitHook(address(0))
140
+ });
141
+
142
+ // mock splits of call
143
+ mockExpect(
144
+ address(splits),
145
+ abi.encodeCall(IJBSplits.splitsOf, (_projectId, returnedRuleset.id, 0)),
146
+ abi.encode(returnedSplits)
147
+ );
148
+
149
+ // mock directory call for fee processing
150
+ mockExpect(
151
+ address(directory),
152
+ abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, address(0))),
153
+ abi.encode(address(_terminal))
154
+ );
155
+
156
+ // mock call to feelessAddresses
157
+ mockExpect(
158
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(true)
159
+ );
160
+
161
+ vm.expectEmit(true, true, true, false);
162
+ emit IJBPayoutTerminal.PayoutReverted(
163
+ _projectId,
164
+ returnedSplits[0],
165
+ 0,
166
+ bytes("0x9996b3150000000000000000000000000000000000000000000000000000000000000000"),
167
+ address(this)
168
+ );
169
+
170
+ _terminal.sendPayoutsOf(_projectId, address(0), 0, 0, 0);
171
+ }
172
+
173
+ // it will revert UNDER_MIN_TOKENS_PAID_OUT
174
+ function test_WhenPayoutFailsDoNotTakeFee() external {
175
+ // needed for terminal store mock call
176
+ JBRuleset memory returnedRuleset = JBRuleset({
177
+ cycleNumber: 1,
178
+ id: 1,
179
+ basedOnId: 0,
180
+ start: 0,
181
+ duration: 0,
182
+ weight: 0,
183
+ weightCutPercent: 0,
184
+ approvalHook: IJBRulesetApprovalHook(address(0)),
185
+ metadata: 0
186
+ });
187
+
188
+ JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
189
+
190
+ // record payout mock call
191
+ mockExpect(
192
+ address(store),
193
+ abi.encodeCall(IJBTerminalStore.recordPayoutFor, (_projectId, mockTokenContext, 0, 100)),
194
+ abi.encode(returnedRuleset, 100)
195
+ );
196
+
197
+ // projects owner of
198
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
199
+
200
+ // mock call to feeless addresses
201
+ mockExpect(
202
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(false)
203
+ );
204
+
205
+ // needed for splits return call
206
+ JBSplit[] memory returnedSplits = new JBSplit[](1);
207
+ returnedSplits[0] = JBSplit({
208
+ preferAddToBalance: false,
209
+ percent: 0,
210
+ projectId: 0,
211
+ beneficiary: payable(address(this)),
212
+ lockedUntil: uint48(block.timestamp + 1),
213
+ hook: IJBSplitHook(address(1))
214
+ });
215
+
216
+ // mock splits of call
217
+ mockExpect(
218
+ address(splits),
219
+ abi.encodeCall(IJBSplits.splitsOf, (_projectId, returnedRuleset.id, 0)),
220
+ abi.encode(returnedSplits)
221
+ );
222
+
223
+ // mock directory call for fee processing
224
+ mockExpect(
225
+ address(directory),
226
+ abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, address(0))),
227
+ abi.encode(address(_terminal))
228
+ );
229
+
230
+ vm.expectEmit(true, true, true, true);
231
+ emit IJBPayoutTerminal.PayoutTransferReverted(
232
+ _projectId,
233
+ address(this),
234
+ address(0),
235
+ 98, // Amount that would have been transferred after fee.
236
+ 2, // fee amount
237
+ bytes(hex"5274afe70000000000000000000000000000000000000000000000000000000000000000"),
238
+ address(this)
239
+ );
240
+
241
+ _terminal.sendPayoutsOf(_projectId, address(0), 0, 100, 100);
242
+ }
243
+ }
@@ -0,0 +1,310 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBMultiTerminalSetup} from "./JBMultiTerminalSetup.sol";
6
+
7
+ contract TestUseAllowanceOf_Local is JBMultiTerminalSetup {
8
+ uint256 _projectId = 1;
9
+
10
+ function setUp() public {
11
+ super.multiTerminalSetup();
12
+ }
13
+
14
+ function test_WhenAmountPaidOutLTMinTokensPaidOut() external {
15
+ // it will revert UNDER_MIN_TOKENS_PAID_OUT
16
+
17
+ // mock owner call
18
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
19
+
20
+ // needed for terminal store mock call
21
+ JBRuleset memory returnedRuleset = JBRuleset({
22
+ cycleNumber: 1,
23
+ id: 1,
24
+ basedOnId: 0,
25
+ start: 0,
26
+ duration: 0,
27
+ weight: 0,
28
+ weightCutPercent: 0,
29
+ approvalHook: IJBRulesetApprovalHook(address(0)),
30
+ metadata: 0
31
+ });
32
+
33
+ JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
34
+
35
+ // recordUsedAllowance
36
+ mockExpect(
37
+ address(store),
38
+ abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, mockTokenContext, 0, 0)),
39
+ abi.encode(returnedRuleset, 0)
40
+ );
41
+
42
+ // feeless check
43
+ mockExpect(
44
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(true)
45
+ );
46
+
47
+ vm.expectRevert(abi.encodeWithSelector(JBMultiTerminal.JBMultiTerminal_UnderMinTokensPaidOut.selector, 0, 1));
48
+ _terminal.useAllowanceOf(_projectId, address(0), 0, 0, 1, payable(address(this)), payable(address(this)), "");
49
+ }
50
+
51
+ function test_WhenOwnerEQFeeless() external {
52
+ // it will not incur fees
53
+ address mockToken = makeAddr("token");
54
+
55
+ // mock owner call
56
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
57
+
58
+ // needed for terminal store mock call
59
+ JBRuleset memory returnedRuleset = JBRuleset({
60
+ cycleNumber: 1,
61
+ id: 1,
62
+ basedOnId: 0,
63
+ start: 0,
64
+ duration: 0,
65
+ weight: 0,
66
+ weightCutPercent: 0,
67
+ approvalHook: IJBRulesetApprovalHook(address(0)),
68
+ metadata: 0
69
+ });
70
+
71
+ JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
72
+
73
+ // recordUsedAllowance
74
+ mockExpect(
75
+ address(store),
76
+ abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, mockTokenContext, 100, 0)),
77
+ abi.encode(returnedRuleset, 100)
78
+ );
79
+
80
+ // feeless check
81
+ mockExpect(
82
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(true)
83
+ );
84
+
85
+ mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (address(this), 100)), abi.encode(true));
86
+
87
+ vm.expectEmit();
88
+ emit IJBPayoutTerminal.UseAllowance({
89
+ rulesetId: returnedRuleset.id,
90
+ rulesetCycleNumber: returnedRuleset.cycleNumber,
91
+ projectId: _projectId,
92
+ beneficiary: address(this),
93
+ feeBeneficiary: address(this),
94
+ amount: 100,
95
+ amountPaidOut: 100,
96
+ netAmountPaidOut: 100,
97
+ memo: "",
98
+ caller: address(this)
99
+ });
100
+ _terminal.useAllowanceOf(_projectId, mockToken, 100, 0, 0, payable(address(this)), payable(address(this)), "");
101
+ }
102
+
103
+ function test_WhenBeneficiaryIsFeeless() external {
104
+ address mockToken = makeAddr("token");
105
+ address beneficiary = makeAddr("bene");
106
+
107
+ // mock owner call
108
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
109
+
110
+ // needed for terminal store mock call
111
+ JBRuleset memory returnedRuleset = JBRuleset({
112
+ cycleNumber: 1,
113
+ id: 1,
114
+ basedOnId: 0,
115
+ start: 0,
116
+ duration: 0,
117
+ weight: 0,
118
+ weightCutPercent: 0,
119
+ approvalHook: IJBRulesetApprovalHook(address(0)),
120
+ metadata: 0
121
+ });
122
+
123
+ JBAccountingContext memory mockTokenContext = JBAccountingContext({token: address(0), decimals: 0, currency: 0});
124
+
125
+ // recordUsedAllowance
126
+ mockExpect(
127
+ address(store),
128
+ abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, mockTokenContext, 100, 0)),
129
+ abi.encode(returnedRuleset, 100)
130
+ );
131
+
132
+ // first feeless check which will return false.
133
+ mockExpect(
134
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(false)
135
+ );
136
+
137
+ // second which is true for beneficiary.
138
+ mockExpect(
139
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (beneficiary)), abi.encode(true)
140
+ );
141
+
142
+ mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (beneficiary, 100)), abi.encode(true));
143
+
144
+ vm.expectEmit();
145
+ emit IJBPayoutTerminal.UseAllowance({
146
+ rulesetId: returnedRuleset.id,
147
+ rulesetCycleNumber: returnedRuleset.cycleNumber,
148
+ projectId: _projectId,
149
+ beneficiary: beneficiary,
150
+ feeBeneficiary: address(this),
151
+ amount: 100,
152
+ amountPaidOut: 100,
153
+ netAmountPaidOut: 100,
154
+ memo: "",
155
+ caller: address(this)
156
+ });
157
+
158
+ _terminal.useAllowanceOf({
159
+ projectId: _projectId,
160
+ token: mockToken,
161
+ amount: 100,
162
+ currency: 0,
163
+ minTokensPaidOut: 100,
164
+ beneficiary: payable(beneficiary),
165
+ feeBeneficiary: payable(address(this)),
166
+ memo: ""
167
+ });
168
+ }
169
+
170
+ function test_WhenNotFeeless() external {
171
+ address mockToken = makeAddr("token");
172
+ address beneficiary = makeAddr("bene");
173
+
174
+ // Mock controller for mint call on fee payments
175
+ address controller = makeAddr("controller");
176
+
177
+ // Weight for a fee calculation that would take place in terminal store
178
+ uint112 weight = 1000 * 10 ** 18;
179
+
180
+ uint32 currencyId = uint32(uint160(mockToken));
181
+
182
+ // Start the cascade of issuing project tokens to the fee beneficiary. (recieving platform tokens for paying a
183
+ // fee, or being designated as such).
184
+ mockExpect(
185
+ address(directory), abi.encodeCall(IJBDirectory.controllerOf, (_projectId)), abi.encode(address(controller))
186
+ );
187
+
188
+ // mock owner call
189
+ mockExpect(address(projects), abi.encodeCall(IERC721.ownerOf, (_projectId)), abi.encode(address(this)));
190
+
191
+ // needed for terminal store mock call
192
+ JBRuleset memory returnedRuleset = JBRuleset({
193
+ cycleNumber: 1,
194
+ id: 0,
195
+ basedOnId: 0,
196
+ start: 0,
197
+ duration: 0,
198
+ weight: weight,
199
+ weightCutPercent: 0,
200
+ approvalHook: IJBRulesetApprovalHook(address(0)),
201
+ metadata: 0
202
+ });
203
+
204
+ // mock call to tokens decimals()
205
+ mockExpect(mockToken, abi.encodeCall(IERC20Metadata.decimals, ()), abi.encode(18));
206
+
207
+ // mock call to rulesets currentOf returning 0 to bypass ruleset checking
208
+ mockExpect(address(rulesets), abi.encodeCall(IJBRulesets.currentOf, (_projectId)), abi.encode(returnedRuleset));
209
+
210
+ // call params
211
+ JBAccountingContext[] memory _tokens = new JBAccountingContext[](1);
212
+ _tokens[0] = JBAccountingContext({token: mockToken, decimals: 18, currency: currencyId});
213
+
214
+ _terminal.addAccountingContextsFor(_projectId, _tokens);
215
+
216
+ _terminal.accountingContextForTokenOf(_projectId, mockToken);
217
+
218
+ // recordUsedAllowance
219
+ mockExpect(
220
+ address(store),
221
+ abi.encodeCall(IJBTerminalStore.recordUsedAllowanceOf, (_projectId, _tokens[0], 100, 0)),
222
+ abi.encode(returnedRuleset, 100)
223
+ );
224
+
225
+ // first feeless check which will return false.
226
+ mockExpect(
227
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(this))), abi.encode(false)
228
+ );
229
+
230
+ // second which is also false.
231
+ mockExpect(
232
+ address(feelessAddresses), abi.encodeCall(IJBFeelessAddresses.isFeeless, (beneficiary)), abi.encode(false)
233
+ );
234
+
235
+ mockExpect(mockToken, abi.encodeCall(IERC20.transfer, (beneficiary, 98)), abi.encode(true));
236
+
237
+ // call to find the primary terminal for fee processing
238
+ mockExpect(
239
+ address(directory),
240
+ abi.encodeCall(IJBDirectory.primaryTerminalOf, (1, mockToken)),
241
+ abi.encode(address(_terminal))
242
+ );
243
+
244
+ JBTokenAmount memory tokenContext =
245
+ JBTokenAmount({token: mockToken, decimals: 18, currency: currencyId, value: 2});
246
+
247
+ // mock call to jbterminalstore
248
+ mockExpect(
249
+ address(store),
250
+ abi.encodeCall(
251
+ IJBTerminalStore.recordPaymentFrom,
252
+ // feeBeneficiary will receive platform tokens for paying a fee, project id is encoded for memo
253
+ (address(_terminal), tokenContext, _projectId, address(this), bytes(abi.encodePacked(_projectId)))
254
+ ),
255
+ abi.encode(returnedRuleset, 1, new JBPayHookSpecification[](0))
256
+ );
257
+
258
+ // Return the mint of call as minting one project token for paying a fee.
259
+ mockExpect(
260
+ address(controller),
261
+ abi.encodeCall(IJBController.mintTokensOf, (_projectId, 1, address(this), "", true)),
262
+ abi.encode(2)
263
+ );
264
+
265
+ vm.expectEmit();
266
+ emit IJBPayoutTerminal.UseAllowance({
267
+ rulesetId: returnedRuleset.id,
268
+ rulesetCycleNumber: returnedRuleset.cycleNumber,
269
+ projectId: _projectId,
270
+ beneficiary: beneficiary,
271
+ feeBeneficiary: address(this),
272
+ amount: 100,
273
+ amountPaidOut: 100,
274
+ netAmountPaidOut: 98,
275
+ memo: "",
276
+ caller: address(this)
277
+ });
278
+
279
+ _terminal.useAllowanceOf({
280
+ projectId: _projectId,
281
+ token: mockToken,
282
+ amount: 100,
283
+ currency: 0,
284
+ minTokensPaidOut: 97,
285
+ beneficiary: payable(beneficiary),
286
+ feeBeneficiary: payable(address(this)),
287
+ memo: ""
288
+ });
289
+ }
290
+
291
+ modifier whenMsgSenderDNEQFeeless() {
292
+ _;
293
+ }
294
+
295
+ function test_GivenRulesetHoldFeesEQTrue() external whenMsgSenderDNEQFeeless {
296
+ // it will hold fees and emit HoldFee
297
+ }
298
+
299
+ function test_GivenRulesetHoldFeesDNEQTrue() external whenMsgSenderDNEQFeeless {
300
+ // it will not hold fees and emit ProcessFee
301
+ }
302
+
303
+ function test_WhenTokenEQNATIVE_TOKEN() external {
304
+ // it will send ETH via sendValue
305
+ }
306
+
307
+ function test_WhenTokenEQERC20() external {
308
+ // it will call safeTransfer
309
+ }
310
+ }
@@ -0,0 +1,18 @@
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 JBPermissionsSetup is JBTest {
11
+ // Target Contract
12
+ IJBPermissions public _permissions;
13
+
14
+ function permissionsSetup() public virtual {
15
+ // Instantiate the contract being tested
16
+ _permissions = new JBPermissions(address(0));
17
+ }
18
+ }
@@ -0,0 +1,50 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.23;
3
+
4
+ import /* {*} from */ "../../../helpers/TestBaseWorkflow.sol";
5
+ import {JBPermissionsSetup} from "./JBPermissionsSetup.sol";
6
+
7
+ contract TestHasPermissions_Local is JBPermissionsSetup {
8
+ address _op = makeAddr("operator");
9
+ address _account = makeAddr("account");
10
+ uint256 _projectId = 1;
11
+ uint256 _permission = 256;
12
+
13
+ function setUp() public {
14
+ super.permissionsSetup();
15
+ }
16
+
17
+ function test_WhenPermissionIdGt255() external {
18
+ // it will revert with PERMISSION_ID_OUT_OF_BOUNDS
19
+
20
+ vm.expectRevert(abi.encodeWithSelector(JBPermissions.JBPermissions_PermissionIdOutOfBounds.selector, 256));
21
+ _permissions.hasPermission(_op, _account, _projectId, _permission, true, true);
22
+ }
23
+
24
+ modifier whenPermissionIdLt255() {
25
+ _permission = 1;
26
+ _;
27
+ }
28
+
29
+ function test_GivenOperatorHasPermissionForAccountOfProject() external whenPermissionIdLt255 {
30
+ // it will return true
31
+ uint256 permissions = 1 << 1;
32
+
33
+ // Find the storage slot
34
+ bytes32 permissionsOfSlot = keccak256(abi.encode(_op, uint256(0)));
35
+ bytes32 accountSlot = keccak256(abi.encode(_account, uint256(permissionsOfSlot)));
36
+ bytes32 slot = keccak256(abi.encode(_projectId, accountSlot));
37
+
38
+ // Set storage
39
+ vm.store(address(_permissions), slot, bytes32(permissions));
40
+
41
+ bool has = _permissions.hasPermission(_op, _account, _projectId, 1, true, true);
42
+ assertEq(has, true);
43
+ }
44
+
45
+ function test_GivenOperatorDoesntHavePermissionForAccountOfProject() external whenPermissionIdLt255 {
46
+ // it will return false
47
+ bool has = _permissions.hasPermission(_op, _account, _projectId, 1, true, true);
48
+ assertEq(has, false);
49
+ }
50
+ }