@bananapus/core-v6 0.0.26 → 0.0.28

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 (169) hide show
  1. package/ADMINISTRATION.md +1 -1
  2. package/AUDIT_INSTRUCTIONS.md +3 -3
  3. package/CHANGE_LOG.md +17 -2
  4. package/README.md +1 -1
  5. package/RISKS.md +3 -3
  6. package/SKILLS.md +1 -1
  7. package/STYLE_GUIDE.md +2 -2
  8. package/USER_JOURNEYS.md +6 -3
  9. package/foundry.toml +1 -1
  10. package/package.json +5 -5
  11. package/script/Deploy.s.sol +1 -1
  12. package/script/DeployPeriphery.s.sol +1 -1
  13. package/script/helpers/CoreDeploymentLib.sol +1 -1
  14. package/src/JBChainlinkV3PriceFeed.sol +1 -1
  15. package/src/JBChainlinkV3SequencerPriceFeed.sol +1 -1
  16. package/src/JBController.sol +1 -1
  17. package/src/JBDeadline.sol +1 -1
  18. package/src/JBDirectory.sol +1 -1
  19. package/src/JBERC20.sol +1 -1
  20. package/src/JBFeelessAddresses.sol +1 -1
  21. package/src/JBFundAccessLimits.sol +1 -1
  22. package/src/JBMultiTerminal.sol +41 -13
  23. package/src/JBPermissions.sol +1 -1
  24. package/src/JBPrices.sol +1 -1
  25. package/src/JBProjects.sol +1 -1
  26. package/src/JBRulesets.sol +1 -1
  27. package/src/JBSplits.sol +1 -1
  28. package/src/JBTerminalStore.sol +1 -1
  29. package/src/JBTokens.sol +1 -1
  30. package/src/libraries/JBPayoutSplitGroupLib.sol +1 -1
  31. package/src/periphery/JBDeadline1Day.sol +1 -1
  32. package/src/periphery/JBDeadline3Days.sol +1 -1
  33. package/src/periphery/JBDeadline3Hours.sol +1 -1
  34. package/src/periphery/JBDeadline7Days.sol +1 -1
  35. package/src/periphery/JBMatchingPriceFeed.sol +1 -1
  36. package/test/TestFees.sol +6 -4
  37. package/test/TestJBERC20Inheritance.sol +1 -1
  38. package/test/TestMetadataOffsetOverflow.sol +1 -1
  39. package/test/TestMetadataParserLib.sol +1 -1
  40. package/test/TestTerminalMigration.sol +104 -2
  41. package/test/TestTerminalPreviewParity.sol +1 -1
  42. package/test/audit/FeeFreeSurplusLifecycle.t.sol +11 -4
  43. package/test/audit/FeeFreeSurplusStale.t.sol +11 -5
  44. package/test/audit/USDTVoidReturnCompat.t.sol +6 -0
  45. package/test/fork/TestChainlinkPriceFeedFork.sol +1 -1
  46. package/test/fork/TestSequencerPriceFeedFork.sol +1 -1
  47. package/test/fork/TestTerminalPreviewParityFork.sol +1 -1
  48. package/test/helpers/JBTest.sol +1 -1
  49. package/test/helpers/MetadataResolverHelper.sol +1 -1
  50. package/test/mock/MockERC20.sol +1 -1
  51. package/test/mock/MockMaliciousBeneficiary.sol +1 -1
  52. package/test/mock/MockMaliciousSplitHook.sol +1 -1
  53. package/test/mock/MockPriceFeed.sol +1 -1
  54. package/test/mock/MockUSDT.sol +1 -1
  55. package/test/units/static/JBChainlinkV3PriceFeed/TestPriceFeed.sol +1 -1
  56. package/test/units/static/JBController/JBControllerSetup.sol +1 -1
  57. package/test/units/static/JBController/TestBurnTokensOf.sol +1 -1
  58. package/test/units/static/JBController/TestClaimTokensFor.sol +1 -1
  59. package/test/units/static/JBController/TestDeployErc20For.sol +1 -1
  60. package/test/units/static/JBController/TestLaunchProjectFor.sol +1 -1
  61. package/test/units/static/JBController/TestLaunchRulesetsFor.sol +1 -1
  62. package/test/units/static/JBController/TestMigrateController.sol +1 -1
  63. package/test/units/static/JBController/TestMintTokensOfUnits.sol +1 -1
  64. package/test/units/static/JBController/TestOmnichainRulesetOperator.sol +1 -1
  65. package/test/units/static/JBController/TestPayReservedTokenToTerminal.sol +1 -1
  66. package/test/units/static/JBController/TestPreviewMintOf.sol +1 -1
  67. package/test/units/static/JBController/TestReceiveMigrationFrom.sol +1 -1
  68. package/test/units/static/JBController/TestRulesetViews.sol +1 -1
  69. package/test/units/static/JBController/TestSendReservedTokensToSplitsOf.sol +1 -1
  70. package/test/units/static/JBController/TestSetSplitGroupsOf.sol +1 -1
  71. package/test/units/static/JBController/TestSetTokenFor.sol +1 -1
  72. package/test/units/static/JBController/TestSetUriOf.sol +1 -1
  73. package/test/units/static/JBController/TestTransferCreditsFrom.sol +1 -1
  74. package/test/units/static/JBDeadline/TestDeadlineFuzz.sol +1 -1
  75. package/test/units/static/JBDirectory/JBDirectorySetup.sol +1 -1
  76. package/test/units/static/JBDirectory/TestPrimaryTerminalOf.sol +1 -1
  77. package/test/units/static/JBDirectory/TestSetControllerOf.sol +1 -1
  78. package/test/units/static/JBDirectory/TestSetControllerOfMigrationOrder.sol +1 -1
  79. package/test/units/static/JBDirectory/TestSetPrimaryTerminalOf.sol +1 -1
  80. package/test/units/static/JBDirectory/TestSetTerminalsOf.sol +1 -1
  81. package/test/units/static/JBERC20/JBERC20Setup.sol +1 -1
  82. package/test/units/static/JBERC20/SigUtils.sol +1 -1
  83. package/test/units/static/JBERC20/TestInitialize.sol +1 -1
  84. package/test/units/static/JBERC20/TestName.sol +1 -1
  85. package/test/units/static/JBERC20/TestNonces.sol +1 -1
  86. package/test/units/static/JBERC20/TestSymbol.sol +1 -1
  87. package/test/units/static/JBFeelessAdresses/JBFeelessSetup.sol +1 -1
  88. package/test/units/static/JBFeelessAdresses/TestInterfaces.sol +1 -1
  89. package/test/units/static/JBFeelessAdresses/TestSetFeelessAddress.sol +1 -1
  90. package/test/units/static/JBFees/TestFeesFuzz.sol +1 -1
  91. package/test/units/static/JBFixedPointNumber/TestAdjustDecimals.sol +1 -1
  92. package/test/units/static/JBFixedPointNumber/TestAdjustDecimalsFuzz.sol +1 -1
  93. package/test/units/static/JBFundAccessLimits/JBFundAccessSetup.sol +1 -1
  94. package/test/units/static/JBFundAccessLimits/TestFundAccessLimitsEdge.sol +1 -1
  95. package/test/units/static/JBFundAccessLimits/TestPayoutLimitOf.sol +1 -1
  96. package/test/units/static/JBFundAccessLimits/TestPayoutLimitsOf.sol +1 -1
  97. package/test/units/static/JBFundAccessLimits/TestSetFundAccessLimitsFor.sol +1 -1
  98. package/test/units/static/JBFundAccessLimits/TestSurplusAllowanceOf.sol +1 -1
  99. package/test/units/static/JBFundAccessLimits/TestSurplusAllowancesOf.sol +1 -1
  100. package/test/units/static/JBMetadataResolver/TestGetDataFor.sol +1 -1
  101. package/test/units/static/JBMetadataResolver/TestMetadataResolverEdgeCases.sol +1 -1
  102. package/test/units/static/JBMetadataResolver/TestMetadataResolverFuzz.sol +1 -1
  103. package/test/units/static/JBMultiTerminal/JBMultiTerminalSetup.sol +1 -1
  104. package/test/units/static/JBMultiTerminal/TestAccountingContextsOf.sol +1 -1
  105. package/test/units/static/JBMultiTerminal/TestAddAccountingContextsFor.sol +1 -1
  106. package/test/units/static/JBMultiTerminal/TestAddToBalanceOf.sol +1 -1
  107. package/test/units/static/JBMultiTerminal/TestCashOutTokensOf.sol +1 -1
  108. package/test/units/static/JBMultiTerminal/TestExecutePayout.sol +3 -42
  109. package/test/units/static/JBMultiTerminal/TestExecuteProcessFee.sol +1 -1
  110. package/test/units/static/JBMultiTerminal/TestMigrateBalanceOf.sol +16 -1
  111. package/test/units/static/JBMultiTerminal/TestPay.sol +1 -1
  112. package/test/units/static/JBMultiTerminal/TestPreviewCashOutFrom.sol +1 -1
  113. package/test/units/static/JBMultiTerminal/TestPreviewPayFor.sol +1 -1
  114. package/test/units/static/JBMultiTerminal/TestProcessHeldFeesOf.sol +1 -1
  115. package/test/units/static/JBMultiTerminal/TestSelfPayRevert.sol +55 -0
  116. package/test/units/static/JBMultiTerminal/TestSendPayoutsOf.sol +1 -1
  117. package/test/units/static/JBMultiTerminal/TestUseAllowanceOf.sol +1 -1
  118. package/test/units/static/JBPermissions/JBPermissionsSetup.sol +1 -1
  119. package/test/units/static/JBPermissions/TestHasPermission.sol +1 -1
  120. package/test/units/static/JBPermissions/TestHasPermissions.sol +1 -1
  121. package/test/units/static/JBPermissions/TestSetPermissionsFor.sol +1 -1
  122. package/test/units/static/JBPrices/JBPricesSetup.sol +1 -1
  123. package/test/units/static/JBPrices/TestAddPriceFeedFor.sol +1 -1
  124. package/test/units/static/JBPrices/TestPricePerUnitOf.sol +1 -1
  125. package/test/units/static/JBPrices/TestPrices.sol +1 -1
  126. package/test/units/static/JBProjects/JBProjectsSetup.sol +1 -1
  127. package/test/units/static/JBProjects/TestCreateFor.sol +1 -1
  128. package/test/units/static/JBProjects/TestInitialProject.sol +1 -1
  129. package/test/units/static/JBProjects/TestInterfaces.sol +1 -1
  130. package/test/units/static/JBProjects/TestSetResolver.sol +1 -1
  131. package/test/units/static/JBProjects/TestTokenUri.sol +1 -1
  132. package/test/units/static/JBRulesetMetadataResolver/TestSetCashOutTaxRateTo.sol +1 -1
  133. package/test/units/static/JBRulesets/JBRulesetsSetup.sol +1 -1
  134. package/test/units/static/JBRulesets/TestCurrentApprovalStatusForLatestRulesetOf.sol +1 -1
  135. package/test/units/static/JBRulesets/TestCurrentOf.sol +1 -1
  136. package/test/units/static/JBRulesets/TestGetRulesetOf.sol +1 -1
  137. package/test/units/static/JBRulesets/TestLatestQueuedRulesetOf.sol +1 -1
  138. package/test/units/static/JBRulesets/TestRulesets.sol +1 -1
  139. package/test/units/static/JBRulesets/TestRulesetsOf.sol +1 -1
  140. package/test/units/static/JBRulesets/TestUpcomingRulesetOf.sol +1 -1
  141. package/test/units/static/JBRulesets/TestUpdateRulesetWeightCache.sol +1 -1
  142. package/test/units/static/JBSplits/JBSplitsSetup.sol +1 -1
  143. package/test/units/static/JBSplits/TestSelfManagedSplitGroups.sol +1 -1
  144. package/test/units/static/JBSplits/TestSetSplitGroupsOf.sol +1 -1
  145. package/test/units/static/JBSplits/TestSplitsLockedEdge.sol +1 -1
  146. package/test/units/static/JBSplits/TestSplitsOf.sol +1 -1
  147. package/test/units/static/JBSplits/TestSplitsPacking.sol +1 -1
  148. package/test/units/static/JBSurplus/TestSurplusFuzz.sol +1 -1
  149. package/test/units/static/JBTerminalStore/JBTerminalStoreSetup.sol +1 -1
  150. package/test/units/static/JBTerminalStore/TestCurrentReclaimableSurplusOf.sol +1 -1
  151. package/test/units/static/JBTerminalStore/TestCurrentSurplusOf.sol +1 -1
  152. package/test/units/static/JBTerminalStore/TestCurrentTotalSurplusOf.sol +1 -1
  153. package/test/units/static/JBTerminalStore/TestPreviewCashOutFrom.sol +1 -1
  154. package/test/units/static/JBTerminalStore/TestPreviewPayFrom.sol +1 -1
  155. package/test/units/static/JBTerminalStore/TestRecordCashOutsFor.sol +1 -1
  156. package/test/units/static/JBTerminalStore/TestRecordPaymentFrom.sol +1 -1
  157. package/test/units/static/JBTerminalStore/TestRecordPayoutFor.sol +1 -1
  158. package/test/units/static/JBTerminalStore/TestRecordTerminalMigration.sol +1 -1
  159. package/test/units/static/JBTerminalStore/TestRecordUsedAllowanceOf.sol +1 -1
  160. package/test/units/static/JBTerminalStore/TestUint224Overflow.sol +1 -1
  161. package/test/units/static/JBTokens/JBTokensSetup.sol +1 -1
  162. package/test/units/static/JBTokens/TestBurnFrom.sol +1 -1
  163. package/test/units/static/JBTokens/TestClaimTokensFor.sol +1 -1
  164. package/test/units/static/JBTokens/TestDeployERC20ForUnits.sol +1 -1
  165. package/test/units/static/JBTokens/TestMintFor.sol +1 -1
  166. package/test/units/static/JBTokens/TestSetTokenFor.sol +1 -1
  167. package/test/units/static/JBTokens/TestTotalBalanceOf.sol +1 -1
  168. package/test/units/static/JBTokens/TestTotalSupplyOf.sol +1 -1
  169. package/test/units/static/JBTokens/TestTransferCreditsFrom.sol +1 -1
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBFeelessAddresses} from "../../../../src/interfaces/IJBFeelessAddresses.sol";
5
5
  import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBFeelessAddresses} from "../../../../src/interfaces/IJBFeelessAddresses.sol";
