@@ -73,11 +73,13 @@ export function createPreconfirmedBlockStream(opts: PreconfirmedBlockStreamOptio
7373
7474 let preconfirmedTransactionLogs : { [ txHash : string ] : Partial < StoreEventsLog > [ ] | undefined } = { } ;
7575 let preconfirmedLogsState : "initializing" | "initialized" | "waiting" = "waiting" ;
76+ let firstPreconfirmedBlockNumber : bigint | undefined = undefined ;
7677 let attempt = 0 ;
7778 const preconfirmedBlockLogs$ = recreatePreconfirmedStream$ . pipe (
7879 tap ( ( ) => {
7980 if ( attempt !== 0 ) debug ( `waiting ${ attempt * 500 } ms before initializing preconfirmed logs stream` ) ;
8081 preconfirmedLogsState = "initializing" ;
82+ firstPreconfirmedBlockNumber = undefined ;
8183 preconfirmedTransactionLogs = { } ;
8284 } ) ,
8385 switchMap ( ( ) => timer ( attempt * 500 ) ) ,
@@ -114,6 +116,10 @@ export function createPreconfirmedBlockStream(opts: PreconfirmedBlockStreamOptio
114116 return ! isProcessedBlock ;
115117 } ) ,
116118 tap ( ( block ) => {
119+ if ( preconfirmedLogsState !== "initialized" ) {
120+ firstPreconfirmedBlockNumber = block . blockNumber ;
121+ debug ( "first preconfirmed block number" , firstPreconfirmedBlockNumber ) ;
122+ }
117123 debug ( "preconfirmed block" , block . blockNumber , "with" , block . logs . length , "logs" ) ;
118124 preconfirmedLogsState = "initialized" ;
119125 attempt = 0 ;
@@ -125,6 +131,16 @@ export function createPreconfirmedBlockStream(opts: PreconfirmedBlockStreamOptio
125131 }
126132 ( preconfirmedTransactionLogs [ txHash ] ??= [ ] ) . push ( log ) ;
127133 } ) ;
134+ debug (
135+ "preconfirmed logs state" ,
136+ Object . fromEntries (
137+ Object . entries ( preconfirmedTransactionLogs ) . map ( ( [ txHash , logs ] ) => [
138+ txHash ,
139+ { numLogs : logs ?. length , blockNumber : logs ?. [ 0 ] ?. blockNumber } ,
140+ ] ) ,
141+ ) ,
142+ "transactions" ,
143+ ) ;
128144 } ) ,
129145 ) ;
130146
@@ -133,7 +149,12 @@ export function createPreconfirmedBlockStream(opts: PreconfirmedBlockStreamOptio
133149 processedLatestBlockNumber = block . blockNumber ;
134150
135151 const mismatchingTransactions : string [ ] = [ ] ;
136- if ( preconfirmedLogsState === "initialized" ) {
152+ const confirmPreconfirmedLogs =
153+ preconfirmedLogsState === "initialized" &&
154+ firstPreconfirmedBlockNumber &&
155+ block . blockNumber >= firstPreconfirmedBlockNumber ;
156+
157+ if ( confirmPreconfirmedLogs ) {
137158 const logsByTransaction = groupBy (
138159 block . logs . filter ( ( log ) => log . transactionHash ) as StoreEventsLog [ ] ,
139160 ( log ) => log . transactionHash ,
@@ -148,7 +169,7 @@ export function createPreconfirmedBlockStream(opts: PreconfirmedBlockStreamOptio
148169 JSON . stringify (
149170 {
150171 txHash,
151- numPreconfirmedLogs : preconfirmedLogs ?. length ,
172+ numPreconfirmedLogs : preconfirmedLogs ?. length ?? "none" ,
152173 numLatestLogs : latestLogs . length ,
153174 missingLogs : latestLogs . filter (
154175 ( log ) => ! preconfirmedLogs ?. find ( ( preconfirmedLog ) => log . logIndex === preconfirmedLog . logIndex ) ,
@@ -190,14 +211,14 @@ export function createPreconfirmedBlockStream(opts: PreconfirmedBlockStreamOptio
190211 }
191212
192213 // While the preconfirmed logs stream is initializing, don't recreate it and pass the block through
193- if ( preconfirmedLogsState === "initializing" ) {
194- debug ( "preconfirmed logs stream is initializing , not recreating" ) ;
214+ if ( ! confirmPreconfirmedLogs ) {
215+ debug ( "block is before first preconfirmed block , not recreating preconfirmed stream " ) ;
195216 return block ;
196217 }
197218
198219 // If the preconfirmed logs stream is initialized but there are mismatching logs, recreate it and pass the block through.
199220 // Pass all logs from this block, not just the mismatching ones, to make sure they appear in the right order.
200- if ( preconfirmedLogsState === "initialized" && mismatchingTransactions . length > 0 ) {
221+ if ( mismatchingTransactions . length > 0 ) {
201222 debug ( "mismatching transactions found in latest block" , block . blockNumber , "recreating preconfirmed stream" ) ;
202223 recreatePreconfirmedStream$ . next ( ) ;
203224 return block ;
0 commit comments