167 lines
4.5 KiB
Elixir
167 lines
4.5 KiB
Elixir
defmodule ZcashExplorerWeb.PageController do
|
|
use ZcashExplorerWeb, :controller
|
|
|
|
def index(conn, _params) do
|
|
render(conn, "index.html", page_title: "Zcash Explorer - Search the Zcash Blockchain")
|
|
end
|
|
|
|
def broadcast(conn, _params) do
|
|
render(conn, "broadcast.html",
|
|
csrf_token: get_csrf_token(),
|
|
page_title: "Broadcast raw Zcash transaction"
|
|
)
|
|
end
|
|
|
|
def do_broadcast(conn, params) do
|
|
tx_hex = params["tx-hex"]
|
|
|
|
case Zcashex.sendrawtransaction(tx_hex) do
|
|
{:ok, resp} ->
|
|
conn
|
|
|> put_flash(:info, resp)
|
|
|> render("broadcast.html",
|
|
csrf_token: get_csrf_token(),
|
|
page_title: "Broadcast raw Zcash transaction"
|
|
)
|
|
|
|
{:error, reason} ->
|
|
conn
|
|
|> put_flash(:error, reason)
|
|
|> render("broadcast.html",
|
|
csrf_token: get_csrf_token(),
|
|
page_title: "Broadcast raw Zcash Transaction"
|
|
)
|
|
end
|
|
end
|
|
|
|
def disclosure(conn, _params) do
|
|
render(conn, "disclosure.html",
|
|
csrf_token: get_csrf_token(),
|
|
disclosed_data: nil,
|
|
disclosure_hex: nil,
|
|
page_title: "Zcash Payment Disclosure"
|
|
)
|
|
end
|
|
|
|
def do_disclosure(conn, params) do
|
|
disclosure_hex = String.trim(params["disclosure-hex"])
|
|
|
|
case Zcashex.z_validatepaymentdisclosure(disclosure_hex) do
|
|
{:ok, resp} ->
|
|
conn
|
|
|> put_flash(:info, resp)
|
|
|> render("disclosure.html",
|
|
csrf_token: get_csrf_token(),
|
|
disclosed_data: resp,
|
|
disclosure_hex: disclosure_hex,
|
|
page_title: "Zcash Payment Disclosure"
|
|
)
|
|
|
|
{:error, reason} ->
|
|
conn
|
|
|> put_flash(:error, reason)
|
|
|> render("disclosure.html",
|
|
csrf_token: get_csrf_token(),
|
|
disclosed_data: nil,
|
|
disclosure_hex: disclosure_hex,
|
|
page_title: "Zcash Payment Disclosure"
|
|
)
|
|
end
|
|
end
|
|
|
|
def mempool(conn, _params) do
|
|
render(conn, "mempool.html", page_title: "Zcash Mempool")
|
|
end
|
|
|
|
def nodes(conn, _params) do
|
|
render(conn, "nodes.html", page_title: "Zcash Nodes")
|
|
end
|
|
|
|
def vk(conn, _params) do
|
|
height =
|
|
case Cachex.get(:app_cache, "metrics") do
|
|
{:ok, info} ->
|
|
info["blocks"] - 10000
|
|
|
|
{:error, _reason} ->
|
|
# hardcoded to canopy
|
|
1_046_400
|
|
end
|
|
|
|
render(conn, "vk.html",
|
|
csrf_token: get_csrf_token(),
|
|
height: height,
|
|
page_title: "Zcash Viewing Key"
|
|
)
|
|
end
|
|
|
|
def do_import_vk(conn, params) do
|
|
height = params["scan-height"]
|
|
vkey = params["vkey"]
|
|
cur_jobs = Cachex.get!(:app_cache, "nbjobs") || 1
|
|
|
|
with true <- String.starts_with?(vkey, "zxview"),
|
|
true <- is_integer(String.to_integer(height)),
|
|
true <- String.to_integer(height) >= 0,
|
|
true <- cur_jobs <= 10 do
|
|
cmd =
|
|
MuonTrap.cmd("docker", [
|
|
"create",
|
|
"-t",
|
|
"-i",
|
|
"--rm",
|
|
"--ulimit",
|
|
"nofile=90000:90000",
|
|
"--cpus",
|
|
Application.get_env(:zcash_explorer, Zcashex)[:vk_cpus],
|
|
"-m",
|
|
Application.get_env(:zcash_explorer, Zcashex)[:vk_mem],
|
|
Application.get_env(:zcash_explorer, Zcashex)[:vk_runnner_image],
|
|
"zecwallet-cli",
|
|
"import",
|
|
vkey,
|
|
height
|
|
])
|
|
|
|
container_id = elem(cmd, 0) |> String.trim_trailing("\n") |> String.slice(0, 12)
|
|
Task.start(fn -> MuonTrap.cmd("docker", ["start", "-a", "-i", container_id]) end)
|
|
|
|
render(conn, "vk_txs.html",
|
|
csrf_token: get_csrf_token(),
|
|
height: height,
|
|
container_id: container_id,
|
|
page_title: "Zcash Viewing Key"
|
|
)
|
|
else
|
|
false ->
|
|
conn
|
|
|> put_flash(:error, "Invalid Input")
|
|
|> render("vk.html",
|
|
csrf_token: get_csrf_token(),
|
|
height: height,
|
|
page_title: "Zcash Viewing Key"
|
|
)
|
|
end
|
|
end
|
|
|
|
def vk_from_zecwalletcli(conn, params) do
|
|
container_id = Map.get(params, "hostname")
|
|
chan = "VK:" <> "#{container_id}"
|
|
txs = Map.get(params, "_json")
|
|
Phoenix.PubSub.broadcast(ZcashExplorer.PubSub, chan, {:received_txs, txs})
|
|
json(conn, %{status: "received"})
|
|
end
|
|
|
|
def blockchain_info(conn, _params) do
|
|
render(conn, "blockchain_info.html", page_title: "Zcash Blockchain Info")
|
|
end
|
|
|
|
def blockchain_info_api(conn, _params) do
|
|
{:ok, info} = Cachex.get(:app_cache, "metrics")
|
|
{:ok, %{"build" => build}} = Cachex.get(:app_cache, "info")
|
|
info = Map.put(info, "build", build)
|
|
json(conn, info)
|
|
end
|
|
|
|
end
|