Skip to content

Commit ec263b0

Browse files
authored
apollo_storage: add scan_storage_keys_for_contract (#13554)
1 parent f5aa4d7 commit ec263b0

2 files changed

Lines changed: 50 additions & 1 deletion

File tree

crates/apollo_storage/src/state/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,21 @@ impl<'env, Mode: TransactionKind> StateReader<'env, Mode> {
564564
let mut cursor = self.deployed_contracts_table.cursor(self.txn)?;
565565
scan_at_block(&mut cursor, start, end, block_target, limit)
566566
}
567+
568+
/// Returns all storage values for `addr` in the key range [`start_key`, `end`] at
569+
/// `scan_at_block`, up to `limit` entries.
570+
pub fn scan_storage_keys_for_contract(
571+
&self,
572+
addr: ContractAddress,
573+
start: StorageKey,
574+
end: StorageKey,
575+
block_target: BlockNumber,
576+
limit: usize,
577+
) -> StorageResult<Vec<(StorageKey, Felt)>> {
578+
let mut cursor = self.storage_table.cursor(self.txn)?;
579+
let entries = scan_at_block(&mut cursor, (addr, start), (addr, end), block_target, limit)?;
580+
Ok(entries.into_iter().map(|((_, key), value)| (key, value)).collect())
581+
}
567582
}
568583

569584
impl StateStorageWriter for StorageTxn<'_, RW> {

crates/apollo_storage/src/state/state_test.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use starknet_api::block::BlockNumber;
88
use starknet_api::core::{ClassHash, ContractAddress, Nonce};
99
use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass;
1010
use starknet_api::hash::StarkHash;
11-
use starknet_api::state::{SierraContractClass, StateNumber, ThinStateDiff};
11+
use starknet_api::state::{SierraContractClass, StateNumber, StorageKey, ThinStateDiff};
1212
use starknet_api::{class_hash, compiled_class_hash, contract_address, felt, storage_key};
1313
use starknet_types_core::felt::Felt;
1414

@@ -1062,3 +1062,37 @@ scan_cases!(
10621062
);
10631063
}
10641064
);
1065+
1066+
scan_cases!(
1067+
key_macro = storage_key,
1068+
value_macro = felt,
1069+
fn test_scan_storage_keys_for_contract(
1070+
#[case] start: StorageKey,
1071+
#[case] end: StorageKey,
1072+
#[case] synced_block: BlockNumber,
1073+
#[case] limit: usize,
1074+
#[case] expected: Vec<(StorageKey, Felt)>,
1075+
) {
1076+
let addr = contract_address!("0x1");
1077+
let ((reader, mut writer), _temp_dir) = get_test_storage();
1078+
write_two_block_state_diffs(
1079+
&mut writer,
1080+
ThinStateDiff {
1081+
storage_diffs: IndexMap::from([(addr, block_0_entries!())]),
1082+
..Default::default()
1083+
},
1084+
ThinStateDiff {
1085+
storage_diffs: IndexMap::from([(addr, block_1_entries!())]),
1086+
..Default::default()
1087+
},
1088+
);
1089+
let txn = reader.begin_ro_txn().unwrap();
1090+
let state_reader = txn.get_state_reader().unwrap();
1091+
assert_eq!(
1092+
state_reader
1093+
.scan_storage_keys_for_contract(addr, start, end, synced_block, limit)
1094+
.unwrap(),
1095+
expected,
1096+
);
1097+
}
1098+
);

0 commit comments

Comments
 (0)