@rev-net/core-v6 0.0.12 → 0.0.13

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 (78) hide show
  1. package/AUDIT_INSTRUCTIONS.md +295 -0
  2. package/CHANGE_LOG.md +316 -0
  3. package/README.md +2 -2
  4. package/RISKS.md +180 -35
  5. package/SKILLS.md +1 -1
  6. package/USER_JOURNEYS.md +489 -0
  7. package/package.json +9 -9
  8. package/script/Deploy.s.sol +40 -6
  9. package/script/helpers/RevnetCoreDeploymentLib.sol +7 -1
  10. package/src/REVDeployer.sol +63 -47
  11. package/src/REVLoans.sol +51 -15
  12. package/src/interfaces/IREVDeployer.sol +0 -1
  13. package/src/structs/REV721TiersHookFlags.sol +1 -0
  14. package/src/structs/REVAutoIssuance.sol +1 -0
  15. package/src/structs/REVBaseline721HookConfig.sol +1 -0
  16. package/src/structs/REVConfig.sol +1 -0
  17. package/src/structs/REVCroptopAllowedPost.sol +1 -0
  18. package/src/structs/REVDeploy721TiersHookConfig.sol +1 -0
  19. package/src/structs/REVDescription.sol +1 -0
  20. package/src/structs/REVLoan.sol +1 -0
  21. package/src/structs/REVLoanSource.sol +1 -0
  22. package/src/structs/REVStageConfig.sol +1 -0
  23. package/src/structs/REVSuckerDeploymentConfig.sol +1 -0
  24. package/test/REV.integrations.t.sol +132 -12
  25. package/test/REVAutoIssuanceFuzz.t.sol +23 -3
  26. package/test/REVDeployerRegressions.t.sol +35 -4
  27. package/test/REVInvincibility.t.sol +58 -8
  28. package/test/REVInvincibilityHandler.sol +29 -0
  29. package/test/REVLifecycle.t.sol +28 -3
  30. package/test/REVLoans.invariants.t.sol +52 -5
  31. package/test/REVLoansAttacks.t.sol +43 -5
  32. package/test/REVLoansFeeRecovery.t.sol +50 -11
  33. package/test/REVLoansFindings.t.sol +27 -3
  34. package/test/REVLoansRegressions.t.sol +25 -3
  35. package/test/REVLoansSourceFeeRecovery.t.sol +491 -0
  36. package/test/REVLoansSourced.t.sol +56 -7
  37. package/test/REVLoansUnSourced.t.sol +49 -5
  38. package/test/TestBurnHeldTokens.t.sol +32 -5
  39. package/test/TestCEIPattern.t.sol +26 -2
  40. package/test/TestCashOutCallerValidation.t.sol +30 -4
  41. package/test/TestConversionDocumentation.t.sol +26 -5
  42. package/test/TestCrossCurrencyReclaim.t.sol +584 -0
  43. package/test/TestCrossSourceReallocation.t.sol +26 -2
  44. package/test/TestERC2771MetaTx.t.sol +557 -0
  45. package/test/TestEmptyBuybackSpecs.t.sol +23 -3
  46. package/test/TestFlashLoanSurplus.t.sol +28 -3
  47. package/test/TestHookArrayOOB.t.sol +24 -4
  48. package/test/TestLiquidationBehavior.t.sol +26 -3
  49. package/test/TestLoanSourceRotation.t.sol +525 -0
  50. package/test/TestLongTailEconomics.t.sol +651 -0
  51. package/test/TestLowFindings.t.sol +65 -2
  52. package/test/TestMixedFixes.t.sol +28 -3
  53. package/test/TestPermit2Signatures.t.sol +657 -0
  54. package/test/TestReallocationSandwich.t.sol +384 -0
  55. package/test/TestRevnetRegressions.t.sol +324 -0
  56. package/test/TestSplitWeightAdjustment.t.sol +24 -2
  57. package/test/TestSplitWeightE2E.t.sol +29 -2
  58. package/test/TestSplitWeightFork.t.sol +46 -7
  59. package/test/TestStageTransitionBorrowable.t.sol +24 -2
  60. package/test/TestSwapTerminalPermission.t.sol +23 -3
  61. package/test/TestUint112Overflow.t.sol +28 -2
  62. package/test/TestZeroRepayment.t.sol +26 -2
  63. package/test/fork/ForkTestBase.sol +46 -3
  64. package/test/fork/TestCashOutFork.t.sol +1 -1
  65. package/test/fork/TestLoanBorrowFork.t.sol +1 -0
  66. package/test/fork/TestLoanCrossRulesetFork.t.sol +3 -1
  67. package/test/fork/TestLoanLiquidationFork.t.sol +1 -0
  68. package/test/fork/TestLoanReallocateFork.t.sol +1 -0
  69. package/test/fork/TestLoanRepayFork.t.sol +1 -0
  70. package/test/fork/TestLoanTransferFork.t.sol +133 -0
  71. package/test/fork/TestSplitWeightFork.t.sol +3 -0
  72. package/test/helpers/REVEmpty721Config.sol +1 -0
  73. package/test/mock/MockBuybackDataHook.sol +1 -0
  74. package/test/regression/TestBurnPermissionRequired.t.sol +267 -0
  75. package/test/regression/TestCrossRevnetLiquidation.t.sol +228 -0
  76. package/test/regression/TestCumulativeLoanCounter.t.sol +27 -4
  77. package/test/regression/TestLiquidateGapHandling.t.sol +29 -4
  78. package/test/regression/TestZeroPriceFeed.t.sol +396 -0
