@rev-net/core-v6 0.0.11 → 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 (81) hide show
  1. package/ADMINISTRATION.md +7 -7
  2. package/ARCHITECTURE.md +11 -11
  3. package/AUDIT_INSTRUCTIONS.md +295 -0
  4. package/CHANGE_LOG.md +316 -0
  5. package/README.md +9 -6
  6. package/RISKS.md +180 -35
  7. package/SKILLS.md +9 -11
  8. package/STYLE_GUIDE.md +14 -1
  9. package/USER_JOURNEYS.md +489 -0
  10. package/package.json +9 -9
  11. package/script/Deploy.s.sol +124 -40
  12. package/script/helpers/RevnetCoreDeploymentLib.sol +19 -6
  13. package/src/REVDeployer.sol +183 -175
  14. package/src/REVLoans.sol +65 -28
  15. package/src/interfaces/IREVDeployer.sol +25 -23
  16. package/src/structs/REV721TiersHookFlags.sol +1 -0
  17. package/src/structs/REVAutoIssuance.sol +1 -0
  18. package/src/structs/REVBaseline721HookConfig.sol +1 -0
  19. package/src/structs/REVConfig.sol +1 -0
  20. package/src/structs/REVCroptopAllowedPost.sol +1 -0
  21. package/src/structs/REVDeploy721TiersHookConfig.sol +13 -14
  22. package/src/structs/REVDescription.sol +1 -0
  23. package/src/structs/REVLoan.sol +1 -0
  24. package/src/structs/REVLoanSource.sol +1 -0
  25. package/src/structs/REVStageConfig.sol +1 -0
  26. package/src/structs/REVSuckerDeploymentConfig.sol +1 -0
  27. package/test/REV.integrations.t.sol +148 -19
  28. package/test/REVAutoIssuanceFuzz.t.sol +31 -6
  29. package/test/REVDeployerRegressions.t.sol +47 -9
  30. package/test/REVInvincibility.t.sol +83 -19
  31. package/test/REVInvincibilityHandler.sol +29 -0
  32. package/test/REVLifecycle.t.sol +36 -6
  33. package/test/REVLoans.invariants.t.sol +64 -10
  34. package/test/REVLoansAttacks.t.sol +54 -9
  35. package/test/REVLoansFeeRecovery.t.sol +61 -15
  36. package/test/REVLoansFindings.t.sol +42 -9
  37. package/test/REVLoansRegressions.t.sol +33 -6
  38. package/test/REVLoansSourceFeeRecovery.t.sol +491 -0
  39. package/test/REVLoansSourced.t.sol +79 -17
  40. package/test/REVLoansUnSourced.t.sol +61 -10
  41. package/test/TestBurnHeldTokens.t.sol +47 -11
  42. package/test/TestCEIPattern.t.sol +37 -6
  43. package/test/TestCashOutCallerValidation.t.sol +41 -8
  44. package/test/TestConversionDocumentation.t.sol +50 -13
  45. package/test/TestCrossCurrencyReclaim.t.sol +584 -0
  46. package/test/TestCrossSourceReallocation.t.sol +37 -6
  47. package/test/TestERC2771MetaTx.t.sol +557 -0
  48. package/test/TestEmptyBuybackSpecs.t.sol +45 -10
  49. package/test/TestFlashLoanSurplus.t.sol +39 -7
  50. package/test/TestHookArrayOOB.t.sol +42 -13
  51. package/test/TestLiquidationBehavior.t.sol +37 -7
  52. package/test/TestLoanSourceRotation.t.sol +525 -0
  53. package/test/TestLongTailEconomics.t.sol +651 -0
  54. package/test/TestLowFindings.t.sol +80 -8
  55. package/test/TestMixedFixes.t.sol +43 -9
  56. package/test/TestPermit2Signatures.t.sol +657 -0
  57. package/test/TestReallocationSandwich.t.sol +384 -0
  58. package/test/TestRevnetRegressions.t.sol +324 -0
  59. package/test/TestSplitWeightAdjustment.t.sol +52 -13
  60. package/test/TestSplitWeightE2E.t.sol +53 -18
  61. package/test/TestSplitWeightFork.t.sol +66 -21
  62. package/test/TestStageTransitionBorrowable.t.sol +38 -6
  63. package/test/TestSwapTerminalPermission.t.sol +37 -7
  64. package/test/TestUint112Overflow.t.sol +39 -6
  65. package/test/TestZeroRepayment.t.sol +37 -6
  66. package/test/fork/ForkTestBase.sol +66 -17
  67. package/test/fork/TestCashOutFork.t.sol +9 -3
  68. package/test/fork/TestLoanBorrowFork.t.sol +1 -0
  69. package/test/fork/TestLoanCrossRulesetFork.t.sol +11 -3
  70. package/test/fork/TestLoanLiquidationFork.t.sol +1 -0
  71. package/test/fork/TestLoanReallocateFork.t.sol +1 -0
  72. package/test/fork/TestLoanRepayFork.t.sol +1 -0
  73. package/test/fork/TestLoanTransferFork.t.sol +133 -0
  74. package/test/fork/TestSplitWeightFork.t.sol +3 -0
  75. package/test/helpers/REVEmpty721Config.sol +46 -0
  76. package/test/mock/MockBuybackDataHook.sol +1 -0
  77. package/test/regression/TestBurnPermissionRequired.t.sol +267 -0
  78. package/test/regression/TestCrossRevnetLiquidation.t.sol +228 -0
  79. package/test/regression/TestCumulativeLoanCounter.t.sol +38 -8
  80. package/test/regression/TestLiquidateGapHandling.t.sol +40 -8
  81. package/test/regression/TestZeroPriceFeed.t.sol +396 -0