5
5
  import {JBFeelessSetup} from "./JBFeelessSetup.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
5
5
  import {JBTest} from "../../../helpers/JBTest.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBTest} from "../../../helpers/JBTest.sol";
5
5
  import {JBFixedPointNumber} from "../../../../src/libraries/JBFixedPointNumber.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBTest} from "../../../helpers/JBTest.sol";
5
5
  import {JBFixedPointNumber} from "../../../../src/libraries/JBFixedPointNumber.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBFundAccessLimits} from "../../../../src/JBFundAccessLimits.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBFundAccessLimits} from "../../../../src/JBFundAccessLimits.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
5
5
  import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
5
5
  import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBFundAccessLimits} from "../../../../src/JBFundAccessLimits.sol";
5
5
  import {JBControlled} from "../../../../src/abstract/JBControlled.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
5
5
  import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
5
5
  import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBTest} from "../../../helpers/JBTest.sol";
5
5
  import {JBMetadataResolver} from "../../../../src/libraries/JBMetadataResolver.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBTest} from "../../../helpers/JBTest.sol";
5
5
  import {JBMetadataResolver} from "../../../../src/libraries/JBMetadataResolver.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBTest} from "../../../helpers/JBTest.sol";
5
5
  import {JBMetadataResolver} from "../../../../src/libraries/JBMetadataResolver.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {MetadataResolverHelper} from "../../../helpers/MetadataResolverHelper.sol";
