Skip to content

Commit caaeb3c

Browse files
committed
apollo_l1_provider: make sure wrong event types do not get scraped
1 parent 6363378 commit caaeb3c

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

crates/apollo_l1_provider/tests/flow_test_event_filters.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,33 @@ async fn all_event_types_must_be_filtered_and_parsed() {
132132
}
133133
}
134134

135+
#[tokio::test]
136+
async fn cannot_parse_log_message_to_l1() {
137+
// Setup.
138+
// Make a mock L1
139+
let asserter = Asserter::new();
140+
let provider = ProviderBuilder::new().connect_mocked_client(asserter.clone());
141+
142+
let mut base_layer = EthereumBaseLayerContract::new_with_provider(
143+
EthereumBaseLayerConfig::default(),
144+
provider.root().clone(),
145+
);
146+
147+
// We can just return the same block all the time, it will only affect the timestamps.
148+
let dummy_block: Block<B256, Header> = dummy_block();
149+
150+
// This log is for LogMessageToL1 event.
151+
let expected_message_to_l1_log =
152+
encode_log_message_to_l1_log(&[U256::from(15), U256::from(202)]);
153+
asserter.push_success(&vec![expected_message_to_l1_log.clone()]);
154+
// asserter.push_success(&Vec::<Log>::new());
155+
asserter.push_success(&dummy_block);
156+
157+
let result = base_layer.events(0..=1, event_identifiers_to_track()).await;
158+
159+
assert!(result.is_err(), "expected error");
160+
}
161+
135162
fn dummy_block<T>() -> Block<T, Header> {
136163
Block {
137164
header: Header {
@@ -246,3 +273,48 @@ fn encode_message_into_log(
246273
removed: false,
247274
}
248275
}
276+
277+
// Generate a LogMessageToL1 log (which we do not filter on).
278+
fn encode_log_message_to_l1_log(payload: &[U256]) -> Log {
279+
let selector = "LogMessageToL1(address,uint256[],uint256,uint256)";
280+
let block_number = 1;
281+
let starknet_address = DEFAULT_ANVIL_L1_ACCOUNT_ADDRESS.to_bigint().to_str_radix(16);
282+
let starknet_address = format!("{:0>64}", starknet_address);
283+
284+
let offset = U256::from(32u64);
285+
286+
let mut encoded = Vec::new();
287+
// Offset to the array data (96 bytes).
288+
encoded.extend_from_slice(&offset.to_be_bytes::<32>());
289+
290+
// Tail section has the payload array data only. It starts with the length of the array.
291+
let array_len = U256::from(payload.len());
292+
encoded.extend_from_slice(&array_len.to_be_bytes::<32>());
293+
// Finally, write the array elements.
294+
for item in payload {
295+
encoded.extend_from_slice(&item.to_be_bytes::<32>());
296+
}
297+
298+
let log_data = Bytes::from(encoded);
299+
300+
Log {
301+
inner: LogInner {
302+
address: DEFAULT_ANVIL_L1_DEPLOYED_ADDRESS.parse().unwrap(),
303+
data: LogData::new_unchecked(
304+
vec![
305+
filter_to_hash(selector).parse().unwrap(),
306+
starknet_address.parse().unwrap(),
307+
U256::from(L1_CONTRACT_ADDRESS).into(),
308+
],
309+
log_data,
310+
),
311+
},
312+
block_hash: Some(BlockHash::from_str(FAKE_HASH).unwrap()),
313+
block_number: Some(block_number),
314+
block_timestamp: None,
315+
transaction_hash: Some(TxHash::from_str(FAKE_HASH).unwrap()),
316+
transaction_index: Some(block_number + 1),
317+
log_index: Some(block_number + 2),
318+
removed: false,
319+
}
320+
}

crates/papyrus_base_layer/src/eth_events.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub fn parse_event(log: Log, block_timestamp: BlockTimestamp) -> EthereumBaseLay
2424
let log = log.inner;
2525

2626
let event = Starknet::StarknetEvents::decode_log(&log)?.data;
27+
2728
match event {
2829
Starknet::StarknetEvents::LogMessageToL2(event) => {
2930
let fee = Fee(event.fee.try_into().map_err(EthereumBaseLayerError::FeeOutOfRange)?);

crates/papyrus_base_layer/src/ethereum_base_layer_contract.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,13 @@ impl BaseLayerContract for EthereumBaseLayerContract {
161161
.select(block_range.clone())
162162
.events(event_types_to_filter)
163163
.address(immutable_self.config.starknet_contract_address);
164+
164165
let matching_logs = tokio::time::timeout(
165166
immutable_self.config.timeout_millis,
166167
immutable_self.contract.provider().get_logs(&filter),
167168
)
168169
.await??;
170+
169171
// Debugging.
170172
let hashes: Vec<_> = matching_logs.iter().filter_map(|log| log.transaction_hash).collect();
171173
debug!("Got events in {:?}, L1 tx hashes: {:?}", block_range, hashes);

0 commit comments

Comments
 (0)