Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions src/chain/ResourceConstraintManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
32 changes: 16 additions & 16 deletions test/foundry/ResourceConstraintManager.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
Expand All @@ -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);

Expand All @@ -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)
)
);
Expand All @@ -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);
}
Expand All @@ -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)
)
Expand All @@ -606,15 +606,15 @@ 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);
vm.expectRevert(
abi.encodeWithSelector(
ResourceConstraintManager.InvalidPeriod.selector,
uint64(20_000_000),
uint64(3),
uint64(0),
uint64(0)
)
);
Expand Down
Loading