Skip to content

Commit

Permalink
resolved_addresses is now a map
Browse files Browse the repository at this point in the history
  • Loading branch information
bchamagne authored and Neylix committed Dec 20, 2023
1 parent f320550 commit c16b71f
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 49 deletions.
10 changes: 6 additions & 4 deletions lib/archethic/mining/validation_context.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ defmodule Archethic.Mining.ValidationContext do
:validation_stamp,
:validation_time,
:contract_context,
resolved_addresses: [],
resolved_addresses: %{},
unspent_outputs: [],
cross_validation_stamps: [],
cross_validation_nodes_confirmation: <<>>,
Expand Down Expand Up @@ -76,7 +76,7 @@ defmodule Archethic.Mining.ValidationContext do
transaction: Transaction.t(),
previous_transaction: nil | Transaction.t(),
unspent_outputs: list(UnspentOutput.t()),
resolved_addresses: list({original_address :: binary(), resolved_address :: binary()}),
resolved_addresses: %{Crypto.prepended_hash() => Crypto.prepended_hash()},
welcome_node: Node.t(),
coordinator_node: Node.t(),
cross_validation_nodes: list(Node.t()),
Expand Down Expand Up @@ -1434,7 +1434,9 @@ defmodule Archethic.Mining.ValidationContext do
end

defp get_resolved_address_for_address(resolved_addresses, address) do
{_to, resolved} = Enum.find(resolved_addresses, fn {to, _resolved} -> to == address end)
resolved
Enum.find_value(resolved_addresses, fn
{^address, resolved} -> resolved
_ -> false
end)
end
end
26 changes: 3 additions & 23 deletions lib/archethic/transaction_chain.ex
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,6 @@ defmodule Archethic.TransactionChain do
alias __MODULE__.Transaction.ValidationStamp

alias __MODULE__.Transaction.ValidationStamp.LedgerOperations

alias __MODULE__.Transaction.ValidationStamp.LedgerOperations.TransactionMovement.Type,
as: TransactionMovementType

alias __MODULE__.Transaction.ValidationStamp.LedgerOperations.UnspentOutput
alias __MODULE__.TransactionSummary
alias __MODULE__.TransactionInput
Expand Down Expand Up @@ -781,10 +777,7 @@ defmodule Archethic.TransactionChain do
Resolve all the last addresses from the transaction data
"""
@spec resolve_transaction_addresses(Transaction.t(), DateTime.t()) ::
list(
{{origin_address :: binary(), type :: TransactionMovementType.t()},
resolved_address :: binary()}
)
%{Crypto.prepended_hash() => Crypto.prepended_hash()}
def resolve_transaction_addresses(
tx = %Transaction{data: %TransactionData{recipients: recipients}},
time = %DateTime{}
Expand All @@ -796,7 +789,7 @@ defmodule Archethic.TransactionChain do
addresses =
tx
|> Transaction.get_movements()
|> Enum.map(&{&1.to, &1.type})
|> Enum.map(& &1.to)
|> Enum.concat(recipient_addresses)

authorized_nodes = P2P.authorized_and_available_nodes()
Expand All @@ -805,20 +798,6 @@ defmodule Archethic.TransactionChain do
TaskSupervisor,
addresses,
fn
{^burning_address, type} ->
{{burning_address, type}, burning_address}

{to, type} ->
nodes = Election.chain_storage_nodes(to, authorized_nodes)

case fetch_last_address(to, nodes, timestamp: time) do
{:ok, resolved} ->
{{to, type}, resolved}

_ ->
{{to, type}, to}
end

^burning_address ->
{burning_address, burning_address}

Expand All @@ -837,6 +816,7 @@ defmodule Archethic.TransactionChain do
)
|> Stream.filter(&match?({:ok, _}, &1))
|> Enum.map(fn {:ok, res} -> res end)
|> Enum.into(%{})
end

@doc """
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,12 +224,9 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation
Resolve the addresses of given movements
If a movement does not have a resolved address, it is dropped
"""
@spec resolve_movements(list(t()), list({Crypto.prepended_hash(), Crypto.prepended_hash()})) ::
@spec resolve_movements(list(t()), %{Crypto.prepended_hash() => Crypto.prepended_hash()}) ::
list(t())
def resolve_movements(movements, resolved_addresses) do
# list of pairs into map for ease of use
resolved_addresses = Enum.into(resolved_addresses, %{})

movements
|> Enum.reduce([], fn mvt = %__MODULE__{to: to}, acc ->
case Map.get(resolved_addresses, to) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,9 @@ defmodule ArchethicWeb.API.JsonRPC.Method.EstimateTransactionFee do
end

defp get_resolved_address_for_address(resolved_addresses, address) do
{_to, resolved} = Enum.find(resolved_addresses, fn {to, _resolved} -> to == address end)
resolved
Enum.find_value(resolved_addresses, fn
{^address, resolved} -> resolved
_ -> false
end)
end
end
12 changes: 5 additions & 7 deletions test/archethic/mining/validation_context_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,7 @@ defmodule Archethic.Mining.ValidationContextTest do
"seed",
0
),
resolved_addresses: [
{transfer_address, resolved_address}
]
resolved_addresses: %{transfer_address => resolved_address}
}

expected_movements = [
Expand Down Expand Up @@ -147,10 +145,10 @@ defmodule Archethic.Mining.ValidationContextTest do
validation_context =
%ValidationContext{
create_context()
| resolved_addresses: [
{contract_address1, latest_contract_address},
{contract_address2, latest_contract_address}
],
| resolved_addresses: %{
contract_address1 => latest_contract_address,
contract_address2 => latest_contract_address
},
transaction:
Transaction.new(
:transfer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation
resolved3_address = random_address()
token_address = random_address()

resolved_addresses = [
{transfer1_address, resolved1_address},
{transfer2_address, resolved2_address},
{transfer3_address, resolved3_address}
]
resolved_addresses = %{
transfer1_address => resolved1_address,
transfer2_address => resolved2_address,
transfer3_address => resolved3_address
}

assert [
%TransactionMovement{
Expand Down Expand Up @@ -77,9 +77,9 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation
resolved1_address = random_address()
token_address = random_address()

resolved_addresses = [
{transfer1_address, resolved1_address}
]
resolved_addresses = %{
transfer1_address => resolved1_address
}

assert [
%TransactionMovement{
Expand Down Expand Up @@ -146,7 +146,7 @@ defmodule Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperation
transfer3_address = random_address()
token_address = random_address()

resolved_addresses = []
resolved_addresses = %{}

assert [] =
TransactionMovement.resolve_movements(
Expand Down

0 comments on commit c16b71f

Please sign in to comment.