@@ -1,23 +1,31 @@
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
 
17
26
  import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
18
27
  import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
19
28
  import {JBRuleset} from "@bananapus/core-v6/src/structs/JBRuleset.sol";
20
- import {JBRulesetMetadata} from "@bananapus/core-v6/src/structs/JBRulesetMetadata.sol";
21
29
  import {JBSingleAllowance} from "@bananapus/core-v6/src/structs/JBSingleAllowance.sol";
22
30
  import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
23
31
  import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
@@ -34,6 +42,7 @@ import {JB721TiersHook} from "@bananapus/721-hook-v6/src/JB721TiersHook.sol";
34
42
  import {JB721TiersHookStore} from "@bananapus/721-hook-v6/src/JB721TiersHookStore.sol";
35
43
  import {JBAddressRegistry} from "@bananapus/address-registry-v6/src/JBAddressRegistry.sol";
36
44
  import {IJBAddressRegistry} from "@bananapus/address-registry-v6/src/interfaces/IJBAddressRegistry.sol";
45
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
37
46
 
38
47
  /// @notice A fake terminal that returns garbage accounting contexts.
39
48
  /// Used to test unvalidated loan source terminal rejection.
@@ -135,22 +144,36 @@ contract GarbageTerminal is ERC165, IJBPayoutTerminal {
135
144
  /// Auto-issuance timing guard bypass (false positive)
136
145
  /// repayLoan revert on excess collateral (false positive)
137
146
  contract REVLoansFindings is TestBaseWorkflow {
147
+ // forge-lint: disable-next-line(mixed-case-variable)
138
148
  bytes32 REV_DEPLOYER_SALT = "REVDeployer";
149
+ // forge-lint: disable-next-line(mixed-case-variable)
139
150
  bytes32 ERC20_SALT = "REV_TOKEN";
140
151
 
152
+ // forge-lint: disable-next-line(mixed-case-variable)
141
153
  REVDeployer REV_DEPLOYER;
154
+ // forge-lint: disable-next-line(mixed-case-variable)
142
155
  JB721TiersHook EXAMPLE_HOOK;
156
+ // forge-lint: disable-next-line(mixed-case-variable)
143
157
  IJB721TiersHookDeployer HOOK_DEPLOYER;
158
+ // forge-lint: disable-next-line(mixed-case-variable)
144
159
  IJB721TiersHookStore HOOK_STORE;
160
+ // forge-lint: disable-next-line(mixed-case-variable)
145
161
  IJBAddressRegistry ADDRESS_REGISTRY;
162
+ // forge-lint: disable-next-line(mixed-case-variable)
146
163
  IREVLoans LOANS_CONTRACT;
164
+ // forge-lint: disable-next-line(mixed-case-variable)
147
165
  IJBSuckerRegistry SUCKER_REGISTRY;
166
+ // forge-lint: disable-next-line(mixed-case-variable)
148
167
  CTPublisher PUBLISHER;
168
+ // forge-lint: disable-next-line(mixed-case-variable)
149
169
  MockBuybackDataHook MOCK_BUYBACK;
150
170
 
171
+ // forge-lint: disable-next-line(mixed-case-variable)
151
172
  uint256 FEE_PROJECT_ID;
173
+ // forge-lint: disable-next-line(mixed-case-variable)
152
174
  uint256 REVNET_ID;
153
175
 
176
+ // forge-lint: disable-next-line(mixed-case-variable)
154
177
  address USER = makeAddr("user");
155
178
 
156
179
  address private constant TRUSTED_FORWARDER = 0xB2b5841DBeF766d4b521221732F9B618fCf34A87;
@@ -162,8 +185,9 @@ contract REVLoansFindings is TestBaseWorkflow {
162
185
 
163
186
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
164
187
  HOOK_STORE = new JB721TiersHookStore();
165
- EXAMPLE_HOOK =
166
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
188
+ EXAMPLE_HOOK = new JB721TiersHook(
189
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
190
+ );
167
191
  ADDRESS_REGISTRY = new JBAddressRegistry();
168
192
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
169
193
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -234,6 +258,7 @@ contract REVLoansFindings is TestBaseWorkflow {
234
258
  });
235
259
 
236
260
  REVConfig memory revnetConfiguration = REVConfig({
261
+ // forge-lint: disable-next-line(named-struct-fields)
237
262
  description: REVDescription("Revnet", "$REV", "ipfs://test", ERC20_SALT),
238
263
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
239
264
  splitOperator: multisig(),
@@ -247,7 +272,9 @@ contract REVLoansFindings is TestBaseWorkflow {
247
272
  terminalConfigurations: terminalConfigurations,
248
273
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
249
274
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256(abi.encodePacked("REV"))
250
- })
275
+ }),
276
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
277
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
251
278
  });
