Skip to content

Commit d944734

Browse files
authored
fix(explorer): do not use @firstblock to fetch logs from Ethereum (#2112)
1 parent b3dc01d commit d944734

File tree

6 files changed

+79
-62
lines changed

6 files changed

+79
-62
lines changed

explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex

Lines changed: 68 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,6 @@ defmodule AlignedLayerServiceManager do
3636
|> Map.get("addresses")
3737
|> Map.get("alignedLayerServiceManager")
3838

39-
@first_block (case @environment do
40-
"devnet" -> 0
41-
"holesky" -> 1_728_056
42-
"mainnet" -> 19_000_000
43-
"sepolia" -> 9_062_616
44-
"hoodi" -> 1_093_860
45-
_ -> raise("Invalid environment")
46-
end)
47-
4839
use Ethers.Contract,
4940
abi_file: "lib/abi/AlignedLayerServiceManager.json",
5041
default_address: @aligned_layer_service_manager_address
@@ -55,35 +46,45 @@ defmodule AlignedLayerServiceManager do
5546

5647
def get_latest_block_number() do
5748
{:ok, num} = Ethers.current_block_number()
49+
Logger.info("Latest block number: #{num}")
5850
num
5951
end
6052

6153
def get_new_batch_events(%{fromBlock: fromBlock, toBlock: toBlock}) do
54+
Logger.info("Fetching new batch events from #{fromBlock} to #{toBlock}")
6255
events =
6356
AlignedLayerServiceManager.EventFilters.new_batch_v3(nil)
6457
|> Ethers.get_logs(fromBlock: fromBlock, toBlock: toBlock)
6558

6659
case events do
6760
{:ok, []} ->
61+
Logger.info("No new batch events found in blocks #{fromBlock}-#{toBlock}")
6862
[]
6963

7064
{:ok, list} ->
65+
Logger.info("Found #{length(list)} new batch events in blocks #{fromBlock}-#{toBlock}")
7166
Enum.map(list, &extract_new_batch_event_info/1)
7267

7368
{:error, reason} ->
69+
Logger.error("Error fetching new batch events from #{fromBlock} to #{toBlock}: #{Map.get(reason, "message")}")
7470
raise("Error fetching events: #{Map.get(reason, "message")}")
7571
end
7672
end
7773

7874
def extract_new_batch_event_info(event) do
75+
block_number = event |> Map.get(:block_number)
76+
tx_hash = event |> Map.get(:transaction_hash)
77+
Logger.info("Extracting new batch event info for block #{block_number}, tx: #{tx_hash}")
78+
7979
new_batch = parse_new_batch_event(event)
80+
Logger.info("New batch event parsed: #{inspect(new_batch)}")
8081

8182
{:ok,
8283
%NewBatchInfo{
8384
address: event |> Map.get(:address),
84-
block_number: event |> Map.get(:block_number),
85-
block_timestamp: get_block_timestamp(event |> Map.get(:block_number)),
86-
transaction_hash: event |> Map.get(:transaction_hash),
85+
block_number: block_number,
86+
block_timestamp: get_block_timestamp(block_number),
87+
transaction_hash: tx_hash,
8788
new_batch: new_batch
8889
}}
8990
end
@@ -101,29 +102,37 @@ defmodule AlignedLayerServiceManager do
101102
}
102103
end
103104

104-
def is_batch_responded(merkle_root) do
105+
def is_batch_responded(merkle_root, fromBlock) do
105106
event =
106107
Utils.string_to_bytes32(merkle_root)
107108
|> AlignedLayerServiceManager.EventFilters.batch_verified()
108-
|> Ethers.get_logs(fromBlock: @first_block)
109+
|> Ethers.get_logs(fromBlock: fromBlock)
109110

110111
case event do
111-
{:error, reason} -> {:error, reason}
112-
{_, []} -> false
113-
{:ok, _} -> true
112+
{:error, reason} ->
113+
Logger.error("Error checking batch response for #{merkle_root}: #{inspect(reason)}")
114+
{:error, reason}
115+
{_, []} ->
116+
false
117+
{:ok, _events} ->
118+
true
114119
end
115120
end
116121

