@ -0,0 +1,137 @@ |
||||
$error-tablet-breakpoint: 768px; |
||||
|
||||
// Block Not Found |
||||
|
||||
.block-not-found { |
||||
display: flex; |
||||
flex-direction: column; |
||||
padding-bottom: 50px; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
flex-direction: row; |
||||
align-items: center; |
||||
justify-content: center; |
||||
padding-top: 52px; |
||||
} |
||||
} |
||||
|
||||
.block-not-found-img { |
||||
margin-bottom: 40px; |
||||
text-align: center; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
margin-bottom: 0; |
||||
text-align: left; |
||||
} |
||||
img { |
||||
max-width: 100%; |
||||
height: auto; |
||||
} |
||||
} |
||||
|
||||
.block-not-found-content { |
||||
text-align: center; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
text-align: left; |
||||
padding-left: 52px; |
||||
max-width: 396px; |
||||
} |
||||
} |
||||
|
||||
.error-title { |
||||
margin-bottom: 20px !important; |
||||
} |
||||
|
||||
.error-descr { |
||||
display: block; |
||||
font-size: 14px; |
||||
color: #a3a9b5; |
||||
line-height: 1.714; |
||||
margin-bottom: 22px; |
||||
word-wrap: break-word; |
||||
} |
||||
|
||||
.error-btn { |
||||
background: transparent; |
||||
display: inline-flex !important; |
||||
} |
||||
|
||||
// TX Not Found |
||||
.tx-nf { |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
flex-direction: column; |
||||
padding-bottom: 50px; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
flex-direction: row; |
||||
padding-top: 52px; |
||||
} |
||||
} |
||||
|
||||
.tx-nf-content { |
||||
margin-top: 52px; |
||||
max-width: 700px; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
margin-left: 90px; |
||||
margin-top: 0; |
||||
} |
||||
} |
||||
|
||||
.tx-nf-blocks { |
||||
margin-bottom: 40px; |
||||
margin-top: 40px; |
||||
} |
||||
|
||||
.tx-nf-block { |
||||
background-color: #fff; |
||||
box-shadow: 0px 0px 30px 0px rgba(202, 199, 226, 0.5); |
||||
padding: 17px 40px 17px 20px; |
||||
position: relative; |
||||
border-radius: 6px; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
width: calc(50% - 20px); |
||||
} |
||||
} |
||||
|
||||
.tx-nf-block { |
||||
.error-descr { |
||||
margin-bottom: 0; |
||||
} |
||||
& + .tx-nf-block { |
||||
margin-top: 30px; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
margin-top: 0; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.tx-nf-blocks-row { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
flex-direction: column; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
flex-direction: row; |
||||
} |
||||
& + .tx-nf-blocks-row { |
||||
margin-top: 30px; |
||||
@media (min-width: $error-tablet-breakpoint) { |
||||
margin-top: 40px; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.tx-nf-number { |
||||
display: inline-block; |
||||
position: absolute; |
||||
top: -15px; |
||||
left: -15px; |
||||
width: 30px; |
||||
height: 30px; |
||||
border-radius: 15px; |
||||
background-color: $secondary; |
||||
box-shadow: 0px 3px 5px 0px rgba($secondary, 0.25); |
||||
color: #fff; |
||||
font-weight: 700; |
||||
font-size: 14px; |
||||
text-align: center; |
||||
line-height: 32px; |
||||
} |
@ -0,0 +1,49 @@ |
||||
// general |
||||
$primary: #840032; |
||||
$secondary: #343434; |
||||
$tertiary: #7f7f7f; |
||||
$additional-font: #ff95db; |
||||
|
||||
// footer |
||||
$footer-background-color: $primary; |
||||
$footer-title-color: #fff; |
||||
$footer-text-color: #fff; |
||||
$footer-item-disc-color: $secondary; |
||||
|
||||
// dashboard |
||||
$dashboard-line-color-price: $tertiary; // price left border |
||||
|
||||
$dashboard-banner-chart-legend-value-color: $additional-font; // chart labels |
||||
|
||||
$dashboard-stats-item-value-color: $additional-font; // stat values |
||||
|
||||
$dashboard-stats-item-border-color: $secondary; // stat border |
||||
|
||||
$dashboard-banner-gradient-start: $primary; // gradient begin |
||||
|
||||
$dashboard-banner-gradient-end: lighten($primary, 5); // gradient end |
||||
|
||||
$dashboard-banner-network-plain-container-background-color: #4b021e; // stats bg |
||||
|
||||
|
||||
// navigation |
||||
.navbar { box-shadow: 0px 0px 30px 0px rgba(75, 2, 30, 0.12); } // header shadow |
||||
$header-icon-border-color-hover: $tertiary; // top border on hover |
||||
$header-icon-color-hover: $tertiary; // nav icon on hover |
||||
.dropdown-item:hover, .dropdown-item:focus { background-color: $tertiary !important; } // dropdown item on hover |
||||
|
||||
// buttons |
||||
$btn-line-bg: #fff; // button bg |
||||
$btn-line-color: #4b021e; // button border and font color && hover bg color |
||||
$btn-copy-color: #4b021e; // btn copy |
||||
$btn-qr-color: #4b021e; // btn qr-code |
||||
|
||||
//links & tile |
||||
.tile a { color: $tertiary !important; } // links color for badges |
||||
.tile-type-block { |
||||
border-left: 4px solid #4b021e; |
||||
} // tab active bg |
||||
|
||||
// card |
||||
$card-background-1: $tertiary; |
||||
$card-tab-active: $tertiary; |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 2.3 KiB |
@ -0,0 +1,20 @@ |
||||
defmodule BlockScoutWeb.PaginationHelpers do |
||||
@moduledoc """ |
||||
Common pagination logic helpers. |
||||
""" |
||||
|
||||
def current_page_number(params) do |
||||
cond do |
||||
!params["prev_page_number"] -> 1 |
||||
params["next_page"] -> String.to_integer(params["prev_page_number"]) + 1 |
||||
params["prev_page"] -> String.to_integer(params["prev_page_number"]) - 1 |
||||
end |
||||
end |
||||
|
||||
def add_navigation_params(params, current_page_path, current_page_number) do |
||||
params |
||||
|> Map.put("prev_page_path", current_page_path) |
||||
|> Map.put("next_page", true) |
||||
|> Map.put("prev_page_number", current_page_number) |
||||
end |
||||
end |
@ -1,20 +1,13 @@ |
||||
<section class="container"> |
||||
<div class="card"> |
||||
<div class="card-body"> |
||||
<div class="card-body" data-async-load data-async-listing="<%= @current_path %>"> |
||||
<h1 class="card-title"><%= gettext "Addresses" %></h1> |
||||
|
||||
<%= render BlockScoutWeb.CommonComponentsView, "_pagination_container.html", position: "top", prev_page_path: @prev_page_path, next_page_path: @next_page_path, cur_page_number: @cur_page_number, show_pagination_limit: true %> |
||||
<%= 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 data-selector="top-addresses-list"> |
||||
<%= for {{address, tx_count}, index} <- Enum.with_index(@address_tx_count_pairs, 1) do %> |
||||
<%= render "_tile.html", |
||||
address: address, index: index, exchange_rate: @exchange_rate, |
||||
total_supply: @total_supply, tx_count: tx_count, |
||||
validation_count: validation_count(address) %> |
||||
<% end %> |
||||
</div> |
||||
<div data-items data-selector="top-addresses-list"></div> |
||||
|
||||
<%= render BlockScoutWeb.CommonComponentsView, "_pagination_container.html", position: "bottom", prev_page_path: @prev_page_path, next_page_path: @next_page_path, cur_page_number: @cur_page_number, show_pagination_limit: true %> |
||||
<%= 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> |
||||
</section> |
||||
|
@ -1,16 +1,12 @@ |
||||
<section class="container"> |
||||
<div class="row"> |
||||
<div class="col-12"> |
||||
<div class="card"> |
||||
<div class="card-body"> |
||||
<h1 class="card-title" data-test="detail_type"> |
||||
<%= gettext("Block Details") %> |
||||
</h1> |
||||
<div class="tile tile-muted text-center" data-selector="block-not-found-message"> |
||||
<%= block_not_found_message(@block_above_tip) %> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="block-not-found"> |
||||
<div class="block-not-found-img"> |
||||
<img alt="Block Not Found" src="/images/errors-img/eth-block-not-found.png" srcset="/images/eth-block-not-found@2x.png 2x"> |
||||
</div> |
||||
<div class="block-not-found-content"> |
||||
<h1 class="card-title error-title"><%= gettext("Block Details") %></h1> |
||||
<p class="error-descr"><%= block_not_found_message(@block_above_tip) %></p> |
||||
<a class="error-btn btn-line" href="/">Back Home</a> |
||||
</div> |
||||
</div> |
||||
</section> |
||||
</section> |
@ -1,47 +1,33 @@ |
||||
<section class="container"> |
||||
<section data-page="transaction-details" data-page-transaction-hash="<%= @transaction_hash %>"> |
||||
<div class="row"> |
||||
<div class="col-12"> |
||||
<div class="card"> |
||||
<div class="card-body"> |
||||
<div class="icon-links float-right"> |
||||
<span data-clipboard-text="<%= @transaction_hash %>"> |
||||
<span |
||||
aria-label='<%= gettext("Copy Transaction Hash") %>' |
||||
class="btn-copy-ico" |
||||
data-placement="top" |
||||
data-toggle="tooltip" |
||||
title='<%= gettext("Copy Txn Hash") %>' |
||||
> |
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.5 32.5" width="32" height="32"> |
||||
<path fill-rule="evenodd" d="M23.5 20.5a1 1 0 0 1-1-1v-9h-9a1 1 0 0 1 0-2h10a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1zm-3-7v10a1 1 0 0 1-1 1h-10a1 1 0 0 1-1-1v-10a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1zm-2 1h-8v8h8v-8z"/> |
||||
</svg> |
||||
</span> |
||||
</span> |
||||
</div> |
||||
<h1 class="card-title"><%= gettext "Transaction Details" %> </h1> |
||||
<div class="tile tile-muted text-center"> |
||||
<div class="loading-spinner mx-auto"> |
||||
<span class="loading-spinner-block-1"></span> |
||||
<span class="loading-spinner-block-2"></span> |
||||
</div> |
||||
<br> |
||||
<span><%= gettext("The transaction %{bold_hash} was not processed yet", bold_hash: "<span class=\"font-weight-bold\">#{@transaction_hash}</span>") |> raw() %> <span> |
||||
</div> |
||||
<hr> |
||||
<div class="text-center"> |
||||
<h2><%= gettext "Once we have the transaction's data this page will refresh automatically" %></h2> |
||||
<h3><%= gettext "The possible reasons for this transaction not being processed include the following:" %></h3> |
||||
<ul class="d-inline-block text-left"> |
||||
<li><%= gettext "The transaction was made a few seconds ago" %></li> |
||||
<li><%= gettext "The transaction may be in the pool of a node that didn't broadcast it yet" %></li> |
||||
<li><%= gettext "Some transactions may take a while longer to be indexed depending on the load on the network" %></li> |
||||
<li><%= gettext "The transaction still does not exist" %></li> |
||||
</ul> |
||||
</div> |
||||
<div class="tx-nf"> |
||||
<div class="tx-nf-illustr"> |
||||
<img alt="Block Not Found" src="/images/errors-img/eth-tx-not-found.png" srcset="/images/errors-img/eth-tx-not-found@2x.png 2x"> |
||||
</div> |
||||
<div class="tx-nf-content"> |
||||
<h1 class="card-title error-title"><%= gettext("Sorry, We are unable to locate this transaction Hash") %></h1> |
||||
<div class="tx-nf-blocks"> |
||||
<div class="tx-nf-blocks-row"> |
||||
<div class="tx-nf-block"> |
||||
<span class="tx-nf-number">1</span> |
||||
<p class="error-descr"><%= gettext("If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page.") %></p> |
||||
</div> |
||||
<div class="tx-nf-block"> |
||||
<span class="tx-nf-number">2</span> |
||||
<p class="error-descr"><%= gettext("It could still be in the TX Pool of a different node, waiting to be broadcasted.") %></p> |
||||
</div> |
||||
</div> |
||||
<div class="tx-nf-blocks-row"> |
||||
<div class="tx-nf-block"> |
||||
<span class="tx-nf-number">3</span> |
||||
<p class="error-descr"><%= gettext("During times when the network is busy (i.e during ICOs) it can take a while for your transaction to propagate through the network and for us to index it.") %></p> |
||||
</div> |
||||
<div class="tx-nf-block"> |
||||
<span class="tx-nf-number">4</span> |
||||
<p class="error-descr"><%= gettext("If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information.") %></p> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<a class="error-btn btn-line" href="/"><%= gettext("Back Home") %></a> |
||||
</div> |
||||
</section> |
||||
</div> |
||||
</section> |
@ -0,0 +1,14 @@ |
||||
defmodule Explorer.Repo.Migrations.AddAddressHashIndexToDecompiledSmartContracts do |
||||
use Ecto.Migration |
||||
|
||||
def change do |
||||
execute( |
||||
""" |
||||
CREATE INDEX IF NOT EXISTS decompiled_smart_contracts_address_hash_index ON decompiled_smart_contracts(address_hash); |
||||
""", |
||||
""" |
||||
DROP INDEX IF EXISTS decompiled_smart_contracts_address_hash_index |
||||
""" |
||||
) |
||||
end |
||||
end |
@ -0,0 +1,18 @@ |
||||
defmodule Explorer.Repo.Migrations.AddDecompiledAndVerifiedFlagToAddresses do |
||||
use Ecto.Migration |
||||
|
||||
def change do |
||||
execute( |
||||
""" |
||||
ALTER TABLE addresses |
||||
ADD COLUMN IF NOT EXISTS decompiled BOOLEAN, |
||||
ADD COLUMN IF NOT EXISTS verified BOOLEAN; |
||||
""", |
||||
""" |
||||
ALTER TABLE addresses |
||||
DROP COLUMN IF EXISTS decompiled, |
||||
DROP COLUMN IF EXISTS verified; |
||||
""" |
||||
) |
||||
end |
||||
end |