@rev-net/core-v6 0.0.10 → 0.0.12

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 (49) hide show
  1. package/ADMINISTRATION.md +7 -7
  2. package/ARCHITECTURE.md +11 -11
  3. package/README.md +7 -4
  4. package/RISKS.md +2 -2
  5. package/SKILLS.md +8 -10
  6. package/STYLE_GUIDE.md +14 -1
  7. package/package.json +9 -9
  8. package/script/Deploy.s.sol +85 -35
  9. package/script/helpers/RevnetCoreDeploymentLib.sol +12 -5
  10. package/src/REVDeployer.sol +121 -129
  11. package/src/REVLoans.sol +14 -13
  12. package/src/interfaces/IREVDeployer.sol +25 -22
  13. package/src/structs/REVDeploy721TiersHookConfig.sol +12 -14
  14. package/test/REV.integrations.t.sol +17 -8
  15. package/test/REVAutoIssuanceFuzz.t.sol +9 -4
  16. package/test/REVDeployerRegressions.t.sol +13 -6
  17. package/test/REVInvincibility.t.sol +26 -12
  18. package/test/REVLifecycle.t.sol +9 -4
  19. package/test/REVLoans.invariants.t.sol +13 -6
  20. package/test/REVLoansAttacks.t.sol +12 -5
  21. package/test/REVLoansFeeRecovery.t.sol +12 -5
  22. package/test/REVLoansFindings.t.sol +16 -7
  23. package/test/REVLoansRegressions.t.sol +9 -4
  24. package/test/REVLoansSourced.t.sol +24 -11
  25. package/test/REVLoansUnSourced.t.sol +13 -6
  26. package/test/TestBurnHeldTokens.t.sol +16 -7
  27. package/test/TestCEIPattern.t.sol +12 -5
  28. package/test/TestCashOutCallerValidation.t.sol +12 -5
  29. package/test/TestConversionDocumentation.t.sol +25 -9
  30. package/test/TestCrossSourceReallocation.t.sol +12 -5
  31. package/test/TestEmptyBuybackSpecs.t.sol +23 -8
  32. package/test/TestFlashLoanSurplus.t.sol +12 -5
  33. package/test/TestHookArrayOOB.t.sol +19 -10
  34. package/test/TestLiquidationBehavior.t.sol +12 -5
  35. package/test/TestLowFindings.t.sol +16 -7
  36. package/test/TestMixedFixes.t.sol +16 -7
  37. package/test/TestSplitWeightAdjustment.t.sol +29 -12
  38. package/test/TestSplitWeightE2E.t.sol +24 -16
  39. package/test/TestSplitWeightFork.t.sol +20 -14
  40. package/test/TestStageTransitionBorrowable.t.sol +15 -5
  41. package/test/TestSwapTerminalPermission.t.sol +15 -5
  42. package/test/TestUint112Overflow.t.sol +12 -5
  43. package/test/TestZeroRepayment.t.sol +12 -5
  44. package/test/fork/ForkTestBase.sol +20 -14
  45. package/test/fork/TestCashOutFork.t.sol +8 -2
  46. package/test/fork/TestLoanCrossRulesetFork.t.sol +8 -2
  47. package/test/helpers/REVEmpty721Config.sol +45 -0
  48. package/test/regression/TestCumulativeLoanCounter.t.sol +12 -5
  49. package/test/regression/TestLiquidateGapHandling.t.sol +12 -5
@@ -7,6 +7,8 @@ import /* {*} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
7
7
  import /* {*} from */ "./../src/REVDeployer.sol";
8
8
  import "@croptop/core-v6/src/CTPublisher.sol";
9
9
  import {MockBuybackDataHook} from "./mock/MockBuybackDataHook.sol";
10
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
11
+ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
10
12
  import "@bananapus/core-v6/script/helpers/CoreDeploymentLib.sol";
11
13
  import "@bananapus/721-hook-v6/script/helpers/Hook721DeploymentLib.sol";
12
14
  import "@bananapus/suckers-v6/script/helpers/SuckerDeploymentLib.sol";
