diff --git a/etherlink/CHANGES_NODE.md b/etherlink/CHANGES_NODE.md index c5b6e4354d2dfd6e5b2c648f7d3ac81909f82dba..587d58cbfd968b39529e7a99b7b6d49368a14357 100644 --- a/etherlink/CHANGES_NODE.md +++ b/etherlink/CHANGES_NODE.md @@ -11,7 +11,7 @@ ### Internals - Use a single RPC (if the rollup node supports it) when fetching EVM events. - (!15629) + (!15629, !15703) - Private RPC `produceBlock` can produce a block without delayed transactions, useful for testing purposes. (!15681) diff --git a/etherlink/bin_node/lib_dev/evm_events_follower.ml b/etherlink/bin_node/lib_dev/evm_events_follower.ml index bce185c26e83b93aee274fe765089ce9654fd350..d829be2ba735582b66050ca9290829db7593b26d 100644 --- a/etherlink/bin_node/lib_dev/evm_events_follower.ml +++ b/etherlink/bin_node/lib_dev/evm_events_follower.ml @@ -148,16 +148,26 @@ let fetch_events_at_once |> List.filter_map (fun (_, e) -> if filter_event e then Some e else None) |> return -let fetch_events state rollup_block_lvl = - let open Lwt_result_syntax in - let*! res = - protect @@ fun () -> fetch_events_at_once state rollup_block_lvl - in - match res with - | Ok events -> return events - | Error _ -> - let*! () = Evm_events_follower_events.fallback () in - fetch_events_one_by_one state rollup_block_lvl +let fetch_events = + let always_fallback = ref false in + fun state rollup_block_lvl -> + let open Lwt_result_syntax in + if !always_fallback then fetch_events_one_by_one state rollup_block_lvl + else + let*! res = + protect @@ fun () -> fetch_events_at_once state rollup_block_lvl + in + match res with + | Ok events -> return events + | Error e -> + (match e with + | Tezos_rpc.Context.Not_found _ :: _ -> + (* 404, Rollup node is too old to support fetching all at + once. Always fallback in the future. *) + always_fallback := true + | _ -> ()) ; + let*! () = Evm_events_follower_events.fallback () in + fetch_events_one_by_one state rollup_block_lvl let on_new_head state rollup_block_lvl = let open Lwt_result_syntax in