117122
# for new batches
118123
def extract_batch_response({_status, %NewBatchInfo{} = batch_creation}) do
119124
created_batch = batch_creation.new_batch
120-
was_batch_responded = is_batch_responded(created_batch.batchMerkleRoot)
125+
was_batch_responded = is_batch_responded(created_batch.batchMerkleRoot, batch_creation.block_number)
121126

122127
batch_response =
123128
case was_batch_responded do
124-
true -> fetch_batch_response(created_batch.batchMerkleRoot)
129+
true ->
130+
Logger.info("Batch #{created_batch.batchMerkleRoot} was responded, fetching response details")
131+
fetch_batch_response(created_batch.batchMerkleRoot, batch_creation.block_number)
125132
# was not verified, fill with nils
126-
false -> %{block_number: nil, transaction_hash: nil, block_timestamp: nil}
133+
false ->
134+
Logger.info("Batch #{created_batch.batchMerkleRoot} was not responded yet")
135+
%{block_number: nil, transaction_hash: nil, block_timestamp: nil}
127136
end
128137

129138
%BatchDB{
@@ -138,7 +147,7 @@ defmodule AlignedLayerServiceManager do
138147
response_timestamp: batch_response.block_timestamp,
139148
amount_of_proofs: nil,
140149
proof_hashes: nil,
141-
fee_per_proof: BatcherPaymentServiceManager.get_fee_per_proof(%{merkle_root: created_batch.batchMerkleRoot}),
150+
fee_per_proof: BatcherPaymentServiceManager.get_fee_per_proof(%{merkle_root: created_batch.batchMerkleRoot, fromBlock: batch_creation.block_number}),
142151
sender_address: Utils.string_to_bytes32(created_batch.senderAddress),
143152
max_aggregator_fee: created_batch.maxAggregatorFee,
144153
is_valid: true # set to false later if a process determines it is invalid
@@ -147,15 +156,17 @@ defmodule AlignedLayerServiceManager do
147156

148157
# for existing but unverified batches
149158
def extract_batch_response(%Batches{} = unverified_batch) do
150-
was_batch_responded = is_batch_responded(unverified_batch.merkle_root)
159+
was_batch_responded = is_batch_responded(unverified_batch.merkle_root, unverified_batch.submission_block_number)
151160

152161
case was_batch_responded do
153162
# Do nothing since unverified batch was not yet verified
154163
false ->
164+
Logger.info("Unverified batch #{unverified_batch.merkle_root} still not responded")
155165
nil
156166

157167
true ->
158-
batch_response = fetch_batch_response(unverified_batch.merkle_root)
168+
Logger.info("Unverified batch #{unverified_batch.merkle_root} now responded, updating status")
169+
batch_response = fetch_batch_response(unverified_batch.merkle_root, unverified_batch.submission_block_number)
159170

160171
%BatchDB{
161172
merkle_root: unverified_batch.merkle_root,
@@ -177,45 +188,59 @@ defmodule AlignedLayerServiceManager do
177188
end
178189
end
179190

180-
def fetch_batch_response(merkle_root) do
181-
case get_batch_verified_events(%{merkle_root: merkle_root}) do
182-
{:ok, batch_verified_info} -> batch_verified_info
183-
{:empty, _} -> nil
184-
{:error, error} -> raise("Error fetching batch response: #{error}")
191+
def fetch_batch_response(merkle_root, fromBlock) do
192+
case get_batch_verified_events(%{merkle_root: merkle_root, fromBlock: fromBlock}) do
193+
{:ok, batch_verified_info} ->
194+
Logger.info("Successfully fetched batch response for #{merkle_root}")
195+
batch_verified_info
196+
{:empty, _} ->
197+
Logger.info("No batch verified events found for #{merkle_root}")
198+
nil
199+
{:error, error} ->
200+
Logger.error("Error fetching batch response for #{merkle_root}: #{error}")
201+
raise("Error fetching batch response: #{error}")
185202
end
186203
end
187204

188-
def get_batch_verified_events(%{merkle_root: merkle_root}) do
205+
def get_batch_verified_events(%{merkle_root: merkle_root, fromBlock: fromBlock}) do
189206
event =
190207
AlignedLayerServiceManager.EventFilters.batch_verified(Utils.string_to_bytes32(merkle_root))
191-
|> Ethers.get_logs(fromBlock: @first_block)
208+
|> Ethers.get_logs(fromBlock: fromBlock)
192209

193210
case event do
194-
{:error, reason} -> {:error, reason}
195-
{_, []} -> {:empty, "No task found"}
196-
{:ok, event} -> extract_batch_verified_event_info(event |> List.first())
211+
{:error, reason} ->
212+
Logger.error("Error getting batch verified events for #{merkle_root}: #{inspect(reason)}")
213+
{:error, reason}
214+
{_, []} ->
215+
Logger.info("No batch verified events found for #{merkle_root}")
216+
{:empty, "No task found"}
217+
{:ok, events} ->
218+
Logger.info("Found #{length(events)} batch verified events for #{merkle_root}")
219+
extract_batch_verified_event_info(events |> List.first())
197220
end
198221
end
199222

200223
defp extract_batch_verified_event_info(event) do
201-
batch_merkle_root = event |> Map.get(:topics_raw) |> Enum.at(1)
202-
sender_address = event |> Map.get(:data) |> Enum.at(0)
224+
block_number = event |> Map.get(:block_number)
203225

204226
{:ok,
205227
%BatchVerifiedInfo{
206228
address: event |> Map.get(:address),
207-
block_number: event |> Map.get(:block_number),
208-
block_timestamp: get_block_timestamp(event |> Map.get(:block_number)),
229+
block_number: block_number,
230+
block_timestamp: get_block_timestamp(block_number),
209231
transaction_hash: event |> Map.get(:transaction_hash),
210-
batch_merkle_root: batch_merkle_root,
211-
sender_address: sender_address
232+
batch_merkle_root: event |> Map.get(:topics_raw) |> Enum.at(1),
233+
sender_address: event |> Map.get(:data) |> Enum.at(0)
212234
}}
213235
end
214236

215237
def get_block_timestamp(block_number) do
216238
case Ethers.Utils.get_block_timestamp(block_number) do
217-
{:ok, timestamp} -> DateTime.from_unix!(timestamp)
218-
{:error, error} -> raise("Error fetching block timestamp: #{error}")
239+
{:ok, timestamp} ->
240+
DateTime.from_unix!(timestamp)
241+
{:error, error} ->
242+
Logger.error("Error fetching block timestamp for block #{block_number}: #{error}")
243+
raise("Error fetching block timestamp: #{error}")
219244
end
220245
end
221246

@@ -230,8 +255,10 @@ defmodule AlignedLayerServiceManager do
230255
end
231256

232257
def update_restakeable_strategies() do
258+
Logger.info("Updating restakeable strategies")
233259
case AlignedLayerServiceManager.get_restakeable_strategies() |> Ethers.call() do
234260
{:ok, restakeable_strategies} ->
261+
Logger.info("Successfully fetched #{length(restakeable_strategies)} restakeable strategies")
235262
Strategies.update(restakeable_strategies)
236263

237264
{:error, error} ->

explorer/lib/explorer/contract_managers/batcher_payment_service_manager.ex

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,6 @@ defmodule BatcherPaymentServiceManager do
33

44
@aligned_config_file System.get_env("ALIGNED_CONFIG_FILE")
55

6-
@environment System.get_env("ENVIRONMENT")
7-
@first_block (case @environment do
8-
"devnet" -> 0
9-
"holesky" -> 1_728_056
10-
"mainnet" -> 19_000_000
11-
"sepolia" -> 9_062_616
12-
"hoodi" -> 1_093_860
13-
_ -> raise("Invalid environment")
14-
end)
15-
166
config_file_path =
177
case @aligned_config_file do
188
nil -> raise("ALIGNED_CONFIG_FILE not set in .env")
@@ -43,12 +33,12 @@ defmodule BatcherPaymentServiceManager do
4333
@batcher_payment_service_address
4434
end
4535

46-
def get_fee_per_proof(%{merkle_root: merkle_root}) do
36+
def get_fee_per_proof(%{merkle_root: merkle_root, fromBlock: fromBlock}) do
4737
BatcherPaymentServiceManager.EventFilters.task_created(
4838
merkle_root
4939
|> Utils.string_to_bytes32()
5040
)
51-
|> Ethers.get_logs(fromBlock: @first_block)
41+
|> Ethers.get_logs(fromBlock: fromBlock)
5242
|> case do
5343
{:ok, []} ->
5444
Logger.warning("No fee per proof events found for merkle root: #{merkle_root}.")
@@ -57,7 +47,7 @@ defmodule BatcherPaymentServiceManager do
5747
{:ok, events} ->
5848
event = events |> hd()
5949
fee_per_proof = event.data |> hd()
60-
Logger.debug("Fee per proof of #{merkle_root}: #{fee_per_proof} WEI.")
50+
Logger.info("Fee per proof of #{merkle_root}: #{fee_per_proof} WEI.")
6151

6252
fee_per_proof
6353

explorer/lib/explorer_web/components/agg_proofs_table.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ defmodule ExplorerWeb.AggProofsTable do
66

77
def agg_proofs_table(assigns) do
88
~H"""
9-
<.table id="agg_proofs" rows={@proofs}>
9+
<.table id="agg_proofs" rows={@agg_proofs}>
1010
<:col :let={proof} label="Merkle root" class="text-left">
1111
<.link navigate={~p"/aggregated_proofs/#{proof.id}"}>
1212
<span class="inline-flex gap-x-3 items-center group-hover:text-foreground/80">

explorer/lib/explorer_web/components/nav.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ defmodule NavComponent do
199199
@doc """
200200
Renders a dropdown on hover component with links.
201201
"""
202-
attr(:title, :list, doc: "the selector title")
202+
attr(:title, :string, doc: "the selector title")
203203
attr(:class, :list, doc: "class for selector")
204-
attr(:links, :string, doc: "the links to render: (name, link, class)")
204+
attr(:links, :list, doc: "the links to render: (name, link, class)")
205205

206206
def nav_links_dropdown(assigns) do
207207
~H"""

explorer/lib/explorer_web/live/pages/agg_proofs/index.html.heex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<.card_preheding>Aggregation</.card_preheding>
33
<%= if @proofs != :empty and @proofs != [] do %>
44
<.card_background class="w-full overflow-x-auto sm:col-span-2">
5-
<.agg_proofs_table proofs={@proofs} />
5+
<.agg_proofs_table agg_proofs={@proofs} />
66
</.card_background>
77
<% else %>
88
<.empty_card_background text="No aggregated proofs To Display." class="sm:col-span-2" />

explorer/lib/explorer_web/live/utils.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,19 +191,19 @@ defmodule ExplorerWeb.Helpers do
191191
end
192192

193193
def get_aligned_contracts_addresses() do
194-
Map.merge(get_batcher_service_addresses(), get_proof_aggregation_addresses())
194+
Map.merge(get_verification_layer_addresses(), get_proof_aggregation_addresses())
195195
end
196196

197197
defp get_proof_aggregation_addresses() do
198198
proof_agg_config_file = System.get_env("ALIGNED_PROOF_AGG_CONFIG_FILE")
199199
{_, config_json_string} = File.read(proof_agg_config_file)
200-
proof_agg_service_addresses = Jason.decode!(config_json_string) |> Map.get("addresses")
200+
Jason.decode!(config_json_string) |> Map.get("addresses")
201201
end
202202

203-
defp get_batcher_service_addresses() do
203+
defp get_verification_layer_addresses() do
204204
aligned_config_file = System.get_env("ALIGNED_CONFIG_FILE")
205205
{_, config_json_string} = File.read(aligned_config_file)
206-
agg_service_addresses = Jason.decode!(config_json_string) |> Map.get("addresses")
206+
Jason.decode!(config_json_string) |> Map.get("addresses")
207207
end
208208

209209
def binary_to_hex_string(binary) do

0 commit comments

Comments
 (0)