@@ -59,8 +61,9 @@ contract TestLiquidationBehavior is TestBaseWorkflow {
59
61
  FEE_PROJECT_ID = jbProjects().createFor(multisig());
60
62
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
61
63
  HOOK_STORE = new JB721TiersHookStore();
62
- EXAMPLE_HOOK =
63
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
64
+ EXAMPLE_HOOK = new JB721TiersHook(
65
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
66
+ );
64
67
  ADDRESS_REGISTRY = new JBAddressRegistry();
65
68
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
66
69
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -133,7 +136,9 @@ contract TestLiquidationBehavior is TestBaseWorkflow {
133
136
  terminalConfigurations: tc,
134
137
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
135
138
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("FEE")
136
- })
139
+ }),
140
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
141
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
137
142
  });
138
143
  }
139
144
 
@@ -170,13 +175,15 @@ contract TestLiquidationBehavior is TestBaseWorkflow {
170
175
  splitOperator: multisig(),
171
176
  stageConfigurations: stages
172
177
  });
173
- REVNET_ID = REV_DEPLOYER.deployFor({
178
+ (REVNET_ID,) = REV_DEPLOYER.deployFor({
174
179
  revnetId: 0,
175
180
  configuration: cfg,
176
181
  terminalConfigurations: tc,
177
182
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
178
183
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("NANA")
179
- })
184
+ }),
185
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
186
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
180
187
  });
181
188
  }
182
189
 
@@ -30,6 +30,8 @@ import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
30
30
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
31
31
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
32
32
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
33
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
34
+ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
33
35
 
34
36
  struct FeeProjectConfig {
35
37
  REVConfig configuration;
@@ -166,13 +168,15 @@ contract TestLowFindings is TestBaseWorkflow {
166
168
  stageConfigurations: stageConfigurations
167
169
  });
168
170
 
169
- revnetId = REV_DEPLOYER.deployFor({
171
+ (revnetId,) = REV_DEPLOYER.deployFor({
170
172
  revnetId: 0,
171
173
  configuration: revnetConfiguration,
172
174
  terminalConfigurations: terminalConfigurations,
173
175
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
174
176
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256(abi.encodePacked("TWO"))
175
- })
177
+ }),
178
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
179
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
176
180
  });
177
181
  }
178
182
 
@@ -219,13 +223,15 @@ contract TestLowFindings is TestBaseWorkflow {
219
223
  stageConfigurations: stageConfigurations
220
224
  });
221
225
 
222
- revnetId = REV_DEPLOYER.deployFor({
226
+ (revnetId,) = REV_DEPLOYER.deployFor({
223
227
  revnetId: 0,
224
228
  configuration: revnetConfiguration,
225
229
  terminalConfigurations: terminalConfigurations,
226
230
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
227
231
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256(abi.encodePacked("SGL"))
228
- })
232
+ }),
233
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
234
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
229
235
  });
230
236
  }
231
237
 
@@ -235,8 +241,9 @@ contract TestLowFindings is TestBaseWorkflow {
235
241
  FEE_PROJECT_ID = jbProjects().createFor(multisig());
236
242
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
237
243
  HOOK_STORE = new JB721TiersHookStore();
238
- EXAMPLE_HOOK =
239
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
244
+ EXAMPLE_HOOK = new JB721TiersHook(
245
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
246
+ );
240
247
  ADDRESS_REGISTRY = new JBAddressRegistry();
241
248
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
242
249
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -278,7 +285,9 @@ contract TestLowFindings is TestBaseWorkflow {
278
285
  revnetId: FEE_PROJECT_ID,
279
286
  configuration: feeProjectConfig.configuration,
280
287
  terminalConfigurations: feeProjectConfig.terminalConfigurations,
281
- suckerDeploymentConfiguration: feeProjectConfig.suckerDeploymentConfiguration
288
+ suckerDeploymentConfiguration: feeProjectConfig.suckerDeploymentConfiguration,
289
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
290
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
282
291
  });
283
292
 
284
293
  vm.deal(USER, 1000 ether);
@@ -29,6 +29,8 @@ import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
29
29
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
30
30
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
31
31
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
32
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
33
+ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
32
34
 
33
35
  /// @notice Tests for PR #32: liquidation boundary, reallocate msg.value, and decimal normalization fixes.
