@rev-net/core-v6 0.0.24 → 0.0.26

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 (67) hide show
  1. package/ADMINISTRATION.md +28 -1
  2. package/ARCHITECTURE.md +53 -129
  3. package/AUDIT_INSTRUCTIONS.md +108 -375
  4. package/CHANGELOG.md +65 -0
  5. package/README.md +76 -175
  6. package/RISKS.md +17 -5
  7. package/SKILLS.md +30 -391
  8. package/STYLE_GUIDE.md +59 -20
  9. package/USER_JOURNEYS.md +55 -478
  10. package/package.json +6 -6
  11. package/references/operations.md +311 -0
  12. package/references/runtime.md +98 -0
  13. package/script/Deploy.s.sol +42 -41
  14. package/src/REVDeployer.sol +0 -3
  15. package/src/REVLoans.sol +10 -10
  16. package/src/REVOwner.sol +30 -7
  17. package/src/interfaces/IREVDeployer.sol +1 -1
  18. package/src/interfaces/IREVOwner.sol +6 -0
  19. package/test/REV.integrations.t.sol +2 -0
  20. package/test/REVAutoIssuanceFuzz.t.sol +2 -0
  21. package/test/REVDeployerRegressions.t.sol +2 -0
  22. package/test/REVInvincibility.t.sol +3 -0
  23. package/test/REVLifecycle.t.sol +2 -0
  24. package/test/REVLoans.invariants.t.sol +2 -0
  25. package/test/REVLoansAttacks.t.sol +2 -0
  26. package/test/REVLoansFeeRecovery.t.sol +2 -0
  27. package/test/REVLoansFindings.t.sol +2 -0
  28. package/test/REVLoansRegressions.t.sol +2 -0
  29. package/test/REVLoansSourceFeeRecovery.t.sol +2 -0
  30. package/test/REVLoansSourced.t.sol +2 -0
  31. package/test/REVLoansUnSourced.t.sol +2 -0
  32. package/test/TestBurnHeldTokens.t.sol +2 -0
  33. package/test/TestCEIPattern.t.sol +2 -0
  34. package/test/TestCashOutCallerValidation.t.sol +2 -0
  35. package/test/TestConversionDocumentation.t.sol +2 -0
  36. package/test/TestCrossCurrencyReclaim.t.sol +2 -0
  37. package/test/TestCrossSourceReallocation.t.sol +2 -0
  38. package/test/TestERC2771MetaTx.t.sol +2 -0
  39. package/test/TestEmptyBuybackSpecs.t.sol +2 -0
  40. package/test/TestFlashLoanSurplus.t.sol +2 -0
  41. package/test/TestHookArrayOOB.t.sol +2 -0
  42. package/test/TestLiquidationBehavior.t.sol +2 -0
  43. package/test/TestLoanSourceRotation.t.sol +2 -0
  44. package/test/TestLoansCashOutDelay.t.sol +2 -0
  45. package/test/TestLongTailEconomics.t.sol +2 -0
  46. package/test/TestLowFindings.t.sol +2 -0
  47. package/test/TestMixedFixes.t.sol +2 -0
  48. package/test/TestPermit2Signatures.t.sol +2 -0
  49. package/test/TestReallocationSandwich.t.sol +2 -0
  50. package/test/TestRevnetRegressions.t.sol +2 -0
  51. package/test/TestSplitWeightAdjustment.t.sol +4 -0
  52. package/test/TestSplitWeightE2E.t.sol +14 -7
  53. package/test/TestSplitWeightFork.t.sol +12 -7
  54. package/test/TestStageTransitionBorrowable.t.sol +2 -0
  55. package/test/TestSwapTerminalPermission.t.sol +2 -0
  56. package/test/TestUint112Overflow.t.sol +2 -0
  57. package/test/TestZeroAmountLoanGuard.t.sol +2 -0
  58. package/test/TestZeroRepayment.t.sol +2 -0
  59. package/test/audit/LoanIdOverflowGuard.t.sol +2 -0
  60. package/test/fork/ForkTestBase.sol +12 -7
  61. package/test/regression/TestBurnPermissionRequired.t.sol +2 -0
  62. package/test/regression/TestCashOutBuybackFeeLeak.t.sol +2 -0
  63. package/test/regression/TestCrossRevnetLiquidation.t.sol +2 -0
  64. package/test/regression/TestCumulativeLoanCounter.t.sol +2 -0
  65. package/test/regression/TestLiquidateGapHandling.t.sol +2 -0
  66. package/test/regression/TestZeroPriceFeed.t.sol +2 -0
  67. package/CHANGE_LOG.md +0 -420