@@ -1,17 +1,26 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  pragma solidity 0.8.26;
3
3
 
4
+ // forge-lint: disable-next-line(unaliased-plain-import)
4
5
  import "forge-std/Test.sol";
6
+ // forge-lint: disable-next-line(unaliased-plain-import)
5
7
  import /* {*} from */ "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
6
- import /* {*} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
8
+ // import /* {*} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
9
+ // forge-lint: disable-next-line(unaliased-plain-import)
7
10
  import /* {*} from */ "./../src/REVDeployer.sol";
11
+ // forge-lint: disable-next-line(unaliased-plain-import)
8
12
  import "@croptop/core-v6/src/CTPublisher.sol";
9
13
  import {MockBuybackDataHook} from "./mock/MockBuybackDataHook.sol";
10
14
 
15
+ // forge-lint: disable-next-line(unaliased-plain-import)
11
16
  import "@bananapus/core-v6/script/helpers/CoreDeploymentLib.sol";
17
+ // forge-lint: disable-next-line(unaliased-plain-import)
12
18
  import "@bananapus/721-hook-v6/script/helpers/Hook721DeploymentLib.sol";
19
+ // forge-lint: disable-next-line(unaliased-plain-import)
13
20
  import "@bananapus/suckers-v6/script/helpers/SuckerDeploymentLib.sol";
21
+ // forge-lint: disable-next-line(unaliased-plain-import)
14
22
  import "@croptop/core-v6/script/helpers/CroptopDeploymentLib.sol";
23
+ // forge-lint: disable-next-line(unaliased-plain-import)
15
24
  import "@bananapus/router-terminal-v6/script/helpers/RouterTerminalDeploymentLib.sol";
16
25
  import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
17
26
  import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
@@ -31,7 +40,6 @@ import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStor
31
40
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
32
41
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
33
42
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
34
- import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
35
43
 
