diff --git a/lib/archethic/oracle_chain/mem_table_loader.ex b/lib/archethic/oracle_chain/mem_table_loader.ex index 4ba33ba1c3..b50dbc4121 100644 --- a/lib/archethic/oracle_chain/mem_table_loader.ex +++ b/lib/archethic/oracle_chain/mem_table_loader.ex @@ -1,6 +1,9 @@ defmodule Archethic.OracleChain.MemTableLoader do @moduledoc false + alias Archethic.Crypto + + alias Archethic.OracleChain alias Archethic.OracleChain.MemTable alias Archethic.TransactionChain @@ -17,15 +20,31 @@ defmodule Archethic.OracleChain.MemTableLoader do end def init(_) do - TransactionChain.list_transactions_by_type(:oracle_summary, [ - :address, - :type, - data: [:content], - validation_stamp: [:timestamp] - ]) - |> Stream.each(&load_transaction(&1, true)) + transactions_stream = + TransactionChain.list_transactions_by_type(:oracle_summary, [ + :address, + :type, + data: [:content], + validation_stamp: [:timestamp] + ]) + + Stream.each(transactions_stream, &load_transaction(&1, true)) |> Stream.run() + # Load last oracle chain from db + case Enum.take(transactions_stream, -1) do + [] -> + :ignore + + [%Transaction{validation_stamp: %ValidationStamp{timestamp: last_summary_timestamp}}] -> + OracleChain.next_summary_date(last_summary_timestamp) + |> Crypto.derive_oracle_address(0) + |> TransactionChain.get_last_address() + |> elem(0) + |> get_chain() + |> Enum.each(&load_transaction(&1, true)) + end + {:ok, []} end @@ -87,4 +106,18 @@ defmodule Archethic.OracleChain.MemTableLoader do end) end) end + + defp get_chain(address, opts \\ [], acc \\ []) do + case TransactionChain.get( + address, + [:address, :type, data: [:content], validation_stamp: [:timestamp]], + opts + ) do + {transactions, false, _paging_state} -> + acc ++ transactions + + {transactions, true, paging_state} -> + get_chain(address, [paging_state: paging_state], acc ++ transactions) + end + end end