Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 83bf821

Browse files
xqftjuanbono
authored andcommitted
Added fee transfer storage update into count_actual_storage_changes() (#960)
* Add utils fns * Implemented fix * Fix some tests * Fix clippy * Fix tests * Fix test --------- Co-authored-by: Juan Bono <juanbono94@gmail.com>
1 parent 517e22a commit 83bf821

File tree

13 files changed

+109
-26
lines changed

13 files changed

+109
-26
lines changed

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ mod test {
298298
let transaction = Transaction::InvokeFunction(invoke_function);
299299

300300
let estimated_fee = estimate_fee(&[transaction], state, &block_context).unwrap();
301-
assert_eq!(estimated_fee[0], (2483, 2448));
301+
assert_eq!(estimated_fee[0], (3707, 3672));
302302
}
303303

304304
#[test]
@@ -1035,7 +1035,7 @@ mod test {
10351035

10361036
assert_eq!(
10371037
estimate_fee(&[deploy, invoke_tx], state, block_context,).unwrap(),
1038-
[(0, 3672), (0, 2448)]
1038+
[(0, 3672), (0, 3672)]
10391039
);
10401040
}
10411041

src/state/cached_state.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use crate::{
66
core::errors::state_errors::StateError,
77
services::api::contract_classes::compiled_class::CompiledClass,
88
state::StateDiff,
9-
utils::{subtract_mappings, to_cache_state_storage_mapping, Address, ClassHash},
9+
utils::{
10+
get_erc20_balance_var_addresses, subtract_mappings, to_cache_state_storage_mapping,
11+
Address, ClassHash,
12+
},
1013
};
1114
use cairo_vm::felt::Felt252;
1215
use getset::{Getters, MutGetters};
@@ -268,8 +271,11 @@ impl<T: StateReader> State for CachedState<T> {
268271
Ok(())
269272
}
270273

271-
fn count_actual_storage_changes(&mut self) -> (usize, usize) {
272-
let storage_updates = subtract_mappings(
274+
fn count_actual_storage_changes(
275+
&mut self,
276+
fee_token_and_sender_address: Option<(&Address, &Address)>,
277+
) -> (usize, usize) {
278+
let mut storage_updates = subtract_mappings(
273279
self.cache.storage_writes.clone(),
274280
self.cache.storage_initial_values.clone(),
275281
);
@@ -301,6 +307,16 @@ impl<T: StateReader> State for CachedState<T> {
301307
modified_contracts.len()
302308
};
303309

310+
// Add fee transfer storage update before actually charging it, as it needs to be included in the
311+
// calculation of the final fee.
312+
if let Some((fee_token_address, sender_address)) = fee_token_and_sender_address {
313+
let (sender_low_key, _) = get_erc20_balance_var_addresses(sender_address).unwrap();
314+
storage_updates.insert(
315+
(fee_token_address.clone(), sender_low_key),
316+
Felt252::default(),
317+
);
318+
}
319+
304320
(n_modified_contracts, storage_updates.len())
305321
}
306322

@@ -705,13 +721,17 @@ mod tests {
705721
((address_two, storage_key_two), Felt252::from(1)),
706722
]);
707723

724+
let fee_token_address = Address(123.into());
725+
let sender_address = Address(321.into());
726+
708727
let expected_changes = {
709-
let n_storage_updates = 3;
728+
let n_storage_updates = 3 + 1; // + 1 fee transfer balance update
710729
let n_modified_contracts = 2;
711730

712731
(n_modified_contracts, n_storage_updates)
713732
};
714-
let changes = cached_state.count_actual_storage_changes();
733+
let changes =
734+
cached_state.count_actual_storage_changes(Some((&fee_token_address, &sender_address)));
715735

716736
assert_eq!(changes, expected_changes);
717737
}

src/state/state_api.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ pub trait State {
5454
fn apply_state_update(&mut self, sate_updates: &StateDiff) -> Result<(), StateError>;
5555

5656
/// Counts the amount of modified contracts and the updates to the storage
57-
fn count_actual_storage_changes(&mut self) -> (usize, usize);
57+
fn count_actual_storage_changes(
58+
&mut self,
59+
fee_token_and_sender_address: Option<(&Address, &Address)>,
60+
) -> (usize, usize);
5861

5962
fn get_class_hash_at(&mut self, contract_address: &Address) -> Result<ClassHash, StateError>;
6063

src/testing/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ mod tests {
584584
.unwrap();
585585
let actual_resources = HashMap::from([
586586
("n_steps".to_string(), 3457),
587-
("l1_gas_usage".to_string(), 2448),
587+
("l1_gas_usage".to_string(), 3672),
588588
("range_check_builtin".to_string(), 80),
589589
("pedersen_builtin".to_string(), 16),
590590
]);

src/transaction/declare.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,10 @@ impl Declare {
168168
} else {
169169
self.run_validate_entrypoint(state, &mut resources_manager, block_context)?
170170
};
171-
let changes = state.count_actual_storage_changes();
171+
let changes = state.count_actual_storage_changes(Some((
172+
&block_context.starknet_os_config.fee_token_address,
173+
&self.sender_address,
174+
)));
172175
let actual_resources = calculate_tx_resources(
173176
resources_manager,
174177
&vec![validate_info.clone()],
@@ -435,7 +438,7 @@ mod tests {
435438

436439
let actual_resources = HashMap::from([
437440
("n_steps".to_string(), 2715),
438-
("l1_gas_usage".to_string(), 1224),
441+
("l1_gas_usage".to_string(), 2448),
439442
("range_check_builtin".to_string(), 63),
440443
("pedersen_builtin".to_string(), 15),
441444
]);

src/transaction/declare_v2.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,10 @@ impl DeclareV2 {
320320
(info, gas)
321321
};
322322

323-
let storage_changes = state.count_actual_storage_changes();
323+
let storage_changes = state.count_actual_storage_changes(Some((
324+
&block_context.starknet_os_config.fee_token_address,
325+
&self.sender_address,
326+
)));
324327
let actual_resources = calculate_tx_resources(
325328
resources_manager,
326329
&[execution_result.call_info.clone()],

src/transaction/deploy.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ impl Deploy {
182182

183183
let resources_manager = ExecutionResourcesManager::default();
184184

185-
let changes = state.count_actual_storage_changes();
185+
let changes = state.count_actual_storage_changes(None);
186186
let actual_resources = calculate_tx_resources(
187187
resources_manager,
188188
&[Some(call_info.clone())],
@@ -245,7 +245,7 @@ impl Deploy {
245245
block_context.validate_max_n_steps,
246246
)?;
247247

248-
let changes = state.count_actual_storage_changes();
248+
let changes = state.count_actual_storage_changes(None);
249249
let actual_resources = calculate_tx_resources(
250250
resources_manager,
251251
&[call_info.clone()],

src/transaction/deploy_account.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,10 @@ impl DeployAccount {
219219
resources_manager,
220220
&[Some(constructor_call_info.clone()), validate_info.clone()],
221221
TransactionType::DeployAccount,
222-
state.count_actual_storage_changes(),
222+
state.count_actual_storage_changes(Some((
223+
&block_context.starknet_os_config.fee_token_address,
224+
&self.contract_address,
225+
))),
223226
None,
224227
0,
225228
)

src/transaction/invoke_function.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,10 @@ impl InvokeFunction {
245245
remaining_gas,
246246
)?
247247
};
248-
let changes = state.count_actual_storage_changes();
248+
let changes = state.count_actual_storage_changes(Some((
249+
&block_context.starknet_os_config.fee_token_address,
250+
&self.contract_address,
251+
)));
249252
let actual_resources = calculate_tx_resources(
250253
resources_manager,
251254
&vec![call_info.clone(), validate_info.clone()],

src/transaction/l1_handler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl L1Handler {
128128
)?
129129
};
130130

131-
let changes = state.count_actual_storage_changes();
131+
let changes = state.count_actual_storage_changes(None);
132132
let actual_resources = calculate_tx_resources(
133133
resources_manager,
134134
&[call_info.clone()],

0 commit comments

Comments
 (0)