From 53635bdd519387b5de604ad2e45ae89eda2980a7 Mon Sep 17 00:00:00 2001 From: TucksonDev Date: Thu, 23 Apr 2026 21:00:42 +0100 Subject: [PATCH] [ResourceConstraintManager] Update boundaries --- src/chain/ResourceConstraintManager.sol | 25 +++++++++------ test/foundry/ResourceConstraintManager.t.sol | 32 ++++++++++---------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/chain/ResourceConstraintManager.sol b/src/chain/ResourceConstraintManager.sol index 9f2a69f1..62c25339 100644 --- a/src/chain/ResourceConstraintManager.sol +++ b/src/chain/ResourceConstraintManager.sol @@ -13,13 +13,14 @@ contract ResourceConstraintManager is AccessControlEnumerable { // Constraint parameters boundaries uint256 public constant MAX_SINGLE_GAS_CONSTRAINTS = 10; uint256 public constant MAX_MULTI_GAS_CONSTRAINTS = 100; - uint64 public constant MIN_SINGLE_DIM_GAS_TARGET_PER_SEC = 7_000_000; // 7M gas/sec + uint64 public constant MIN_SINGLE_DIM_GAS_TARGET_PER_SEC = 7_000_000; // 7M gas/sec uint64 public constant MAX_SINGLE_DIM_GAS_TARGET_PER_SEC = 100_000_000; // 100M gas/sec - uint64 public constant MIN_MULTI_DIM_GAS_TARGET_PER_SEC = 10_000_000; // 10M gas/sec - uint64 public constant MAX_MULTI_DIM_GAS_TARGET_PER_SEC = 500_000_000; // 500M gas/sec - uint32 public constant MIN_ADJUSTMENT_WINDOW_SECS = 5; // 5 seconds (valid for both single-dimension and multi-dimension models) - uint32 public constant MAX_SINGLE_DIM_ADJUSTMENT_WINDOW_SECS = 86400; // 24 hours - uint32 public constant MAX_MULTI_DIM_ADJUSTMENT_WINDOW_SECS = 604800; // 7 days + uint64 public constant MIN_MULTI_DIM_GAS_TARGET_PER_SEC = 1_000_000; // 1M gas/sec + uint64 public constant MAX_MULTI_DIM_GAS_TARGET_PER_SEC = 500_000_000; // 500M gas/sec + uint32 public constant MIN_SINGLE_DIM_ADJUSTMENT_WINDOW_SECS = 5; // 5 seconds + uint32 public constant MAX_SINGLE_DIM_ADJUSTMENT_WINDOW_SECS = 86_400; // 24 hours + uint32 public constant MIN_MULTI_DIM_ADJUSTMENT_WINDOW_SECS = 1; // 1 second + uint32 public constant MAX_MULTI_DIM_ADJUSTMENT_WINDOW_SECS = 2_592_000; // 30 days uint64 public constant MAX_PRICING_EXPONENT = 8000; // scaled by 1000 to allow for fractional exponents bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); @@ -82,12 +83,13 @@ contract ResourceConstraintManager is AccessControlEnumerable { uint64 adjustmentWindowSecs = constraints[i][1]; uint64 startingBacklogValue = constraints[i][2]; if ( - gasTargetPerSec < MIN_SINGLE_DIM_GAS_TARGET_PER_SEC || gasTargetPerSec > MAX_SINGLE_DIM_GAS_TARGET_PER_SEC + gasTargetPerSec < MIN_SINGLE_DIM_GAS_TARGET_PER_SEC + || gasTargetPerSec > MAX_SINGLE_DIM_GAS_TARGET_PER_SEC ) { revert InvalidTarget(gasTargetPerSec, adjustmentWindowSecs, startingBacklogValue); } if ( - adjustmentWindowSecs < MIN_ADJUSTMENT_WINDOW_SECS + adjustmentWindowSecs < MIN_SINGLE_DIM_ADJUSTMENT_WINDOW_SECS || adjustmentWindowSecs > MAX_SINGLE_DIM_ADJUSTMENT_WINDOW_SECS ) { revert InvalidPeriod(gasTargetPerSec, adjustmentWindowSecs, startingBacklogValue); @@ -141,11 +143,14 @@ contract ResourceConstraintManager is AccessControlEnumerable { uint64 targetPerSec = constraints[i].targetPerSec; uint32 adjustmentWindowSecs = constraints[i].adjustmentWindowSecs; uint64 startingBacklogValue = constraints[i].backlog; - if (targetPerSec < MIN_MULTI_DIM_GAS_TARGET_PER_SEC || targetPerSec > MAX_MULTI_DIM_GAS_TARGET_PER_SEC) { + if ( + targetPerSec < MIN_MULTI_DIM_GAS_TARGET_PER_SEC + || targetPerSec > MAX_MULTI_DIM_GAS_TARGET_PER_SEC + ) { revert InvalidTarget(targetPerSec, adjustmentWindowSecs, startingBacklogValue); } if ( - adjustmentWindowSecs < MIN_ADJUSTMENT_WINDOW_SECS + adjustmentWindowSecs < MIN_MULTI_DIM_ADJUSTMENT_WINDOW_SECS || adjustmentWindowSecs > MAX_MULTI_DIM_ADJUSTMENT_WINDOW_SECS ) { revert InvalidPeriod(targetPerSec, adjustmentWindowSecs, startingBacklogValue); diff --git a/test/foundry/ResourceConstraintManager.t.sol b/test/foundry/ResourceConstraintManager.t.sol index cede75c4..3af72c9b 100644 --- a/test/foundry/ResourceConstraintManager.t.sol +++ b/test/foundry/ResourceConstraintManager.t.sol @@ -492,16 +492,16 @@ contract ResourceConstraintManagerTest is Test { } function test_setMultiGasPricingConstraints_invalidTarget() external { - // Test gas target below minimum (9,999,999) + // Test gas target below minimum (999,999) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsLowTarget = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsLowTarget[0] = _createMultiGasConstraint(9_999_999, 100, 0); + constraintsLowTarget[0] = _createMultiGasConstraint(999_999, 100, 0); vm.prank(manager); vm.expectRevert( abi.encodeWithSelector( ResourceConstraintManager.InvalidTarget.selector, - uint64(9_999_999), + uint64(999_999), uint64(100), uint64(0) ) @@ -527,7 +527,7 @@ contract ResourceConstraintManagerTest is Test { // Test edge cases (exactly at boundaries should succeed) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsMinTarget = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsMinTarget[0] = _createMultiGasConstraint(10_000_000, 100, 0); + constraintsMinTarget[0] = _createMultiGasConstraint(1_000_000, 100, 0); vm.prank(manager); resourceConstraintManager.setMultiGasPricingConstraints(constraintsMinTarget); @@ -539,33 +539,33 @@ contract ResourceConstraintManagerTest is Test { } function test_setMultiGasPricingConstraints_invalidPeriod() external { - // Test adjustment window below minimum (4 seconds) + // Test adjustment window below minimum (0 seconds) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsLowPeriod = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsLowPeriod[0] = _createMultiGasConstraint(10_000_000, 4, 0); + constraintsLowPeriod[0] = _createMultiGasConstraint(10_000_000, 0, 0); vm.prank(manager); vm.expectRevert( abi.encodeWithSelector( ResourceConstraintManager.InvalidPeriod.selector, uint64(10_000_000), - uint64(4), + uint64(0), uint64(0) ) ); resourceConstraintManager.setMultiGasPricingConstraints(constraintsLowPeriod); - // Test adjustment window above maximum (604801 seconds) + // Test adjustment window above maximum (2,592,001 seconds) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsHighPeriod = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsHighPeriod[0] = _createMultiGasConstraint(10_000_000, 604801, 0); + constraintsHighPeriod[0] = _createMultiGasConstraint(10_000_000, 2_592_001, 0); vm.prank(manager); vm.expectRevert( abi.encodeWithSelector( ResourceConstraintManager.InvalidPeriod.selector, uint64(10_000_000), - uint64(604801), + uint64(2_592_001), uint64(0) ) ); @@ -574,13 +574,13 @@ contract ResourceConstraintManagerTest is Test { // Test edge cases (exactly at boundaries should succeed) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsMinPeriod = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsMinPeriod[0] = _createMultiGasConstraint(10_000_000, 5, 0); + constraintsMinPeriod[0] = _createMultiGasConstraint(10_000_000, 1, 0); vm.prank(manager); resourceConstraintManager.setMultiGasPricingConstraints(constraintsMinPeriod); ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsMaxPeriod = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsMaxPeriod[0] = _createMultiGasConstraint(10_000_000, 604800, 0); + constraintsMaxPeriod[0] = _createMultiGasConstraint(10_000_000, 2_592_000, 0); vm.prank(manager); resourceConstraintManager.setMultiGasPricingConstraints(constraintsMaxPeriod); } @@ -591,13 +591,13 @@ contract ResourceConstraintManagerTest is Test { new ArbMultiGasConstraintsTypes.ResourceConstraint[](3); constraints[0] = _createMultiGasConstraint(10_000_000, 100, 0); // Valid constraints[1] = _createMultiGasConstraint(20_000_000, 200, 0); // Valid - constraints[2] = _createMultiGasConstraint(5_000_000, 100, 0); // Invalid target + constraints[2] = _createMultiGasConstraint(999_999, 100, 0); // Invalid target vm.prank(manager); vm.expectRevert( abi.encodeWithSelector( ResourceConstraintManager.InvalidTarget.selector, - uint64(5_000_000), + uint64(999_999), uint64(100), uint64(0) ) @@ -606,7 +606,7 @@ contract ResourceConstraintManagerTest is Test { // Test with invalid period in middle constraints[0] = _createMultiGasConstraint(10_000_000, 100, 0); // Valid - constraints[1] = _createMultiGasConstraint(20_000_000, 3, 0); // Invalid period + constraints[1] = _createMultiGasConstraint(20_000_000, 0, 0); // Invalid period constraints[2] = _createMultiGasConstraint(30_000_000, 100, 0); // Valid vm.prank(manager); @@ -614,7 +614,7 @@ contract ResourceConstraintManagerTest is Test { abi.encodeWithSelector( ResourceConstraintManager.InvalidPeriod.selector, uint64(20_000_000), - uint64(3), + uint64(0), uint64(0) ) );