From 2fe5abe17dbfad31a81efc25d405b50466182aa4 Mon Sep 17 00:00:00 2001 From: TucksonDev Date: Wed, 1 Apr 2026 11:40:17 +0100 Subject: [PATCH] ResourceConstraintManager v2: set right boundaries for multi-dimension gas constraints --- src/chain/ResourceConstraintManager.sol | 19 +++++++------ test/foundry/ResourceConstraintManager.t.sol | 30 ++++++++++---------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/chain/ResourceConstraintManager.sol b/src/chain/ResourceConstraintManager.sol index 7afb29d5..2913e139 100644 --- a/src/chain/ResourceConstraintManager.sol +++ b/src/chain/ResourceConstraintManager.sol @@ -13,10 +13,13 @@ 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_GAS_TARGET_PER_SEC = 7_000_000; - uint64 public constant MAX_GAS_TARGET_PER_SEC = 100_000_000; - uint32 public constant MIN_ADJUSTMENT_WINDOW_SECS = 5; - uint32 public constant MAX_ADJUSTMENT_WINDOW_SECS = 86400; + 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 MAX_PRICING_EXPONENT = 8000; // scaled by 1000 to allow for fractional exponents bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); @@ -67,13 +70,13 @@ contract ResourceConstraintManager is AccessControlEnumerable { uint64 adjustmentWindowSecs = constraints[i][1]; uint64 startingBacklogValue = constraints[i][2]; if ( - gasTargetPerSec < MIN_GAS_TARGET_PER_SEC || gasTargetPerSec > MAX_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 > MAX_ADJUSTMENT_WINDOW_SECS + || adjustmentWindowSecs > MAX_SINGLE_DIM_ADJUSTMENT_WINDOW_SECS ) { revert InvalidPeriod(gasTargetPerSec, adjustmentWindowSecs, startingBacklogValue); } @@ -123,12 +126,12 @@ contract ResourceConstraintManager is AccessControlEnumerable { uint64 targetPerSec = constraints[i].targetPerSec; uint32 adjustmentWindowSecs = constraints[i].adjustmentWindowSecs; uint64 startingBacklogValue = constraints[i].backlog; - if (targetPerSec < MIN_GAS_TARGET_PER_SEC || targetPerSec > MAX_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 > MAX_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 0b4055a2..020b4950 100644 --- a/test/foundry/ResourceConstraintManager.t.sol +++ b/test/foundry/ResourceConstraintManager.t.sol @@ -285,7 +285,7 @@ contract ResourceConstraintManagerTest is Test { new ArbMultiGasConstraintsTypes.ResourceConstraint[](3); // Single resource: Computation with weight 1 - multipleConstraints[0] = _createMultiGasConstraint(7_000_000, 5, 0); + multipleConstraints[0] = _createMultiGasConstraint(10_000_000, 5, 0); // Multiple resources: HistoryGrowth (weight 2) + StorageAccessRead (weight 3) ArbMultiGasConstraintsTypes.WeightedResource[] memory resources2 = @@ -331,8 +331,8 @@ contract ResourceConstraintManagerTest is Test { // exponent = backlog * 1 * 1000 / (targetPerSec * adjustmentWindowSecs * 1) = backlog * 1000 / (targetPerSec * adjustmentWindowSecs) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory multipleConstraints = new ArbMultiGasConstraintsTypes.ResourceConstraint[](3); - // 35_000_000 * 1000 / (7_000_000 * 5) = 1000 - multipleConstraints[0] = _createMultiGasConstraint(7_000_000, 5, 35_000_000); + // 50_000_000 * 1000 / (10_000_000 * 5) = 1000 + multipleConstraints[0] = _createMultiGasConstraint(10_000_000, 5, 50_000_000); // 300_000_000_000 * 1000 / (50_000_000 * 1000) = 6000 multipleConstraints[1] = _createMultiGasConstraint(50_000_000, 1000, 300_000_000_000); // 8_640_000_000_000 * 1000 / (100_000_000 * 86400) = 1000 @@ -410,32 +410,32 @@ contract ResourceConstraintManagerTest is Test { } function test_setMultiGasPricingConstraints_invalidTarget() external { - // Test gas target below minimum (6,999,999) + // Test gas target below minimum (9,999,999) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsLowTarget = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsLowTarget[0] = _createMultiGasConstraint(6_999_999, 100, 0); + constraintsLowTarget[0] = _createMultiGasConstraint(9_999_999, 100, 0); vm.prank(manager); vm.expectRevert( abi.encodeWithSelector( ResourceConstraintManager.InvalidTarget.selector, - uint64(6_999_999), + uint64(9_999_999), uint64(100), uint64(0) ) ); resourceConstraintManager.setMultiGasPricingConstraints(constraintsLowTarget); - // Test gas target above maximum (100,000,001) + // Test gas target above maximum (500,000,001) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsHighTarget = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsHighTarget[0] = _createMultiGasConstraint(100_000_001, 100, 0); + constraintsHighTarget[0] = _createMultiGasConstraint(500_000_001, 100, 0); vm.prank(manager); vm.expectRevert( abi.encodeWithSelector( ResourceConstraintManager.InvalidTarget.selector, - uint64(100_000_001), + uint64(500_000_001), uint64(100), uint64(0) ) @@ -445,13 +445,13 @@ contract ResourceConstraintManagerTest is Test { // Test edge cases (exactly at boundaries should succeed) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsMinTarget = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsMinTarget[0] = _createMultiGasConstraint(7_000_000, 100, 0); + constraintsMinTarget[0] = _createMultiGasConstraint(10_000_000, 100, 0); vm.prank(manager); resourceConstraintManager.setMultiGasPricingConstraints(constraintsMinTarget); ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsMaxTarget = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsMaxTarget[0] = _createMultiGasConstraint(100_000_000, 100, 0); + constraintsMaxTarget[0] = _createMultiGasConstraint(500_000_000, 100, 0); vm.prank(manager); resourceConstraintManager.setMultiGasPricingConstraints(constraintsMaxTarget); } @@ -473,17 +473,17 @@ contract ResourceConstraintManagerTest is Test { ); resourceConstraintManager.setMultiGasPricingConstraints(constraintsLowPeriod); - // Test adjustment window above maximum (86401 seconds) + // Test adjustment window above maximum (604801 seconds) ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsHighPeriod = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsHighPeriod[0] = _createMultiGasConstraint(10_000_000, 86401, 0); + constraintsHighPeriod[0] = _createMultiGasConstraint(10_000_000, 604801, 0); vm.prank(manager); vm.expectRevert( abi.encodeWithSelector( ResourceConstraintManager.InvalidPeriod.selector, uint64(10_000_000), - uint64(86401), + uint64(604801), uint64(0) ) ); @@ -498,7 +498,7 @@ contract ResourceConstraintManagerTest is Test { ArbMultiGasConstraintsTypes.ResourceConstraint[] memory constraintsMaxPeriod = new ArbMultiGasConstraintsTypes.ResourceConstraint[](1); - constraintsMaxPeriod[0] = _createMultiGasConstraint(10_000_000, 86400, 0); + constraintsMaxPeriod[0] = _createMultiGasConstraint(10_000_000, 604800, 0); vm.prank(manager); resourceConstraintManager.setMultiGasPricingConstraints(constraintsMaxPeriod); }