diff --git a/lib/archethic_web/live/transaction_details_live.ex b/lib/archethic_web/live/transaction_details_live.ex index 9ab946683f..21914a1335 100644 --- a/lib/archethic_web/live/transaction_details_live.ex +++ b/lib/archethic_web/live/transaction_details_live.ex @@ -9,6 +9,11 @@ defmodule ArchethicWeb.TransactionDetailsLive do alias Archethic.PubSub alias Archethic.TransactionChain.Transaction + alias Archethic.TransactionChain.TransactionData + alias Archethic.TransactionChain.TransactionData.Ledger + alias Archethic.TransactionChain.TransactionData.TokenLedger + alias Archethic.TransactionChain.Transaction.ValidationStamp + alias Archethic.TransactionChain.Transaction.ValidationStamp.LedgerOperations alias ArchethicWeb.ExplorerView @@ -78,32 +83,86 @@ defmodule ArchethicWeb.TransactionDetailsLive do defp handle_transaction( socket, - tx = %Transaction{address: address} + tx = %Transaction{ + address: address, + data: %TransactionData{ + ledger: %Ledger{token: %TokenLedger{transfers: token_transfers}} + }, + validation_stamp: %ValidationStamp{ + ledger_operations: %LedgerOperations{transaction_movements: transaction_movements} + } + } ) do previous_address = Transaction.previous_address(tx) - with {:ok, balance} <- Archethic.get_balance(address), - inputs <- Archethic.get_transaction_inputs(address) do - ledger_inputs = Enum.reject(inputs, &(&1.type == :call)) - contract_inputs = Enum.filter(inputs, &(&1.type == :call)) - uco_price_at_time = tx.validation_stamp.timestamp |> OracleChain.get_uco_price() - uco_price_now = DateTime.utc_now() |> OracleChain.get_uco_price() + inputs = Archethic.get_transaction_inputs(address) + ledger_inputs = Enum.reject(inputs, &(&1.type == :call)) + contract_inputs = Enum.filter(inputs, &(&1.type == :call)) + uco_price_at_time = tx.validation_stamp.timestamp |> OracleChain.get_uco_price() + uco_price_now = DateTime.utc_now() |> OracleChain.get_uco_price() + + tokens = + Enum.reduce(ledger_inputs, [], fn input, acc -> + case input.type do + {:token, token_address, _} -> [token_address | acc] + _ -> acc + end + end) + + tokens = + Enum.reduce(transaction_movements, tokens, fn movement, acc -> + case movement.type do + {:token, token_address, _} -> [token_address | acc] + _ -> acc + end + end) + + token_properties = + Enum.reduce(token_transfers, tokens, fn transfer, acc -> + [transfer.token_address | acc] + end) + |> Enum.uniq() + |> get_token_properties() - socket - |> assign(:transaction, tx) - |> assign(:previous_address, previous_address) - |> assign(:balance, balance) - |> assign(:inputs, ledger_inputs) - |> assign(:calls, contract_inputs) - |> assign(:address, address) - |> assign(:uco_price_at_time, uco_price_at_time) - |> assign(:uco_price_now, uco_price_now) - else - {:error, :network_issue} -> - socket - |> assign(:error, :network_issue) - |> assign(:address, address) - end + socket + |> assign(:transaction, tx) + |> assign(:previous_address, previous_address) + |> assign(:inputs, ledger_inputs) + |> assign(:calls, contract_inputs) + |> assign(:address, address) + |> assign(:uco_price_at_time, uco_price_at_time) + |> assign(:uco_price_now, uco_price_now) + |> assign(:token_properties, token_properties) + end + + defp get_token_properties(token_addresses) do + Task.async_stream(token_addresses, fn token_address -> + case Archethic.search_transaction(token_address) do + {:ok, %Transaction{data: %TransactionData{content: content}, type: :token}} -> + {token_address, content} + + _ -> + :error + end + end) + |> Enum.reduce(%{}, fn + {:ok, {token_address, content}}, acc -> + case Jason.decode(content) do + {:ok, map} -> + properties = %{ + decimals: Map.get(map, "decimals", 8), + symbol: Map.get(map, "symbol") + } + + Map.put(acc, token_address, properties) + + _ -> + acc + end + + _, acc -> + acc + end) end defp handle_not_existing_transaction(socket, address) do diff --git a/lib/archethic_web/templates/explorer/transaction_details.html.leex b/lib/archethic_web/templates/explorer/transaction_details.html.leex index 8a036738fb..c9a002e27f 100644 --- a/lib/archethic_web/templates/explorer/transaction_details.html.leex +++ b/lib/archethic_web/templates/explorer/transaction_details.html.leex @@ -35,7 +35,6 @@ data_section: 'code', operation_section: 'transaction_movements' }" > -