package/src/REVOwner.sol CHANGED
@@ -80,9 +80,16 @@ contract REVOwner is IJBRulesetDataHook, IJBCashOutHook {
80
80
  mapping(uint256 revnetId => IJB721TiersHook tiered721Hook) public tiered721HookOf;
81
81
 
82
82
  /// @notice The deployer that manages revnet state.
83
- /// @dev Set once via `setDeployer()` from the REVDeployer's constructor. Reverts if called again.
83
+ /// @dev Set once via `setDeployer()` using the precomputed canonical REVDeployer address.
84
84
  IREVDeployer public DEPLOYER;
85
85
 
86
+ //*********************************************************************//
87
+ // -------------------- private stored properties -------------------- //
88
+ //*********************************************************************//
89
+
90
+ /// @notice The account allowed to bind the canonical deployer exactly once.
91
+ address private immutable _DEPLOYER_BINDER;
92
+
86
93
  //*********************************************************************//
87
94
  // -------------------------- constructor ---------------------------- //
88
95
  //*********************************************************************//
@@ -105,6 +112,7 @@ contract REVOwner is IJBRulesetDataHook, IJBCashOutHook {
105
112
  SUCKER_REGISTRY = suckerRegistry;
106
113
  // slither-disable-next-line missing-zero-check
107
114
  LOANS = loans;
115
+ _DEPLOYER_BINDER = msg.sender;
108
116
  }
109
117
 
110
118
  //*********************************************************************//
@@ -335,8 +343,9 @@ contract REVOwner is IJBRulesetDataHook, IJBCashOutHook {
335
343
  minReturnedTokens: 0,
336
344
  memo: "",
337
345
  metadata: bytes(abi.encodePacked(context.projectId))
338
- }) {}
339
- catch (bytes memory) {
346
+ }) {
347
+ _afterTransferTo({to: address(feeTerminal), token: context.forwardedAmount.token});
348
+ } catch (bytes memory) {
340
349
  // Decrease the allowance for the fee terminal if the token is not the native token.
341
350
  if (context.forwardedAmount.token != JBConstants.NATIVE_TOKEN) {
342
351
  IERC20(context.forwardedAmount.token)
@@ -359,14 +368,22 @@ contract REVOwner is IJBRulesetDataHook, IJBCashOutHook {
359
368
  memo: "",
360
369
  metadata: bytes(abi.encodePacked(FEE_REVNET_ID))
361
370
  });
371
+ _afterTransferTo({to: msg.sender, token: context.forwardedAmount.token});
362
372
  }
363
373
  }
364
374
 