34
36
  contract TestMixedFixes is TestBaseWorkflow {
@@ -57,8 +59,9 @@ contract TestMixedFixes is TestBaseWorkflow {
57
59
  FEE_PROJECT_ID = jbProjects().createFor(multisig());
58
60
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
59
61
  HOOK_STORE = new JB721TiersHookStore();
60
- EXAMPLE_HOOK =
61
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
62
+ EXAMPLE_HOOK = new JB721TiersHook(
63
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
64
+ );
62
65
  ADDRESS_REGISTRY = new JBAddressRegistry();
63
66
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
64
67
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -131,7 +134,9 @@ contract TestMixedFixes is TestBaseWorkflow {
131
134
  terminalConfigurations: tc,
132
135
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
133
136
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("FEE")
134
- })
137
+ }),
138
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
139
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
135
140
  });
136
141
  }
137
142
 
@@ -168,13 +173,15 @@ contract TestMixedFixes is TestBaseWorkflow {
168
173
  splitOperator: multisig(),
169
174
  stageConfigurations: stages
170
175
  });
171
- REVNET_ID = REV_DEPLOYER.deployFor({
176
+ (REVNET_ID,) = REV_DEPLOYER.deployFor({
172
177
  revnetId: 0,
173
178
  configuration: cfg,
174
179
  terminalConfigurations: tc,
175
180
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
176
181
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("NANA")
177
- })
182
+ }),
183
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
184
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
178
185
  });
179
186
  }
180
187
 
@@ -343,13 +350,15 @@ contract TestMixedFixes is TestBaseWorkflow {
343
350
  splitOperator: multisig(),
344
351
  stageConfigurations: stages
345
352
  });
346
- MIXED_REVNET_ID = REV_DEPLOYER.deployFor({
353
+ (MIXED_REVNET_ID,) = REV_DEPLOYER.deployFor({
347
354
  revnetId: 0,
348
355
  configuration: cfg,
349
356
  terminalConfigurations: tc,
350
357
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
351
358
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("MIXED")
352
- })
359
+ }),
360
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
361
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
353
362
  });
354
363
  }
355
364
 
@@ -32,6 +32,8 @@ import {IJBPayHook} from "@bananapus/core-v6/src/interfaces/IJBPayHook.sol";
32
32
  import {JBBeforePayRecordedContext} from "@bananapus/core-v6/src/structs/JBBeforePayRecordedContext.sol";
33
33
  import {JBPayHookSpecification} from "@bananapus/core-v6/src/structs/JBPayHookSpecification.sol";
34
34
  import {JBTokenAmount} from "@bananapus/core-v6/src/structs/JBTokenAmount.sol";
35
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
36
+ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
35
37
 
36
38
  /// @notice Tests for the split weight adjustment in REVDeployer.beforePayRecordedWith.
37
39
  contract TestSplitWeightAdjustment is TestBaseWorkflow {
@@ -57,8 +59,9 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
57
59
  FEE_PROJECT_ID = jbProjects().createFor(multisig());
58
60
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
59
61
  HOOK_STORE = new JB721TiersHookStore();
60
- EXAMPLE_HOOK =
61
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
62
+ EXAMPLE_HOOK = new JB721TiersHook(
63
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
64
+ );
62
65
  ADDRESS_REGISTRY = new JBAddressRegistry();
63
66
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
64
67
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -134,20 +137,27 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
134
137
  revnetId: FEE_PROJECT_ID,
135
138
  configuration: feeCfg,
136
139
  terminalConfigurations: feeTc,
137
- suckerDeploymentConfiguration: feeSdc
140
+ suckerDeploymentConfiguration: feeSdc,
141
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
142
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
138
143
  });
139
144
 
140
145
  // Deploy the revnet.
141
146
  (REVConfig memory cfg, JBTerminalConfig[] memory tc, REVSuckerDeploymentConfig memory sdc) =
142
147
  _buildMinimalConfig();
143
148
  cfg.description = REVDescription("Test2", "TS2", "ipfs://test2", "TEST_SALT_2");
