From 9f146d933838d4057ca887af24b1c0c44f77b4b3 Mon Sep 17 00:00:00 2001
From: Barnabas Busa
Date: Fri, 14 Aug 2026 13:01:19 +0200
Subject: [PATCH 1/2] feat(gas-profiler): update Glamsterdam preset to frozen
devnet-8 repricing
---
.../gas-profiler/SimulatePage.types.ts | 54 ++++++------
.../GlamsterdamPresetModal.tsx | 84 +++++++++----------
2 files changed, 69 insertions(+), 69 deletions(-)
diff --git a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts
index 5cedabc38..ed436d85d 100644
--- a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts
+++ b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts
@@ -320,41 +320,41 @@ export const GAS_PARAMETER_GROUPS: GasParameterGroup[] = [
/**
* Glamsterdam (EIP-8007) gas schedule preset.
- * Applies all gas parameter changes proposed for the Glamsterdam fork.
+ * Values match the frozen glamsterdam-devnet-8 repricing (ACDT #90).
*
- * EIP-7904: Compute repricing (opcodes + precompiles)
+ * EIP-2780: Intrinsic transaction gas decomposition
* EIP-7976: Calldata floor cost increase
- * EIP-2780: Transaction base cost reduction
- * EIP-8038: State access repricing (TBD - using current values as placeholders)
+ * EIP-7981: Access list data cost (folded into per-entry costs)
+ * EIP-8037: State creation gas (state-gas dimension folded into execution gas)
+ * EIP-8038: State access repricing
+ *
+ * EIP-7904 (compute repricing) is now Informational and recommends no changes,
+ * so the preset no longer overrides compute opcodes or precompiles.
*/
export const GLAMSTERDAM_PRESET: Record = {
- // EIP-7904: Compute repricing
- DIV: 15,
- SDIV: 20,
- MOD: 12,
- MULMOD: 11,
- KECCAK256: 45,
- PC_BLAKE2F_BASE: 170,
- PC_BLAKE2F_PER_ROUND: 2,
- PC_BLS12_G1ADD: 643,
- PC_BLS12_G2ADD: 765,
- PC_BN254_ADD: 314,
- PC_BN254_PAIRING_PER_PAIR: 34103,
- PC_KZG_POINT_EVALUATION: 89363,
+ // EIP-2780: TX_BASE_COST; create tx intrinsic = TX_BASE_COST + CREATE_ACCESS (EIP-8038)
+ TX_BASE: 12000,
+ TX_CREATE_BASE: 24000,
// EIP-7976: Calldata floor
- TX_FLOOR_PER_TOKEN: 15,
+ TX_FLOOR_PER_TOKEN: 16,
+
+ // EIP-8038: State access repricing
+ CALL_COLD: 3000, // COLD_ACCOUNT_ACCESS
+ SSTORE_RESET: 12100, // SLOAD_COLD 2,100 + STORAGE_WRITE 10,000
+ CALL_VALUE_XFER: 11300, // CALL_VALUE = ACCOUNT_WRITE 9,000 + CALL_STIPEND 2,300
- // EIP-2780: TX base cost
- TX_BASE: 4500,
+ // EIP-8038 per-entry cost + EIP-7981 data cost (64 gas/byte)
+ TX_ACCESS_LIST_ADDR: 4180, // 2,900 + 1,280
+ TX_ACCESS_LIST_KEY: 4048, // 2,000 + 2,048
- // EIP-8038: State access repricing (TBD - current values)
- SLOAD_COLD: 2100,
- SLOAD_WARM: 100,
- SSTORE_RESET: 2900,
- CALL_COLD: 2600,
- TX_ACCESS_LIST_ADDR: 2400,
- TX_ACCESS_LIST_KEY: 1900,
+ // EIP-8037: State creation gas (CPSB = 1,530 per state byte)
+ SSTORE_SET: 97920, // GAS_STORAGE_SET = 64 * CPSB
+ CALL_NEW_ACCOUNT: 183600, // GAS_NEW_ACCOUNT = 120 * CPSB
+ CREATE: 195600, // GAS_CREATE 183,600 + CREATE_ACCESS 12,000
+ CREATE2: 195600,
+ CREATE_DATA: 1530, // GAS_CODE_DEPOSIT per byte
+ TX_AUTH_COST: 35190, // PER_AUTH_BASE_COST = 23 * CPSB
};
/**
diff --git a/src/pages/ethereum/execution/gas-profiler/components/GlamsterdamPresetModal/GlamsterdamPresetModal.tsx b/src/pages/ethereum/execution/gas-profiler/components/GlamsterdamPresetModal/GlamsterdamPresetModal.tsx
index be4cbdd6a..0cd556d2a 100644
--- a/src/pages/ethereum/execution/gas-profiler/components/GlamsterdamPresetModal/GlamsterdamPresetModal.tsx
+++ b/src/pages/ethereum/execution/gas-profiler/components/GlamsterdamPresetModal/GlamsterdamPresetModal.tsx
@@ -34,24 +34,16 @@ interface UnsupportedEip {
/** EIP sections with overridable parameters */
const EIP_SECTIONS: EipSection[] = [
{
- eip: 'EIP-7904',
- name: 'Compute Repricing',
- description: 'Adjusts gas costs for compute-heavy opcodes and precompiles to better reflect actual resource usage.',
- url: 'https://eips.ethereum.org/EIPS/eip-7904',
+ eip: 'EIP-2780',
+ name: 'Intrinsic Transaction Gas',
+ description:
+ 'Decomposes the flat 21,000 intrinsic cost into TX_BASE_COST (12,000) plus per-resource primitives; contract-creation intrinsic becomes TX_BASE_COST + CREATE_ACCESS (24,000).',
+ url: 'https://eips.ethereum.org/EIPS/eip-2780',
parameters: [
- { key: 'DIV', label: 'DIV' },
- { key: 'SDIV', label: 'SDIV' },
- { key: 'MOD', label: 'MOD' },
- { key: 'MULMOD', label: 'MULMOD' },
- { key: 'KECCAK256', label: 'KECCAK256' },
- { key: 'PC_BLAKE2F_BASE', label: 'BLAKE2F Base' },
- { key: 'PC_BLAKE2F_PER_ROUND', label: 'BLAKE2F /Round' },
- { key: 'PC_BLS12_G1ADD', label: 'BLS12 G1Add' },
- { key: 'PC_BLS12_G2ADD', label: 'BLS12 G2Add' },
- { key: 'PC_BN254_ADD', label: 'BN254 Add' },
- { key: 'PC_BN254_PAIRING_PER_PAIR', label: 'BN254 Pairing /Pair' },
- { key: 'PC_KZG_POINT_EVALUATION', label: 'KZG Point Eval' },
+ { key: 'TX_BASE', label: 'TX Base' },
+ { key: 'TX_CREATE_BASE', label: 'TX Create Base' },
],
+ note: 'The decomposition itself (COLD_ACCOUNT_ACCESS and TX_VALUE_COST charged per transaction shape) cannot be expressed as overrides, so plain ETH transfers simulate at 12,000 instead of the decomposed 21,000.',
},
{
eip: 'EIP-7976',
@@ -59,50 +51,56 @@ const EIP_SECTIONS: EipSection[] = [
description: 'Increases the calldata floor cost per token, discouraging using calldata for data availability.',
url: 'https://eips.ethereum.org/EIPS/eip-7976',
parameters: [{ key: 'TX_FLOOR_PER_TOKEN', label: 'Floor Per Token' }],
- },
- {
- eip: 'EIP-2780',
- name: 'Transaction Repricing',
- description:
- 'Reprices transaction costs: reduces the base cost from 21,000 to 4,500, and restructures value transfer and cold account access pricing.',
- url: 'https://eips.ethereum.org/EIPS/eip-2780',
- parameters: [{ key: 'TX_BASE', label: 'TX Base' }],
- note: 'This EIP also introduces structural changes (new account surcharge, cold account cost splitting by code presence, value transfer repricing) that cannot be simulated as parameter overrides.',
+ note: 'The EIP also re-weights zero bytes to 4 tokens (64/64 per byte); token weights cannot be overridden, so zero bytes floor at 16 per byte here.',
},
{
eip: 'EIP-8038',
name: 'State Access Repricing',
description:
- 'Reprices state access opcodes (SLOAD, SSTORE, CALL cold/warm). Values are still under discussion and may change.',
+ 'Reprices state access: COLD_ACCOUNT_ACCESS 3,000, STORAGE_WRITE 10,000, CALL_VALUE 11,300, access list entries. Frozen for glamsterdam-devnet-8 (ACDT #90).',
url: 'https://eips.ethereum.org/EIPS/eip-8038',
- placeholder: true,
parameters: [
- { key: 'SLOAD_COLD', label: 'SLOAD Cold' },
- { key: 'SLOAD_WARM', label: 'SLOAD Warm' },
+ { key: 'CALL_COLD', label: 'Cold Account Access' },
{ key: 'SSTORE_RESET', label: 'SSTORE Reset' },
- { key: 'CALL_COLD', label: 'CALL Cold' },
+ { key: 'CALL_VALUE_XFER', label: 'Call Value' },
{ key: 'TX_ACCESS_LIST_ADDR', label: 'Access List Addr' },
{ key: 'TX_ACCESS_LIST_KEY', label: 'Access List Key' },
],
- note: 'SSTORE clear refund and EXTCODESIZE/EXTCODECOPY formula changes in this EIP cannot be simulated as parameter overrides.',
+ note: 'SSTORE Reset is SLOAD_COLD 2,100 + STORAGE_WRITE 10,000. Access list entries include EIP-7981 data cost (1,280 per address, 2,048 per key). The raised storage-clear refund and the EXTCODESIZE/EXTCODECOPY extra warm read cannot be simulated as overrides.',
+ },
+ {
+ eip: 'EIP-8037',
+ name: 'State Creation Gas',
+ description:
+ 'Prices state creation at a fixed 1,530 gas per state byte (CPSB): new account 183,600, storage set 97,920, code deposit 1,530 per byte, EIP-7702 auth 35,190.',
+ url: 'https://eips.ethereum.org/EIPS/eip-8037',
+ parameters: [
+ { key: 'SSTORE_SET', label: 'SSTORE Set' },
+ { key: 'CALL_NEW_ACCOUNT', label: 'New Account' },
+ { key: 'CREATE', label: 'CREATE' },
+ { key: 'CREATE2', label: 'CREATE2' },
+ { key: 'CREATE_DATA', label: 'Code Deposit /Byte' },
+ { key: 'TX_AUTH_COST', label: '7702 Auth' },
+ ],
+ note: 'The EIP meters these in a separate state-gas dimension with source-based refunds; the simulation folds them into execution gas, so blocks near the limit overestimate slightly.',
},
];
/** EIPs that involve structural changes and cannot be simulated via parameter overrides */
const UNSUPPORTED_EIPS: UnsupportedEip[] = [
{
- eip: 'EIP-8037',
- name: 'State Growth Costs',
+ eip: 'EIP-7904',
+ name: 'Compute Gas Cost Analysis',
reason:
- 'Introduces new gas costs for account/storage creation that require protocol-level changes, not just parameter adjustments.',
- url: 'https://eips.ethereum.org/EIPS/eip-8037',
+ 'Now Informational: with EIP-7928 optimizations, compute opcodes and precompiles meet the throughput target at current costs, so no compute repricing is applied.',
+ url: 'https://eips.ethereum.org/EIPS/eip-7904',
},
{
- eip: 'EIP-7981',
- name: 'Access List Data Gas',
+ eip: 'EIP-7778',
+ name: 'Block Gas Accounting without Refunds',
reason:
- 'Adds a new intrinsic gas mechanism for access list data that cannot be expressed as a simple price override.',
- url: 'https://eips.ethereum.org/EIPS/eip-7981',
+ 'Excludes gas refunds from block-level gas accounting, a structural change that cannot be expressed as a price override.',
+ url: 'https://eips.ethereum.org/EIPS/eip-7778',
},
];
@@ -218,11 +216,13 @@ export function GlamsterdamPresetModal({
EIP-8007 (Glamsterdam)
- , the upcoming Ethereum execution layer upgrade. It bundles compute repricing, calldata floor increases, and
- transaction base cost reductions into a single preset you can simulate against real blocks.
+ , the upcoming Ethereum execution layer upgrade. It bundles state access and state creation repricing,
+ calldata floor increases, and the intrinsic transaction gas decomposition into a single preset you can
+ simulate against real blocks.
- Values below are pre-filled with the proposed changes. You can adjust any parameter before simulating.
+ Values below are pre-filled with the frozen glamsterdam-devnet-8 repricing. You can adjust any parameter
+ before simulating.
From beaf6e72696a0c17e45103b417a5169c41e574c5 Mon Sep 17 00:00:00 2001
From: Barnabas Busa
Date: Fri, 14 Aug 2026 13:17:22 +0200
Subject: [PATCH 2/2] fix(gas-profiler): keep sliders usable with preset values
above their static ranges
- widen static GAS_PARAMETER_GROUPS ranges (SSTORE_SET/SSTORE_RESET/CALL_NEW_ACCOUNT/CREATE/CREATE2) to cover the devnet-8 preset values
- GasScheduleDrawer: widen derived slider max to the current value so an applied preset doesn't render clamped and snap down on first drag
- correct stale SSTORE_RESET interface comment (backend default is the legacy EIP-2200 5,000; write surcharge = SSTORE_RESET - SLOAD_COLD)
---
.../gas-profiler/SimulatePage.types.ts | 12 +++++-----
.../GasScheduleDrawer/GasScheduleDrawer.tsx | 22 +++++++++++--------
2 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts
index ed436d85d..f8b433520 100644
--- a/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts
+++ b/src/pages/ethereum/execution/gas-profiler/SimulatePage.types.ts
@@ -23,7 +23,7 @@ export interface GasSchedule {
// Storage - SSTORE (Istanbul+: EIP-2200 net metered)
SSTORE_SET?: number; // Istanbul+: 20000
- SSTORE_RESET?: number; // Istanbul+: 2900
+ SSTORE_RESET?: number; // Istanbul+: 5000 (legacy EIP-2200 value; backend charges SSTORE_RESET - SLOAD_COLD as the write surcharge)
// Calls - access costs (pre-Berlin: single CALL_BASE, post-Berlin: cold/warm)
CALL_BASE?: number; // pre-Berlin: varies by fork
@@ -123,8 +123,8 @@ export const GAS_PARAMETER_GROUPS: GasParameterGroup[] = [
// Post-Berlin (EIP-2929): cold/warm access costs
{ key: 'SLOAD_COLD', label: 'SLOAD Cold', min: 0, max: 10000, step: 100 },
{ key: 'SLOAD_WARM', label: 'SLOAD Warm', min: 0, max: 1000, step: 10 },
- { key: 'SSTORE_SET', label: 'SSTORE Set', min: 0, max: 50000, step: 1000 },
- { key: 'SSTORE_RESET', label: 'SSTORE Reset', min: 0, max: 10000, step: 100 },
+ { key: 'SSTORE_SET', label: 'SSTORE Set', min: 0, max: 150000, step: 1000 },
+ { key: 'SSTORE_RESET', label: 'SSTORE Reset', min: 0, max: 25000, step: 100 },
],
},
{
@@ -145,9 +145,9 @@ export const GAS_PARAMETER_GROUPS: GasParameterGroup[] = [
{ key: 'CALL_COLD', label: 'CALL Cold', min: 0, max: 10000, step: 100 },
{ key: 'CALL_WARM', label: 'CALL Warm', min: 0, max: 1000, step: 10 },
{ key: 'CALL_VALUE_XFER', label: 'Value Transfer', min: 0, max: 20000, step: 500 },
- { key: 'CALL_NEW_ACCOUNT', label: 'New Account', min: 0, max: 50000, step: 1000 },
- { key: 'CREATE', label: 'CREATE', min: 0, max: 100000, step: 1000 },
- { key: 'CREATE2', label: 'CREATE2', min: 0, max: 100000, step: 1000 },
+ { key: 'CALL_NEW_ACCOUNT', label: 'New Account', min: 0, max: 300000, step: 1000 },
+ { key: 'CREATE', label: 'CREATE', min: 0, max: 300000, step: 1000 },
+ { key: 'CREATE2', label: 'CREATE2', min: 0, max: 300000, step: 1000 },
{ key: 'SELFDESTRUCT', label: 'SELFDESTRUCT', min: 0, max: 10000, step: 100 },
],
},
diff --git a/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/GasScheduleDrawer.tsx b/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/GasScheduleDrawer.tsx
index b2053c823..393d6a483 100644
--- a/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/GasScheduleDrawer.tsx
+++ b/src/pages/ethereum/execution/gas-profiler/components/GasScheduleDrawer/GasScheduleDrawer.tsx
@@ -59,25 +59,29 @@ interface CategoryGroup {
}
/**
- * Derive slider constraints from default value
+ * Derive slider constraints from the default value, widening the range to keep
+ * the current value (e.g. an applied preset) within the slider scale
*/
-function getSliderConstraints(defaultValue: number): { min: number; max: number; step: number } {
+function getSliderConstraints(
+ defaultValue: number,
+ currentValue: number = defaultValue
+): { min: number; max: number; step: number } {
if (defaultValue === 0) {
- return { min: 0, max: 100, step: 1 };
+ return { min: 0, max: Math.max(100, currentValue), step: 1 };
}
if (defaultValue <= 10) {
- return { min: 0, max: Math.max(50, defaultValue * 5), step: 1 };
+ return { min: 0, max: Math.max(50, defaultValue * 5, currentValue), step: 1 };
}
if (defaultValue <= 100) {
- return { min: 0, max: Math.max(500, defaultValue * 5), step: 10 };
+ return { min: 0, max: Math.max(500, defaultValue * 5, currentValue), step: 10 };
}
if (defaultValue <= 1000) {
- return { min: 0, max: Math.max(5000, defaultValue * 5), step: 50 };
+ return { min: 0, max: Math.max(5000, defaultValue * 5, currentValue), step: 50 };
}
if (defaultValue <= 10000) {
- return { min: 0, max: Math.max(50000, defaultValue * 5), step: 100 };
+ return { min: 0, max: Math.max(50000, defaultValue * 5, currentValue), step: 100 };
}
- return { min: 0, max: defaultValue * 5, step: 1000 };
+ return { min: 0, max: Math.max(defaultValue * 5, currentValue), step: 1000 };
}
/**
@@ -462,7 +466,7 @@ export function GasScheduleDrawer({
if (!param) return null;
const currentValue = schedule[key] ?? param.value;
const isModified = schedule[key] !== undefined && schedule[key] !== param.value;
- const { min, max, step } = getSliderConstraints(param.value);
+ const { min, max, step } = getSliderConstraints(param.value, currentValue);
return (