365
- /// @notice Set the caller as this contract's deployer.
366
- /// @dev Called by the REVDeployer's constructor. Reverts if a deployer is already set.
367
- function setDeployer() external {
375
+ /// @notice Bind the canonical deployer address exactly once.
376
+ /// @dev The deployer address is precomputed and supplied by the account that created this REVOwner instance.
377
+ /// Only that deploy-time binder may call this, which avoids an ambient public initializer where any first caller
378
+ /// could seize the deployer role before the deterministic REVDeployer is actually deployed.
379
+ /// @param deployer The canonical REVDeployer instance that will manage revnet runtime state.
380
+ function setDeployer(IREVDeployer deployer) external {
381
+ // Only the account that deployed this REVOwner may complete the one-time deployer binding.
382
+ if (msg.sender != _DEPLOYER_BINDER) revert REVOwner_Unauthorized();
383
+ // Prevent the deployer binding from being overwritten after initialization.
368
384
  if (address(DEPLOYER) != address(0)) revert REVOwner_AlreadyInitialized();
369
- DEPLOYER = IREVDeployer(msg.sender);
385
+ // Store the canonical REVDeployer that is authorized to manage runtime hook state.
386
+ DEPLOYER = deployer;
370
387
  }
371
388
 
372
389
  /// @notice Store the cash out delay for a revnet.
@@ -426,4 +443,10 @@ contract REVOwner is IJBRulesetDataHook, IJBCashOutHook {
426
443
  IERC20(token).safeIncreaseAllowance({spender: to, value: amount});
427
444
  return 0;
428
445
  }
446
+
447
+ /// @notice Clears any token allowance granted by `_beforeTransferTo`.
448
+ function _afterTransferTo(address to, address token) internal {
449
+ if (token == JBConstants.NATIVE_TOKEN) return;
450
+ IERC20(token).forceApprove({spender: to, value: 0});
451
+ }
429
452
  }
@@ -3,11 +3,11 @@ pragma solidity ^0.8.0;
3
3
 
4
4
  import {IJB721TiersHook} from "@bananapus/721-hook-v6/src/interfaces/IJB721TiersHook.sol";
5
5
  import {IJB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/interfaces/IJB721TiersHookDeployer.sol";
6
+ import {IJBBuybackHookRegistry} from "@bananapus/buyback-hook-v6/src/interfaces/IJBBuybackHookRegistry.sol";
6
7
  import {IJBController} from "@bananapus/core-v6/src/interfaces/IJBController.sol";
7
8
  import {IJBDirectory} from "@bananapus/core-v6/src/interfaces/IJBDirectory.sol";
8
9
  import {IJBPermissions} from "@bananapus/core-v6/src/interfaces/IJBPermissions.sol";
9
10
  import {IJBProjects} from "@bananapus/core-v6/src/interfaces/IJBProjects.sol";
10
- import {IJBBuybackHookRegistry} from "@bananapus/buyback-hook-v6/src/interfaces/IJBBuybackHookRegistry.sol";
11
11
  import {JBRulesetConfig} from "@bananapus/core-v6/src/structs/JBRulesetConfig.sol";
12
12
  import {JBTerminalConfig} from "@bananapus/core-v6/src/structs/JBTerminalConfig.sol";
13
13
  import {IJBSuckerRegistry} from "@bananapus/suckers-v6/src/interfaces/IJBSuckerRegistry.sol";
@@ -1,10 +1,16 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  pragma solidity ^0.8.0;
3
3
 
4
+ import {IREVDeployer} from "./IREVDeployer.sol";
5
+
4
6
  /// @notice Interface for the REVOwner contract that handles runtime data hook and cash out hook behavior for revnets.
5
7
  interface IREVOwner {
6
8
  /// @notice The timestamp of when cashouts will become available to a specific revnet's participants.
7
9
  /// @param revnetId The ID of the revnet.
8
10
  /// @return The cash out delay timestamp.
9
11
  function cashOutDelayOf(uint256 revnetId) external view returns (uint256);
12
+
13
+ /// @notice Bind the canonical deployer exactly once.
14
+ /// @param deployer The revnet deployer instance.
15
+ function setDeployer(IREVDeployer deployer) external;
10
16
  }
@@ -241,6 +241,8 @@ contract REVnet_Integrations is TestBaseWorkflow {
241
241
  address(revOwner)
242
242
  );
243
243
 
244
+ revOwner.setDeployer(REV_DEPLOYER);
245
+
244
246
  // Deploy the ARB sucker deployer.
245
247
  JBArbitrumSuckerDeployer _deployer =
246
248
  new JBArbitrumSuckerDeployer(jbDirectory(), jbPermissions(), jbTokens(), address(this), address(0));
@@ -104,6 +104,8 @@ contract REVAutoIssuanceFuzz_Local is TestBaseWorkflow {
104
104
  address(revOwner)
105
105
  );
106
106
 
107
+ revOwner.setDeployer(REV_DEPLOYER);
108
+
107
109
  vm.prank(multisig());
108
110
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
109
111
  }
