parent
092b6a7bac
commit
4d2ae670cc
@ -0,0 +1,71 @@ |
|||||||
|
defmodule BlockScoutWeb.TokensController do |
||||||
|
use BlockScoutWeb, :controller |
||||||
|
|
||||||
|
import BlockScoutWeb.Chain, only: [paging_options: 1, next_page_params: 3, split_list_by_page: 1] |
||||||
|
|
||||||
|
alias BlockScoutWeb.TokensView |
||||||
|
alias Explorer.Chain |
||||||
|
alias Phoenix.View |
||||||
|
|
||||||
|
def index(conn, %{"type" => "JSON"} = params) do |
||||||
|
full_options = |
||||||
|
Keyword.merge( |
||||||
|
[ |
||||||
|
necessity_by_association: %{ |
||||||
|
[contract_address: :contract_address] => :optional |
||||||
|
} |
||||||
|
], |
||||||
|
paging_options(params) |
||||||
|
) |
||||||
|
|
||||||
|
tokens = |
||||||
|
full_options |
||||||
|
|> paging_options() |
||||||
|
|> Chain.list_top_tokens() |
||||||
|
|
||||||
|
{tokens_page, next_page} = split_list_by_page(tokens) |
||||||
|
|
||||||
|
next_page_path = |
||||||
|
case next_page_params(next_page, tokens_page, params) do |
||||||
|
nil -> |
||||||
|
nil |
||||||
|
|
||||||
|
next_page_params -> |
||||||
|
address_path( |
||||||
|
conn, |
||||||
|
:index, |
||||||
|
Map.delete(next_page_params, "type") |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
|
items = |
||||||
|
tokens_page |
||||||
|
|> Enum.with_index(1) |
||||||
|
|> Enum.map(fn {token, index} -> |
||||||
|
View.render_to_string( |
||||||
|
TokensView, |
||||||
|
"_tile.html", |
||||||
|
token: token, |
||||||
|
index: index |
||||||
|
) |
||||||
|
end) |
||||||
|
|
||||||
|
json( |
||||||
|
conn, |
||||||
|
%{ |
||||||
|
items: items, |
||||||
|
next_page_path: next_page_path |
||||||
|
} |
||||||
|
) |
||||||
|
end |
||||||
|
|
||||||
|
def index(conn, _params) do |
||||||
|
total_supply = Chain.total_supply() |
||||||
|
|
||||||
|
render(conn, "index.html", |
||||||
|
current_path: current_path(conn), |
||||||
|
address_count: Chain.address_estimated_count(), |
||||||
|
total_supply: total_supply |
||||||
|
) |
||||||
|
end |
||||||
|
end |
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,36 @@ |
|||||||
|
<tr> |
||||||
|
<td class="stakes-td"> |
||||||
|
<!-- incremented number by order in the list --> |
||||||
|
<span class="color-lighten"> |
||||||
|
<%= @index %> |
||||||
|
</span> |
||||||
|
</td> |
||||||
|
<td class="stakes-td"> |
||||||
|
<% token = "#{@token.name} (#{@token.symbol})" %> |
||||||
|
<%= link(token, |
||||||
|
to: token_path(BlockScoutWeb.Endpoint, :show, @token.contract_address_hash), |
||||||
|
"data-test": "token_link", |
||||||
|
class: "text-truncate") %> |
||||||
|
</td> |
||||||
|
<td class="stakes-td"> |
||||||
|
<%= render BlockScoutWeb.AddressView, |
||||||
|
"_link.html", |
||||||
|
address: @token.contract_address, |
||||||
|
contract: true, |
||||||
|
use_custom_tooltip: false |
||||||
|
%> |
||||||
|
</td> |
||||||
|
<td class="stakes-td"> |
||||||
|
<%= if decimals?(@token) do %> |
||||||
|
<span data-test="token_supply"><%= format_according_to_decimals(@token.total_supply, @token.decimals) %></span> |
||||||
|
<% else %> |
||||||
|
<span data-test="token_supply"><%= format_integer_to_currency(@token.total_supply) %></span> |
||||||
|
<% end %> <%= @token.symbol %> |
||||||
|
</td> |
||||||
|
<td class="stakes-td"> |
||||||
|
<span class="mr-4"> |
||||||
|
<span data-test="transaction_count"> |
||||||
|
<%= @token.holder_count %> |
||||||
|
</span> |
||||||
|
</td> |
||||||
|
</tr> |
@ -0,0 +1,45 @@ |
|||||||
|
<section class="container"> |
||||||
|
<div class="card"> |
||||||
|
<div class="card-body" data-async-load data-async-listing="<%= @current_path %>"> |
||||||
|
<h1 class="card-title"><%= gettext "Tokens" %></h1> |
||||||
|
|
||||||
|
<%= render BlockScoutWeb.CommonComponentsView, "_pagination_container.html", position: "top", cur_page_number: "1", show_pagination_limit: true, data_next_page_button: true, data_prev_page_button: true %> |
||||||
|
|
||||||
|
<div class="addresses-table-container"> |
||||||
|
<div class="stakes-table-container"> |
||||||
|
<table> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th class="stakes-table-th"> |
||||||
|
<div class="stakes-table-th-content"> </div> |
||||||
|
</th> |
||||||
|
<th class="stakes-table-th"> |
||||||
|
<div class="stakes-table-th-content">Token</div> |
||||||
|
</th> |
||||||
|
<th class="stakes-table-th"> |
||||||
|
<div class="stakes-table-th-content">Address</div> |
||||||
|
</th> |
||||||
|
<th class="stakes-table-th"> |
||||||
|
<div class="stakes-table-th-content"> |
||||||
|
Total Supply |
||||||
|
</div> |
||||||
|
</th> |
||||||
|
<th class="stakes-table-th"> |
||||||
|
<div class="stakes-table-th-content"> |
||||||
|
Holders Count |
||||||
|
</div> |
||||||
|
</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody data-items data-selector="top-tokens-list"> |
||||||
|
<%= render BlockScoutWeb.CommonComponentsView, "_table-loader.html", total_supply: @total_supply %> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<%= render BlockScoutWeb.CommonComponentsView, "_pagination_container.html", position: "bottom", cur_page_number: "1", show_pagination_limit: true, data_next_page_button: true, data_prev_page_button: true %> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<script defer data-cfasync="false" src="<%= static_path(@conn, "/js/async-listing-load.js") %>"></script> |
||||||
|
</section> |
@ -0,0 +1,8 @@ |
|||||||
|
defmodule BlockScoutWeb.TokensView do |
||||||
|
use BlockScoutWeb, :view |
||||||
|
|
||||||
|
alias Explorer.Chain.Token |
||||||
|
|
||||||
|
def decimals?(%Token{decimals: nil}), do: false |
||||||
|
def decimals?(%Token{decimals: _}), do: true |
||||||
|
end |
Loading…
Reference in new issue