5
5
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
5
5
  import {IJBTerminalStore} from "../../../../src/interfaces/IJBTerminalStore.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBTerminalStore} from "../../../../src/JBTerminalStore.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {IJBFeeTerminal} from "../../../../src/interfaces/IJBFeeTerminal.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {MockERC20} from "../../../mock/MockERC20.sol";
5
5
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
@@ -1,21 +1,17 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
6
6
  import {IJBFeelessAddresses} from "../../../../src/interfaces/IJBFeelessAddresses.sol";
7
- import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
8
7
  import {IJBSplitHook} from "../../../../src/interfaces/IJBSplitHook.sol";
9
8
  import {IJBTerminal} from "../../../../src/interfaces/IJBTerminal.sol";
10
9
  import {IJBTerminalStore} from "../../../../src/interfaces/IJBTerminalStore.sol";
11
10
  import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
12
11
  import {JBFees} from "../../../../src/libraries/JBFees.sol";
13
12
  import {JBAccountingContext} from "../../../../src/structs/JBAccountingContext.sol";
14
- import {JBPayHookSpecification} from "../../../../src/structs/JBPayHookSpecification.sol";
15
- import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
16
13
  import {JBSplit} from "../../../../src/structs/JBSplit.sol";
17
14
  import {JBSplitHookContext} from "../../../../src/structs/JBSplitHookContext.sol";
