@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
@@ -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 Full revnet lifecycle E2E: deploy 3-stage -> pay -> advance stages -> cash out.
44
47
  contract REVLifecycle_Local is TestBaseWorkflow {
@@ -91,7 +94,14 @@ contract REVLifecycle_Local is TestBaseWorkflow {
91
94
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
92
95
  HOOK_STORE = new JB721TiersHookStore();
93
96
  EXAMPLE_HOOK = new JB721TiersHook(
94
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
97
+ jbDirectory(),
98
+ jbPermissions(),
99
+ jbPrices(),
100
+ jbRulesets(),
101
+ HOOK_STORE,
102
+ jbSplits(),
103
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
104
+ multisig()
95
105
  );
96
106
  ADDRESS_REGISTRY = new JBAddressRegistry();
97
107
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -100,6 +110,7 @@ contract REVLifecycle_Local is TestBaseWorkflow {
100
110
 
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(),
@@ -39,11 +39,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
39
39
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
40
40
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
41
41
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
42
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
43
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
42
44
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
43
45
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
44
46
  import {JBTest} from "@bananapus/core-v6/test/helpers/JBTest.sol";
45
47
  import {REVOwner} from "../src/REVOwner.sol";
46
48
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
49
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
47
50
 
48
51
  struct FeeProjectConfig {
49
52
  REVConfig configuration;
@@ -530,7 +533,14 @@ contract InvariantREVLoansTests is StdInvariant, TestBaseWorkflow {
530
533
  HOOK_STORE = new JB721TiersHookStore();
531
534
 
532
535
  EXAMPLE_HOOK = new JB721TiersHook(
533
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
536
+ jbDirectory(),
537
+ jbPermissions(),
538
+ jbPrices(),
539
+ jbRulesets(),
540
+ HOOK_STORE,
541
+ jbSplits(),
542
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
543
+ multisig()
534
544
  );
535
545
 
536
546
  ADDRESS_REGISTRY = new JBAddressRegistry();
@@ -542,6 +552,7 @@ contract InvariantREVLoansTests is StdInvariant, TestBaseWorkflow {
542
552
 
543
553
  LOANS_CONTRACT = new REVLoans({
544
554
  controller: jbController(),
555
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
545
556
  revId: FEE_PROJECT_ID,
546
557
  owner: address(this),
547
558
  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";
@@ -46,6 +48,7 @@ import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
46
48
  import {JBPayHookSpecification} from "@bananapus/core-v6/src/structs/JBPayHookSpecification.sol";
47
49
  import {REVOwner} from "../src/REVOwner.sol";
48
50
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
51
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
49
52
 
50
53
  /// @notice A malicious terminal that re-enters REVLoans during fee payment in _adjust().
51
54
  /// @dev Reentrancy during pay() callback in _adjust.
@@ -369,7 +372,14 @@ contract REVLoansAttacks is TestBaseWorkflow {
369
372
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
370
373
  HOOK_STORE = new JB721TiersHookStore();
371
374
  EXAMPLE_HOOK = new JB721TiersHook(
372
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
375
+ jbDirectory(),
376
+ jbPermissions(),
377
+ jbPrices(),
378
+ jbRulesets(),
379
+ HOOK_STORE,
380
+ jbSplits(),
381
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
382
+ multisig()
373
383
  );
374
384
  ADDRESS_REGISTRY = new JBAddressRegistry();
375
385
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -384,6 +394,7 @@ contract REVLoansAttacks is TestBaseWorkflow {
384
394
 
385
395
  LOANS_CONTRACT = new REVLoans({
386
396
  controller: jbController(),
397
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
387
398
  revId: FEE_PROJECT_ID,
388
399
  owner: address(this),
389
400
  permit2: permit2(),
@@ -39,6 +39,8 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
39
39
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
40
40
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
41
41
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
42
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
43
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
42
44
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
43
45
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
44
46
  import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
@@ -47,6 +49,7 @@ import {JBPayHookSpecification} from "@bananapus/core-v6/src/structs/JBPayHookSp
47
49
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.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
  /// @notice A terminal mock that always reverts on pay(), used to simulate fee payment failure.
52
55
  contract RevertingFeeTerminal is ERC165, IJBPayoutTerminal {
@@ -333,7 +336,14 @@ contract REVLoansFeeRecovery is TestBaseWorkflow {
333
336
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
334
337
  HOOK_STORE = new JB721TiersHookStore();
335
338
  EXAMPLE_HOOK = new JB721TiersHook(
336
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
339
+ jbDirectory(),
340
+ jbPermissions(),
341
+ jbPrices(),
342
+ jbRulesets(),
343
+ HOOK_STORE,
344
+ jbSplits(),
345
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
346
+ multisig()
337
347
  );
338
348
  ADDRESS_REGISTRY = new JBAddressRegistry();
339
349
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -349,6 +359,7 @@ contract REVLoansFeeRecovery is TestBaseWorkflow {
349
359
 
350
360
  LOANS_CONTRACT = new REVLoans({
351
361
  controller: jbController(),
362
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
352
363
  revId: FEE_PROJECT_ID,
353
364
  owner: address(this),
354
365
  permit2: permit2(),
@@ -40,6 +40,8 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
40
40
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
41
41
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
42
42
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
43
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
44
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
43
45
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
44
46
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
45
47
  import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
@@ -47,6 +49,7 @@ import {JBPayHookSpecification} from "@bananapus/core-v6/src/structs/JBPayHookSp
47
49
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.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
  /// @notice A fake terminal that returns garbage accounting contexts.
52
55
  /// Used to test unvalidated loan source terminal rejection.
@@ -198,7 +201,14 @@ contract REVLoansFindings is TestBaseWorkflow {
198
201
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
199
202
  HOOK_STORE = new JB721TiersHookStore();
200
203
  EXAMPLE_HOOK = new JB721TiersHook(
201
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
204
+ jbDirectory(),
205
+ jbPermissions(),
206
+ jbPrices(),
207
+ jbRulesets(),
208
+ HOOK_STORE,
209
+ jbSplits(),
210
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
211
+ multisig()
202
212
  );
203
213
  ADDRESS_REGISTRY = new JBAddressRegistry();
204
214
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -207,6 +217,7 @@ contract REVLoansFindings is TestBaseWorkflow {
207
217
 
208
218
  LOANS_CONTRACT = new REVLoans({
209
219
  controller: jbController(),
220
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
210
221
  revId: FEE_PROJECT_ID,
211
222
  owner: address(this),
212
223
  permit2: permit2(),
@@ -35,6 +35,8 @@ 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 {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
@@ -43,6 +45,7 @@ import {JBPayHookSpecification} from "@bananapus/core-v6/src/structs/JBPayHookSp
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 A fake terminal that tracks whether useAllowanceOf was called.
48
51
  /// @dev REVLoans.borrowFrom does not validate source terminal registration.
@@ -193,7 +196,14 @@ contract REVLoansRegressions is TestBaseWorkflow {
193
196
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
194
197
  HOOK_STORE = new JB721TiersHookStore();
195
198
  EXAMPLE_HOOK = new JB721TiersHook(
196
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
199
+ jbDirectory(),
200
+ jbPermissions(),
201
+ jbPrices(),
202
+ jbRulesets(),
203
+ HOOK_STORE,
204
+ jbSplits(),
205
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
206
+ multisig()
197
207
  );
198
208
  ADDRESS_REGISTRY = new JBAddressRegistry();
199
209
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -202,6 +212,7 @@ contract REVLoansRegressions is TestBaseWorkflow {
202
212
 
203
213
  LOANS_CONTRACT = new REVLoans({
204
214
  controller: jbController(),
215
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
205
216
  revId: FEE_PROJECT_ID,
206
217
  owner: address(this),
207
218
  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
  struct SourceFeeProjectConfig {
45
48
  REVConfig configuration;
@@ -220,7 +223,14 @@ contract REVLoansSourceFeeRecovery is TestBaseWorkflow {
220
223
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
221
224
  HOOK_STORE = new JB721TiersHookStore();
222
225
  EXAMPLE_HOOK = new JB721TiersHook(
223
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
226
+ jbDirectory(),
227
+ jbPermissions(),
228
+ jbPrices(),
229
+ jbRulesets(),
230
+ HOOK_STORE,
231
+ jbSplits(),
232
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
233
+ multisig()
224
234
  );
225
235
  ADDRESS_REGISTRY = new JBAddressRegistry();
226
236
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -229,6 +239,7 @@ contract REVLoansSourceFeeRecovery is TestBaseWorkflow {
229
239
 
230
240
  LOANS_CONTRACT = new REVLoans({
231
241
  controller: jbController(),
242
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
232
243
  revId: FEE_PROJECT_ID,
233
244
  owner: address(this),
234
245
  permit2: permit2(),
@@ -40,11 +40,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
40
40
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
41
41
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
42
42
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
43
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
44
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
43
45
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
44
46
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
45
47
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
46
48
  import {REVOwner} from "../src/REVOwner.sol";
47
49
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
50
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
48
51
 
49
52
  struct FeeProjectConfig {
50
53
  REVConfig configuration;
@@ -306,7 +309,14 @@ contract REVLoansSourcedTests is TestBaseWorkflow {
306
309
  HOOK_STORE = new JB721TiersHookStore();
307
310
 
308
311
  EXAMPLE_HOOK = new JB721TiersHook(
309
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
312
+ jbDirectory(),
313
+ jbPermissions(),
314
+ jbPrices(),
315
+ jbRulesets(),
316
+ HOOK_STORE,
317
+ jbSplits(),
318
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
319
+ multisig()
310
320
  );
311
321
 
312
322
  ADDRESS_REGISTRY = new JBAddressRegistry();
@@ -330,6 +340,7 @@ contract REVLoansSourcedTests is TestBaseWorkflow {
330
340
 
331
341
  LOANS_CONTRACT = new REVLoans({
332
342
  controller: jbController(),
343
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
333
344
  revId: FEE_PROJECT_ID,
334
345
  owner: address(this),
335
346
  permit2: permit2(),
@@ -38,10 +38,13 @@ 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
  struct FeeProjectConfig {
47
50
  REVConfig configuration;
@@ -292,7 +295,14 @@ contract REVLoansUnsourcedTests is TestBaseWorkflow {
292
295
  HOOK_STORE = new JB721TiersHookStore();
293
296
 
294
297
  EXAMPLE_HOOK = new JB721TiersHook(
295
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
298
+ jbDirectory(),
299
+ jbPermissions(),
300
+ jbPrices(),
301
+ jbRulesets(),
302
+ HOOK_STORE,
303
+ jbSplits(),
304
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
305
+ multisig()
296
306
  );
297
307
 
298
308
  ADDRESS_REGISTRY = new JBAddressRegistry();
@@ -304,6 +314,7 @@ contract REVLoansUnsourcedTests is TestBaseWorkflow {
304
314
 
305
315
  LOANS_CONTRACT = new REVLoans({
306
316
  controller: jbController(),
317
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
307
318
  revId: FEE_PROJECT_ID,
308
319
  owner: address(this),
309
320
  permit2: permit2(),
@@ -35,10 +35,13 @@ 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 {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;
@@ -197,7 +200,14 @@ contract TestBurnHeldTokens is TestBaseWorkflow {
197
200
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
198
201
  HOOK_STORE = new JB721TiersHookStore();
199
202
  EXAMPLE_HOOK = new JB721TiersHook(
200
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
203
+ jbDirectory(),
204
+ jbPermissions(),
205
+ jbPrices(),
206
+ jbRulesets(),
207
+ HOOK_STORE,
208
+ jbSplits(),
209
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
210
+ multisig()
201
211
  );
202
212
  ADDRESS_REGISTRY = new JBAddressRegistry();
203
213
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -207,6 +217,7 @@ contract TestBurnHeldTokens is TestBaseWorkflow {
207
217
 
208
218
  LOANS_CONTRACT = new REVLoans({
209
219
  controller: jbController(),
220
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
210
221
  revId: FEE_PROJECT_ID,
211
222
  owner: address(this),
212
223
  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
  /// @notice Contract that reenters REVLoans when it receives ETH during a borrow payout.
47
50
  /// Records the loan state it observes during reentrancy to verify CEI correctness.
@@ -123,7 +126,14 @@ contract TestCEIPattern is TestBaseWorkflow {
123
126
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
124
127
  HOOK_STORE = new JB721TiersHookStore();
125
128
  EXAMPLE_HOOK = new JB721TiersHook(
126
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
129
+ jbDirectory(),
130
+ jbPermissions(),
131
+ jbPrices(),
132
+ jbRulesets(),
133
+ HOOK_STORE,
134
+ jbSplits(),
135
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
136
+ multisig()
127
137
  );
128
138
  ADDRESS_REGISTRY = new JBAddressRegistry();
129
139
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -136,6 +146,7 @@ contract TestCEIPattern is TestBaseWorkflow {
136
146
  .addPriceFeedFor(0, uint32(uint160(address(TOKEN))), uint32(uint160(JBConstants.NATIVE_TOKEN)), priceFeed);
137
147
  LOANS_CONTRACT = new REVLoans({
138
148
  controller: jbController(),
149
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
139
150
  revId: FEE_PROJECT_ID,
140
151
  owner: address(this),
141
152
  permit2: permit2(),
@@ -39,11 +39,14 @@ import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
39
39
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
40
40
  import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
41
41
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
42
+ import {JB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/JB721CheckpointsDeployer.sol";
43
+ import {IJB721CheckpointsDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721CheckpointsDeployer.sol";
42
44
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
43
45
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
44
46
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
45
47
  import {REVOwner} from "../src/REVOwner.sol";
46
48
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
49
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
47
50
 
48
51
  struct FeeProjectConfig {
49
52
  REVConfig configuration;
@@ -210,7 +213,14 @@ contract TestCashOutCallerValidation is TestBaseWorkflow {
210
213
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
211
214
  HOOK_STORE = new JB721TiersHookStore();
212
215
  EXAMPLE_HOOK = new JB721TiersHook(
213
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
216
+ jbDirectory(),
217
+ jbPermissions(),
218
+ jbPrices(),
219
+ jbRulesets(),
220
+ HOOK_STORE,
221
+ jbSplits(),
222
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
223
+ multisig()
214
224
  );
215
225
  ADDRESS_REGISTRY = new JBAddressRegistry();
216
226
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -220,6 +230,7 @@ contract TestCashOutCallerValidation is TestBaseWorkflow {
220
230
 
221
231
  LOANS_CONTRACT = new REVLoans({
222
232
  controller: jbController(),
233
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
223
234
  revId: FEE_PROJECT_ID,
224
235
  owner: address(this),
225
236
  permit2: permit2(),
@@ -354,7 +365,7 @@ contract TestCashOutCallerValidation is TestBaseWorkflow {
354
365
  (
355
366
  uint256 cashOutTaxRate,
356
367
  uint256 cashOutCount,
357
- uint256 totalSupply,
368
+ uint256 totalSupply,,
358
369
  JBCashOutHookSpecification[] memory hookSpecifications
359
370
  ) = REV_OWNER.beforeCashOutRecordedWith(context);
360
371
 
@@ -35,10 +35,13 @@ 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 {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
  contract TestConversionDocumentation is TestBaseWorkflow {
44
47
  // forge-lint: disable-next-line(mixed-case-variable)
@@ -140,7 +143,14 @@ contract TestConversionDocumentation is TestBaseWorkflow {
140
143
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
141
144
  HOOK_STORE = new JB721TiersHookStore();
142
145
  EXAMPLE_HOOK = new JB721TiersHook(
143
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
146
+ jbDirectory(),
147
+ jbPermissions(),
148
+ jbPrices(),
149
+ jbRulesets(),
150
+ HOOK_STORE,
151
+ jbSplits(),
152
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
153
+ multisig()
144
154
  );
145
155
  ADDRESS_REGISTRY = new JBAddressRegistry();
146
156
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -150,6 +160,7 @@ contract TestConversionDocumentation is TestBaseWorkflow {
150
160
 
151
161
  LOANS_CONTRACT = new REVLoans({
152
162
  controller: jbController(),
163
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
153
164
  revId: FEE_PROJECT_ID,
154
165
  owner: address(this),
155
166
  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 Cross-currency reclaim tests: verify cash-out behavior when a revnet's baseCurrency differs from the
44
47
  /// terminal token currency, and when price feeds return various values.
@@ -89,7 +92,14 @@ contract TestCrossCurrencyReclaim 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());
@@ -101,6 +111,7 @@ contract TestCrossCurrencyReclaim 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(),
@@ -36,11 +36,14 @@ 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 {REVEmpty721Config} from "./helpers/REVEmpty721Config.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 PR #13: cross-source reallocation prevention.
46
49
  contract TestCrossSourceReallocation is TestBaseWorkflow {
@@ -86,7 +89,14 @@ contract TestCrossSourceReallocation is TestBaseWorkflow {
86
89
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
87
90
  HOOK_STORE = new JB721TiersHookStore();
88
91
  EXAMPLE_HOOK = new JB721TiersHook(
89
- jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
92
+ jbDirectory(),
93
+ jbPermissions(),
94
+ jbPrices(),
95
+ jbRulesets(),
96
+ HOOK_STORE,
97
+ jbSplits(),
98
+ IJB721CheckpointsDeployer(address(new JB721CheckpointsDeployer())),
99
+ multisig()
90
100
  );
91
101
  ADDRESS_REGISTRY = new JBAddressRegistry();
92
102
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
@@ -99,6 +109,7 @@ contract TestCrossSourceReallocation is TestBaseWorkflow {
99
109
  .addPriceFeedFor(0, uint32(uint160(address(TOKEN))), uint32(uint160(JBConstants.NATIVE_TOKEN)), priceFeed);
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(),
@@ -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";
@@ -45,6 +47,7 @@ import {ERC2771Forwarder} from "@openzeppelin/contracts/metatx/ERC2771Forwarder.
45
47
  import {ERC2771ForwarderMock, ForwardRequest} from "@bananapus/core-v6/test/mock/ERC2771ForwarderMock.sol";
46
48
  import {REVOwner} from "../src/REVOwner.sol";
47
49
  import {IREVDeployer} from "../src/interfaces/IREVDeployer.sol";
50
+ import {MockSuckerRegistry} from "./mock/MockSuckerRegistry.sol";
48
51
 
49
52
  struct MetaTxProjectConfig {
50
53
  REVConfig configuration;
@@ -275,7 +278,14 @@ contract TestERC2771MetaTx 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());
@@ -291,6 +301,7 @@ contract TestERC2771MetaTx is TestBaseWorkflow {
291
301
  // Deploy LOANS_CONTRACT with the forwarder as trusted forwarder.
292
302
  LOANS_CONTRACT = new REVLoans({
293
303
  controller: jbController(),
304
+ suckerRegistry: IJBSuckerRegistry(address(new MockSuckerRegistry())),
294
305
  revId: FEE_PROJECT_ID,
295
306
  owner: address(this),
296
307
  permit2: permit2(),