Blockchain explorer for Ethereum based network and a tool for inspecting and analyzing EVM based blockchains.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
blockscout/lib/explorer_web/controllers/transaction_controller.ex

94 lines
2.4 KiB

defmodule ExplorerWeb.TransactionController do
use ExplorerWeb, :controller
import Ecto.Query
alias Explorer.Repo.NewRelic, as: Repo
alias Explorer.Transaction
alias Explorer.TransactionForm
def index(conn, %{"last_seen" => last_seen} = _) do
query =
from(
transaction in Transaction,
where: transaction.id < ^last_seen,
inner_join: receipt in assoc(transaction, :receipt),
inner_join: block in assoc(transaction, :block),
inner_join: to_address in assoc(transaction, :to_address),
inner_join: from_address in assoc(transaction, :from_address),
preload: [
block: block,
receipt: receipt,
to_address: to_address,
from_address: from_address
],
order_by: [desc: transaction.id],
limit: 10
)
total_query =
from(
transaction in Transaction,
select: fragment("count(?)", transaction.id),
inner_join: receipt in assoc(transaction, :receipt),
inner_join: block in assoc(transaction, :block)
)
entries =
query
|> Repo.all()
|> Enum.map(&TransactionForm.build_and_merge/1)
last = List.last(entries) || Transaction.null()
render(
conn,
"index.html",
transactions: %{
entries: entries,
total_entries: Repo.one(total_query),
last_seen: last.id
}
)
end
def index(conn, params) do
query =
from(
t in Transaction,
select: t.id,
order_by: [desc: t.id],
limit: 1
)
first_id = Repo.one(query) || 0
last_seen = Integer.to_string(first_id + 1)
index(conn, Map.put(params, "last_seen", last_seen))
end
def show(conn, params) do
hash = String.downcase(params["id"])
query =
from(
transaction in Transaction,
left_join: receipt in assoc(transaction, :receipt),
left_join: block in assoc(transaction, :block),
inner_join: to_address in assoc(transaction, :to_address),
inner_join: from_address in assoc(transaction, :from_address),
preload: [
block: block,
receipt: receipt,
to_address: to_address,
from_address: from_address
],
where: fragment("lower(?)", transaction.hash) == ^hash,
limit: 1
)
transaction = query |> Repo.one() |> TransactionForm.build_and_merge()
render(conn, "show.html", transaction: transaction)
end
end