Skip to content

Commit a5b9ca8

Browse files
committed
fix: replace simple arithmetic operations with saturating_* analogs for gas calculations
1 parent 0938565 commit a5b9ca8

1 file changed

Lines changed: 53 additions & 13 deletions

File tree

evm/src/gasometer/mod.rs

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,9 @@ impl<'config> Gasometer<'config> {
354354
// According to EIP-2028: non-zero byte = 16, zero-byte = 4
355355
// According to EIP-7623: tokens_in_calldata = zero_bytes_in_calldata + nonzero_bytes_in_calldata * 4
356356
let tokens_in_calldata = (zero_data_len + non_zero_data_len * 4) as u64;
357-
tokens_in_calldata * config.total_cost_floor_per_token + config.gas_floor_base_cost
357+
tokens_in_calldata
358+
.saturating_mul(config.total_cost_floor_per_token)
359+
.saturating_add(config.gas_floor_base_cost)
358360
} else {
359361
0
360362
}
@@ -369,12 +371,33 @@ impl<'config> Gasometer<'config> {
369371
authorization_list_len,
370372
} => {
371373
#[deny(clippy::let_and_return)]
372-
let cost = config.gas_transaction_call
373-
+ zero_data_len as u64 * config.gas_transaction_zero_data
374-
+ non_zero_data_len as u64 * config.gas_transaction_non_zero_data
375-
+ access_list_address_len as u64 * config.gas_access_list_address
376-
+ access_list_storage_len as u64 * config.gas_access_list_storage_key
377-
+ authorization_list_len as u64 * config.gas_per_empty_account_cost;
374+
let cost = config
375+
.gas_transaction_call
376+
.saturating_add(
377+
config
378+
.gas_transaction_zero_data
379+
.saturating_mul(zero_data_len as u64),
380+
)
381+
.saturating_add(
382+
config
383+
.gas_transaction_non_zero_data
384+
.saturating_mul(non_zero_data_len as u64),
385+
)
386+
.saturating_add(
387+
config
388+
.gas_access_list_address
389+
.saturating_mul(access_list_address_len as u64),
390+
)
391+
.saturating_add(
392+
config
393+
.gas_access_list_storage_key
394+
.saturating_mul(access_list_storage_len as u64),
395+
)
396+
.saturating_add(
397+
config
398+
.gas_per_empty_account_cost
399+
.saturating_mul(authorization_list_len as u64),
400+
);
378401
let floor_gas = floor_gas_calc(config, zero_data_len, non_zero_data_len);
379402

380403
(cost, floor_gas)
@@ -386,14 +409,31 @@ impl<'config> Gasometer<'config> {
386409
access_list_storage_len,
387410
initcode_cost,
388411
} => {
389-
let mut cost = config.gas_transaction_create
390-
+ zero_data_len as u64 * config.gas_transaction_zero_data
391-
+ non_zero_data_len as u64 * config.gas_transaction_non_zero_data
392-
+ access_list_address_len as u64 * config.gas_access_list_address
393-
+ access_list_storage_len as u64 * config.gas_access_list_storage_key;
412+
let mut cost = config
413+
.gas_transaction_create
414+
.saturating_add(
415+
config
416+
.gas_transaction_zero_data
417+
.saturating_mul(zero_data_len as u64),
418+
)
419+
.saturating_add(
420+
config
421+
.gas_transaction_non_zero_data
422+
.saturating_mul(non_zero_data_len as u64),
423+
)
424+
.saturating_add(
425+
config
426+
.gas_access_list_address
427+
.saturating_mul(access_list_address_len as u64),
428+
)
429+
.saturating_add(
430+
config
431+
.gas_access_list_storage_key
432+
.saturating_mul(access_list_storage_len as u64),
433+
);
394434

395435
if config.max_initcode_size.is_some() {
396-
cost += initcode_cost;
436+
cost = cost.saturating_add(initcode_cost);
397437
}
398438

399439
let floor_gas = floor_gas_calc(config, zero_data_len, non_zero_data_len);

0 commit comments

Comments
 (0)