144
- revnetId = REV_DEPLOYER.deployFor({
145
- revnetId: 0, configuration: cfg, terminalConfigurations: tc, suckerDeploymentConfiguration: sdc
149
+ (revnetId,) = REV_DEPLOYER.deployFor({
150
+ revnetId: 0,
151
+ configuration: cfg,
152
+ terminalConfigurations: tc,
153
+ suckerDeploymentConfiguration: sdc,
154
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
155
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
146
156
  });
147
157
  }
148
158
 
149
- /// @notice No 721 hook = no split adjustment, weight from buyback passes through.
150
- function test_beforePay_no721_noAdjustment() public {
159
+ /// @notice Empty 721 hook (no tiers) = no split adjustment, weight passes through.
160
+ function test_beforePay_empty721_noAdjustment() public {
151
161
  uint256 revnetId = _deployRevnet();
152
162
 
153
163
  JBBeforePayRecordedContext memory context = JBBeforePayRecordedContext({
@@ -167,11 +177,11 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
167
177
  metadata: ""
168
178
  });
169
179
 
170
- // No 721 hook deployed, buyback returns context.weight with empty specs.
180
+ // 721 hook is deployed but has no tiers, buyback returns context.weight.
171
181
  (uint256 weight, JBPayHookSpecification[] memory specs) = REV_DEPLOYER.beforePayRecordedWith(context);
172
182
 
173
183
  assertEq(weight, context.weight, "weight should pass through unchanged");
174
- assertEq(specs.length, 0, "no specs when no 721 hook and empty buyback");
184
+ assertEq(specs.length, 1, "should have 721 hook spec even with no tiers");
175
185
  }
176
186
 
177
187
  /// @notice When 721 hook returns splits, weight is adjusted proportionally.
@@ -294,14 +304,21 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
294
304
  revnetId: FEE_PROJECT_ID,
295
305
  configuration: feeCfg,
296
306
  terminalConfigurations: feeTc,
297
- suckerDeploymentConfiguration: feeSdc
307
+ suckerDeploymentConfiguration: feeSdc,
308
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
309
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
298
310
  });
299
311
 
300
312
  (REVConfig memory cfg, JBTerminalConfig[] memory tc, REVSuckerDeploymentConfig memory sdc) =
301
313
  _buildMinimalConfig();
302
314
  cfg.description = REVDescription("AMM", "AMM", "ipfs://amm", "AMM_SALT");
303
- uint256 revnetId = ammDeployer.deployFor({
304
- revnetId: 0, configuration: cfg, terminalConfigurations: tc, suckerDeploymentConfiguration: sdc
315
+ (uint256 revnetId,) = ammDeployer.deployFor({
316
+ revnetId: 0,
317
+ configuration: cfg,
318
+ terminalConfigurations: tc,
319
+ suckerDeploymentConfiguration: sdc,
320
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
321
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
305
322
  });
306
323
 
307
324
  // Mock a 721 hook for this project.
@@ -38,6 +38,7 @@ import {REVDeploy721TiersHookConfig} from "../src/structs/REVDeploy721TiersHookC
38
38
  import {REVBaseline721HookConfig} from "../src/structs/REVBaseline721HookConfig.sol";
39
39
  import {REV721TiersHookFlags} from "../src/structs/REV721TiersHookFlags.sol";
40
40
  import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
41
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
41
42
 
42
43
  /// @notice E2E tests verifying that the split weight adjustment in REVDeployer produces correct token counts
43
44
  /// when payments flow through the full terminal → store → dataHook → mint pipeline.
@@ -75,8 +76,9 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
75
76
 
76
77
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
77
78
  HOOK_STORE = new JB721TiersHookStore();
78
- EXAMPLE_HOOK =
79
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
79
+ EXAMPLE_HOOK = new JB721TiersHook(
80
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
81
+ );
80
82
  ADDRESS_REGISTRY = new JBAddressRegistry();
81
83
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
82
84
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -192,10 +194,7 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
192
194
  tokenUriResolver: IJB721TokenUriResolver(address(0)),
193
195
  contractUri: "ipfs://contract",
194
196
  tiersConfig: JB721InitTiersConfig({
195
- tiers: tiers,
196
- currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
197
- decimals: 18,
198
- prices: IJBPrices(address(0))
197
+ tiers: tiers, currency: uint32(uint160(JBConstants.NATIVE_TOKEN)), decimals: 18
199
198
  }),
200
199
  reserveBeneficiary: address(0),
201
200
  flags: REV721TiersHookFlags({
@@ -206,10 +205,10 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
206
205
  })
207
206
  }),
208
207
  salt: bytes32("E2E_721"),
209
- splitOperatorCanAdjustTiers: false,
210
- splitOperatorCanUpdateMetadata: false,
211
- splitOperatorCanMint: false,
212
- splitOperatorCanIncreaseDiscountPercent: false
208
+ preventSplitOperatorAdjustingTiers: false,
209
+ preventSplitOperatorUpdatingMetadata: false,
210
+ preventSplitOperatorMinting: false,
211
+ preventSplitOperatorIncreasingDiscountPercent: false
213
212
  });
214
213
  }
215
214
 
@@ -225,7 +224,9 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
225
224
  revnetId: FEE_PROJECT_ID,
226
225
  configuration: feeCfg,
227
226
  terminalConfigurations: feeTc,
228
- suckerDeploymentConfiguration: feeSdc
227
+ suckerDeploymentConfiguration: feeSdc,
228
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
229
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
229
230
  });
230
231
 
231
232
  // Deploy the revnet with 721 hook.
@@ -233,7 +234,7 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
233
234
  _buildMinimalConfig();
234
235
  REVDeploy721TiersHookConfig memory hookConfig = _build721Config();
235
236
 
236
- (revnetId, hook) = REV_DEPLOYER.deployWith721sFor({
237
+ (revnetId, hook) = REV_DEPLOYER.deployFor({
237
238
  revnetId: 0,
238
239
  configuration: cfg,
239
240
  terminalConfigurations: tc,
@@ -405,7 +406,9 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
405
406
  revnetId: FEE_PROJECT_ID,
406
407
  configuration: feeCfg,
407
408
  terminalConfigurations: feeTc,
408
- suckerDeploymentConfiguration: feeSdc
409
+ suckerDeploymentConfiguration: feeSdc,
410
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
411
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
409
412
  });
410
413
 
411
414
  // Deploy revnet with 721 hook.
@@ -414,7 +417,7 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
414
417
  cfg.description = REVDescription("AMM E2E", "AMME", "ipfs://amme2e", "AMME_SALT");
415
418
  REVDeploy721TiersHookConfig memory hookConfig = _build721Config();
416
419
 
417
- (uint256 revnetId, IJB721TiersHook hook) = ammDeployer.deployWith721sFor({
420
+ (uint256 revnetId, IJB721TiersHook hook) = ammDeployer.deployFor({
418
421
  revnetId: 0,
419
422
  configuration: cfg,
420
423
  terminalConfigurations: tc,
@@ -499,8 +502,13 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
499
502
  _buildMinimalConfig();
500
503
  cfg2.description = REVDescription("NoSplit", "NS", "ipfs://nosplit", "NOSPLIT_SALT");
501
504
 
502
- uint256 revnetId2 = REV_DEPLOYER.deployFor({
503
- revnetId: 0, configuration: cfg2, terminalConfigurations: tc2, suckerDeploymentConfiguration: sdc2
505
+ (uint256 revnetId2,) = REV_DEPLOYER.deployFor({
506
+ revnetId: 0,
507
+ configuration: cfg2,
508
+ terminalConfigurations: tc2,
509
+ suckerDeploymentConfiguration: sdc2,
510
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
511
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
504
512
  });
505
513
 
506
514
  vm.prank(PAYER);
@@ -36,6 +36,7 @@ import {JB721InitTiersConfig} from "@bananapus/721-hook-v6/src/structs/JB721Init
36
36
  import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
37
37
  import {REVDeploy721TiersHookConfig} from "../src/structs/REVDeploy721TiersHookConfig.sol";
38
38
  import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
39
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
39
40
 
40
41
  // Buyback hook
41
42
  import {JBBuybackHook} from "@bananapus/buyback-hook-v6/src/JBBuybackHook.sol";
@@ -258,8 +259,9 @@ contract TestSplitWeightFork is TestBaseWorkflow {
258
259
 
259
260
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
260
261
  HOOK_STORE = new JB721TiersHookStore();
261
- EXAMPLE_HOOK =
262
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
262
+ EXAMPLE_HOOK = new JB721TiersHook(
263
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
264
+ );
263
265
  ADDRESS_REGISTRY = new JBAddressRegistry();
264
266
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
265
267
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -394,10 +396,7 @@ contract TestSplitWeightFork is TestBaseWorkflow {
394
396
  tokenUriResolver: IJB721TokenUriResolver(address(0)),
395
397
  contractUri: "ipfs://contract",
396
398
  tiersConfig: JB721InitTiersConfig({
397
- tiers: tiers,
398
- currency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
399
- decimals: 18,
400
- prices: IJBPrices(address(0))
399
+ tiers: tiers, currency: uint32(uint160(JBConstants.NATIVE_TOKEN)), decimals: 18
401
400
  }),
402
401
  reserveBeneficiary: address(0),
403
402
  flags: REV721TiersHookFlags({
@@ -408,10 +407,10 @@ contract TestSplitWeightFork is TestBaseWorkflow {
408
407
  })
409
408
  }),
410
409
  salt: bytes32("FORK_721"),
411
- splitOperatorCanAdjustTiers: false,
412
- splitOperatorCanUpdateMetadata: false,
413
- splitOperatorCanMint: false,
414
- splitOperatorCanIncreaseDiscountPercent: false
410
+ preventSplitOperatorAdjustingTiers: false,
411
+ preventSplitOperatorUpdatingMetadata: false,
412
+ preventSplitOperatorMinting: false,
413
+ preventSplitOperatorIncreasingDiscountPercent: false
415
414
  });
416
415
  }
417
416
 
@@ -427,7 +426,9 @@ contract TestSplitWeightFork is TestBaseWorkflow {
427
426
  revnetId: FEE_PROJECT_ID,
428
427
  configuration: feeCfg,
429
428
  terminalConfigurations: feeTc,
430
- suckerDeploymentConfiguration: feeSdc
429
+ suckerDeploymentConfiguration: feeSdc,
430
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
431
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
431
432
  });
432
433
 
433
434
  // Deploy the revnet with 721 hook.
@@ -435,7 +436,7 @@ contract TestSplitWeightFork is TestBaseWorkflow {
435
436
  _buildMinimalConfig();
436
437
  REVDeploy721TiersHookConfig memory hookConfig = _build721Config();
437
438
 
438
- (revnetId, hook) = REV_DEPLOYER.deployWith721sFor({
439
+ (revnetId, hook) = REV_DEPLOYER.deployFor({
439
440
  revnetId: 0,
440
441
  configuration: cfg,
441
442
  terminalConfigurations: tc,
@@ -748,8 +749,13 @@ contract TestSplitWeightFork is TestBaseWorkflow {
748
749
  _buildMinimalConfig();
749
750
  cfg2.description = REVDescription("NoSplit Fork", "NSF", "ipfs://nosplit", "NSF_SALT");
750
751
 
751
- uint256 revnetId2 = REV_DEPLOYER.deployFor({
752
- revnetId: 0, configuration: cfg2, terminalConfigurations: tc2, suckerDeploymentConfiguration: sdc2
752
+ (uint256 revnetId2,) = REV_DEPLOYER.deployFor({
753
+ revnetId: 0,
754
+ configuration: cfg2,
755
+ terminalConfigurations: tc2,
756
+ suckerDeploymentConfiguration: sdc2,
757
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
758
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
753
759
  });
754
760
 
755
761
  // Set up pool for revnet2 too (so buyback hook has a pool, but will choose mint at 1:1).
@@ -25,6 +25,8 @@ import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
25
25
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
26
26
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
27
27
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
28
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
29
+ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
28
30
 
29
31
  /// @notice Documents and verifies that stage transitions change the borrowable amount for the same collateral.
30
32
  /// This is by design: loan value tracks the current bonding curve parameters (cashOutTaxRate),
@@ -110,8 +112,9 @@ contract TestStageTransitionBorrowable is TestBaseWorkflow {
110
112
  FEE_PROJECT_ID = jbProjects().createFor(multisig());
111
113
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
112
114
  HOOK_STORE = new JB721TiersHookStore();
113
- EXAMPLE_HOOK =
114
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
115
+ EXAMPLE_HOOK = new JB721TiersHook(
116
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
117
+ );
115
118
  ADDRESS_REGISTRY = new JBAddressRegistry();
116
119
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
117
120
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -145,14 +148,21 @@ contract TestStageTransitionBorrowable is TestBaseWorkflow {
145
148
  revnetId: FEE_PROJECT_ID,
146
149
  configuration: feeCfg,
147
150
  terminalConfigurations: feeTc,
148
- suckerDeploymentConfiguration: feeSdc
151
+ suckerDeploymentConfiguration: feeSdc,
152
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
153
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
149
154
  });
150
155
 
151
156
  // Deploy the test revnet.
152
157
  (REVConfig memory cfg, JBTerminalConfig[] memory tc, REVSuckerDeploymentConfig memory sdc) = _buildConfig();
153
158
  cfg.description = REVDescription("StageTest2", "ST2", "ipfs://test2", "STG_SALT_2");
154
- REVNET_ID = REV_DEPLOYER.deployFor({
155
- revnetId: 0, configuration: cfg, terminalConfigurations: tc, suckerDeploymentConfiguration: sdc
159
+ (REVNET_ID,) = REV_DEPLOYER.deployFor({
160
+ revnetId: 0,
161
+ configuration: cfg,
162
+ terminalConfigurations: tc,
163
+ suckerDeploymentConfiguration: sdc,
164
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
165
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
156
166
  });
157
167
 
158
168
  vm.deal(USER, 100 ether);
@@ -27,6 +27,8 @@ import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
27
27
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
28
28
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
29
29
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
30
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
31
+ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
30
32
 
31
33
  /// @notice Tests for default operator permissions including SET_ROUTER_TERMINAL.
32
34
  /// Verifies that all default split operator permissions are granted correctly.
@@ -53,8 +55,9 @@ contract TestSwapTerminalPermission is TestBaseWorkflow {
53
55
  FEE_PROJECT_ID = jbProjects().createFor(multisig());
54
56
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
55
57
  HOOK_STORE = new JB721TiersHookStore();
56
- EXAMPLE_HOOK =
57
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
58
+ EXAMPLE_HOOK = new JB721TiersHook(
59
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
60
+ );
58
61
  ADDRESS_REGISTRY = new JBAddressRegistry();
59
62
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
60
63
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -89,15 +92,22 @@ contract TestSwapTerminalPermission is TestBaseWorkflow {
89
92
  revnetId: FEE_PROJECT_ID,
90
93
  configuration: feeCfg,
91
94
  terminalConfigurations: feeTc,
92
- suckerDeploymentConfiguration: feeSdc
95
+ suckerDeploymentConfiguration: feeSdc,
96
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
97
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
93
98
  });
94
99
 
95
100
  // Deploy the test revnet
96
101
  (REVConfig memory cfg, JBTerminalConfig[] memory tc, REVSuckerDeploymentConfig memory sdc) =
97
102
  _buildConfig("TestRevnet", "TST", "TST_SALT");
98
103
 
99
- TEST_REVNET_ID = REV_DEPLOYER.deployFor({
100
- revnetId: 0, configuration: cfg, terminalConfigurations: tc, suckerDeploymentConfiguration: sdc
104
+ (TEST_REVNET_ID,) = REV_DEPLOYER.deployFor({
105
+ revnetId: 0,
106
+ configuration: cfg,
107
+ terminalConfigurations: tc,
108
+ suckerDeploymentConfiguration: sdc,
109
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
110
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
101
111
  });
102
112
  }
103
113
 
@@ -7,6 +7,8 @@ import /* {*} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
7
7
  import /* {*} from */ "./../src/REVDeployer.sol";
8
8
  import "@croptop/core-v6/src/CTPublisher.sol";
9
9
  import {MockBuybackDataHook} from "./mock/MockBuybackDataHook.sol";
10
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
11
+ import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
10
12
 
11
13
  import "@bananapus/core-v6/script/helpers/CoreDeploymentLib.sol";
12
14
  import "@bananapus/721-hook-v6/script/helpers/Hook721DeploymentLib.sol";
@@ -61,8 +63,9 @@ contract TestUint112Overflow is TestBaseWorkflow {
61
63
 
62
64
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
63
65
  HOOK_STORE = new JB721TiersHookStore();
64
- EXAMPLE_HOOK =
65
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
66
+ EXAMPLE_HOOK = new JB721TiersHook(
67
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
68
+ );
66
69
  ADDRESS_REGISTRY = new JBAddressRegistry();
67
70
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
68
71
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -144,7 +147,9 @@ contract TestUint112Overflow is TestBaseWorkflow {
144
147
  terminalConfigurations: tc,
145
148
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
146
149
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("FEE")
147
- })
150
+ }),
151
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
152
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
148
153
  });
149
154
  }
150
155
 
@@ -184,13 +189,15 @@ contract TestUint112Overflow is TestBaseWorkflow {
184
189
  splitOperator: multisig(),
185
190
  stageConfigurations: stages
186
191
  });
187
- REVNET_ID = REV_DEPLOYER.deployFor({
192
+ (REVNET_ID,) = REV_DEPLOYER.deployFor({
188
193
  revnetId: 0,
189
194
  configuration: cfg,
190
195
  terminalConfigurations: tc,
191
196
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
192
197
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("NANA")
193
- })
198
+ }),
199
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
200
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
194
201
  });
195
202
  }
196
203