Skip to content

Commit 9772aca

Browse files
MarcosNicolauMauroToscanoJuArce
authored
feat: aggregated proofs explorer views (#1856)
Co-authored-by: MauroFab <[email protected]> Co-authored-by: Mauro Toscano <[email protected]> Co-authored-by: JuArce <[email protected]>
1 parent ca2bc86 commit 9772aca

File tree

14 files changed

+623
-126
lines changed

14 files changed

+623
-126
lines changed

explorer/lib/explorer/models/aggregated_proofs.ex

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule AggregatedProofs do
22
require Logger
33
use Ecto.Schema
4+
import Ecto.Query
45
import Ecto.Changeset
56

67
@primary_key {:id, :binary_id, autogenerate: true}
@@ -59,4 +60,30 @@ defmodule AggregatedProofs do
5960
|> Explorer.Repo.update()
6061
end
6162
end
63+
64+
def get_aggregated_proof_by_id(id) do
65+
Explorer.Repo.get_by(AggregatedProofs, id: id)
66+
end
67+
68+
def get_paginated_proofs(%{page: page, page_size: size}) do
69+
query =
70+
from(proof in AggregatedProofs,
71+
order_by: [desc: proof.block_number],
72+
limit: ^size,
73+
offset: ^((page - 1) * size),
74+
select: proof
75+
)
76+
77+
Explorer.Repo.all(query)
78+
end
79+
80+
def get_last_page(page_size) do
81+
total_proofs = Explorer.Repo.aggregate(AggregatedProofs, :count, :id)
82+
last_page = div(total_proofs, page_size)
83+
if rem(total_proofs, page_size) > 0, do: last_page + 1, else: last_page
84+
end
85+
86+
def get_number_of_agg_proofs() do
87+
Explorer.Repo.aggregate(AggregatedProofs, :count, :id)
88+
end
6289
end

explorer/lib/explorer/models/aggregation_mode_proof.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ defmodule AggregationModeProof do
22
require Logger
33
use Ecto.Schema
44
import Ecto.Changeset
5+
import Ecto.Query
56

67
# Different from proofs.ex (we could use the same but the hashes are constructed different)
78
@primary_key {:id, :id, autogenerate: true}
@@ -47,4 +48,14 @@ defmodule AggregationModeProof do
4748
|> Explorer.Repo.update()
4849
end
4950
end
51+
52+
def get_all_proof_hashes(id) do
53+
query =
54+
from(proof in AggregationModeProof,
55+
where: proof.agg_proof_id == ^id,
56+
select: proof.proof_hash
57+
)
58+
59+
Explorer.Repo.all(query)
60+
end
5061
end
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
defmodule ExplorerWeb.AggProofsTable do
2+
use Phoenix.Component
3+
use ExplorerWeb, :live_component
4+
5+
attr(:agg_proofs, :list, required: true)
6+
7+
def agg_proofs_table(assigns) do
8+
~H"""
9+
<.table id="agg_proofs" rows={@proofs}>
10+
<:col :let={proof} label="Merkle root" class="text-left">
11+
<.link navigate={~p"/aggregated_proofs/#{proof.id}"}>
12+
<span class="inline-flex gap-x-3 items-center group-hover:text-foreground/80">
13+
<%= Helpers.shorten_hash(proof.merkle_root, 6) %>
14+
<.right_arrow />
15+
<.tooltip>
16+
<%= proof.merkle_root %>
17+
</.tooltip>
18+
</span>
19+
</.link>
20+
</:col>
21+
<:col :let={proof} label="Age">
22+
<span class="md:px-0" title={proof.age}>
23+
<%= proof.age %>
24+
</span>
25+
</:col>
26+
<:col :let={proof} label="Block Number">
27+
<%= proof.block_number |> Helpers.format_number() %>
28+
</:col>
29+
30+
<:col :let={proof} label="Blob versioned hash" class="text-left">
31+
<.a href={
32+
"#{Helpers.get_blobscan_url()}/blob/#{proof.blob_versioned_hash}"}
33+
class="inline-flex gap-x-3 items-center group-hover:text-foreground/80 no-underline font-normal"
34+
>
35+
<span class="inline-flex gap-x-3 items-center group-hover:text-foreground/80">
36+
<%= Helpers.shorten_hash(proof.blob_versioned_hash, 6) %>
37+
<.tooltip>
38+
<%= proof.blob_versioned_hash %>
39+
</.tooltip>
40+
</span>
41+
</.a>
42+
</:col>
43+
44+
<:col :let={proof} label="Number of proofs">
45+
<%= proof.number_of_proofs |> Helpers.format_number() %>
46+
</:col>
47+
</.table>
48+
"""
49+
end
50+
end

explorer/lib/explorer_web/components/contracts.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ defmodule ContractsComponent do
1111
{:ok,
1212
assign(socket,
1313
contracts: [
14+
%{
15+
contract_name: "AlignedProofAggregationService",
16+
address: addresses["alignedProofAggregationService"]
17+
},
1418
%{
1519
contract_name: "AlignedServiceManager",
1620
address: addresses["alignedLayerServiceManager"]

explorer/lib/explorer_web/components/core_components.ex

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,39 @@ defmodule ExplorerWeb.CoreComponents do
497497
"""
498498
end
499499

500+
@doc """
501+
Renders a dynamic badge component for the batcher.
502+
"""
503+
attr(:class, :string, default: nil)
504+
attr(:status, :integer)
505+
slot(:inner_block, default: nil)
506+
507+
def dynamic_badge_for_agg_proof(assigns) do
508+
~H"""
509+
<.badge
510+
variant={
511+
case @status do
512+
0 -> "accent"
513+
1 -> "destructive"
514+
2 -> "foreground"
515+
end
516+
}
517+
class={
518+
classes([
519+
@class
520+
])
521+
}
522+
>
523+
<%= case @status do
524+
0 -> "Verified"
525+
1 -> "Failed"
526+
2 -> "Missed"
527+
end %>
528+
<%= render_slot(@inner_block) %>
529+
</.badge>
530+
"""
531+
end
532+
500533
@doc """
501534
Renders a selector dropdown on hover component with buttons that trigger actions on click.
502535

explorer/lib/explorer_web/components/footer.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ defmodule FooterComponent do
99
{"General",
1010
[
1111
{"Batches", "/batches"},
12+
{"Aggregation", "/aggregated_proofs"},
1213
{"Operators", "/operators"},
1314
{"Restake", "/restaked"}
1415
]},

0 commit comments

Comments
 (0)