@@ -119,6 +119,8 @@ contract REVDeployerRegressions is TestBaseWorkflow {
119
119
  address(REV_OWNER)
120
120
  );
121
121
 
122
+ REV_OWNER.setDeployer(REV_DEPLOYER);
123
+
122
124
  vm.prank(multisig());
123
125
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
124
126
  }
@@ -271,6 +271,8 @@ contract REVInvincibility_PropertyTests is TestBaseWorkflow {
271
271
  address(REV_OWNER)
272
272
  );
273
273
 
274
+ REV_OWNER.setDeployer(REV_DEPLOYER);
275
+
274
276
  // Deploy fee project
275
277
  vm.prank(multisig());
276
278
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -1052,6 +1054,7 @@ contract REVInvincibility_Invariants is StdInvariant, TestBaseWorkflow {
1052
1054
  TRUSTED_FORWARDER,
1053
1055
  address(REV_OWNER)
1054
1056
  );
1057
+ REV_OWNER.setDeployer(REV_DEPLOYER);
1055
1058
 
1056
1059
  // Deploy fee project
1057
1060
  {
@@ -127,6 +127,8 @@ contract REVLifecycle_Local is TestBaseWorkflow {
127
127
  address(REV_OWNER)
128
128
  );
129
129
 
130
+ REV_OWNER.setDeployer(REV_DEPLOYER);
131
+
130
132
  vm.prank(multisig());
131
133
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
132
134
 
@@ -569,6 +569,8 @@ contract InvariantREVLoansTests is StdInvariant, TestBaseWorkflow {
569
569
  address(REV_OWNER)
570
570
  );
571
571
 
572
+ REV_OWNER.setDeployer(REV_DEPLOYER);
573
+
572
574
  // Approve the basic deployer to configure the project.
573
575
  vm.prank(address(multisig()));
574
576
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -410,6 +410,8 @@ contract REVLoansAttacks is TestBaseWorkflow {
410
410
  address(REV_OWNER)
411
411
  );
412
412
 
413
+ REV_OWNER.setDeployer(REV_DEPLOYER);
414
+
413
415
  // Deploy fee project
414
416
  vm.prank(address(multisig()));
415
417
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -376,6 +376,8 @@ contract REVLoansFeeRecovery is TestBaseWorkflow {
376
376
  address(REV_OWNER)
377
377
  );
378
378
 
379
+ REV_OWNER.setDeployer(REV_DEPLOYER);
380
+
379
381
  // Deploy fee project.
380
382
  vm.prank(multisig());
381
383
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -234,6 +234,8 @@ contract REVLoansFindings is TestBaseWorkflow {
234
234
  address(REV_OWNER)
235
235
  );
236
236
 
237
+ REV_OWNER.setDeployer(REV_DEPLOYER);
238
+
237
239
  vm.prank(multisig());
238
240
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
239
241
 
@@ -229,6 +229,8 @@ contract REVLoansRegressions is TestBaseWorkflow {
229
229
  address(REV_OWNER)
230
230
  );
231
231
 
232
+ REV_OWNER.setDeployer(REV_DEPLOYER);
233
+
232
234
  vm.prank(multisig());
233
235
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
234
236
 
@@ -256,6 +256,8 @@ contract REVLoansSourceFeeRecovery is TestBaseWorkflow {
256
256
  address(REV_OWNER)
257
257
  );
258
258
 
259
+ REV_OWNER.setDeployer(REV_DEPLOYER);
260
+
259
261
  // Deploy fee project.
260
262
  vm.prank(multisig());
261
263
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -355,6 +355,8 @@ contract REVLoansSourcedTests is TestBaseWorkflow {
355
355
  address(REV_OWNER)
356
356
  );
357
357
 
358
+ REV_OWNER.setDeployer(REV_DEPLOYER);
359
+
358
360
  // Approve the basic deployer to configure the project.
359
361
  vm.prank(address(multisig()));
360
362
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -331,6 +331,8 @@ contract REVLoansUnsourcedTests is TestBaseWorkflow {
331
331
  address(REV_OWNER)
332
332
  );
333
333
 
334
+ REV_OWNER.setDeployer(REV_DEPLOYER);
335
+
334
336
  // Approve the basic deployer to configure the project.
335
337
  vm.prank(address(multisig()));
336
338
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -234,6 +234,8 @@ contract TestBurnHeldTokens is TestBaseWorkflow {
234
234
  address(REV_OWNER)
235
235
  );
236
236
 
237
+ REV_OWNER.setDeployer(REV_DEPLOYER);
238
+
237
239
  // Deploy fee project.
238
240
  vm.prank(multisig());
239
241
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -162,6 +162,8 @@ contract TestCEIPattern is TestBaseWorkflow {
162
162
  address(REV_OWNER)
163
163
  );
164
164
 
165
+ REV_OWNER.setDeployer(REV_DEPLOYER);
166
+
165
167
  vm.prank(multisig());
166
168
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
167
169
  _deployFeeProject();
@@ -247,6 +247,8 @@ contract TestCashOutCallerValidation is TestBaseWorkflow {
247
247
  address(REV_OWNER)
248
248
  );
249
249
 
250
+ REV_OWNER.setDeployer(REV_DEPLOYER);
251
+
250
252
  // Approve the deployer to configure the fee project.
251
253
  vm.prank(multisig());
252
254
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -177,6 +177,8 @@ contract TestConversionDocumentation is TestBaseWorkflow {
177
177
  address(REV_OWNER)
178
178
  );
179
179
 
180
+ REV_OWNER.setDeployer(REV_DEPLOYER);
181
+
180
182
  // Deploy fee project as revnet.
181
183
  vm.prank(multisig());
182
184
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -128,6 +128,8 @@ contract TestCrossCurrencyReclaim is TestBaseWorkflow {
128
128
  address(REV_OWNER)
129
129
  );
130
130
 
131
+ REV_OWNER.setDeployer(REV_DEPLOYER);
132
+
131
133
  vm.prank(multisig());
132
134
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
133
135
 
@@ -125,6 +125,8 @@ contract TestCrossSourceReallocation is TestBaseWorkflow {
125
125
  address(REV_OWNER)
126
126
  );
127
127
 
128
+ REV_OWNER.setDeployer(REV_DEPLOYER);
129
+
128
130
  vm.prank(multisig());
129
131
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
130
132
  _deployFeeProject();
@@ -318,6 +318,8 @@ contract TestERC2771MetaTx is TestBaseWorkflow {
318
318
  address(REV_OWNER)
319
319
  );
320
320
 
321
+ REV_OWNER.setDeployer(REV_DEPLOYER);
322
+
321
323
  // Approve the deployer to configure the project.
322
324
  vm.prank(address(multisig()));
323
325
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -116,6 +116,8 @@ contract TestEmptyBuybackSpecs is TestBaseWorkflow {
116
116
  address(REV_OWNER)
117
117
  );
118
118
 
119
+ REV_OWNER.setDeployer(REV_DEPLOYER);
120
+
119
121
  vm.prank(multisig());
120
122
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
121
123
  }
