Orchard Pool
This commit is contained in:
parent
7024d17d6c
commit
921420e8bd
|
@ -31,7 +31,6 @@ defmodule ZcashExplorer.Application do
|
||||||
{Cachex,
|
{Cachex,
|
||||||
name: :app_cache,
|
name: :app_cache,
|
||||||
warmers: [
|
warmers: [
|
||||||
warmer(module: ZcashExplorer.Price.PriceWarmer, state: {}),
|
|
||||||
warmer(module: ZcashExplorer.Metrics.MetricsWarmer, state: {}),
|
warmer(module: ZcashExplorer.Metrics.MetricsWarmer, state: {}),
|
||||||
warmer(module: ZcashExplorer.Metrics.MempoolInfoWarmer, state: {}),
|
warmer(module: ZcashExplorer.Metrics.MempoolInfoWarmer, state: {}),
|
||||||
warmer(module: ZcashExplorer.Metrics.NetworkSolpsWarmer, state: {}),
|
warmer(module: ZcashExplorer.Metrics.NetworkSolpsWarmer, state: {}),
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
defmodule ZcashExplorer.Price.PriceService do
|
|
||||||
@moduledoc false
|
|
||||||
|
|
||||||
def fetch_current_price() do
|
|
||||||
case fetch_price() do
|
|
||||||
nil ->
|
|
||||||
{:error, "Unable to fetch ZEC price in USD"}
|
|
||||||
|
|
||||||
price ->
|
|
||||||
{:ok, price}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp fetch_price() do
|
|
||||||
url()
|
|
||||||
|> HTTPoison.get!([{"User-agent", "curl/7.83.1"}])
|
|
||||||
|> Map.get(:body)
|
|
||||||
|> Poison.decode!()
|
|
||||||
end
|
|
||||||
|
|
||||||
defp url() do
|
|
||||||
"https://api.coingecko.com/api/v3/simple/price?ids=zcash&vs_currencies=usd&include_market_cap=true&include_24hr_vol=true&include_24hr_change=true&include_last_updated_at=true"
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,28 +0,0 @@
|
||||||
defmodule ZcashExplorer.Price.PriceWarmer do
|
|
||||||
@moduledoc """
|
|
||||||
Price warmer which caches Zec prices every 30s.
|
|
||||||
"""
|
|
||||||
alias ZcashExplorer.Price.PriceService
|
|
||||||
use Cachex.Warmer
|
|
||||||
|
|
||||||
@doc """
|
|
||||||
Returns the interval for this warmer.
|
|
||||||
"""
|
|
||||||
def interval,
|
|
||||||
do: :timer.seconds(30)
|
|
||||||
|
|
||||||
@doc """
|
|
||||||
Executes this cache warmer.
|
|
||||||
"""
|
|
||||||
def execute(_state) do
|
|
||||||
PriceService.fetch_current_price() |> handle_result
|
|
||||||
end
|
|
||||||
|
|
||||||
# ignores the warmer result in case of error
|
|
||||||
defp handle_result({:error, _reason}),
|
|
||||||
do: :ignore
|
|
||||||
|
|
||||||
defp handle_result({:ok, price}) do
|
|
||||||
{:ok, [{"price", price}]}
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
defmodule ZcashExplorerWeb.OrchardPoolLive do
|
||||||
|
use ZcashExplorerWeb, :live_view
|
||||||
|
import Phoenix.LiveView.Helpers
|
||||||
|
@impl true
|
||||||
|
def render(assigns) do
|
||||||
|
~L"""
|
||||||
|
<p class="text-2xl font-semibold text-gray-900">
|
||||||
|
<%= orchard_value(@blockchain_info["valuePools"]) %> ZEC
|
||||||
|
</p>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def mount(_params, _session, socket) do
|
||||||
|
if connected?(socket), do: Process.send_after(self(), :update, 15000)
|
||||||
|
|
||||||
|
case Cachex.get(:app_cache, "metrics") do
|
||||||
|
{:ok, info} ->
|
||||||
|
{:ok, %{"build" => build}} = Cachex.get(:app_cache, "info")
|
||||||
|
info = Map.put(info, "build", build)
|
||||||
|
{:ok, assign(socket, :blockchain_info, info)}
|
||||||
|
|
||||||
|
{:error, _reason} ->
|
||||||
|
{:ok, assign(socket, :blockchain_info, "loading...")}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def handle_info(:update, socket) do
|
||||||
|
Process.send_after(self(), :update, 15000)
|
||||||
|
{:ok, info} = Cachex.get(:app_cache, "metrics")
|
||||||
|
{:ok, %{"build" => build}} = Cachex.get(:app_cache, "info")
|
||||||
|
info = Map.put(info, "build", build)
|
||||||
|
{:noreply, assign(socket, :blockchain_info, info)}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp orchard_value(value_pools) do
|
||||||
|
value_pools |> get_value_pools |> Map.get("orchard")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_value_pools(value_pools) do
|
||||||
|
Enum.map(value_pools, fn %{"id" => name, "chainValue" => value} -> {name, value} end)
|
||||||
|
|> Map.new()
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
defmodule ZcashExplorerWeb.PriceLive do
|
|
||||||
use ZcashExplorerWeb, :live_view
|
|
||||||
import Phoenix.LiveView.Helpers
|
|
||||||
@impl true
|
|
||||||
def render(assigns) do
|
|
||||||
~L"""
|
|
||||||
<dd class="ml-16 pb-6 flex items-baseline sm:pb-7">
|
|
||||||
<p class="text-2xl font-semibold text-gray-900">
|
|
||||||
$<%= @price["zcash"]["usd"] %>
|
|
||||||
</p>
|
|
||||||
<%= if @price["zcash"]["usd_24h_change"] > 0 do %>
|
|
||||||
<p class="ml-2 flex items-baseline text-sm font-semibold text-green-600">
|
|
||||||
<!-- Heroicon name: solid/arrow-sm-up -->
|
|
||||||
<svg class="self-center flex-shrink-0 h-5 w-5 text-green-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
||||||
<path fill-rule="evenodd" d="M5.293 9.707a1 1 0 010-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 01-1.414 1.414L11 7.414V15a1 1 0 11-2 0V7.414L6.707 9.707a1 1 0 01-1.414 0z" clip-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
<span class="sr-only">
|
|
||||||
Increased by
|
|
||||||
</span>
|
|
||||||
<%= Float.ceil(@price["zcash"]["usd_24h_change"], 4) %> %
|
|
||||||
</p>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<%= if @price["zcash"]["usd_24h_change"] < 0 do %>
|
|
||||||
<p class="ml-2 flex items-baseline text-sm font-semibold text-red-600">
|
|
||||||
<!-- Heroicon name: solid/arrow-sm-down -->
|
|
||||||
|
|
||||||
<svg class="self-center flex-shrink-0 h-5 w-5 text-red-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
||||||
<path fill-rule="evenodd" d="M14.707 10.293a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 111.414-1.414L9 12.586V5a1 1 0 012 0v7.586l2.293-2.293a1 1 0 011.414 0z" clip-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
|
|
||||||
<span class="sr-only">
|
|
||||||
Decreased by
|
|
||||||
</span>
|
|
||||||
<%= Float.ceil(@price["zcash"]["usd_24h_change"], 4) %>%
|
|
||||||
</p>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="absolute bottom-0 inset-x-0 bg-gray-50 px-4 py-4 sm:px-6">
|
|
||||||
<div class="text-sm">
|
|
||||||
<a href="https://www.coingecko.com/en/coins/zcash" target="_blank" rel="noreferrer" class="font-medium text-indigo-600 hover:text-indigo-500"> View more<span class="sr-only"> View detailed price charts of Zcash.</span></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</dd>
|
|
||||||
"""
|
|
||||||
end
|
|
||||||
|
|
||||||
@impl true
|
|
||||||
def mount(_params, _session, socket) do
|
|
||||||
if connected?(socket), do: Process.send_after(self(), :update, 3000)
|
|
||||||
|
|
||||||
case Cachex.get(:app_cache, "price") do
|
|
||||||
{:ok, price} ->
|
|
||||||
{:ok, assign(socket, :price, price)}
|
|
||||||
|
|
||||||
{:error, _reason} ->
|
|
||||||
{:ok, assign(socket, :price, "updating...")}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@impl true
|
|
||||||
def handle_info(:update, socket) do
|
|
||||||
Process.send_after(self(), :update, 3000)
|
|
||||||
{:ok, price} = Cachex.get(:app_cache, "price")
|
|
||||||
{:noreply, assign(socket, :price, price)}
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -30,6 +30,7 @@ defmodule ZcashExplorerWeb.Router do
|
||||||
live "/index/recent_blocks", RecentBlocksLive
|
live "/index/recent_blocks", RecentBlocksLive
|
||||||
live "/index/recent_transactions", RecentTransactionsLive
|
live "/index/recent_transactions", RecentTransactionsLive
|
||||||
live "/live/raw_mempool", RawMempoolLive
|
live "/live/raw_mempool", RawMempoolLive
|
||||||
|
live "/live/orchard_pool", OrchardPoolLive
|
||||||
live "/live/nodes", NodesLive
|
live "/live/nodes", NodesLive
|
||||||
live "/vkdetails", VkLive
|
live "/vkdetails", VkLive
|
||||||
live "/blockchain-info-live", BlockChainInfoLive
|
live "/blockchain-info-live", BlockChainInfoLive
|
||||||
|
|
|
@ -2,16 +2,24 @@
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<dl class="mt-5 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4">
|
<dl class="mt-5 grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4">
|
||||||
|
|
||||||
<div class="relative bg-white pt-5 px-4 pb-12 sm:pt-6 sm:px-6 shadow rounded-lg overflow-hidden">
|
<div class="relative bg-white pt-5 px-4 pb-12 sm:pt-6 sm:px-6 shadow rounded-lg overflow-hidden">
|
||||||
<dt>
|
<dt>
|
||||||
<div class="absolute bg-indigo-500 rounded-md p-3">
|
<div class="absolute bg-green-500 rounded-md p-3">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z" />
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z"></path>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
<p class="ml-16 text-sm font-medium text-gray-500 truncate">Price</p>
|
<p class="ml-16 text-sm font-medium text-gray-500 truncate">Blockchain Size</p>
|
||||||
</dt>
|
</dt>
|
||||||
<%= live_render(@conn, ZcashExplorerWeb.PriceLive) %>
|
<dd class="ml-16 pb-6 flex items-baseline sm:pb-7">
|
||||||
|
<%= live_render(@conn, ZcashExplorerWeb.OrchardPoolLive) %>
|
||||||
|
<div class="absolute bottom-0 inset-x-0 bg-gray-50 px-4 py-4 sm:px-6">
|
||||||
|
<div class="text-sm">
|
||||||
|
<a href="/blockchain-info" class="font-medium text-indigo-600 hover:text-indigo-500">View blockchain info<span class="sr-only"> View blockchain info</span></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue