Skip to content

Commit 2be49b2

Browse files
committed
feat(spec-specs): CREATE failure refunds account state gas to reservoir
1 parent cef0fde commit 2be49b2

1 file changed

Lines changed: 15 additions & 2 deletions

File tree

  • src/ethereum/forks/amsterdam/vm/instructions

src/ethereum/forks/amsterdam/vm/instructions/system.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,15 @@ def generic_create(
8686
if memory_size > U256(MAX_INIT_CODE_SIZE):
8787
raise OutOfGasError
8888

89-
# Charge state gas for account creation after initcode validation
89+
# Charge state gas for account creation (pay-before-execute).
90+
# Refunded to the reservoir on any failure path below.
9091
cost_per_state_byte = state_gas_per_byte(
9192
evm.message.block_env.block_gas_limit
9293
)
93-
charge_state_gas(evm, STATE_BYTES_PER_NEW_ACCOUNT * cost_per_state_byte)
94+
create_account_state_gas = (
95+
STATE_BYTES_PER_NEW_ACCOUNT * cost_per_state_byte
96+
)
97+
charge_state_gas(evm, create_account_state_gas)
9498

9599
tx_state = evm.message.tx_env.state
96100

@@ -117,6 +121,9 @@ def generic_create(
117121
):
118122
evm.gas_left += create_message_gas
119123
evm.state_gas_left += create_message_state_gas_reservoir
124+
# No account created — refund state gas to reservoir.
125+
evm.state_gas_left += create_account_state_gas
126+
evm.state_gas_used -= create_account_state_gas
120127
push(evm.stack, U256(0))
121128
return
122129

@@ -128,6 +135,9 @@ def generic_create(
128135
increment_nonce(tx_state, evm.message.current_target)
129136
evm.regular_gas_used += create_message_gas
130137
evm.state_gas_left += create_message_state_gas_reservoir
138+
# Address collision — no account created, refund state gas.
139+
evm.state_gas_left += create_account_state_gas
140+
evm.state_gas_used -= create_account_state_gas
131141
push(evm.stack, U256(0))
132142
return
133143

@@ -157,6 +167,9 @@ def generic_create(
157167

158168
if child_evm.error:
159169
incorporate_child_on_error(evm, child_evm)
170+
# No account created, refund parent's CREATE state gas.
171+
evm.state_gas_left += create_account_state_gas
172+
evm.state_gas_used -= create_account_state_gas
160173
evm.return_data = child_evm.output
161174
push(evm.stack, U256(0))
162175
else:

0 commit comments

Comments
 (0)