@@ -128,6 +128,8 @@ contract TestFlashLoanSurplus is TestBaseWorkflow {
128
128
  address(REV_OWNER)
129
129
  );
130
130
 
131
+ REV_OWNER.setDeployer(REV_DEPLOYER);
132
+
131
133
  vm.prank(multisig());
132
134
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
133
135
  _deployFeeProject();
@@ -118,6 +118,8 @@ contract TestHookArrayOOB is TestBaseWorkflow {
118
118
  address(REV_OWNER)
119
119
  );
120
120
 
121
+ REV_OWNER.setDeployer(REV_DEPLOYER);
122
+
121
123
  vm.prank(multisig());
122
124
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
123
125
  }
@@ -126,6 +126,8 @@ contract TestLiquidationBehavior is TestBaseWorkflow {
126
126
  address(REV_OWNER)
127
127
  );
128
128
 
129
+ REV_OWNER.setDeployer(REV_DEPLOYER);
130
+
129
131
  vm.prank(multisig());
130
132
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
131
133
  _deployFeeProject();
@@ -135,6 +135,8 @@ contract TestLoanSourceRotation is TestBaseWorkflow {
135
135
  address(REV_OWNER)
136
136
  );
137
137
 
138
+ REV_OWNER.setDeployer(REV_DEPLOYER);
139
+
138
140
  vm.prank(multisig());
