@rev-net/core-v6 0.0.30 → 0.0.31

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 (62) hide show
  1. package/USER_JOURNEYS.md +11 -0
  2. package/package.json +8 -8
  3. package/script/Deploy.s.sol +4 -1
  4. package/src/REVDeployer.sol +4 -2
  5. package/src/REVLoans.sol +81 -59
  6. package/src/REVOwner.sol +40 -11
  7. package/src/interfaces/IREVLoans.sol +5 -0
  8. package/test/REV.integrations.t.sol +10 -1
  9. package/test/REVAutoIssuanceFuzz.t.sol +10 -1
  10. package/test/REVDeployerRegressions.t.sol +12 -1
  11. package/test/REVInvincibility.t.sol +21 -2
  12. package/test/REVLifecycle.t.sol +12 -1
  13. package/test/REVLoans.invariants.t.sol +12 -1
  14. package/test/REVLoansAttacks.t.sol +12 -1
  15. package/test/REVLoansFeeRecovery.t.sol +12 -1
  16. package/test/REVLoansFindings.t.sol +12 -1
  17. package/test/REVLoansRegressions.t.sol +12 -1
  18. package/test/REVLoansSourceFeeRecovery.t.sol +12 -1
  19. package/test/REVLoansSourced.t.sol +12 -1
  20. package/test/REVLoansUnSourced.t.sol +12 -1
  21. package/test/TestBurnHeldTokens.t.sol +12 -1
  22. package/test/TestCEIPattern.t.sol +12 -1
  23. package/test/TestCashOutCallerValidation.t.sol +13 -2
  24. package/test/TestConversionDocumentation.t.sol +12 -1
  25. package/test/TestCrossCurrencyReclaim.t.sol +12 -1
  26. package/test/TestCrossSourceReallocation.t.sol +12 -1
  27. package/test/TestERC2771MetaTx.t.sol +12 -1
  28. package/test/TestEmptyBuybackSpecs.t.sol +12 -1
  29. package/test/TestFlashLoanSurplus.t.sol +12 -1
  30. package/test/TestHiddenTokens.t.sol +12 -1
  31. package/test/TestHookArrayOOB.t.sol +12 -1
  32. package/test/TestLiquidationBehavior.t.sol +12 -1
  33. package/test/TestLoanSourceRotation.t.sol +12 -1
  34. package/test/TestLoansCashOutDelay.t.sol +12 -1
  35. package/test/TestLongTailEconomics.t.sol +12 -1
  36. package/test/TestLowFindings.t.sol +12 -1
  37. package/test/TestMixedFixes.t.sol +12 -1
  38. package/test/TestPermit2Signatures.t.sol +12 -1
  39. package/test/TestReallocationSandwich.t.sol +12 -1
  40. package/test/TestRevnetRegressions.t.sol +14 -2
  41. package/test/TestSplitWeightAdjustment.t.sol +12 -1
  42. package/test/TestSplitWeightE2E.t.sol +14 -1
  43. package/test/TestSplitWeightFork.t.sol +14 -1
  44. package/test/TestStageTransitionBorrowable.t.sol +12 -1
  45. package/test/TestSwapTerminalPermission.t.sol +12 -1
  46. package/test/TestUint112Overflow.t.sol +12 -1
  47. package/test/TestZeroAmountLoanGuard.t.sol +12 -1
  48. package/test/TestZeroRepayment.t.sol +12 -1
  49. package/test/audit/CodexPhantomSurplusTerminal.t.sol +367 -0
  50. package/test/audit/LoanIdOverflowGuard.t.sol +12 -1
  51. package/test/audit/NemesisOperatorDelegation.t.sol +12 -1
  52. package/test/fork/ForkTestBase.sol +14 -1
  53. package/test/mock/MockBuybackCashOutRecorder.sol +2 -0
  54. package/test/mock/MockBuybackDataHook.sol +3 -1
  55. package/test/mock/MockBuybackDataHookMintPath.sol +2 -0
  56. package/test/mock/MockSuckerRegistry.sol +17 -0
  57. package/test/regression/TestBurnPermissionRequired.t.sol +12 -1
  58. package/test/regression/TestCashOutBuybackFeeLeak.t.sol +14 -1
  59. package/test/regression/TestCrossRevnetLiquidation.t.sol +12 -1
  60. package/test/regression/TestCumulativeLoanCounter.t.sol +12 -1
  61. package/test/regression/TestLiquidateGapHandling.t.sol +12 -1
  62. package/test/regression/TestZeroPriceFeed.t.sol +12 -1
