@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.
- package/ADMINISTRATION.md +28 -1
- package/ARCHITECTURE.md +53 -129
- package/AUDIT_INSTRUCTIONS.md +108 -375
- package/CHANGELOG.md +65 -0
- package/README.md +76 -175
- package/RISKS.md +17 -5
- package/SKILLS.md +30 -391
- package/STYLE_GUIDE.md +59 -20
- package/USER_JOURNEYS.md +55 -478
- package/package.json +6 -6
- package/references/operations.md +311 -0
- package/references/runtime.md +98 -0
- package/script/Deploy.s.sol +42 -41
- package/src/REVDeployer.sol +0 -3
- package/src/REVLoans.sol +10 -10
- package/src/REVOwner.sol +30 -7
- package/src/interfaces/IREVDeployer.sol +1 -1
- package/src/interfaces/IREVOwner.sol +6 -0
- package/test/REV.integrations.t.sol +2 -0
- package/test/REVAutoIssuanceFuzz.t.sol +2 -0
- package/test/REVDeployerRegressions.t.sol +2 -0
- package/test/REVInvincibility.t.sol +3 -0
- package/test/REVLifecycle.t.sol +2 -0
- package/test/REVLoans.invariants.t.sol +2 -0
- package/test/REVLoansAttacks.t.sol +2 -0
- package/test/REVLoansFeeRecovery.t.sol +2 -0
- package/test/REVLoansFindings.t.sol +2 -0
- package/test/REVLoansRegressions.t.sol +2 -0
- package/test/REVLoansSourceFeeRecovery.t.sol +2 -0
- package/test/REVLoansSourced.t.sol +2 -0
- package/test/REVLoansUnSourced.t.sol +2 -0
- package/test/TestBurnHeldTokens.t.sol +2 -0
- package/test/TestCEIPattern.t.sol +2 -0
- package/test/TestCashOutCallerValidation.t.sol +2 -0
- package/test/TestConversionDocumentation.t.sol +2 -0
- package/test/TestCrossCurrencyReclaim.t.sol +2 -0
- package/test/TestCrossSourceReallocation.t.sol +2 -0
- package/test/TestERC2771MetaTx.t.sol +2 -0
- package/test/TestEmptyBuybackSpecs.t.sol +2 -0
- package/test/TestFlashLoanSurplus.t.sol +2 -0
- package/test/TestHookArrayOOB.t.sol +2 -0
- package/test/TestLiquidationBehavior.t.sol +2 -0
- package/test/TestLoanSourceRotation.t.sol +2 -0
- package/test/TestLoansCashOutDelay.t.sol +2 -0
- package/test/TestLongTailEconomics.t.sol +2 -0
- package/test/TestLowFindings.t.sol +2 -0
- package/test/TestMixedFixes.t.sol +2 -0
- package/test/TestPermit2Signatures.t.sol +2 -0
- package/test/TestReallocationSandwich.t.sol +2 -0
- package/test/TestRevnetRegressions.t.sol +2 -0
- package/test/TestSplitWeightAdjustment.t.sol +4 -0
- package/test/TestSplitWeightE2E.t.sol +14 -7
- package/test/TestSplitWeightFork.t.sol +12 -7
- package/test/TestStageTransitionBorrowable.t.sol +2 -0
- package/test/TestSwapTerminalPermission.t.sol +2 -0
- package/test/TestUint112Overflow.t.sol +2 -0
- package/test/TestZeroAmountLoanGuard.t.sol +2 -0
- package/test/TestZeroRepayment.t.sol +2 -0
- package/test/audit/LoanIdOverflowGuard.t.sol +2 -0
- package/test/fork/ForkTestBase.sol +12 -7
- package/test/regression/TestBurnPermissionRequired.t.sol +2 -0
- package/test/regression/TestCashOutBuybackFeeLeak.t.sol +2 -0
- package/test/regression/TestCrossRevnetLiquidation.t.sol +2 -0
- package/test/regression/TestCumulativeLoanCounter.t.sol +2 -0
- package/test/regression/TestLiquidateGapHandling.t.sol +2 -0
- package/test/regression/TestZeroPriceFeed.t.sol +2 -0
- 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()`
|
|
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
|
-
|
|
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
|
|
366
|
-
/// @dev
|
|
367
|
-
|
|
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
|
-
|
|
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));
|
|
@@ -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
|
{
|
package/test/REVLifecycle.t.sol
CHANGED
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
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
|
});
|
|
@@ -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);
|