139
141
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
140
142
 
@@ -238,6 +238,8 @@ contract TestLoansCashOutDelay is TestBaseWorkflow {
238
238
  address(REV_OWNER)
239
239
  );
240
240
 
241
+ REV_OWNER.setDeployer(REV_DEPLOYER);
242
+
241
243
  // Approve the deployer to configure the fee project.
242
244
  vm.prank(multisig());
243
245
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -128,6 +128,8 @@ contract TestLongTailEconomics is TestBaseWorkflow {
128
128
  address(REV_OWNER)
129
129
  );
130
130
 
131
+ REV_OWNER.setDeployer(REV_DEPLOYER);
132
+
131
133
  vm.prank(multisig());
132
134
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
133
135
 
@@ -317,6 +317,8 @@ contract TestLowFindings is TestBaseWorkflow {
317
317
  address(REV_OWNER)
318
318
  );
319
319
 
320
+ REV_OWNER.setDeployer(REV_DEPLOYER);
321
+
320
322
  // Deploy fee project.
321
323
  vm.prank(multisig());
322
324
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -124,6 +124,8 @@ contract TestMixedFixes is TestBaseWorkflow {
124
124
  address(REV_OWNER)
125
125
  );
126
126
 
127
+ REV_OWNER.setDeployer(REV_DEPLOYER);
128
+
127
129
  vm.prank(multisig());
128
130
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
129
131
  _deployFeeProject();
@@ -285,6 +285,8 @@ contract TestPermit2Signatures is TestBaseWorkflow {
285
285
  address(REV_OWNER)
286
286
  );
287
287
 
288
+ REV_OWNER.setDeployer(REV_DEPLOYER);
289
+
288
290
  // Approve the basic deployer to configure the project.
289
291
  vm.prank(address(multisig()));
290
292
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -179,6 +179,8 @@ contract TestReallocationSandwich is TestBaseWorkflow {
179
179
  address(REV_OWNER)
180
180
  );
181
181
 
182
+ REV_OWNER.setDeployer(REV_DEPLOYER);
183
+
182
184
  vm.prank(multisig());
183
185
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
184
186
 
@@ -168,6 +168,8 @@ contract TestRevnetRegressions is TestBaseWorkflow {
168
168
  address(REV_OWNER)
169
169
  );
170
170
 
171
+ REV_OWNER.setDeployer(REV_DEPLOYER);
172
+
171
173
  vm.prank(multisig());
172
174
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
173
175
  }
@@ -117,6 +117,8 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
117
117
  address(REV_OWNER)
