From acaf93da03cafc0bba0b3fc48de7f4b986fc95be Mon Sep 17 00:00:00 2001 From: Samuel Date: Thu, 2 Jun 2022 12:12:27 +0200 Subject: [PATCH] Write transaction to specific genesis address --- lib/archethic/db.ex | 2 ++ lib/archethic/db/embedded_impl.ex | 9 +++++++++ lib/archethic/transaction_chain.ex | 14 ++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/lib/archethic/db.ex b/lib/archethic/db.ex index a40133d35..b7cc745bf 100644 --- a/lib/archethic/db.ex +++ b/lib/archethic/db.ex @@ -16,7 +16,9 @@ defmodule Archethic.DB do opts :: [paging_state: nil | binary(), after: DateTime.t()] ) :: Enumerable.t() @callback write_transaction(Transaction.t()) :: :ok + @callback write_transaction_at(Transaction.t(), binary()) :: :ok @callback write_transaction_chain(Enumerable.t()) :: :ok + @callback write_transaction(Transaction.t()) :: :ok @callback list_transactions(fields :: list()) :: Enumerable.t() @callback add_last_transaction_address(binary(), binary(), DateTime.t()) :: :ok @callback list_last_transaction_addresses() :: Enumerable.t() diff --git a/lib/archethic/db/embedded_impl.ex b/lib/archethic/db/embedded_impl.ex index 5ababc507..c080ff15e 100644 --- a/lib/archethic/db/embedded_impl.ex +++ b/lib/archethic/db/embedded_impl.ex @@ -78,6 +78,15 @@ defmodule Archethic.DB.EmbeddedImpl do end end + @doc """ + Write a transaction if a specific genesis address + """ + @spec write_transaction_at(Transaction.t(), binary()) :: :ok + def write_transaction_at(tx = %Transaction{}, genesis_address) + when is_binary(genesis_address) do + ChainWriter.append_transaction(genesis_address, tx) + end + @doc """ Determine if the transaction exists or not """ diff --git a/lib/archethic/transaction_chain.ex b/lib/archethic/transaction_chain.ex index be3ec0669..485cee276 100644 --- a/lib/archethic/transaction_chain.ex +++ b/lib/archethic/transaction_chain.ex @@ -126,6 +126,20 @@ defmodule Archethic.TransactionChain do ) end + @doc """ + Write the transaction in a specific genesis address + """ + @spec writer_transaction_at(Transaction.t(), binary()) :: :ok + def write_transaction_at(tx = %Transaction{address: address, type: type}, genesis_address) do + DB.write_transaction_at(tx, genesis_address) + KOLedger.remove_transaction(address) + + Logger.info("Transaction stored", + transaction_address: Base.encode16(address), + transaction_type: type + ) + end + @doc """ Persist a new transaction chain """