From 2a026d803674e94e162811c95a4f5788b4512635 Mon Sep 17 00:00:00 2001 From: Samuel Date: Wed, 3 Aug 2022 10:51:28 +0200 Subject: [PATCH] Fix loading of inputs of burn address on restart --- lib/archethic/account/mem_tables_loader.ex | 16 ++++++--- .../account/mem_tables_loader_test.exs | 36 +++++++++++++++++-- test/archethic/account_test.exs | 32 ++++++++++++++--- 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/lib/archethic/account/mem_tables_loader.ex b/lib/archethic/account/mem_tables_loader.ex index 663e086af..32d894d48 100644 --- a/lib/archethic/account/mem_tables_loader.ex +++ b/lib/archethic/account/mem_tables_loader.ex @@ -8,6 +8,10 @@ defmodule Archethic.Account.MemTablesLoader do alias Archethic.Crypto + alias Archethic.Election + + alias Archethic.P2P + alias Archethic.TransactionChain alias Archethic.TransactionChain.Transaction alias Archethic.TransactionChain.Transaction.ValidationStamp @@ -17,6 +21,8 @@ defmodule Archethic.Account.MemTablesLoader do alias Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperations.UnspentOutput + alias Archethic.Utils + require Logger alias Archethic.Reward @@ -27,14 +33,12 @@ defmodule Archethic.Account.MemTablesLoader do :previous_public_key, validation_stamp: [ :timestamp, - ledger_operations: [:unspent_outputs, :transaction_movements] + ledger_operations: [:fee, :unspent_outputs, :transaction_movements] ] ] @excluded_types [ :node, - :beacon, - :beacon_summary, :oracle, :oracle_summary, :node_shared_secrets, @@ -80,7 +84,11 @@ defmodule Archethic.Account.MemTablesLoader do :ok = set_transaction_movements(address, transaction_movements, timestamp, tx_type) :ok = set_unspent_outputs(address, unspent_outputs, timestamp) - if fee > 0 do + burn_storage_nodes = + Election.storage_nodes(LedgerOperations.burning_address(), P2P.authorized_nodes(timestamp)) + + if Utils.key_in_node_list?(burn_storage_nodes, Crypto.first_node_public_key()) and + fee > 0 do UCOLedger.add_unspent_output( LedgerOperations.burning_address(), %UnspentOutput{from: address, amount: fee, type: :UCO}, diff --git a/test/archethic/account/mem_tables_loader_test.exs b/test/archethic/account/mem_tables_loader_test.exs index 8cfb05ab4..6889c49ea 100644 --- a/test/archethic/account/mem_tables_loader_test.exs +++ b/test/archethic/account/mem_tables_loader_test.exs @@ -6,6 +6,8 @@ defmodule Archethic.Account.MemTablesLoaderTest do alias Archethic.Account.MemTables.UCOLedger alias Archethic.Account.MemTablesLoader + alias Archethic.Crypto + alias Archethic.P2P alias Archethic.P2P.Node @@ -29,9 +31,21 @@ defmodule Archethic.Account.MemTablesLoaderTest do MockDB |> stub(:list_transactions_by_type, fn :mint_rewards, [:address, :type] -> [ - %Transaction{address: "@RewardToken0", type: :mint_rewards}, - %Transaction{address: "@RewardToken1", type: :mint_rewards}, - %Transaction{address: "@RewardToken2", type: :mint_rewards} + %Transaction{ + address: "@RewardToken0", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + }, + %Transaction{ + address: "@RewardToken1", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + }, + %Transaction{ + address: "@RewardToken2", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + } ] end) @@ -52,6 +66,17 @@ defmodule Archethic.Account.MemTablesLoaderTest do describe "load_transaction/1" do test "should distribute unspent outputs" do + P2P.add_and_connect_node(%Node{ + ip: {127, 0, 0, 1}, + port: 3000, + first_public_key: Crypto.first_node_public_key(), + last_public_key: Crypto.first_node_public_key(), + authorized?: true, + authorization_date: DateTime.utc_now() |> DateTime.add(-1000), + available?: true, + geo_patch: "AAA" + }) + assert :ok = MemTablesLoader.load_transaction(create_transaction()) [ @@ -62,6 +87,9 @@ defmodule Archethic.Account.MemTablesLoaderTest do [%UnspentOutput{from: "@Charlie3", amount: 3_400_000_000}] = UCOLedger.get_unspent_outputs("@Tom4") + [%UnspentOutput{from: "@Charlie3", amount: 100_000_000}] = + UCOLedger.get_unspent_outputs(LedgerOperations.burning_address()) + assert [ %UnspentOutput{ from: "@Charlie3", @@ -108,6 +136,7 @@ defmodule Archethic.Account.MemTablesLoaderTest do validation_stamp: %ValidationStamp{ timestamp: DateTime.utc_now(), ledger_operations: %LedgerOperations{ + fee: 100_000_000, transaction_movements: [ %TransactionMovement{to: "@Tom4", amount: 3_400_000_000, type: :UCO}, %TransactionMovement{ @@ -180,6 +209,7 @@ defmodule Archethic.Account.MemTablesLoaderTest do validation_stamp: %ValidationStamp{ timestamp: DateTime.utc_now(), ledger_operations: %LedgerOperations{ + fee: 0, transaction_movements: [ %TransactionMovement{to: "@Tom4", amount: 3_400_000_000, type: :UCO}, %TransactionMovement{ diff --git a/test/archethic/account_test.exs b/test/archethic/account_test.exs index a33b49144..fc457923f 100644 --- a/test/archethic/account_test.exs +++ b/test/archethic/account_test.exs @@ -6,6 +6,8 @@ defmodule Archethic.AccountTest do alias Archethic.Account.MemTables.TokenLedger alias Archethic.Account.MemTables.UCOLedger + alias Archethic.TransactionChain.Transaction.ValidationStamp + alias Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperations alias Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperations.UnspentOutput alias Archethic.TransactionChain.Transaction @@ -19,11 +21,31 @@ defmodule Archethic.AccountTest do setup do expect(MockDB, :list_transactions_by_type, fn _, _ -> [ - %Transaction{address: "@RewardToken0", type: :mint_rewards}, - %Transaction{address: "@RewardToken1", type: :mint_rewards}, - %Transaction{address: "@RewardToken2", type: :mint_rewards}, - %Transaction{address: "@RewardToken3", type: :mint_rewards}, - %Transaction{address: "@RewardToken4", type: :mint_rewards} + %Transaction{ + address: "@RewardToken0", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + }, + %Transaction{ + address: "@RewardToken1", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + }, + %Transaction{ + address: "@RewardToken2", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + }, + %Transaction{ + address: "@RewardToken3", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + }, + %Transaction{ + address: "@RewardToken4", + type: :mint_rewards, + validation_stamp: %ValidationStamp{ledger_operations: %LedgerOperations{fee: 0}} + } ] end)