118
118
  );
119
119
 
120
+ REV_OWNER.setDeployer(REV_DEPLOYER);
121
+
120
122
  vm.prank(multisig());
121
123
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
122
124
  }
@@ -341,6 +343,8 @@ contract TestSplitWeightAdjustment is TestBaseWorkflow {
341
343
  address(ammOwner)
342
344
  );
343
345
 
346
+ ammOwner.setDeployer(ammDeployer);
347
+
344
348
  vm.prank(multisig());
345
349
  jbProjects().approve(address(ammDeployer), FEE_PROJECT_ID);
346
350
 
@@ -39,6 +39,7 @@ import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/
39
39
  import {IJBRulesetDataHook} from "@bananapus/core-v6/src/interfaces/IJBRulesetDataHook.sol";
40
40
  import {IJBBuybackHookRegistry} from "@bananapus/buyback-hook-v6/src/interfaces/IJBBuybackHookRegistry.sol";
41
41
  import {JB721TierConfig} from "@bananapus/721-hook-v6/src/structs/JB721TierConfig.sol";
42
+ import {JB721TierConfigFlags} from "@bananapus/721-hook-v6/src/structs/JB721TierConfigFlags.sol";
42
43
  import {JB721InitTiersConfig} from "@bananapus/721-hook-v6/src/structs/JB721InitTiersConfig.sol";
43
44
  import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
44
45
  import {REVDeploy721TiersHookConfig} from "../src/structs/REVDeploy721TiersHookConfig.sol";
@@ -137,6 +138,8 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
137
138
  address(REV_OWNER)
138
139
  );
139
140
 
141
+ REV_OWNER.setDeployer(REV_DEPLOYER);
142
+
140
143
  vm.prank(multisig());
141
144
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
142
145
 
@@ -211,13 +214,15 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
211
214
  encodedIPFSUri: bytes32("tier1"),
212
215
  category: 1,
213
216
  discountPercent: 0,
214
- allowOwnerMint: false,
215
- useReserveBeneficiaryAsDefault: false,
216
- transfersPausable: false,
217
- useVotingUnits: false,
218
- cannotBeRemoved: false,
219
- cannotIncreaseDiscountPercent: false,
220
- cantBuyWithCredits: false,
217
+ flags: JB721TierConfigFlags({
218
+ allowOwnerMint: false,
219
+ useReserveBeneficiaryAsDefault: false,
220
+ transfersPausable: false,
221
+ useVotingUnits: false,
222
+ cantBeRemoved: false,
223
+ cantIncreaseDiscountPercent: false,
224
+ cantBuyWithCredits: false
225
+ }),
221
226
  splitPercent: SPLIT_PERCENT,
222
227
  splits: tierSplits
223
228
  });
@@ -438,6 +443,8 @@ contract TestSplitWeightE2E is TestBaseWorkflow {
438
443
  address(ammOwner)
439
444
  );
440
445
 
446
+ ammOwner.setDeployer(ammDeployer);
447
+
441
448
  vm.prank(multisig());
442
449
  jbProjects().approve(address(ammDeployer), FEE_PROJECT_ID);
443
450
 
@@ -39,6 +39,7 @@ import {IJBBuybackHookRegistry} from "@bananapus/buyback-hook-v6/src/interfaces/
39
39
  import {REVBaseline721HookConfig} from "../src/structs/REVBaseline721HookConfig.sol";
40
40
  import {REV721TiersHookFlags} from "../src/structs/REV721TiersHookFlags.sol";
41
41
  import {JB721TierConfig} from "@bananapus/721-hook-v6/src/structs/JB721TierConfig.sol";
42
+ import {JB721TierConfigFlags} from "@bananapus/721-hook-v6/src/structs/JB721TierConfigFlags.sol";
42
43
  import {JB721InitTiersConfig} from "@bananapus/721-hook-v6/src/structs/JB721InitTiersConfig.sol";
