diff --git a/lib/archethic/beacon_chain/summary.ex b/lib/archethic/beacon_chain/summary.ex index 493f738a2e..49321278f8 100644 --- a/lib/archethic/beacon_chain/summary.ex +++ b/lib/archethic/beacon_chain/summary.ex @@ -226,11 +226,7 @@ defmodule Archethic.BeaconChain.Summary do transaction_attestations = slots |> Stream.flat_map(& &1.transaction_attestations) - |> Stream.uniq_by(fn %ReplicationAttestation{ - transaction_summary: %TransactionSummary{address: address} - } -> - address - end) + |> reduce_confirmations() |> Enum.sort_by( fn %ReplicationAttestation{ transaction_summary: %TransactionSummary{timestamp: timestamp} @@ -243,6 +239,32 @@ defmodule Archethic.BeaconChain.Summary do %{summary | transaction_attestations: transaction_attestations} end + defp reduce_confirmations(transaction_attestations) do + transaction_attestations + |> Stream.transform( + # start function, init acc + fn -> %{} end, + # reducer function, return empty enum, accumulate replication attestation by address in acc + fn attestation = %ReplicationAttestation{ + transaction_summary: %TransactionSummary{address: address}, + confirmations: confirmations + }, + acc -> + # Accumulate distinct confirmations in a replication attestation + acc = + Map.update(acc, address, attestation, fn reduced_attest -> + Map.update!(reduced_attest, :confirmations, &((&1 ++ confirmations) |> Enum.uniq())) + end) + + {[], acc} + end, + # last function, return acc in the enumeration + fn acc -> {Map.values(acc), acc} end, + # after function, do nothing + fn _ -> :ok end + ) + end + defp filter_reached_threshold( summary = %__MODULE__{summary_time: summary_time, transaction_attestations: attestations} ) do