@@ -31,6 +31,8 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
31
31
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
32
32
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
33
33
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
34
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
35
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
34
36
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
35
37
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
36
38
  import {JBBeforePayRecordedContext} from "@bananapus/core-v6/src/structs/JBBeforePayRecordedContext.sol";
@@ -39,6 +41,7 @@ import {JBTokenAmount} from "@bananapus/core-v6/src/structs/JBTokenAmount.sol";
39
41
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
40
42
  import {REVOwner} from "../src/REVOwner.sol";
41
43
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
44
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
42
45
 
43
46
  /// @notice Regression tests for the empty buyback hook specifications fix.
44
47
  /// When JBBuybackHook determines minting is cheaper than swapping, it returns an empty
@@ -82,7 +85,14 @@ contract TestEmptyBuybackSpecs is TestBaseWorkflow {
82
85
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
83
86
  HOOK_STORE = new JB721TiersHookStore();
84
87
  EXAMPLE_HOOK = new JB721TiersHook(
85
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
88
+ jbDirectory(),
89
+ jbPermissions(),
90
+ jbPrices(),
91
+ jbRulesets(),
92
+ HOOK_STORE,
93
+ jbSplits(),
94
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
95
+ multisig()
86
96
  );
87
97
  ADDRESS_REGISTRY = new JBAddressRegistry();
88
98
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -90,6 +100,7 @@ contract TestEmptyBuybackSpecs is TestBaseWorkflow {
90
100
  MOCK_BUYBACK_MINT_PATH = new MockBuybackDataHookMintPath();
91
101
  LOANS_CONTRACT = new REVLoans({
92
102
  controller: jbController(),
103
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
93
104
  revId: FEE_PROJECT_ID,
94
105
  owner: address(this),
95
106
  permit2: permit2(),
@@ -36,10 +36,13 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
36
36
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
37
37
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
38
38
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
39
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
40
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
39
41
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
40
42
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
41
43
  import {REVOwner} from "../src/REVOwner.sol";
42
44
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
45
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
43
46
 
44
47
  /// @notice Tests showing that flash loan surplus manipulation is economically unprofitable.
45
48
  contract TestFlashLoanSurplus is TestBaseWorkflow {
@@ -89,7 +92,14 @@ contract TestFlashLoanSurplus is TestBaseWorkflow {
89
92
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
90
93
  HOOK_STORE = new JB721TiersHookStore();
91
94
  EXAMPLE_HOOK = new JB721TiersHook(
92
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
95
+ jbDirectory(),
96
+ jbPermissions(),
97
+ jbPrices(),
98
+ jbRulesets(),
99
+ HOOK_STORE,
100
+ jbSplits(),
101
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
102
+ multisig()
93
103
  );
94
104
  ADDRESS_REGISTRY = new JBAddressRegistry();
95
105
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -102,6 +112,7 @@ contract TestFlashLoanSurplus is TestBaseWorkflow {
102
112
  .addPriceFeedFor(0, uint32(uint160(address(TOKEN))), uint32(uint160(JBConstants.NATIVE_TOKEN)), priceFeed);
103
113
  LOANS_CONTRACT = new REVLoans({
104
114
  controller: jbController(),
115
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
105
116
  revId: FEE_PROJECT_ID,
106
117
  owner: address(this),
107
118
  permit2: permit2(),
@@ -37,10 +37,13 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
37
37
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
38
38
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
39
39
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
40
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
41
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
40
42
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
41
43
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
42
44
  import {REVOwner} from "../src/REVOwner.sol";
43
45
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
46
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
44
47
 
45
48
  /// @notice Tests for the standalone REVHiddenTokens contract.
46
49
  contract TestHiddenTokens is TestBaseWorkflow {
@@ -90,7 +93,14 @@ contract TestHiddenTokens is TestBaseWorkflow {
90
93
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
91
94
  HOOK_STORE = new JB721TiersHookStore();
92
95
  EXAMPLE_HOOK = new JB721TiersHook(
93
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
96
+ jbDirectory(),
97
+ jbPermissions(),
98
+ jbPrices(),
99
+ jbRulesets(),
100
+ HOOK_STORE,
101
+ jbSplits(),
102
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
103
+ multisig()
94
104
  );
95
105
  ADDRESS_REGISTRY = new JBAddressRegistry();
96
106
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -99,6 +109,7 @@ contract TestHiddenTokens is TestBaseWorkflow {
99
109
 
100
110
  LOANS_CONTRACT = new REVLoans({
101
111
  controller: jbController(),
112
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
102
113
  revId: FEE_PROJECT_ID,
103
114
  owner: address(this),
104
115
  permit2: permit2(),
@@ -32,6 +32,8 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
32
32
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
33
33
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
34
34
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
35
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
36
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
35
37
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
36
38
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
37
39
  import {JBBeforePayRecordedContext} from "@bananapus/core-v6/src/structs/JBBeforePayRecordedContext.sol";
@@ -40,6 +42,7 @@ import {JBTokenAmount} from "@bananapus/core-v6/src/structs/JBTokenAmount.sol";
40
42
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
41
43
  import {REVOwner} from "../src/REVOwner.sol";
42
44
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
45
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
43
46
 
44
47
  /// @notice Tests for PR #22: fix/c2-hook-array-oob
45
48
  /// Verifies that the fix for the hook array out-of-bounds bug works correctly.
@@ -84,7 +87,14 @@ contract TestHookArrayOOB is TestBaseWorkflow {
84
87
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
85
88
  HOOK_STORE = new JB721TiersHookStore();
86
89
  EXAMPLE_HOOK = new JB721TiersHook(
87
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
90
+ jbDirectory(),
91
+ jbPermissions(),
92
+ jbPrices(),
93
+ jbRulesets(),
94
+ HOOK_STORE,
95
+ jbSplits(),
96
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
97
+ multisig()
88
98
  );
89
99
  ADDRESS_REGISTRY = new JBAddressRegistry();
90
100
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -92,6 +102,7 @@ contract TestHookArrayOOB is TestBaseWorkflow {
92
102
  MOCK_BUYBACK = new MockBuybackDataHook();
93
103
  LOANS_CONTRACT = new REVLoans({
94
104
  controller: jbController(),
105
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
95
106
  revId: FEE_PROJECT_ID,
96
107
  owner: address(this),
97
108
  permit2: permit2(),
@@ -37,11 +37,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
37
37
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
38
38
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
39
39
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
40
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
41
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
40
42
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
41
43
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
42
44
  import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
43
45
  import {REVOwner} from "../src/REVOwner.sol";
44
46
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
47
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
45
48
 
46
49
  /// @notice Tests for PR #10: liquidation behavior documentation and collateral burn mechanics.
47
50
  contract TestLiquidationBehavior is TestBaseWorkflow {
@@ -87,7 +90,14 @@ contract TestLiquidationBehavior is TestBaseWorkflow {
87
90
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
88
91
  HOOK_STORE = new JB721TiersHookStore();
89
92
  EXAMPLE_HOOK = new JB721TiersHook(
90
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
93
+ jbDirectory(),
94
+ jbPermissions(),
95
+ jbPrices(),
96
+ jbRulesets(),
97
+ HOOK_STORE,
98
+ jbSplits(),
99
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
100
+ multisig()
91
101
  );
92
102
  ADDRESS_REGISTRY = new JBAddressRegistry();
93
103
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -100,6 +110,7 @@ contract TestLiquidationBehavior is TestBaseWorkflow {
100
110
  .addPriceFeedFor(0, uint32(uint160(address(TOKEN))), uint32(uint160(JBConstants.NATIVE_TOKEN)), priceFeed);
101
111
  LOANS_CONTRACT = new REVLoans({
102
112
  controller: jbController(),
113
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
103
114
  revId: FEE_PROJECT_ID,
104
115
  owner: address(this),
105
116
  permit2: permit2(),
@@ -36,12 +36,15 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
36
36
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
37
37
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
38
38
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
39
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
40
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
39
41
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
40
42
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
41
43
  import {JBSingleAllowance} from "@bananapus/core-v6/src/structs/JBSingleAllowance.sol";
42
44
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
43
45
  import {REVOwner} from "../src/REVOwner.sol";
44
46
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
47
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
45
48
 
46
49
  /// @notice Tests for loan source rotation: verify behavior when loans are taken from different sources (tokens)
47
50
  /// and that existing loans remain valid and repayable after new sources are introduced.
@@ -90,7 +93,14 @@ contract TestLoanSourceRotation is TestBaseWorkflow {
90
93
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
91
94
  HOOK_STORE = new JB721TiersHookStore();
92
95
  EXAMPLE_HOOK = new JB721TiersHook(
93
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
96
+ jbDirectory(),
97
+ jbPermissions(),
98
+ jbPrices(),
99
+ jbRulesets(),
100
+ HOOK_STORE,
101
+ jbSplits(),
102
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
103
+ multisig()
94
104
  );
95
105
  ADDRESS_REGISTRY = new JBAddressRegistry();
96
106
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -108,6 +118,7 @@ contract TestLoanSourceRotation is TestBaseWorkflow {
108
118
 
109
119
  LOANS_CONTRACT = new REVLoans({
110
120
  controller: jbController(),
121
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
111
122
  revId: FEE_PROJECT_ID,
112
123
  owner: address(this),
113
124
  permit2: permit2(),
@@ -34,11 +34,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
34
34
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
35
35
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
36
36
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
37
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
38
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
37
39
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
38
40
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
39
41
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
40
42
  import {REVOwner} from "../src/REVOwner.sol";
41
43
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
44
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
42
45
 
43
46
  struct FeeProjectConfig {
44
47
  REVConfig configuration;
@@ -202,7 +205,14 @@ contract TestLoansCashOutDelay is TestBaseWorkflow {
202
205
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
203
206
  HOOK_STORE = new JB721TiersHookStore();
204
207
  EXAMPLE_HOOK = new JB721TiersHook(
205
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
208
+ jbDirectory(),
209
+ jbPermissions(),
210
+ jbPrices(),
211
+ jbRulesets(),
212
+ HOOK_STORE,
213
+ jbSplits(),
214
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
215
+ multisig()
206
216
  );
207
217
  ADDRESS_REGISTRY = new JBAddressRegistry();
208
218
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -211,6 +221,7 @@ contract TestLoansCashOutDelay is TestBaseWorkflow {
211
221
 
212
222
  LOANS_CONTRACT = new REVLoans({
213
223
  controller: jbController(),
224
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
214
225
  revId: FEE_PROJECT_ID,
215
226
  owner: address(this),
216
227
  permit2: permit2(),
@@ -32,11 +32,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
32
32
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
33
33
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
34
34
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
35
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
36
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
35
37
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
36
38
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
37
39
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
38
40
  import {REVOwner} from "../src/REVOwner.sol";
39
41
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
42
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
40
43
 
41
44
  /// @notice Long-tail economic simulation: run a revnet through multiple stage transitions with many payments
42
45
  /// and cash outs, verifying value conservation and bonding curve consistency.
@@ -92,7 +95,14 @@ contract TestLongTailEconomics is TestBaseWorkflow {
92
95
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
93
96
  HOOK_STORE = new JB721TiersHookStore();
94
97
  EXAMPLE_HOOK = new JB721TiersHook(
95
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
98
+ jbDirectory(),
99
+ jbPermissions(),
100
+ jbPrices(),
101
+ jbRulesets(),
102
+ HOOK_STORE,
103
+ jbSplits(),
104
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
105
+ multisig()
96
106
  );
97
107
  ADDRESS_REGISTRY = new JBAddressRegistry();
98
108
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -101,6 +111,7 @@ contract TestLongTailEconomics is TestBaseWorkflow {
101
111
 
102
112
  LOANS_CONTRACT = new REVLoans({
103
113
  controller: jbController(),
114
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
104
115
  revId: FEE_PROJECT_ID,
105
116
  owner: address(this),
106
117
  permit2: permit2(),
@@ -37,11 +37,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
37
37
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
38
38
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
39
39
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
40
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
41
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
40
42
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
41
43
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
42
44
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
43
45
  import {REVOwner} from "../src/REVOwner.sol";
44
46
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
47
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
45
48
 
46
49
  struct FeeProjectConfig {
47
50
  REVConfig configuration;
@@ -275,7 +278,14 @@ contract TestLowFindings is TestBaseWorkflow {
275
278
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
276
279
  HOOK_STORE = new JB721TiersHookStore();
277
280
  EXAMPLE_HOOK = new JB721TiersHook(
278
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
281
+ jbDirectory(),
282
+ jbPermissions(),
283
+ jbPrices(),
284
+ jbRulesets(),
285
+ HOOK_STORE,
286
+ jbSplits(),
287
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
288
+ multisig()
279
289
  );
280
290
  ADDRESS_REGISTRY = new JBAddressRegistry();
281
291
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -290,6 +300,7 @@ contract TestLowFindings is TestBaseWorkflow {
290
300
 
291
301
  LOANS_CONTRACT = new REVLoans({
292
302
  controller: jbController(),
303
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
293
304
  revId: FEE_PROJECT_ID,
294
305
  owner: address(this),
295
306
  permit2: permit2(),
@@ -35,11 +35,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
35
35
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
36
36
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
37
37
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
38
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
39
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
38
40
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
39
41
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
40
42
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
41
43
  import {REVOwner} from "../src/REVOwner.sol";
42
44
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
45
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
43
46
 
44
47
  /// @notice Tests for PR #32: liquidation boundary, reallocate msg.value, and decimal normalization fixes.
45
48
  contract TestMixedFixes is TestBaseWorkflow {
@@ -85,7 +88,14 @@ contract TestMixedFixes is TestBaseWorkflow {
85
88
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
86
89
  HOOK_STORE = new JB721TiersHookStore();
87
90
  EXAMPLE_HOOK = new JB721TiersHook(
88
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
91
+ jbDirectory(),
92
+ jbPermissions(),
93
+ jbPrices(),
94
+ jbRulesets(),
95
+ HOOK_STORE,
96
+ jbSplits(),
97
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
98
+ multisig()
89
99
  );
90
100
  ADDRESS_REGISTRY = new JBAddressRegistry();
91
101
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -98,6 +108,7 @@ contract TestMixedFixes is TestBaseWorkflow {
98
108
  .addPriceFeedFor(0, uint32(uint160(address(TOKEN))), uint32(uint160(JBConstants.NATIVE_TOKEN)), priceFeed);
99
109
  LOANS_CONTRACT = new REVLoans({
100
110
  controller: jbController(),
111
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
101
112
  revId: FEE_PROJECT_ID,
102
113
  owner: address(this),
103
114
  permit2: permit2(),
@@ -38,6 +38,8 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
38
38
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
39
39
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
40
40
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
41
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
42
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
41
43
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
42
44
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
43
45
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
@@ -47,6 +49,7 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
47
49
  import {JBFees} from "@bananapus/core-v6/src/libraries/JBFees.sol";
48
50
  import {REVOwner} from "../src/REVOwner.sol";
49
51
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
52
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
50
53
 
51
54
  struct Permit2ProjectConfig {
52
55
  REVConfig configuration;
@@ -243,7 +246,14 @@ contract TestPermit2Signatures is TestBaseWorkflow {
243
246
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
244
247
  HOOK_STORE = new JB721TiersHookStore();
245
248
  EXAMPLE_HOOK = new JB721TiersHook(
246
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
249
+ jbDirectory(),
250
+ jbPermissions(),
251
+ jbPrices(),
252
+ jbRulesets(),
253
+ HOOK_STORE,
254
+ jbSplits(),
255
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
256
+ multisig()
247
257
  );
248
258
  ADDRESS_REGISTRY = new JBAddressRegistry();
249
259
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -258,6 +268,7 @@ contract TestPermit2Signatures is TestBaseWorkflow {
258
268
 
259
269
  LOANS_CONTRACT = new REVLoans({
260
270
  controller: jbController(),
271
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
261
272
  revId: FEE_PROJECT_ID,
262
273
  owner: address(this),
263
274
  permit2: permit2(),
@@ -34,11 +34,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
34
34
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
35
35
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
36
36
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
37
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
38
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
37
39
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
38
40
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
39
41
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
40
42
  import {REVOwner} from "../src/REVOwner.sol";
41
43
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
44
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
42
45
 
43
46
  /// @notice Deterministic test for the reallocation sandwich at stage boundaries.
44
47
  /// Documents that a borrower can extract additional value by calling `reallocateCollateralFromLoan` immediately
@@ -145,7 +148,14 @@ contract TestReallocationSandwich is TestBaseWorkflow {
145
148
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
146
149
  HOOK_STORE = new JB721TiersHookStore();
147
150
  EXAMPLE_HOOK = new JB721TiersHook(
148
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
151
+ jbDirectory(),
152
+ jbPermissions(),
153
+ jbPrices(),
154
+ jbRulesets(),
155
+ HOOK_STORE,
156
+ jbSplits(),
157
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
158
+ multisig()
149
159
  );
150
160
  ADDRESS_REGISTRY = new JBAddressRegistry();
151
161
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -153,6 +163,7 @@ contract TestReallocationSandwich is TestBaseWorkflow {
153
163
  MOCK_BUYBACK = new MockBuybackDataHook();
154
164
  LOANS_CONTRACT = new REVLoans({
155
165
  controller: jbController(),
166
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
156
167
  revId: FEE_PROJECT_ID,
157
168
  owner: address(this),
158
169
  permit2: permit2(),
@@ -38,22 +38,26 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
38
38
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
39
39
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
40
40
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
41
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
42
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
41
43
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
42
44
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
43
45
  import {REVOwner} from "../src/REVOwner.sol";
44
46
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
47
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
45
48
 
46
49
  /// @notice A test harness that exposes REVLoans internal functions for direct testing.
47
50
  /// Used to test _totalBorrowedFrom without needing to set up a full borrow flow.
48
51
  contract REVLoansHarness is REVLoans {
49
52
  constructor(
50
53
  IJBController controller,
54
+ IJBSuckerRegistry suckerRegistry,
51
55
  uint256 revId,
52
56
  address owner,
53
57
  IPermit2 permit2,
54
58
  address trustedForwarder
55
59
  )
56
- REVLoans(controller, revId, owner, permit2, trustedForwarder)
60
+ REVLoans(controller, suckerRegistry, revId, owner, permit2, trustedForwarder)
57
61
  {}
58
62
 
59
63
  /// @notice Expose _totalBorrowedFrom for testing.
@@ -131,7 +135,14 @@ contract TestRevnetRegressions is TestBaseWorkflow {
131
135
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
132
136
  HOOK_STORE = new JB721TiersHookStore();
133
137
  EXAMPLE_HOOK = new JB721TiersHook(
134
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
138
+ jbDirectory(),
139
+ jbPermissions(),
140
+ jbPrices(),
141
+ jbRulesets(),
142
+ HOOK_STORE,
143
+ jbSplits(),
144
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
145
+ multisig()
135
146
  );
136
147
  ADDRESS_REGISTRY = new JBAddressRegistry();
137
148
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -140,6 +151,7 @@ contract TestRevnetRegressions is TestBaseWorkflow {
140
151
 
141
152
  LOANS_CONTRACT = new REVLoansHarness({
142
153
  controller: jbController(),
154
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
143
155
  revId: FEE_PROJECT_ID,
144
156
  owner: address(this),
145
157
  permit2: permit2(),
@@ -32,6 +32,8 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
32
32
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
33
33
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
34
34
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
35
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
36
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
35
37
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
36
38
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
37
39
  import {IJBRulesetDataHook} from "@bananapus/core-v6/src/interfaces/IJBRulesetDataHook.sol";
@@ -43,6 +45,7 @@ import {JBTokenAmount} from "@bananapus/core-v6/src/structs/JBTokenAmount.sol";
43
45
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
44
46
  import {REVOwner} from "../src/REVOwner.sol";
45
47
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
48
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
46
49
 
47
50
  /// @notice Tests for the split weight adjustment in REVDeployer.beforePayRecordedWith.
48
51
  contract TestSplitWeightAdjustment is TestBaseWorkflow {
@@ -83,7 +86,14 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
83
86
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
84
87
  HOOK_STORE = new JB721TiersHookStore();
85
88
  EXAMPLE_HOOK = new JB721TiersHook(
86
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
89
+ jbDirectory(),
90
+ jbPermissions(),
91
+ jbPrices(),
92
+ jbRulesets(),
93
+ HOOK_STORE,
94
+ jbSplits(),
95
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
96
+ multisig()
87
97
  );
88
98
  ADDRESS_REGISTRY = new JBAddressRegistry();
89
99
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -91,6 +101,7 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
91
101
  MOCK_BUYBACK = new MockBuybackDataHookMintPath();
92
102
  LOANS_CONTRACT = new REVLoans({
93
103
  controller: jbController(),
104
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
94
105
  revId: FEE_PROJECT_ID,
95
106
  owner: address(this),
96
107
  permit2: permit2(),
@@ -34,6 +34,8 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
34
34
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
35
35
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
36
36
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
37
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
38
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
37
39
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
38
40
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
39
41
  import {IJBRulesetDataHook} from "@bananapus/core-v6/src/interfaces/IJBRulesetDataHook.sol";
@@ -42,6 +44,8 @@ import {JB721TierConfig} from "@bananapus/721-hook-v6/src/structs/JB721TierConfi
42
44
  import {JB721TierConfigFlags} from "@bananapus/721-hook-v6/src/structs/JB721TierConfigFlags.sol";
43
45
  import {JB721InitTiersConfig} from "@bananapus/721-hook-v6/src/structs/JB721InitTiersConfig.sol";
44
46
  import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
47
+ import "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
48
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
45
49
  import {REVDeploy721TiersHookConfig} from "../src/structs/REVDeploy721TiersHookConfig.sol";
46
50
  import {REVBaseline721HookConfig} from "../src/structs/REVBaseline721HookConfig.sol";
47
51
  import {REV721TiersHookFlags} from "../src/structs/REV721TiersHookFlags.sol";
@@ -49,6 +53,7 @@ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
49
53
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
50
54
  import {REVOwner} from "../src/REVOwner.sol";
51
55
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
56
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
52
57
 
53
58
  /// @notice E2E tests verifying that the split weight adjustment in REVDeployer produces correct token counts
54
59
  /// when payments flow through the full terminal → store → dataHook → mint pipeline.
@@ -102,7 +107,14 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
102
107
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
103
108
  HOOK_STORE = new JB721TiersHookStore();
104
109
  EXAMPLE_HOOK = new JB721TiersHook(
105
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
110
+ jbDirectory(),
111
+ jbPermissions(),
112
+ jbPrices(),
113
+ jbRulesets(),
114
+ HOOK_STORE,
115
+ jbSplits(),
116
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
117
+ multisig()
106
118
  );
107
119
  ADDRESS_REGISTRY = new JBAddressRegistry();
108
120
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -111,6 +123,7 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
111
123
 
112
124
  LOANS_CONTRACT = new REVLoans({
113
125
  controller: jbController(),
126
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
114
127
  revId: FEE_PROJECT_ID,
115
128
  owner: address(this),
116
129
  permit2: permit2(),