43
44
  import {IJB721TokenUriResolver} from "@bananapus/721-hook-v6/src/interfaces/IJB721TokenUriResolver.sol";
44
45
  import {REVDeploy721TiersHookConfig} from "../src/structs/REVDeploy721TiersHookConfig.sol";
@@ -349,6 +350,8 @@ contract TestSplitWeightFork is TestBaseWorkflow {
349
350
  address(REV_OWNER)
350
351
  );
351
352
 
353
+ REV_OWNER.setDeployer(REV_DEPLOYER);
354
+
352
355
  vm.prank(multisig());
353
356
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
354
357
 
@@ -422,13 +425,15 @@ contract TestSplitWeightFork is TestBaseWorkflow {
422
425
  encodedIPFSUri: bytes32("tier1"),
423
426
  category: 1,
424
427
  discountPercent: 0,
425
- allowOwnerMint: false,
426
- useReserveBeneficiaryAsDefault: false,
427
- transfersPausable: false,
428
- useVotingUnits: false,
429
- cannotBeRemoved: false,
430
- cannotIncreaseDiscountPercent: false,
431
- cantBuyWithCredits: false,
428
+ flags: JB721TierConfigFlags({
429
+ allowOwnerMint: false,
430
+ useReserveBeneficiaryAsDefault: false,
431
+ transfersPausable: false,
432
+ useVotingUnits: false,
433
+ cantBeRemoved: false,
434
+ cantIncreaseDiscountPercent: false,
435
+ cantBuyWithCredits: false
436
+ }),
432
437
  splitPercent: SPLIT_PERCENT,
433
438
  splits: tierSplits
434
439
  });
@@ -172,6 +172,8 @@ contract TestStageTransitionBorrowable is TestBaseWorkflow {
172
172
  address(REV_OWNER)
173
173
  );
174
174
 
175
+ REV_OWNER.setDeployer(REV_DEPLOYER);
176
+
175
177
  vm.prank(multisig());
176
178
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
177
179
 
@@ -113,6 +113,8 @@ contract TestSwapTerminalPermission is TestBaseWorkflow {
113
113
  address(REV_OWNER)
114
114
  );
115
115
 
116
+ REV_OWNER.setDeployer(REV_DEPLOYER);
117
+
116
118
  vm.prank(multisig());
117
119
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
118
120
 
@@ -133,6 +133,8 @@ contract TestUint112Overflow is TestBaseWorkflow {
133
133
  address(REV_OWNER)
134
134
  );
135
135
 
136
+ REV_OWNER.setDeployer(REV_DEPLOYER);
137
+
136
138
  // Deploy fee project
137
139
  vm.prank(multisig());
138
140
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
@@ -126,6 +126,8 @@ contract TestZeroAmountLoanGuard is TestBaseWorkflow {
126
126
  address(REV_OWNER)
127
127
  );
128
128
 
129
+ REV_OWNER.setDeployer(REV_DEPLOYER);
130
+
129
131
  vm.prank(multisig());
130
132
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
131
133
  _deployFeeProject();
@@ -126,6 +126,8 @@ contract TestZeroRepayment is TestBaseWorkflow {
126
126
  address(REV_OWNER)
127
127
  );
128
128
 
129
+ REV_OWNER.setDeployer(REV_DEPLOYER);
130
+
129
131
  vm.prank(multisig());
130
132
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);
131
133
  _deployFeeProject();
@@ -183,6 +183,8 @@ contract LoanIdOverflowGuard is TestBaseWorkflow {
183
183
  address(REV_OWNER)
184
184
  );
185
185
 
186
+ REV_OWNER.setDeployer(REV_DEPLOYER);
187
+
186
188
  // Approve the deployer to configure the fee project.
187
189
  vm.prank(multisig());
188
190
  jbProjects().approve(address(REV_DEPLOYER), FEE_PROJECT_ID);