252
279
  }
253
280
 
@@ -279,19 +306,22 @@ contract REVLoansFindings is TestBaseWorkflow {
279
306
  });
280
307
 
281
308
  REVConfig memory revnetConfiguration = REVConfig({
309
+ // forge-lint: disable-next-line(named-struct-fields)
282
310
  description: REVDescription("Borrowable", "BRW", "ipfs://brw", "BRW_TOKEN"),
283
311
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
284
312
  splitOperator: multisig(),
285
313
  stageConfigurations: stageConfigurations
286
314
  });
287
315
 
288
- REVNET_ID = REV_DEPLOYER.deployFor({
316
+ (REVNET_ID,) = REV_DEPLOYER.deployFor({
289
317
  revnetId: 0,
290
318
  configuration: revnetConfiguration,
291
319
  terminalConfigurations: terminalConfigurations,
292
320
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
293
321
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256(abi.encodePacked("BRW"))
294
- })
322
+ }),
323
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
324
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
295
325
  });
296
326
  }
297
327
 
@@ -510,6 +540,7 @@ contract REVLoansFindings is TestBaseWorkflow {
510
540
  });
511
541
 
512
542
  REVConfig memory config = REVConfig({
543
+ // forge-lint: disable-next-line(named-struct-fields)
513
544
  description: REVDescription("FP1Test", "FP1", "ipfs://fp1", "FP1_TOKEN"),
514
545
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
515
546
  splitOperator: multisig(),
@@ -519,13 +550,15 @@ contract REVLoansFindings is TestBaseWorkflow {
519
550
  // Record the deploy timestamp -- this is used for stage ID calculation.
520
551
  uint256 deployTimestamp = block.timestamp;
521
552
 
522
- uint256 fp1RevnetId = REV_DEPLOYER.deployFor({
553
+ (uint256 fp1RevnetId,) = REV_DEPLOYER.deployFor({
523
554
  revnetId: 0,
524
555
  configuration: config,
525
556
  terminalConfigurations: terminalConfigurations,
526
557
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
527
558
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("FP1")
528
- })
559
+ }),
560
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
561
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
529
562
  });
530
563
 
531
564
  // Step 2: Verify the second ruleset ID matches deployTimestamp + 1.
@@ -1,23 +1,31 @@
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
 
17
26
  import {JBConstants} from "@bananapus/core-v6/src/libraries/JBConstants.sol";
18
27
  import {JBAccountingContext} from "@bananapus/core-v6/src/structs/JBAccountingContext.sol";
19
28
  import {REVLoans} from "../src/REVLoans.sol";
20
- import {REVLoan} from "../src/structs/REVLoan.sol";
21
29
  import {REVStageConfig, REVAutoIssuance} from "../src/structs/REVStageConfig.sol";
22
30
  import {REVLoanSource} from "../src/structs/REVLoanSource.sol";
23
31
  import {REVDescription} from "../src/structs/REVDescription.sol";
@@ -30,6 +38,7 @@ 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 {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
41
+ import {REVEmpty721Config} from "./helpers/REVEmpty721Config.sol";
33
42
 
34
43
  /// @notice A fake terminal that tracks whether useAllowanceOf was called.
35
44
  /// @dev REVLoans.borrowFrom does not validate source terminal registration.
@@ -130,22 +139,36 @@ contract FakeTerminal is ERC165, IJBPayoutTerminal {
130
139
 
131
140
  /// @notice Regression tests for REVLoans unvalidated source terminal.
132
141
  contract REVLoansRegressions is TestBaseWorkflow {
142
+ // forge-lint: disable-next-line(mixed-case-variable)
133
143
  bytes32 REV_DEPLOYER_SALT = "REVDeployer";
144
+ // forge-lint: disable-next-line(mixed-case-variable)
134
145
  bytes32 ERC20_SALT = "REV_TOKEN";
135
146
 
147
+ // forge-lint: disable-next-line(mixed-case-variable)
136
148
  REVDeployer REV_DEPLOYER;
149
+ // forge-lint: disable-next-line(mixed-case-variable)
137
150
  JB721TiersHook EXAMPLE_HOOK;
151
+ // forge-lint: disable-next-line(mixed-case-variable)
138
152
  IJB721TiersHookDeployer HOOK_DEPLOYER;
153
+ // forge-lint: disable-next-line(mixed-case-variable)
139
154
  IJB721TiersHookStore HOOK_STORE;
155
+ // forge-lint: disable-next-line(mixed-case-variable)
140
156
  IJBAddressRegistry ADDRESS_REGISTRY;
157
+ // forge-lint: disable-next-line(mixed-case-variable)
141
158
  IREVLoans LOANS_CONTRACT;
159
+ // forge-lint: disable-next-line(mixed-case-variable)
142
160
  IJBSuckerRegistry SUCKER_REGISTRY;
161
+ // forge-lint: disable-next-line(mixed-case-variable)
143
162
  CTPublisher PUBLISHER;
163
+ // forge-lint: disable-next-line(mixed-case-variable)
144
164
  MockBuybackDataHook MOCK_BUYBACK;
145
165
 
166
+ // forge-lint: disable-next-line(mixed-case-variable)
146
167
  uint256 FEE_PROJECT_ID;
168
+ // forge-lint: disable-next-line(mixed-case-variable)
147
169
  uint256 REVNET_ID;
148
170
 
171
+ // forge-lint: disable-next-line(mixed-case-variable)
149
172
  address USER = makeAddr("user");
150
173
 
151
174
  address private constant TRUSTED_FORWARDER = 0xB2b5841DBeF766d4b521221732F9B618fCf34A87;
@@ -157,8 +180,9 @@ contract REVLoansRegressions is TestBaseWorkflow {
157
180
 
158
181
  SUCKER_REGISTRY = new JBSuckerRegistry(jbDirectory(), jbPermissions(), multisig(), address(0));
159
182
  HOOK_STORE = new JB721TiersHookStore();
160
- EXAMPLE_HOOK =
161
- new JB721TiersHook(jbDirectory(), jbPermissions(), jbRulesets(), HOOK_STORE, jbSplits(), multisig());
183
+ EXAMPLE_HOOK = new JB721TiersHook(
184
+ jbDirectory(), jbPermissions(), jbPrices(), jbRulesets(), HOOK_STORE, jbSplits(), multisig()
185
+ );
162
186
  ADDRESS_REGISTRY = new JBAddressRegistry();
163
187
  HOOK_DEPLOYER = new JB721TiersHookDeployer(EXAMPLE_HOOK, HOOK_STORE, ADDRESS_REGISTRY, multisig());
164
188
  PUBLISHER = new CTPublisher(jbDirectory(), jbPermissions(), FEE_PROJECT_ID, multisig());
@@ -222,6 +246,7 @@ contract REVLoansRegressions is TestBaseWorkflow {
222
246
  });
223
247
 
224
248
  REVConfig memory revnetConfiguration = REVConfig({
249
+ // forge-lint: disable-next-line(named-struct-fields)
225
250
  description: REVDescription("H6Test", "H6T", "ipfs://h6test", "H6_TOKEN"),
226
251
  baseCurrency: uint32(uint160(JBConstants.NATIVE_TOKEN)),
227
252
  splitOperator: multisig(),
@@ -229,13 +254,15 @@ contract REVLoansRegressions is TestBaseWorkflow {
229
254
  });
230
255
 
231
256
  vm.prank(multisig());
232
- REVNET_ID = REV_DEPLOYER.deployFor({
257
+ (REVNET_ID,) = REV_DEPLOYER.deployFor({
233
258
  revnetId: FEE_PROJECT_ID,
234
259
  configuration: revnetConfiguration,
235
260
  terminalConfigurations: terminalConfigurations,
236
261
  suckerDeploymentConfiguration: REVSuckerDeploymentConfig({
237
262
  deployerConfigurations: new JBSuckerDeployerConfig[](0), salt: keccak256("H6_TEST")
238
- })
263
+ }),
264
+ tiered721HookConfiguration: REVEmpty721Config.empty721Config(uint32(uint160(JBConstants.NATIVE_TOKEN))),
265
+ allowedPosts: REVEmpty721Config.emptyAllowedPosts()
239
266
  });
240
267
  }
241
268