@@ -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+
135162fn 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+ }
0 commit comments