@@ -107,6 +107,31 @@ pub fn message_l1_from_output_iter<It: Iterator<Item = Felt>>(
107107 Ok ( MessageToL1 { from_address, to_address, payload } )
108108}
109109
110+ /// Parses messages to L1 from an output iterator.
111+ /// Reads the segment size, parses all messages, and verifies the segment is fully consumed.
112+ pub fn parse_messages_to_l1 < It : Iterator < Item = Felt > > (
113+ iter : & mut It ,
114+ ) -> Result < Vec < MessageToL1 > , OsOutputError > {
115+ let mut messages_to_l1_segment_size: usize =
116+ wrap_missing_as ( iter. next ( ) , "messages_to_l1_segment_size" ) ?;
117+ let mut messages_to_l1_iter = iter. take ( messages_to_l1_segment_size) . peekable ( ) ;
118+ let mut messages_to_l1 = Vec :: new ( ) ;
119+
120+ while messages_to_l1_iter. peek ( ) . is_some ( ) {
121+ let message = message_l1_from_output_iter ( & mut messages_to_l1_iter) ?;
122+ messages_to_l1_segment_size -= message. payload . 0 . len ( ) + MESSAGE_TO_L1_CONST_FIELD_SIZE ;
123+ messages_to_l1. push ( message) ;
124+ }
125+
126+ assert_eq ! (
127+ messages_to_l1_segment_size, 0 ,
128+ "Expected messages to L1 segment to be consumed, but {messages_to_l1_segment_size} felts \
129+ were left."
130+ ) ;
131+
132+ Ok ( messages_to_l1)
133+ }
134+
110135// TODO(Tzahi): Replace with starknet_api struct after it is updated.
111136#[ cfg_attr( feature = "deserialize" , derive( serde:: Deserialize , serde:: Serialize ) ) ]
112137#[ cfg_attr( feature = "testing" , derive( Clone , PartialEq ) ) ]
@@ -225,21 +250,7 @@ impl TryFromOutputIter for OutputIterParsedData {
225250 } ;
226251
227252 // Messages to L1 and L2.
228- let mut messages_to_l1_segment_size =
229- wrap_missing_as ( output_iter. next ( ) , "messages_to_l1_segment_size" ) ?;
230- let mut messages_to_l1_iter = output_iter. take ( messages_to_l1_segment_size) . peekable ( ) ;
231- let mut messages_to_l1 = Vec :: < MessageToL1 > :: new ( ) ;
232-
233- while messages_to_l1_iter. peek ( ) . is_some ( ) {
234- let message = message_l1_from_output_iter ( & mut messages_to_l1_iter) ?;
235- messages_to_l1_segment_size -= message. payload . 0 . len ( ) + MESSAGE_TO_L1_CONST_FIELD_SIZE ;
236- messages_to_l1. push ( message) ;
237- }
238- assert_eq ! (
239- messages_to_l1_segment_size, 0 ,
240- "Expected messages to L1 segment to be consumed, but {messages_to_l1_segment_size} \
241- felts were left.",
242- ) ;
253+ let messages_to_l1 = parse_messages_to_l1 ( output_iter) ?;
243254
244255 let mut messages_to_l2_segment_size =
245256 wrap_missing_as ( output_iter. next ( ) , "messages_to_l2_segment_size" ) ?;
0 commit comments