36
44
  struct FeeProjectConfig {
37
45
  REVConfig configuration;
@@ -40,23 +48,38 @@ struct FeeProjectConfig {
40
48
  }
41
49
 
42
50
  contract TestLowFindings is TestBaseWorkflow {
51
+ // forge-lint: disable-next-line(mixed-case-variable)
43
52
  bytes32 REV_DEPLOYER_SALT = "REVDeployer";
53
+ // forge-lint: disable-next-line(mixed-case-variable)
44
54
  bytes32 ERC20_SALT = "REV_TOKEN";
45
55
 
56
+ // forge-lint: disable-next-line(mixed-case-variable)
46
57
  REVDeployer REV_DEPLOYER;
58
+ // forge-lint: disable-next-line(mixed-case-variable)
47
59
  JB721TiersHook EXAMPLE_HOOK;
60
+ // forge-lint: disable-next-line(mixed-case-variable)
48
61
  IJB721TiersHookDeployer HOOK_DEPLOYER;
62
+ // forge-lint: disable-next-line(mixed-case-variable)
49
63
  IJB721TiersHookStore HOOK_STORE;
64
+ // forge-lint: disable-next-line(mixed-case-variable)
50
65
  IJBAddressRegistry ADDRESS_REGISTRY;
66
+ // forge-lint: disable-next-line(mixed-case-variable)
51
67
  IREVLoans LOANS_CONTRACT;
68
+ // forge-lint: disable-next-line(mixed-case-variable)
52
69
  MockERC20 TOKEN;
70
+ // forge-lint: disable-next-line(mixed-case-variable)
53
71
  IJBSuckerRegistry SUCKER_REGISTRY;
72
+ // forge-lint: disable-next-line(mixed-case-variable)
54
73
  CTPublisher PUBLISHER;
74
+ // forge-lint: disable-next-line(mixed-case-variable)
55
75
  MockBuybackDataHook MOCK_BUYBACK;
56
76
 
77
+ // forge-lint: disable-next-line(mixed-case-variable)
57
78
  uint256 FEE_PROJECT_ID;
79
+ // forge-lint: disable-next-line(mixed-case-variable)
58
80
  uint256 REVNET_ID;
59
81
 
82
+ // forge-lint: disable-next-line(mixed-case-variable)
60
83
  address USER = makeAddr("user");
61
84
 
62
85
  address private constant TRUSTED_FORWARDER = 0xB2b5841DBeF766d4b521221732F9B618fCf34A87;
@@ -86,6 +109,7 @@ contract TestLowFindings is TestBaseWorkflow {
86
109
  autoIssuances: new REVAutoIssuance[](0),
87
110
  splitPercent: 2000,
88
111
  splits: splits,
112
+ // forge-lint: disable-next-line(unsafe-typecast)
89
113
  initialIssuance: uint112(1000 * decimalMultiplier),
90
114
  issuanceCutFrequency: 90 days,
91
115
  issuanceCutPercent: JBConstants.MAX_WEIGHT_CUT_PERCENT / 2,
@@ -94,6 +118,7 @@ contract TestLowFindings is TestBaseWorkflow {
94
118
  });
95
119
 
96
120
  REVConfig memory revnetConfiguration = REVConfig({
121
+ // forge-lint: disable-next-line(named-struct-fields)
97
122
  description: REVDescription("Revnet", "$REV", "ipfs://test", ERC20_SALT),
98
123
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
99
124
  splitOperator: multisig(),
@@ -138,6 +163,7 @@ contract TestLowFindings is TestBaseWorkflow {
138
163
  autoIssuances: new REVAutoIssuance[](0),
139
164
  splitPercent: 2000,
140
165
  splits: splits,
166
+ // forge-lint: disable-next-line(unsafe-typecast)
141
167
  initialIssuance: uint112(1000 * decimalMultiplier),
142
168
  issuanceCutFrequency: 0,
143
169
  issuanceCutPercent: 0,
@@ -162,6 +188,7 @@ contract TestLowFindings is TestBaseWorkflow {
162
188
  loanSources[0] = REVLoanSource({token: JBConstants.NATIVE_TOKEN, terminal: jbMultiTerminal()});
163
189
 
164
190
  REVConfig memory revnetConfiguration = REVConfig({
191
+ // forge-lint: disable-next-line(named-struct-fields)
165
192
  description: REVDescription("TwoStage", "$TWO", "ipfs://test", "TWO_TOKEN"),
166
193
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
167
194
  splitOperator: multisig(),
@@ -206,6 +233,7 @@ contract TestLowFindings is TestBaseWorkflow {
206
233
  autoIssuances: new REVAutoIssuance[](0),
207
234
  splitPercent: 2000,
208
235
  splits: splits,
236
+ // forge-lint: disable-next-line(unsafe-typecast)
209
237
  initialIssuance: uint112(1000 * decimalMultiplier),
210
238
  issuanceCutFrequency: 0,
211
239
  issuanceCutPercent: 0,
@@ -217,6 +245,7 @@ contract TestLowFindings is TestBaseWorkflow {
217
245
  loanSources[0] = REVLoanSource({token: JBConstants.NATIVE_TOKEN, terminal: jbMultiTerminal()});
218
246
 
219
247
  REVConfig memory revnetConfiguration = REVConfig({
248
+ // forge-lint: disable-next-line(named-struct-fields)
220
249
  description: REVDescription("Single", "$SGL", "ipfs://test", "SGL_TOKEN"),
221
250
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
222
251
  splitOperator: multisig(),
@@ -550,6 +579,7 @@ contract TestLowFindings is TestBaseWorkflow {
550
579
 
551
580
  // Increase surplus WITHOUT minting new tokens — makes existing collateral worth more.
552
581
  // This allows reallocating collateral since borrowable(reduced collateral) > loan.amount.
582
+ // forge-lint: disable-next-line(mixed-case-variable)
553
583
  address DONOR = makeAddr("donor");
554
584
  vm.deal(DONOR, 100 ether);
555
585
  vm.prank(DONOR);
@@ -578,4 +608,37 @@ contract TestLowFindings is TestBaseWorkflow {
578
608
  assertTrue(newLoanId != loanId, "New loan should have different ID");
579
609
  assertTrue(newLoanId != reallocatedLoanId, "New loan should differ from reallocated loan");
580
610
  }
611
+
612
+ /// @notice Borrowing with a collateral count so small that the bonding curve rounds the borrow amount to zero
613
+ /// should revert with `REVLoans_ZeroBorrowAmount`.
614
+ function test_borrowFrom_revertsOnZeroBorrowAmount() public {
615
+ uint256 revnetId = _deploySingleStageRevnet();
616
+
617
+ // Pay ETH into revnet to create surplus and get tokens.
618
+ vm.prank(USER);
619
+ uint256 tokens =
620
+ jbMultiTerminal().pay{value: 10 ether}(revnetId, JBConstants.NATIVE_TOKEN, 10 ether, USER, 0, "", "");
621
+ assertGt(tokens, 0, "Should have received tokens");
622
+
623
+ // Confirm that 1 wei of collateral produces a zero borrowable amount.
624
+ // With surplus ~10e18 and totalSupply ~10_000e18, mulDiv(10e18, 1, 10_000e18) rounds to 0.
625
+ uint256 borrowable =
626
+ LOANS_CONTRACT.borrowableAmountFrom(revnetId, 1, 18, uint32(uint160(JBConstants.NATIVE_TOKEN)));
627
+ assertEq(borrowable, 0, "Borrowable amount for 1 wei of collateral should be 0");
628
+
629
+ // Mock the BURN permission (permission ID 11) for the loans contract.
630
+ mockExpect(
631
+ address(jbPermissions()),
632
+ abi.encodeCall(IJBPermissions.hasPermission, (address(LOANS_CONTRACT), USER, revnetId, 11, true, true)),
633
+ abi.encode(true)
634
+ );
635
+
636
+ REVLoanSource memory source = REVLoanSource({token: JBConstants.NATIVE_TOKEN, terminal: jbMultiTerminal()});
637
+ uint256 minPrepaid = LOANS_CONTRACT.MIN_PREPAID_FEE_PERCENT();
638
+
639
+ // Attempt to borrow with 1 wei of collateral -- bonding curve returns 0, should revert.
640
+ vm.prank(USER);
641
+ vm.expectRevert(REVLoans.REVLoans_ZeroBorrowAmount.selector);
642
+ LOANS_CONTRACT.borrowFrom(revnetId, source, 0, 1, payable(USER), minPrepaid);
643
+ }
581
644
  }
@@ -1,16 +1,25 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  pragma solidity 0.8.26;
3
3
 
4
+ // forge-lint: disable-next-line(unaliased-plain-import)
4
5
  import "forge-std/Test.sol";
6
+ // forge-lint: disable-next-line(unaliased-plain-import)
5
7
  import /* {*} from */ "@bananapus/core-v6/test/helpers/TestBaseWorkflow.sol";
6
- import /* {*} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
8
+ // import /* {*} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
9
+ // forge-lint: disable-next-line(unaliased-plain-import)
7
10
  import /* {*} from */ "./../src/REVDeployer.sol";
11
+ // forge-lint: disable-next-line(unaliased-plain-import)
8
12
  import "@croptop/core-v6/src/CTPublisher.sol";
9
13
  import {MockBuybackDataHook} from "./mock/MockBuybackDataHook.sol";
14
+ // forge-lint: disable-next-line(unaliased-plain-import)
10
15
  import "@bananapus/core-v6/script/helpers/CoreDeploymentLib.sol";
16
+ // forge-lint: disable-next-line(unaliased-plain-import)
11
17
  import "@bananapus/721-hook-v6/script/helpers/Hook721DeploymentLib.sol";
18
+ // forge-lint: disable-next-line(unaliased-plain-import)
12
19
  import "@bananapus/suckers-v6/script/helpers/SuckerDeploymentLib.sol";
20
+ // forge-lint: disable-next-line(unaliased-plain-import)
13
21
  import "@croptop/core-v6/script/helpers/CroptopDeploymentLib.sol";
22
+ // forge-lint: disable-next-line(unaliased-plain-import)
14
23
  import "@bananapus/router-terminal-v6/script/helpers/RouterTerminalDeploymentLib.sol";
15
24
  import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
16
25
  import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
@@ -21,7 +30,6 @@ import {REVLoan} from "../src/structs/REVLoan.sol";
21
30
  import {REVStageConfig, REVAutoIssuance} from "../src/structs/REVStageConfig.sol";
22
31
  import {REVLoanSource} from "../src/structs/REVLoanSource.sol";
23
32
  import {REVDescription} from "../src/structs/REVDescription.sol";
24
- import {IREVLoans} from "./../src/interfaces/IREVLoans.sol";
25
33
  import {JBSuckerDeployerConfig} from "@bananapus/suckers-v6/src/structs/JBSuckerDeployerConfig.sol";
26
34
  import {JBSuckerRegistry} from "@bananapus/suckers-v6/src/JBSuckerRegistry.sol";
27
35
  import {JB721TiersHookDeployer} from "@bananapus/721-hook-v6/src/JB721TiersHookDeployer.sol";
@@ -30,26 +38,39 @@ import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStor
30
38
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
31
39
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
32
40
  import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
33
- import {REVCroptopAllowedPost} from "../src/structs/REVCroptopAllowedPost.sol";
34
41
 
35
42
  /// @notice Tests for PR #32: liquidation boundary, reallocate msg.value, and decimal normalization fixes.
36
43
  contract TestMixedFixes is TestBaseWorkflow {
44
+ // forge-lint: disable-next-line(mixed-case-variable)
37
45
  bytes32 REV_DEPLOYER_SALT = "REVDeployer";
38
46
 
47
+ // forge-lint: disable-next-line(mixed-case-variable)
39
48
  REVDeployer REV_DEPLOYER;
49
+ // forge-lint: disable-next-line(mixed-case-variable)
40
50
  JB721TiersHook EXAMPLE_HOOK;
51
+ // forge-lint: disable-next-line(mixed-case-variable)
41
52
  IJB721TiersHookDeployer HOOK_DEPLOYER;
53
+ // forge-lint: disable-next-line(mixed-case-variable)
42
54
  IJB721TiersHookStore HOOK_STORE;
55
+ // forge-lint: disable-next-line(mixed-case-variable)
43
56
  IJBAddressRegistry ADDRESS_REGISTRY;
57
+ // forge-lint: disable-next-line(mixed-case-variable)
44
58
  REVLoans LOANS_CONTRACT;
59
+ // forge-lint: disable-next-line(mixed-case-variable)
45
60
  MockERC20 TOKEN;
61
+ // forge-lint: disable-next-line(mixed-case-variable)
46
62
  IJBSuckerRegistry SUCKER_REGISTRY;
63
+ // forge-lint: disable-next-line(mixed-case-variable)
47
64
  CTPublisher PUBLISHER;
65
+ // forge-lint: disable-next-line(mixed-case-variable)
48
66
  MockBuybackDataHook MOCK_BUYBACK;
49
67
 
68
+ // forge-lint: disable-next-line(mixed-case-variable)
50
69
  uint256 FEE_PROJECT_ID;
70
+ // forge-lint: disable-next-line(mixed-case-variable)
51
71
  uint256 REVNET_ID;
52
72
 
73
+ // forge-lint: disable-next-line(mixed-case-variable)
53
74
  address USER = makeAddr("user");
54
75
 
55
76
  address private constant TRUSTED_FORWARDER = 0xB2b5841DBeF766d4b521221732F9B618fCf34A87;
@@ -122,6 +143,7 @@ contract TestMixedFixes is TestBaseWorkflow {
122
143
  extraMetadata: 0
123
144
  });
124
145
  REVConfig memory cfg = REVConfig({
146
+ // forge-lint: disable-next-line(named-struct-fields)
125
147
  description: REVDescription("Revnet", "$REV", "ipfs://test", "REV_TOKEN"),
126
148
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
127
149
  splitOperator: multisig(),
@@ -168,6 +190,7 @@ contract TestMixedFixes is TestBaseWorkflow {
168
190
  REVLoanSource[] memory ls = new REVLoanSource[](1);
169
191
  ls[0] = REVLoanSource({token: JBConstants.NATIVE_TOKEN, terminal: jbMultiTerminal()});
170
192
  REVConfig memory cfg = REVConfig({
193
+ // forge-lint: disable-next-line(named-struct-fields)
171
194
  description: REVDescription("NANA", "$NANA", "ipfs://test2", "NANA_TOKEN"),
172
195
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
173
196
  splitOperator: multisig(),
@@ -312,6 +335,7 @@ contract TestMixedFixes is TestBaseWorkflow {
312
335
 
313
336
  // ==================== Mixed-Decimal Normalization Tests ====================
314
337
 
338
+ // forge-lint: disable-next-line(mixed-case-variable)
315
339
  uint256 MIXED_REVNET_ID;
316
340
 
317
341
  /// @notice Deploy a revnet with BOTH ETH (18 dec) and TOKEN (6 dec) as loan sources.
@@ -345,6 +369,7 @@ contract TestMixedFixes is TestBaseWorkflow {
345
369
  ls[0] = REVLoanSource({token: JBConstants.NATIVE_TOKEN, terminal: jbMultiTerminal()});
346
370
  ls[1] = REVLoanSource({token: address(TOKEN), terminal: jbMultiTerminal()});
347
371
  REVConfig memory cfg = REVConfig({
372
+ // forge-lint: disable-next-line(named-struct-fields)
348
373
  description: REVDescription("Mixed", "$MIX", "ipfs://mix", "MIX_TOKEN"),
349
374
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
350
375
  splitOperator: multisig(),