18
- import {JBTokenAmount} from "../../../../src/structs/JBTokenAmount.sol";
19
15
  import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
20
16
  import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
21
17
  import {JBMultiTerminalSetup} from "./JBMultiTerminalSetup.sol";
@@ -366,9 +362,7 @@ contract TestExecutePayout_Local is JBMultiTerminalSetup {
366
362
  }
367
363
 
368
364
  function test_GivenPreferAddToBalanceDNEQTrueAndTerminalEQThisAddress() external {
369
- // it will call internal _pay
370
-
371
- _setAccountingContext(_projectId, _usdc, 0, _usdcCurrency);
365
+ // it will revert with MintNotAllowed because same-project same-terminal pay splits are blocked
372
366
 
373
367
  // mock call to directory primaryTerminalOf
374
368
  mockExpect(
@@ -386,41 +380,8 @@ contract TestExecutePayout_Local is JBMultiTerminalSetup {
386
380
  hook: IJBSplitHook(address(0))
387
381
  });
388
382
 
389
- // needed for next mock call returns
390
- JBTokenAmount memory tokenAmount =
391
- JBTokenAmount({token: _usdc, decimals: 0, currency: _usdcCurrency, value: _defaultAmount});
392
- JBPayHookSpecification[] memory hookSpecifications = new JBPayHookSpecification[](0);
393
- JBRuleset memory returnedRuleset = JBRuleset({
394
- cycleNumber: 1,
395
- id: 1,
396
- basedOnId: 0,
397
- start: 0,
398
- duration: 0,
399
- weight: 0,
400
- weightCutPercent: 0,
401
- approvalHook: IJBRulesetApprovalHook(address(0)),
402
- metadata: 0
403
- });
404
-
405
- // mock call to JBTerminalStore recordPaymentFrom
406
- mockExpect(
407
- address(store),
408
- abi.encodeCall(
409
- IJBTerminalStore.recordPaymentFrom,
410
- (
411
- address(_terminal),
412
- tokenAmount,
413
- _projectId,
414
- address(this),
415
- bytes(abi.encodePacked(uint256(_projectId)))
416
- )
417
- ),
418
- abi.encode(returnedRuleset, 0, hookSpecifications)
419
- );
420
-
421
- // for safe ERC20 check of code length at token address
422
383
  vm.prank(address(_terminal));
423
-
384
+ vm.expectRevert(JBMultiTerminal.JBMultiTerminal_MintNotAllowed.selector);
424
385
  JBMultiTerminal(address(_terminal))
425
386
  .executePayout({
426
387
  split: _splitMemory,
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
@@ -11,6 +11,7 @@ import {JBAccountingContext} from "../../../../src/structs/JBAccountingContext.s
11
11
  import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
12
12
  import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
13
13
  import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
14
+ import {IJBFeelessAddresses} from "../../../../src/interfaces/IJBFeelessAddresses.sol";
14
15
  import {JBMultiTerminalSetup} from "./JBMultiTerminalSetup.sol";
15
16
 
16
17
  contract TestMigrateBalanceOf_Local is JBMultiTerminalSetup {
@@ -104,6 +105,13 @@ contract TestMigrateBalanceOf_Local is JBMultiTerminalSetup {
104
105
  function test_GivenTokenIsERC20() external whenPermissioned {
105
106
  // it will safeIncreaseAllowance and addToBalanceOf
106
107
 
108
+ // mock _isFeeless to return true (skip migration fee for this unit test)
109
+ mockExpect(
110
+ address(feelessAddresses),
111
+ abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(_newTerminal))),
112
+ abi.encode(true)
113
+ );
114
+
107
115
  // for next mock
108
116
  // forge-lint: disable-next-line(unsafe-typecast)
109
117
  JBAccountingContext memory _context =
@@ -143,6 +151,13 @@ contract TestMigrateBalanceOf_Local is JBMultiTerminalSetup {
143
151
  function test_GivenTokenIsNative() external whenPermissioned {
144
152
  // it will addToBalanceOf with value in msgvalue
145
153
 
154
+ // mock _isFeeless to return true (skip migration fee for this unit test)
155
+ mockExpect(
156
+ address(feelessAddresses),
157
+ abi.encodeCall(IJBFeelessAddresses.isFeeless, (address(_newTerminal))),
158
+ abi.encode(true)
159
+ );
160
+
146
161
  // for next mock
147
162
  // forge-lint: disable-next-line(unsafe-typecast)
148
163
  JBAccountingContext memory _context =
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {MockERC20} from "../../../mock/MockERC20.sol";
5
5
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {IJBCashOutHook} from "../../../../src/interfaces/IJBCashOutHook.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {IJBController} from "../../../../src/interfaces/IJBController.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -0,0 +1,55 @@
1
+ // SPDX-License-Identifier: MIT
2
+ pragma solidity 0.8.28;
3
+
4
+ import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
+ import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
6
+ import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
7
+ import {JBSplit} from "../../../../src/structs/JBSplit.sol";
8
+ import {IJBSplitHook} from "../../../../src/interfaces/IJBSplitHook.sol";
9
+ import {JBMultiTerminalSetup} from "./JBMultiTerminalSetup.sol";
10
+
11
+ /// @notice Tests that a pay-type split back into the same terminal reverts with MintNotAllowed.
12
+ contract TestSelfPayRevert_Local is JBMultiTerminalSetup {
13
+ uint64 _projectId = 1;
14
+ uint256 _defaultAmount = 1e18;
15
+ address _sender = makeAddr("sender");
16
+ address _native = JBConstants.NATIVE_TOKEN;
17
+
18
+ function setUp() public {
19
+ super.multiTerminalSetup();
20
+ }
21
+
22
+ /// @notice When a split routes a pay back to the same project on the same terminal,
23
+ /// executePayout should revert with MintNotAllowed.
24
+ function test_RevertWhen_SplitPaysBackToSameTerminal() external {
25
+ // Build a split targeting the SAME project with preferAddToBalance = false (pay path).
26
+ JBSplit memory split = JBSplit({
27
+ preferAddToBalance: false,
28
+ percent: 1_000_000_000,
29
+ projectId: _projectId,
30
+ beneficiary: payable(_sender),
31
+ lockedUntil: 0,
32
+ hook: IJBSplitHook(address(0))
33
+ });
34
+
35
+ // Mock primaryTerminalOf to return this terminal (self-referencing).
36
+ mockExpect(
37
+ address(directory),
38
+ abi.encodeCall(IJBDirectory.primaryTerminalOf, (_projectId, _native)),
39
+ abi.encode(address(_terminal))
40
+ );
41
+
42
+ // executePayout requires msg.sender == address(this), so we call it via the terminal.
43
+ // The terminal's try-catch in the split group lib would normally catch this.
44
+ vm.prank(address(_terminal));
45
+ vm.expectRevert(JBMultiTerminal.JBMultiTerminal_MintNotAllowed.selector);
46
+ JBMultiTerminal(payable(address(_terminal)))
47
+ .executePayout({
48
+ split: split,
49
+ projectId: uint256(_projectId),
50
+ token: _native,
51
+ amount: _defaultAmount,
52
+ originalMessageSender: _sender
53
+ });
54
+ }
55
+ }
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {JBPermissioned} from "../../../../src/abstract/JBPermissioned.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBMultiTerminal} from "../../../../src/JBMultiTerminal.sol";
5
5
  import {IJBController} from "../../../../src/interfaces/IJBController.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPermissions} from "../../../../src/JBPermissions.sol";
5
5
  import {IJBPermissions} from "../../../../src/interfaces/IJBPermissions.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPermissions} from "../../../../src/JBPermissions.sol";
5
5
  import {JBPermissionsSetup} from "./JBPermissionsSetup.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPermissions} from "../../../../src/JBPermissions.sol";
5
5
  import {JBPermissionsSetup} from "./JBPermissionsSetup.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPermissions} from "../../../../src/JBPermissions.sol";
5
5
  import {JBPermissionsData} from "../../../../src/structs/JBPermissionsData.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPrices} from "../../../../src/JBPrices.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPrices} from "../../../../src/JBPrices.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPrices} from "../../../../src/JBPrices.sol";
5
5
  import {IJBPriceFeed} from "../../../../src/interfaces/IJBPriceFeed.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBPrices} from "../../../../src/JBPrices.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBProjects} from "../../../../src/JBProjects.sol";
5
5
  import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {StdStorage, stdStorage} from "forge-std/StdStorage.sol";
5
5
  import {stdError} from "forge-std/StdError.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBProjects} from "../../../../src/JBProjects.sol";
5
5
  import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBProjectsSetup} from "./JBProjectsSetup.sol";
5
5
 
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBProjects} from "../../../../src/interfaces/IJBProjects.sol";
5
5
  import {IJBTokenUriResolver} from "../../../../src/interfaces/IJBTokenUriResolver.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {StdStorage, stdStorage} from "forge-std/StdStorage.sol";
5
5
  import {IJBTokenUriResolver} from "../../../../src/interfaces/IJBTokenUriResolver.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBConstants} from "../../../../src/libraries/JBConstants.sol";
5
5
  import {JBRulesetMetadataResolver} from "../../../../src/libraries/JBRulesetMetadataResolver.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBRulesets} from "../../../../src/JBRulesets.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBApprovalStatus} from "../../../../src/enums/JBApprovalStatus.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBApprovalStatus} from "../../../../src/enums/JBApprovalStatus.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
5
5
  import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBApprovalStatus} from "../../../../src/enums/JBApprovalStatus.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {stdError} from "forge-std/StdError.sol";
5
5
  import {JBRulesets} from "../../../../src/JBRulesets.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBRuleset} from "../../../../src/structs/JBRuleset.sol";
5
5
  import {JBRulesetsSetup} from "./JBRulesetsSetup.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBApprovalStatus} from "../../../../src/enums/JBApprovalStatus.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
5
5
  import {IJBRulesetApprovalHook} from "../../../../src/interfaces/IJBRulesetApprovalHook.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBSplits} from "../../../../src/JBSplits.sol";
5
5
  import {IJBDirectory} from "../../../../src/interfaces/IJBDirectory.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBSplits} from "../../../../src/JBSplits.sol";
5
5
  import {JBControlled} from "../../../../src/abstract/JBControlled.sol";
@@ -1,5 +1,5 @@
1
1
  // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.26;
2
+ pragma solidity 0.8.28;
3
3
 
4
4
  import {JBSplits} from "../../../../src/JBSplits.sol";
5
5
  import {JBControlled} from "../../../../src/abstract/JBControlled.sol";