POA Theme
pull/192/head
Jimmy Lauzau 7 years ago committed by GitHub
commit c80f6b9cb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      apps/explorer/lib/explorer/chain/statistics.ex
  2. 23
      apps/explorer_web/assets/css/_content.scss
  3. 13
      apps/explorer_web/assets/css/_typography.scss
  4. 4
      apps/explorer_web/assets/css/_utilities.scss
  5. 17
      apps/explorer_web/assets/css/app.scss
  6. 27
      apps/explorer_web/assets/css/components/_address_link.scss
  7. 10
      apps/explorer_web/assets/css/components/_all.scss
  8. 67
      apps/explorer_web/assets/css/components/_blocks.scss
  9. 73
      apps/explorer_web/assets/css/components/_chain.scss
  10. 22
      apps/explorer_web/assets/css/components/_dot.scss
  11. 102
      apps/explorer_web/assets/css/components/_header.scss
  12. 42
      apps/explorer_web/assets/css/components/_internal_transaction.scss
  13. 8
      apps/explorer_web/assets/css/components/_nav_tabs.scss
  14. 16
      apps/explorer_web/assets/css/components/_pagination.scss
  15. 16
      apps/explorer_web/assets/css/components/_panels.scss
  16. 36
      apps/explorer_web/assets/css/components/_sidebar.scss
  17. 49
      apps/explorer_web/assets/css/components/_transaction.scss
  18. 2
      apps/explorer_web/assets/css/components/_transaction_log.scss
  19. 156
      apps/explorer_web/assets/css/components/_transactions.scss
  20. 1
      apps/explorer_web/assets/css/explorer/_all.scss
  21. 12
      apps/explorer_web/assets/css/explorer/_button.scss
  22. 32
      apps/explorer_web/assets/css/explorer/_table.scss
  23. 39
      apps/explorer_web/assets/css/theme/_fonts.scss
  24. 12
      apps/explorer_web/assets/css/theme/_neutral_variables.scss
  25. 928
      apps/explorer_web/assets/css/theme/_poa_variables.scss
  26. 145
      apps/explorer_web/assets/css/theme/_theme_ribbon.scss
  27. 2
      apps/explorer_web/assets/css/theme/_variables.scss
  28. 115
      apps/explorer_web/assets/css/tooltip.scss
  29. 3
      apps/explorer_web/assets/js/app.js
  30. 11
      apps/explorer_web/assets/js/lib/card_flip.js
  31. 16
      apps/explorer_web/assets/js/lib/clipboard_buttons.js
  32. 6
      apps/explorer_web/assets/js/lib/market_history_chart.js
  33. 5
      apps/explorer_web/assets/js/lib/tooltip.js
  34. 33
      apps/explorer_web/assets/package-lock.json
  35. 1
      apps/explorer_web/assets/package.json
  36. 22
      apps/explorer_web/assets/static/images/average_time.svg
  37. 20
      apps/explorer_web/assets/static/images/last_block.svg
  38. 5
      apps/explorer_web/assets/static/images/mgi.svg
  39. 1
      apps/explorer_web/assets/static/images/poa_logo.svg
  40. 3
      apps/explorer_web/assets/static/images/purple-block.svg
  41. 25
      apps/explorer_web/assets/static/images/smart_contract.svg
  42. 31
      apps/explorer_web/assets/static/images/token.svg
  43. 15
      apps/explorer_web/lib/explorer_web/templates/address/_link.html.eex
  44. 2
      apps/explorer_web/lib/explorer_web/templates/address/overview.html.eex
  45. 65
      apps/explorer_web/lib/explorer_web/templates/address_internal_transaction/index.html.eex
  46. 99
      apps/explorer_web/lib/explorer_web/templates/address_transaction/index.html.eex
  47. 73
      apps/explorer_web/lib/explorer_web/templates/block/index.html.eex
  48. 246
      apps/explorer_web/lib/explorer_web/templates/block_transaction/index.html.eex
  49. 31
      apps/explorer_web/lib/explorer_web/templates/chain/_blocks.html.eex
  50. 32
      apps/explorer_web/lib/explorer_web/templates/chain/_transactions.html.eex
  51. 121
      apps/explorer_web/lib/explorer_web/templates/chain/show.html.eex
  52. 3
      apps/explorer_web/lib/explorer_web/templates/icons/_block_icon.html.eex
  53. 18
      apps/explorer_web/lib/explorer_web/templates/icons/_guage_icon.html.eex
  54. 17
      apps/explorer_web/lib/explorer_web/templates/icons/_hourglass_icon.html.eex
  55. 22
      apps/explorer_web/lib/explorer_web/templates/icons/_smart_contract.html.eex
  56. 3
      apps/explorer_web/lib/explorer_web/templates/icons/_transaction_icon.html.eex
  57. 61
      apps/explorer_web/lib/explorer_web/templates/layout/_ribbon.html.eex
  58. 60
      apps/explorer_web/lib/explorer_web/templates/layout/_sidebar.html.eex
  59. 37
      apps/explorer_web/lib/explorer_web/templates/layout/_topnav.html.eex
  60. 53
      apps/explorer_web/lib/explorer_web/templates/layout/app.html.eex
  61. 93
      apps/explorer_web/lib/explorer_web/templates/pending_transaction/index.html.eex
  62. 8
      apps/explorer_web/lib/explorer_web/templates/transaction/_link.html.eex
  63. 108
      apps/explorer_web/lib/explorer_web/templates/transaction/index.html.eex
  64. 190
      apps/explorer_web/lib/explorer_web/templates/transaction/overview.html.eex
  65. 52
      apps/explorer_web/lib/explorer_web/templates/transaction/show.html.eex
  66. 35
      apps/explorer_web/lib/explorer_web/templates/transaction_log/index.html.eex
  67. 5
      apps/explorer_web/lib/explorer_web/views/address_transaction_view.ex
  68. 4
      apps/explorer_web/lib/explorer_web/views/address_view.ex
  69. 4
      apps/explorer_web/lib/explorer_web/views/block_transaction_view.ex
  70. 3
      apps/explorer_web/lib/explorer_web/views/icons_view.ex
  71. 3
      apps/explorer_web/lib/explorer_web/views/pending_transaction_view.ex
  72. 20
      apps/explorer_web/lib/explorer_web/views/transaction_view.ex
  73. 314
      apps/explorer_web/priv/gettext/default.pot
  74. 314
      apps/explorer_web/priv/gettext/en/LC_MESSAGES/default.po
  75. 3
      apps/explorer_web/test/explorer_web/controllers/address_internal_transaction_controller_test.exs
  76. 69
      apps/explorer_web/test/explorer_web/controllers/address_transaction_controller_test.exs
  77. 20
      apps/explorer_web/test/explorer_web/controllers/block_transaction_controller_test.exs
  78. 50
      apps/explorer_web/test/explorer_web/controllers/pending_transaction_controller_test.exs
  79. 14
      apps/explorer_web/test/explorer_web/controllers/transaction_controller_test.exs
  80. 280
      apps/explorer_web/test/explorer_web/features/contributor_browsing_test.exs
  81. 6
      apps/explorer_web/test/explorer_web/features/pages/address_page.ex
  82. 17
      apps/explorer_web/test/explorer_web/features/pages/block_list_page.ex
  83. 13
      apps/explorer_web/test/explorer_web/features/pages/block_page.ex
  84. 25
      apps/explorer_web/test/explorer_web/features/pages/home_page.ex
  85. 25
      apps/explorer_web/test/explorer_web/features/pages/transaction_list_page.ex
  86. 23
      apps/explorer_web/test/explorer_web/features/pages/transaction_logs_page.ex
  87. 21
      apps/explorer_web/test/explorer_web/features/pages/transaction_page.ex
  88. 13
      apps/explorer_web/test/explorer_web/features/viewing_addresses_test.exs
  89. 43
      apps/explorer_web/test/explorer_web/features/viewing_blocks_test.exs
  90. 136
      apps/explorer_web/test/explorer_web/features/viewing_transactions_test.exs

@ -110,7 +110,7 @@ defmodule Explorer.Chain.Statistics do
from(
block in Block,
order_by: [desc: block.number],
preload: :transactions,
preload: [:miner, :transactions],
limit: 5
)
@ -119,7 +119,7 @@ defmodule Explorer.Chain.Statistics do
transaction in Transaction,
join: block in assoc(transaction, :block),
order_by: [desc: block.number],
preload: [block: block],
preload: [:from_address, :to_address, block: block],
limit: 5
)

@ -12,13 +12,14 @@
.content-container {
flex-grow: 1;
padding-top: 90px;
padding-top: 85px;
}
.content-header {
display: flex;
position: fixed;
width: 100%;
z-index: 10001;
}
.container {
@ -30,13 +31,26 @@
}
}
@media (max-width: 768px) {
#content {
height: 100%;
}
}
@media (min-width: 768px) {
.content-header {
width: calc(100% - 200px);
width: 100%;
}
.content-container {
padding-top: 155px;
}
.container {
&__section {
&--partitioned {
display: flex;
@ -47,9 +61,10 @@
&__subsection {
flex: 1;
margin-right: 10px;
& + & { margin-left: 5px; }
&-chain {
margin: 10px 5px;
}
}
}
}

@ -1,13 +1,12 @@
body {
color: $gray-500;
font-family: $font-family-sans-serif;
font-size: 13px;
}
h1 {
font-size: 28px;
font-size: 18px;
font-family: $font-family-sans-serif;
font-weight: 600;
}
h2 {
@ -33,8 +32,7 @@ h4 {
}
p {
font-size: 12px;
color: $gray-600;
font-size: 13px;
@media screen and (max-width: 768px) {
font-size: 14px !important;
@ -51,3 +49,6 @@ a {
text-decoration: none;
}
}
.monospace {
font-family: $font-family-monospace;
}

@ -472,11 +472,11 @@ $padding-xs: 5px;
}
&-top {
border-top: 1px solid lighten($gray-300, 42%);
border-top: 1px solid lighten($primary, 40%);
}
&-bottom {
border-bottom: 1px solid lighten($gray-300, 42%);
border-bottom: 1px solid lighten($primary, 40%);
&-bold {
border-bottom: 2px solid lighten($gray-300, 32%);

@ -19,19 +19,34 @@ $fa-font-path: "~@fortawesome/fontawesome-free/webfonts";
@import "node_modules/bootstrap/scss/mixins";
@import "node_modules/bootstrap/scss/root";
@import "node_modules/bootstrap/scss/reboot";
@import "node_modules/bootstrap/scss/grid";
// Bootstrap Components
@import "node_modules/bootstrap/scss/dropdown";
@import "node_modules/bootstrap/scss/transitions";
@import "node_modules/bootstrap/scss/tables";
@import "node_modules/bootstrap/scss/nav";
//Custom theme
@import "theme/theme_ribbon";
@import "theme/fonts";
// Custom SCSS
@import "content";
@import "theme/fonts";
@import "utilities";
@import "typography";
@import "components/panels";
@import "components/header";
@import "components/sidebar";
@import "components/nav_tabs";
@import "components/chain";
@import "components/dot";
@import "components/pagination";
@import "components/address_link";
@import "explorer/button";
@import "explorer/filter";
@import "explorer/table";
@import "tooltip";
:export {
primary: $primary;

@ -0,0 +1,27 @@
.address-link {
border: 1px solid $border-color;
white-space: nowrap;
display: inline-block;
&__font {
font-family: $font-family-monospace;
}
&__type {
padding: 0 3px;
}
&__seperator {
margin: 0 2px;
}
&__copy-button {
background-color: $gray-100;
appearance: none;
border-color: transparent transparent transparent $border-color;
i {
color:$gray-500 !important;
}
}
}

@ -1,14 +1,4 @@
@import "section";
@import "dot";
@import "address";
@import "block";
@import "blocks";
@import "chain";
@import "footer";
@import "header";
@import "internal_transaction";
@import "pagination";
@import "transaction";
@import "transaction_log";
@import "transactions";

@ -1,67 +0,0 @@
.blocks {
@extend %paper;
&__container {
padding: explorer-size(-1) explorer-size(0);
display: flex;
& + & { padding-top: 0; }
&--title { padding-top: explorer-size(0); }
}
&__headline-title,
&__title {
@include explorer-typography("title");
color: explorer-color("slate", "900");
margin: 0;
width: 90%;
}
&__headline-title { line-height: 18px; }
&__table {
@extend %table;
@include explorer-typography("body1");
color: explorer-color("slate", "900");
}
&__column-header {
@include explorer-typography("body1");
&--optional { display: none; }
}
&__column {
&--optional { display: none; }
}
&__link { color: explorer-color("blue", "500"); }
&__pagination {
margin: explorer-size(-1) 0 explorer-size(-2) 0;
.pagination { text-align: right; }
}
}
@media (min-width: $explorer-breakpoint-sm) {
.blocks {
&__column-header {
&--optional { display: table-cell; }
}
&__column {
&--optional { display: table-cell; }
}
}
}
@media (min-width: $explorer-breakpoint-md) {
.blocks {
&__headline {
display: flex;
align-items: center;
justify-content: center;
}
&__headline-title { flex: 1; }
&__pagination {
margin: explorer-size(-1) 0 explorer-size(-2) 0;
}
}
}

@ -1,12 +1,11 @@
.chain {
@extend %paper;
justify-conntent: space-around;
align-items: flex-start;
padding: explorer-size(0) 0;
&__container {
flex: 1;
text-align: center;
&--secondary { display: none; }
&--tertiary { display: none; }
}
&__image {
@ -16,11 +15,12 @@
}
&__title {
@include explorer-typography("caption");
&--data { color: explorer-color("blue", "500"); }
font-size: 13px;
line-height: 24px;
}
}
.container__stats {
@extend %paper;
display: flex;
@ -37,6 +37,20 @@
margin-bottom: explorer-size(-2);
text-align: center;
}
svg {
width: 30px;
}
path {
fill: $primary;
}
.stroke {
stroke: $primary;
}
}
.graph__squares {
@ -45,37 +59,30 @@
display: inline-block;
&--price {
background-color: explorer-color("blue", "500");
background-color: $primary;
}
&--mcap {
background-color: explorer-color("gray", "500");
background-color: $secondary;
}
}
.flex {
.graph-flex {
font-size: 12px;
display: flex;
justify-content: space-between;
}
@media (min-width: $explorer-breakpoint-sm) {
.chain {
&__image {
height: explorer-size(1);
}
&__container {
&--secondary { display: block; }
}
}
margin-top: 25px;
color: $gray-500;
}
@media (min-width: $explorer-breakpoint-md) {
.container__stats {
width: 18%;
width: 15%;
flex-direction: column;
align-content: space-between;
color: $gray-500;
margin: 10px 5px;
img {
display: inline-block;
@ -98,27 +105,3 @@
}
}
}
@media (min-width: $explorer-breakpoint-lg) {
.chain {
&__image {
height: explorer-size(1);
}
&__container {
&--secondary { display: block; }
}
}
}
@media (min-width: $explorer-breakpoint-xl) {
.chain {
&__image {
height: explorer-size(1);
}
&__container {
&--tertiary { display: block; }
}
}
}

@ -1,12 +1,16 @@
%dot {
.transaction {
&__dot {
display: inline-block;
height: map-get(map-get($explorer-typography-styles, "body1"), "line-height") / 4;
width: map-get(map-get($explorer-typography-styles, "body1"), "line-height") / 4;
line-height: map-get(map-get($explorer-typography-styles, "body1"), "line-height");
height: 10px;
width: 10px ;
border-radius: 50%;
}
margin-left: 5px;
vertical-align: baseline;
%dot--pending { background-color: explorer-color("gray", "500"); }
%dot--succeeded { background-color: explorer-color("green", "500"); }
%dot--failed { background-color: explorer-color("red", "500"); }
%dot--warned { background-color: explorer-color("yellow", "500"); }
&--pending { background-color: $gray-500; }
&--success { background-color: $success; }
&--failed { background-color: $danger; }
&--out_of_gas { background-color: $warning; }
}
}

@ -1,65 +1,117 @@
.header {
@extend %explorer-header-min-height;
background: explorer-color("gray", "50");
box-shadow: 0 2px 2px 0 rgba(explorer-color("slate", "900"), 0.16),
0 0px 2px 0 rgba(explorer-color("slate", "900"), 0.12);
background: $gray-100;
box-shadow: 0 2px 2px 0 rgba($gray-900, 0.16),
0 0px 2px 0 rgba($gray-900, 0.12);
top: 0;
left: 0;
right: 0;
width: 100%;
&__container {
}
&__row {
vertical-align: middle;
display: flex;
&--theme {
display: none;
}
&--search {
background-color: $secondary;
padding: 5px;
}
}
&__cell {
&--links {
display: flex;
flex-direction: row-reverse;
padding-right: explorer-size(0);
padding: 15px 25px;
img {
height: 20px;
}
i {
font-size: 1.55em;
color: $gray-500;
&--search {
@include explorer-typography("body1");
padding-left: 8px;
width: 90%;
margin-top: 7px;
}
}
&--search {
font-size: 12px;
width: 75%;
height: 45px;
margin: 3px;
&--search-form {
&-form {
position: relative;
border: 1px solid darken($secondary, 35%);
}
&--search-glass {
height: 16px;
width: 16px;
&-glass {
height: 15px;
width: 15px;
position: absolute;
top: 18px;
left: 16px;
opacity: 0.5;
color: darken($secondary, 45%);
}
&--search-input {
&-input {
width: 100%;
border: none;
background-color: transparent;
height: 50px;
height: 45px;
padding-left: 45px;
&[placeholder] {
text-overflow: ellipsis;
}
}
}
}
}
input::-webkit-input-placeholder {
color: darken($secondary, 75%);
}
@media (max-width: 768px) {
width: 90%;
padding-top: 5px;
.header {
&__row {
&--topnav {
display: none;
}
&--theme {
background-color: $primary;
padding: 5px;
}
}
&--search-input[placeholder] {
text-overflow: ellipsis;
&__cell {
&--search {
padding-left: 8px;
width: 95%;
height: 50px;
margin: 3px 0px;
}
}
}
}
.topnav-dropdown {
background: $gray-100;
width: 85px;
border: none;
transform: translate3d(48px, 35px, 0px) !important;
}
.topnav-dropdown-items {
padding-left: 12px;
}

@ -1,42 +0,0 @@
.internal-transaction {
@extend %paper;
&__container {
padding: explorer-size(-1) explorer-size(0);
& + & { padding-top: 0; }
&--title { padding-top: explorer-size(0); }
}
&__header { @extend %section-header; }
&__heading { @extend %section-header__heading; }
&__subheading { @extend %section-header__subheading; }
&__tabs { @extend %section-tabs; }
&__tab {
@extend %section-tabs__tab;
&--active { @extend %section-tabs__tab--active; }
}
&__attributes { padding: explorer-size(-1) explorer-size(1); }
&__link { color: explorer-color("blue", "500"); }
&__table {
@extend %table;
@include explorer-typography("body1");
color: explorer-color("slate", "900");
}
&__to-address, &__from-address {
max-width: explorer-size(1);
text-overflow: ellipsis;
overflow: hidden;
}
&__column-header { @include explorer-typography("body1"); }
}
@media (min-width: $explorer-breakpoint-lg) {
&__to-address, &__from-address {
max-width: explorer-size(6);
}
}

@ -0,0 +1,8 @@
.nav-tabs {
border-bottom: none;
.nav-link {
border-color: $border-color $border-color $border-color;
margin-right: 5px;
}
}

@ -9,6 +9,7 @@
}
li {
font-size: 13px;
display: inline-block;
margin: 0;
margin-right: explorer-size(-3);
@ -16,20 +17,19 @@
}
&-link {
@include explorer-typography("body1");
display: block;
line-height: 1;
color: lighten(explorer-color("gray", "700"), 10);
color: $gray-400;
text-decoration: none;
padding: explorer-size(-3) explorer-size(-3) + explorer-size(-5);
border: 1px solid lighten(explorer-color("gray", "500"), 10);
border-radius: explorer-size(-5);
padding: 7px 9px;
border: 1px solid $border-color;
border-radius: $border-radius;
&:hover,
&.is-current {
border-color: explorer-color("blue", "500");
background: explorer-color("blue", "500");
color: explorer-color("white");
border-color: $primary;
background: $primary;
color: $white;
}
}
}

@ -0,0 +1,16 @@
.panels {
@extend %paper;
&__container {
padding: 20px;
}
}
.pagination {
text-align: right;
margin: 10px;
}
.monospace {
font-family: $font-family-monospace;
}

@ -9,9 +9,8 @@
z-index: 9999;
height: 100%;
position: fixed;
}
#sidebar .sidebar-header {
.sidebar-header {
background-color: $primary;
color: $gray-800;
height: 66px;
@ -19,6 +18,23 @@
text-align: center;
box-shadow:0 2px 2px 0 rgba(38,50,56,.16), 0 0 2px 0 rgba(38,50,56,.12);
img {
width: 65%;
}
}
.social-media {
display: flex;
width: 100%;
position: absolute;
bottom: 15px;
justify-content: space-evenly;
a {
font-size: 18px;
color: $primary;
}
}
}
#sidebar .menu-items {
@ -37,7 +53,7 @@
cursor: pointer;
img {
width: 35px;
width: 33px;
height: 100%;
margin-right: 5px;
}
@ -51,6 +67,9 @@
}
}
.fa-sitemap, .fa-home {
color: $gray-500;
}
}
#sidebar li {
@ -58,12 +77,14 @@
padding-left: 5px;
line-height: 25px;
}
a[data-toggle="collapse"] {
position: relative;
}
#sidebar--container {
width: 200px;
display: none;
}
#pageSubmenu {
@ -83,6 +104,7 @@ a[data-toggle="collapse"] {
----------------------------------------------------- */
@media (max-width: 768px) {
#sidebar--container {
display: block;
margin-left: -200px;
transform: rotateY(90deg);
height: 100vh;
@ -156,11 +178,3 @@ a[data-toggle="collapse"] {
transform: rotate(-45deg) translate(1px, -1px);
}
}
.social-media {
font-size: 20px;
padding: 5px;
margin-left: 10px;
margin-top: 4px;
color: $gray-500;
}

@ -1,49 +0,0 @@
.transaction {
&__container { @extend %paper; }
&__header { @extend %section-header; }
&__heading { @extend %section-header__heading; }
&__subheading { @extend %section-header__subheading; }
&__tabs { @extend %section-tabs; }
&__tab {
@extend %section-tabs__tab;
&--active { @extend %section-tabs__tab--active; }
}
&__attributes { padding: explorer-size(-1) explorer-size(1); }
&__column { @include explorer-typography("body1"); }
&__item { @extend %section-list__item; }
&__item-key { @extend %section-list__item-key; }
&__item-value { @extend %section-list__item-value; }
&__link { color: explorer-color("blue", "500"); }
&__dot {
@extend %dot;
margin-left: explorer-size(-2);
vertical-align: baseline;
&--pending { @extend %dot--pending; }
&--success { @extend %dot--succeeded; }
&--failed { @extend %dot--failed; }
&--out_of_gas { @extend %dot--warned; }
}
}
@media (min-width: $explorer-breakpoint-lg) {
.transaction {
&__attributes {
display: flex;
align-items: top;
justify-content: top;
}
&__column {
width: explorer-size(1);
flex: 1;
margin-right: explorer-size(1);
& + & { margin-left: explorer-size(1); }
}
&__dot { margin-left: explorer-size(-1); }
}
}

@ -21,7 +21,7 @@
&__link { color: explorer-color("blue", "500"); }
&__table {
@extend %table;
@include explorer-typography("body1");
color: explorer-color("slate", "900");
}

@ -1,156 +0,0 @@
.transactions {
@extend %paper;
&__container {
padding: explorer-size(-1) explorer-size(0);
&__flex {
display: flex;
}
& + & {
padding-top: 0;
}
&--title {
padding-top: explorer-size(0);
}
}
&__headline-title,
&__title {
@include explorer-typography("title");
color: explorer-color("slate", "900");
width: 90%;
}
&__title { margin: 0; }
&__table {
@extend %table;
@include explorer-typography("body1");
color: explorer-color("slate", "900");
& > thead > tr > th.transactions__column-header--status {
border-bottom: 0 none;
}
}
&__column-header { @include explorer-typography("body1"); }
&__column-title {
&--status { display: none; }
}
&__link {
color: explorer-color("blue", "500");
&--truncated {
display: inline-block;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
&--next-page {
@include explorer-typography("body1");
display: block;
text-align: center;
padding: explorer-size(-1) 0;
border-top: 1px solid explorer-color("slate", "50");
}
&--long-hash { max-width: explorer-size(2); }
&--hash { max-width: explorer-size(2); }
}
&__pagination {
margin: explorer-size(-1) 0 explorer-size(-2) 0;
.pagination { text-align: right; }
}
&__column-header {
&--optional { display: none; }
}
&__column {
&--status {
width: explorer-size(-1);
text-align: center;
}
&--optional { display: none; }
}
&__tabs { @extend %section-tabs; }
&__tab {
@extend %section-tabs__tab;
&--active { @extend %section-tabs__tab--active; }
}
&__tab-link {
color: explorer-color("blue", "500");
text-decoration: none;
&--active { color: explorer-color("slate", "900"); }
}
&__hash-container { height: 1rem; }
&__dot {
@extend %dot;
vertical-align: baseline;
&--pending { @extend %dot--pending; }
&--success { @extend %dot--succeeded; }
&--failed { @extend %dot--failed; }
&--out_of_gas { @extend %dot--warned; }
}
}
@media (min-width: $explorer-breakpoint-sm) {
.transactions {
&__link {
&--long-hash { max-width: explorer-size(3); }
&--hash { max-width: explorer-size(1); }
}
}
}
@media (min-width: $explorer-breakpoint-md) {
.transactions {
&__headline {
display: flex;
align-items: center;
justify-content: center;
}
&__headline-title { flex: 1; }
&__pagination {
margin: explorer-size(-1) 0 explorer-size(-2) 0;
}
&__link {
&--long-hash { max-width: explorer-size(4); }
&--hash { max-width: explorer-size(3); }
}
}
}
@media (min-width: $explorer-breakpoint-lg) {
.transactions {
&__link {
&--long-hash { max-width: explorer-size(5); }
&--hash { max-width: explorer-size(4); }
}
}
}
@media (min-width: $explorer-breakpoint-xl) {
.transactions {
&__column-header {
&--optional { display: table-cell; }
}
&__column {
&--optional { display: table-cell; }
}
&__link {
&--long-hash { max-width: explorer-size(5); }
&--hash { max-width: explorer-size(4); }
}
}
}

@ -4,5 +4,4 @@
@import "size";
@import "open_sans";
@import "paper";
@import "table";
@import "typography";

@ -4,7 +4,7 @@
text-align: center;
text-decoration: none;
white-space: nowrap;
padding: 4px 10px;
padding: 8px 10px;
border-radius: .14589803rem;
&--primary {
@ -28,23 +28,23 @@
}
&--secondary {
border: 1px solid $gray-500;
color: $gray-600;
border: 1px solid $primary;
color: $primary;
-webkit-transition: background-color .25s;
transition: background-color .25s;
font-weight: 400;
&:hover,
&:focus {
background-color: explorer-color("gray", "400");
color: explorer-color("gray", "900");;
background-color: $primary;
color: $white;
text-decoration: none;
outline: none !important;
}
}
&--tertiary {
background-color: $gray-500;
border: 1px solid $primary;
color: $gray-800;
-webkit-transition: background-color .25s, color .25s;
transition: background-color .25s, color .25s;

@ -1,23 +1,25 @@
%table {
width: 100%;
max-width: 100%;
margin-bottom: 1rem;
.table-font {
> thead,
> tbody,
> tfoot {
> tr {
> th { text-align: left; }
thead th, td, th {
border-top: none;
border-bottom: none;
}
> th,
> td {
padding: explorer-size(-2) 0;
line-height: 1rem;
i {
color: $gray-500;
}
img {
width: 12px;
}
}
> thead > tr > th {
border-bottom: 2px solid explorer-color("slate", "50");
.table-horizontal {
th {
width: 35%;
}
}
.address-cell {
width: 150px;
}

@ -1,37 +1,2 @@
@font-face {
font-family: 'Roboto';
src: url("/fonts/Roboto/Roboto-Light.ttf");
font-weight: 200;
}
@font-face {
font-family: 'Roboto';
src: url("/fonts/Roboto/Roboto-Regular.ttf");
font-weight: 400;
}
@font-face {
font-family: 'Roboto';
src: url("/fonts/Roboto/Roboto-MediumItalic.ttf");
font-weight: 400;
font-style: italic;
}
@font-face {
font-family: 'Roboto';
src: url("/fonts/Roboto/Roboto-Medium.ttf");
font-weight: 600;
}
@font-face {
font-family: 'Roboto';
src: url("/fonts/Roboto/Roboto-Bold.ttf");
font-weight: 700;
}
@font-face {
font-family: 'Boxed Bold';
src: url("/fonts/boxed-bold.otf");
}
@import url('https://fonts.googleapis.com/css?family=Roboto+Mono');
@import url('https://fonts.googleapis.com/css?family=Roboto');

@ -63,7 +63,7 @@ $colors: map-merge((
), $colors);
$primary: $blue !default;
$secondary: $gray-600 !default;
$secondary: $gray-400 !default;
$success: $green !default;
$info: $cyan !default;
$warning: $yellow !default;
@ -708,13 +708,13 @@ $card-columns-margin: $card-spacer-y !default;
// Tooltips
$tooltip-font-size: $font-size-sm !default;
$tooltip-max-width: 200px !default;
$tooltip-max-width: 70ch !default;
$tooltip-color: $white !default;
$tooltip-bg: $black !default;
$tooltip-bg: darken($secondary, 30%) !default;
$tooltip-border-radius: $border-radius !default;
$tooltip-opacity: .9 !default;
$tooltip-padding-y: .25rem !default;
$tooltip-padding-x: .5rem !default;
$tooltip-opacity: 1 !default;
$tooltip-padding-y: .35rem !default;
$tooltip-padding-x: .6rem !default;
$tooltip-margin: 0 !default;
$tooltip-arrow-width: .8rem !default;

@ -0,0 +1,928 @@
// Variables
//
// Variables should follow the `$component-state-property-size` formula for
// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
//
// Color system
//
// stylelint-disable
$white: #fff !default;
$gray-100: #f8f9fa !default;
$gray-200: #e9ecef !default;
$gray-300: #dee2e6 !default;
$gray-400: #ced4da !default;
$gray-500: #adb5bd !default;
$gray-600: #cdcdcc !default;
$gray-700: #495057 !default;
$gray-800: #343a40 !default;
$gray-900: #212529 !default;
$black: #000 !default;
$grays: () !default;
$grays: map-merge((
"100": $gray-100,
"200": $gray-200,
"300": $gray-300,
"400": $gray-400,
"500": $gray-500,
"600": $gray-600,
"700": $gray-700,
"800": $gray-800,
"900": $gray-900
), $grays);
$blue: #4786ff !default;
$indigo: #5b33a1 !default;
$purple: #9987fc !default;
$pink: #e83e8c !default;
$red: #dc3545 !default;
$orange: #fd7e14 !default;
$yellow: #ffc107 !default;
$green: #61db97 !default;
$teal: !default;
$cyan: #90e1d8 !default;
$colors: () !default;
$colors: map-merge((
"blue": $blue,
"indigo": $indigo,
"purple": $purple,
"pink": $pink,
"red": $red,
"orange": $orange,
"yellow": $yellow,
"green": $green,
"teal": $teal,
"cyan": $cyan,
"white": $white,
"gray": $gray-600,
"gray-dark": $gray-800
), $colors);
$primary: $indigo !default;
$secondary: $cyan !default;
$success: $green !default;
$info: $cyan !default;
$warning: $orange !default;
$danger: $red !default;
$light: $gray-100 !default;
$dark: $gray-800 !default;
$theme-colors: () !default;
$theme-colors: map-merge((
"primary": $primary,
"secondary": $cyan,
"success": $success,
"info": $info,
"warning": $warning,
"danger": $danger,
"light": $light,
"dark": $dark
), $theme-colors);
// stylelint-enable
// Set a specific jump point for requesting color jumps
$theme-color-interval: 8% !default;
// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255.
$yiq-contrasted-threshold: 150 !default;
// Customize the light and dark text colors for use in our YIQ color contrast function.
$yiq-text-dark: $gray-900 !default;
$yiq-text-light: $white !default;
// Options
//
// Quickly modify global styling by enabling or disabling optional features.
$enable-caret: true !default;
$enable-rounded: true !default;
$enable-shadows: false !default;
$enable-gradients: false !default;
$enable-transitions: true !default;
$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS
$enable-grid-classes: true !default;
$enable-print-styles: true !default;
// Spacing
//
// Control the default styling of most Bootstrap elements by modifying these
// variables. Mostly focused on spacing.
// You can add more entries to the $spacers map, should you need more variation.
// stylelint-disable
$spacer: 1rem !default;
$spacers: () !default;
$spacers: map-merge((
0: 0,
1: ($spacer * .25),
2: ($spacer * .5),
3: $spacer,
4: ($spacer * 1.5),
5: ($spacer * 3)
), $spacers);
// This variable affects the `.h-*` and `.w-*` classes.
$sizes: () !default;
$sizes: map-merge((
25: 25%,
50: 50%,
75: 75%,
100: 100%,
auto: auto
), $sizes);
// stylelint-enable
// Body
//
// Settings for the `<body>` element.
$body-bg: $white !default;
$body-color: $gray-900 !default;
// Links
//
// Style anchor elements.
$link-color: theme-color("primary") !default;
$link-decoration: none !default;
$link-hover-color: darken(map-get($theme-colors, primary), 15%) !default;
$link-hover-decoration: underline !default;
// Paragraphs
//
// Style p element.
$paragraph-margin-bottom: 1rem !default;
// Grid breakpoints
//
// Define the minimum dimensions at which your layout will change,
// adapting to different screen sizes, for use in media queries.
$grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px
) !default;
@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
@include _assert-starts-at-zero($grid-breakpoints);
// Grid containers
//
// Define the maximum width of `.container` for different screen sizes.
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1140px
) !default;
@include _assert-ascending($container-max-widths, "$container-max-widths");
// Grid columns
//
// Set the number of columns and specify the width of the gutters.
$grid-columns: 12 !default;
$grid-gutter-width: 30px !default;
// Components
//
// Define common padding and border radius sizes and more.
$line-height-lg: 1.5 !default;
$line-height-sm: 1.5 !default;
$border-width: 1px !default;
$border-color: $gray-300 !default;
$border-radius: .25rem !default;
$border-radius-lg: .3rem !default;
$border-radius-sm: .2rem !default;
$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;
$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;
$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;
$component-active-color: $white !default;
$component-active-bg: theme-color("primary") !default;
$caret-width: .3em !default;
$transition-base: all .2s ease-in-out !default;
$transition-fade: opacity .15s linear !default;
$transition-collapse: height .35s ease !default;
// Fonts
//
// Font, line-height, and color for body text, headings, and more.
// stylelint-disable value-keyword-case
$font-family-sans-serif: Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
$font-family-monospace: "Roboto Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
$font-family-base: $font-family-sans-serif !default;
// stylelint-enable value-keyword-case
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
$font-size-lg: ($font-size-base * 1.25) !default;
$font-size-sm: ($font-size-base * .875) !default;
$font-weight-light: 300 !default;
$font-weight-normal: 400 !default;
$font-weight-bold: 700 !default;
$font-weight-base: $font-weight-normal !default;
$line-height-base: 1.5 !default;
$h1-font-size: $font-size-base * 2.5 !default;
$h2-font-size: $font-size-base * 2 !default;
$h3-font-size: $font-size-base * 1.75 !default;
$h4-font-size: $font-size-base * 1.5 !default;
$h5-font-size: $font-size-base * 1.25 !default;
$h6-font-size: $font-size-base !default;
$headings-margin-bottom: ($spacer / 2) !default;
$headings-font-family: inherit !default;
$headings-font-weight: 500 !default;
$headings-line-height: 1.2 !default;
$headings-color: inherit !default;
$display1-size: 6rem !default;
$display2-size: 5.5rem !default;
$display3-size: 4.5rem !default;
$display4-size: 3.5rem !default;
$display1-weight: 300 !default;
$display2-weight: 300 !default;
$display3-weight: 300 !default;
$display4-weight: 300 !default;
$display-line-height: $headings-line-height !default;
$lead-font-size: ($font-size-base * 1.25) !default;
$lead-font-weight: 300 !default;
$small-font-size: 80% !default;
$text-muted: $gray-600 !default;
$blockquote-small-color: $gray-600 !default;
$blockquote-font-size: ($font-size-base * 1.25) !default;
$hr-border-color: rgba($black, .1) !default;
$hr-border-width: $border-width !default;
$mark-padding: .2em !default;
$dt-font-weight: $font-weight-bold !default;
$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;
$nested-kbd-font-weight: $font-weight-bold !default;
$list-inline-padding: .5rem !default;
$mark-bg: #fcf8e3 !default;
$hr-margin-y: $spacer !default;
// Tables
//
// Customizes the `.table` component with basic values, each used across all table variations.
$table-cell-padding: .75rem !default;
$table-cell-padding-sm: .3rem !default;
$table-bg: transparent !default;
$table-accent-bg: rgba($black, .05) !default;
$table-hover-bg: rgba($black, .075) !default;
$table-active-bg: $table-hover-bg !default;
$table-border-width: $border-width !default;
$table-border-color: $gray-300 !default;
$table-head-bg: $gray-200 !default;
$table-head-color: $gray-700 !default;
$table-dark-bg: $gray-900 !default;
$table-dark-accent-bg: rgba($white, .05) !default;
$table-dark-hover-bg: rgba($white, .075) !default;
$table-dark-border-color: lighten($gray-900, 7.5%) !default;
$table-dark-color: $body-bg !default;
$table-striped-order: odd !default;
$table-caption-color: $text-muted !default;
// Buttons + Forms
//
// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.
$input-btn-padding-y: .375rem !default;
$input-btn-padding-x: .75rem !default;
$input-btn-line-height: $line-height-base !default;
$input-btn-focus-width: .2rem !default;
$input-btn-focus-color: rgba($component-active-bg, .25) !default;
$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;
$input-btn-padding-y-sm: .25rem !default;
$input-btn-padding-x-sm: .5rem !default;
$input-btn-line-height-sm: $line-height-sm !default;
$input-btn-padding-y-lg: .5rem !default;
$input-btn-padding-x-lg: 1rem !default;
$input-btn-line-height-lg: $line-height-lg !default;
$input-btn-border-width: $border-width !default;
// Buttons
//
// For each of Bootstrap's buttons, define text, background, and border color.
$btn-padding-y: $input-btn-padding-y !default;
$btn-padding-x: $input-btn-padding-x !default;
$btn-line-height: $input-btn-line-height !default;
$btn-padding-y-sm: $input-btn-padding-y-sm !default;
$btn-padding-x-sm: $input-btn-padding-x-sm !default;
$btn-line-height-sm: $input-btn-line-height-sm !default;
$btn-padding-y-lg: $input-btn-padding-y-lg !default;
$btn-padding-x-lg: $input-btn-padding-x-lg !default;
$btn-line-height-lg: $input-btn-line-height-lg !default;
$btn-border-width: $input-btn-border-width !default;
$btn-font-weight: $font-weight-normal !default;
$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
$btn-focus-width: $input-btn-focus-width !default;
$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
$btn-disabled-opacity: .65 !default;
$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
$btn-link-disabled-color: $gray-600 !default;
$btn-block-spacing-y: .5rem !default;
// Allows for customizing button radius independently from global border radius
$btn-border-radius: $border-radius !default;
$btn-border-radius-lg: $border-radius-lg !default;
$btn-border-radius-sm: $border-radius-sm !default;
$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
// Forms
$label-margin-bottom: .5rem !default;
$input-padding-y: $input-btn-padding-y !default;
$input-padding-x: $input-btn-padding-x !default;
$input-line-height: $input-btn-line-height !default;
$input-padding-y-sm: $input-btn-padding-y-sm !default;
$input-padding-x-sm: $input-btn-padding-x-sm !default;
$input-line-height-sm: $input-btn-line-height-sm !default;
$input-padding-y-lg: $input-btn-padding-y-lg !default;
$input-padding-x-lg: $input-btn-padding-x-lg !default;
$input-line-height-lg: $input-btn-line-height-lg !default;
$input-bg: $white !default;
$input-disabled-bg: $gray-200 !default;
$input-color: $gray-700 !default;
$input-border-color: $gray-400 !default;
$input-border-width: $input-btn-border-width !default;
$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;
$input-border-radius: $border-radius !default;
$input-border-radius-lg: $border-radius-lg !default;
$input-border-radius-sm: $border-radius-sm !default;
$input-focus-bg: $input-bg !default;
$input-focus-border-color: lighten($component-active-bg, 25%) !default;
$input-focus-color: $input-color !default;
$input-focus-width: $input-btn-focus-width !default;
$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
$input-placeholder-color: $gray-600 !default;
$input-plaintext-color: $body-color !default;
$input-height-border: $input-border-width * 2 !default;
$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;
$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;
$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;
$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;
$input-height-inner-lg: ($font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;
$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;
$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
$form-text-margin-top: .25rem !default;
$form-check-input-gutter: 1.25rem !default;
$form-check-input-margin-y: .3rem !default;
$form-check-input-margin-x: .25rem !default;
$form-check-inline-margin-x: .75rem !default;
$form-check-inline-input-margin-x: .3125rem !default;
$form-group-margin-bottom: 1rem !default;
$input-group-addon-color: $input-color !default;
$input-group-addon-bg: $gray-200 !default;
$input-group-addon-border-color: $input-border-color !default;
$custom-control-gutter: 1.5rem !default;
$custom-control-spacer-x: 1rem !default;
$custom-control-indicator-size: 1rem !default;
$custom-control-indicator-bg: $gray-300 !default;
$custom-control-indicator-bg-size: 50% 50% !default;
$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
$custom-control-indicator-disabled-bg: $gray-200 !default;
$custom-control-label-disabled-color: $gray-600 !default;
$custom-control-indicator-checked-color: $component-active-color !default;
$custom-control-indicator-checked-bg: $component-active-bg !default;
$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default;
$custom-control-indicator-checked-box-shadow: none !default;
$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
$custom-control-indicator-active-color: $component-active-color !default;
$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;
$custom-control-indicator-active-box-shadow: none !default;
$custom-checkbox-indicator-border-radius: $border-radius !default;
$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default;
$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;
$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;
$custom-checkbox-indicator-icon-indeterminate: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default;
$custom-checkbox-indicator-indeterminate-box-shadow: none !default;
$custom-radio-indicator-border-radius: 50% !default;
$custom-radio-indicator-icon-checked: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E"), "#", "%23") !default;
$custom-select-padding-y: .375rem !default;
$custom-select-padding-x: .75rem !default;
$custom-select-height: $input-height !default;
$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
$custom-select-line-height: $input-btn-line-height !default;
$custom-select-color: $input-color !default;
$custom-select-disabled-color: $gray-600 !default;
$custom-select-bg: $input-bg !default;
$custom-select-disabled-bg: $gray-200 !default;
$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
$custom-select-indicator-color: $gray-800 !default;
$custom-select-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E"), "#", "%23") !default;
$custom-select-border-width: $input-btn-border-width !default;
$custom-select-border-color: $input-border-color !default;
$custom-select-border-radius: $border-radius !default;
$custom-select-focus-border-color: $input-focus-border-color !default;
$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;
$custom-select-font-size-sm: 75% !default;
$custom-select-height-sm: $input-height-sm !default;
$custom-select-font-size-lg: 125% !default;
$custom-select-height-lg: $input-height-lg !default;
$custom-range-track-width: 100% !default;
$custom-range-track-height: .5rem !default;
$custom-range-track-cursor: pointer !default;
$custom-range-track-bg: $gray-300 !default;
$custom-range-track-border-radius: 1rem !default;
$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
$custom-range-thumb-width: 1rem !default;
$custom-range-thumb-height: $custom-range-thumb-width !default;
$custom-range-thumb-bg: $component-active-bg !default;
$custom-range-thumb-border: 0 !default;
$custom-range-thumb-border-radius: 1rem !default;
$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;
$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;
$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;
$custom-file-height: $input-height !default;
$custom-file-focus-border-color: $input-focus-border-color !default;
$custom-file-focus-box-shadow: $input-btn-focus-box-shadow !default;
$custom-file-padding-y: $input-btn-padding-y !default;
$custom-file-padding-x: $input-btn-padding-x !default;
$custom-file-line-height: $input-btn-line-height !default;
$custom-file-color: $input-color !default;
$custom-file-bg: $input-bg !default;
$custom-file-border-width: $input-btn-border-width !default;
$custom-file-border-color: $input-border-color !default;
$custom-file-border-radius: $input-border-radius !default;
$custom-file-box-shadow: $input-box-shadow !default;
$custom-file-button-color: $custom-file-color !default;
$custom-file-button-bg: $input-group-addon-bg !default;
$custom-file-text: (
en: "Browse"
) !default;
// Form validation
$form-feedback-margin-top: $form-text-margin-top !default;
$form-feedback-font-size: $small-font-size !default;
$form-feedback-valid-color: theme-color("success") !default;
$form-feedback-invalid-color: theme-color("danger") !default;
// Dropdowns
//
// Dropdown menu container and contents.
$dropdown-min-width: 10rem !default;
$dropdown-padding-y: .5rem !default;
$dropdown-spacer: .125rem !default;
$dropdown-bg: $white !default;
$dropdown-border-color: rgba($black, .15) !default;
$dropdown-border-radius: $border-radius !default;
$dropdown-border-width: $border-width !default;
$dropdown-divider-bg: $gray-200 !default;
$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;
$dropdown-link-color: $gray-900 !default;
$dropdown-link-hover-color: darken($gray-900, 5%) !default;
$dropdown-link-hover-bg: $gray-100 !default;
$dropdown-link-active-color: $component-active-color !default;
$dropdown-link-active-bg: $component-active-bg !default;
$dropdown-link-disabled-color: $gray-600 !default;
$dropdown-item-padding-y: .25rem !default;
$dropdown-item-padding-x: 1.5rem !default;
$dropdown-header-color: $gray-600 !default;
// Z-index master list
//
// Warning: Avoid customizing these values. They're used for a bird's eye view
// of components dependent on the z-axis and are designed to all work together.
$zindex-dropdown: 1000 !default;
$zindex-sticky: 1020 !default;
$zindex-fixed: 1030 !default;
$zindex-modal-backdrop: 1040 !default;
$zindex-modal: 1050 !default;
$zindex-popover: 1060 !default;
$zindex-tooltip: 1070 !default;
// Navs
$nav-link-padding-y: .5rem !default;
$nav-link-padding-x: 1rem !default;
$nav-link-disabled-color: $gray-600 !default;
$nav-tabs-border-color: $gray-300 !default;
$nav-tabs-border-width: $border-width !default;
$nav-tabs-border-radius: $border-radius !default;
$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;
$nav-tabs-link-active-color: $gray-700 !default;
$nav-tabs-link-active-bg: $body-bg !default;
$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;
$nav-pills-border-radius: $border-radius !default;
$nav-pills-link-active-color: $component-active-color !default;
$nav-pills-link-active-bg: $component-active-bg !default;
$nav-divider-color: $gray-200 !default;
$nav-divider-margin-y: ($spacer / 2) !default;
// Navbar
$navbar-padding-y: ($spacer / 2) !default;
$navbar-padding-x: $spacer !default;
$navbar-nav-link-padding-x: .5rem !default;
$navbar-brand-font-size: $font-size-lg !default;
// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
$nav-link-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;
$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;
$navbar-toggler-padding-y: .25rem !default;
$navbar-toggler-padding-x: .75rem !default;
$navbar-toggler-font-size: $font-size-lg !default;
$navbar-toggler-border-radius: $btn-border-radius !default;
$navbar-dark-color: rgba($white, .5) !default;
$navbar-dark-hover-color: rgba($white, .75) !default;
$navbar-dark-active-color: $white !default;
$navbar-dark-disabled-color: rgba($white, .25) !default;
$navbar-dark-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
$navbar-dark-toggler-border-color: rgba($white, .1) !default;
$navbar-light-color: $gray-200 !default;
$navbar-light-hover-color: rgba($black, .7) !default;
$navbar-light-active-color: rgba($black, .9) !default;
$navbar-light-disabled-color: rgba($black, .3) !default;
$navbar-light-toggler-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
$navbar-light-toggler-border-color: rgba($black, .1) !default;
// Pagination
$pagination-padding-y: .5rem !default;
$pagination-padding-x: .75rem !default;
$pagination-padding-y-sm: .25rem !default;
$pagination-padding-x-sm: .5rem !default;
$pagination-padding-y-lg: .75rem !default;
$pagination-padding-x-lg: 1.5rem !default;
$pagination-line-height: 1.25 !default;
$pagination-color: $link-color !default;
$pagination-bg: $white !default;
$pagination-border-width: $border-width !default;
$pagination-border-color: $gray-300 !default;
$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;
$pagination-focus-outline: 0 !default;
$pagination-hover-color: $link-hover-color !default;
$pagination-hover-bg: $gray-200 !default;
$pagination-hover-border-color: $gray-300 !default;
$pagination-active-color: $component-active-color !default;
$pagination-active-bg: $component-active-bg !default;
$pagination-active-border-color: $pagination-active-bg !default;
$pagination-disabled-color: $gray-600 !default;
$pagination-disabled-bg: $white !default;
$pagination-disabled-border-color: $gray-300 !default;
// Jumbotron
$jumbotron-padding: 2rem !default;
$jumbotron-bg: $gray-200 !default;
// Cards
$card-spacer-y: .75rem !default;
$card-spacer-x: 1.25rem !default;
$card-border-width: $border-width !default;
$card-border-radius: $border-radius !default;
$card-border-color: rgba($black, .125) !default;
$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;
$card-cap-bg: rgba($black, .03) !default;
$card-bg: $white !default;
$card-img-overlay-padding: 1.25rem !default;
$card-group-margin: ($grid-gutter-width / 2) !default;
$card-deck-margin: $card-group-margin !default;
$card-columns-count: 3 !default;
$card-columns-gap: 1.25rem !default;
$card-columns-margin: $card-spacer-y !default;
// Tooltips
$tooltip-font-size: $font-size-sm !default;
$tooltip-max-width: 70ch !default;
$tooltip-color: $white !default;
$tooltip-bg: darken($secondary, 25%) !default;
$tooltip-border-radius: $border-radius !default;
$tooltip-opacity: 1 !default;
$tooltip-padding-y: .30rem !default;
$tooltip-padding-x: .6rem !default;
$tooltip-margin: 0 !default;
$tooltip-arrow-width: .8rem !default;
$tooltip-arrow-height: .4rem !default;
$tooltip-arrow-color: $tooltip-bg !default;
// Popovers
$popover-font-size: $font-size-sm !default;
$popover-bg: $white !default;
$popover-max-width: 276px !default;
$popover-border-width: $border-width !default;
$popover-border-color: rgba($black, .2) !default;
$popover-border-radius: $border-radius-lg !default;
$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;
$popover-header-bg: darken($popover-bg, 3%) !default;
$popover-header-color: $headings-color !default;
$popover-header-padding-y: .5rem !default;
$popover-header-padding-x: .75rem !default;
$popover-body-color: $body-color !default;
$popover-body-padding-y: $popover-header-padding-y !default;
$popover-body-padding-x: $popover-header-padding-x !default;
$popover-arrow-width: 1rem !default;
$popover-arrow-height: .5rem !default;
$popover-arrow-color: $popover-bg !default;
$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;
// Badges
$badge-font-size: 75% !default;
$badge-font-weight: $font-weight-bold !default;
$badge-padding-y: .25em !default;
$badge-padding-x: .4em !default;
$badge-border-radius: $border-radius !default;
$badge-pill-padding-x: .6em !default;
// Use a higher than normal value to ensure completely rounded edges when
// customizing padding or font-size on labels.
$badge-pill-border-radius: 10rem !default;
// Modals
// Padding applied to the modal body
$modal-inner-padding: 1rem !default;
$modal-dialog-margin: .5rem !default;
$modal-dialog-margin-y-sm-up: 1.75rem !default;
$modal-title-line-height: $line-height-base !default;
$modal-content-bg: $white !default;
$modal-content-border-color: rgba($black, .2) !default;
$modal-content-border-width: $border-width !default;
$modal-content-border-radius: $border-radius-lg !default;
$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;
$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;
$modal-backdrop-bg: $black !default;
$modal-backdrop-opacity: .5 !default;
$modal-header-border-color: $gray-200 !default;
$modal-footer-border-color: $modal-header-border-color !default;
$modal-header-border-width: $modal-content-border-width !default;
$modal-footer-border-width: $modal-header-border-width !default;
$modal-header-padding: 1rem !default;
$modal-lg: 800px !default;
$modal-md: 500px !default;
$modal-sm: 300px !default;
$modal-transition: transform .3s ease-out !default;
// Alerts
//
// Define alert colors, border radius, and padding.
$alert-padding-y: .75rem !default;
$alert-padding-x: 1.25rem !default;
$alert-margin-bottom: 1rem !default;
$alert-border-radius: $border-radius !default;
$alert-link-font-weight: $font-weight-bold !default;
$alert-border-width: $border-width !default;
$alert-bg-level: -10 !default;
$alert-border-level: -9 !default;
$alert-color-level: 6 !default;
// Progress bars
$progress-height: 1rem !default;
$progress-font-size: ($font-size-base * .75) !default;
$progress-bg: $gray-200 !default;
$progress-border-radius: $border-radius !default;
$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;
$progress-bar-color: $white !default;
$progress-bar-bg: theme-color("primary") !default;
$progress-bar-animation-timing: 1s linear infinite !default;
$progress-bar-transition: width .6s ease !default;
// List group
$list-group-bg: $white !default;
$list-group-border-color: rgba($black, .125) !default;
$list-group-border-width: $border-width !default;
$list-group-border-radius: $border-radius !default;
$list-group-item-padding-y: .75rem !default;
$list-group-item-padding-x: 1.25rem !default;
$list-group-hover-bg: $gray-100 !default;
$list-group-active-color: $component-active-color !default;
$list-group-active-bg: $component-active-bg !default;
$list-group-active-border-color: $list-group-active-bg !default;
$list-group-disabled-color: $gray-600 !default;
$list-group-disabled-bg: $list-group-bg !default;
$list-group-action-color: $gray-700 !default;
$list-group-action-hover-color: $list-group-action-color !default;
$list-group-action-active-color: $body-color !default;
$list-group-action-active-bg: $gray-200 !default;
// Image thumbnails
$thumbnail-padding: .25rem !default;
$thumbnail-bg: $body-bg !default;
$thumbnail-border-width: $border-width !default;
$thumbnail-border-color: $gray-300 !default;
$thumbnail-border-radius: $border-radius !default;
$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;
// Figures
$figure-caption-font-size: 90% !default;
$figure-caption-color: $gray-600 !default;
// Breadcrumbs
$breadcrumb-padding-y: .75rem !default;
$breadcrumb-padding-x: 1rem !default;
$breadcrumb-item-padding: .5rem !default;
$breadcrumb-margin-bottom: 1rem !default;
$breadcrumb-bg: $gray-200 !default;
$breadcrumb-divider-color: $gray-600 !default;
$breadcrumb-active-color: $gray-600 !default;
$breadcrumb-divider: quote("/") !default;
$breadcrumb-border-radius: $border-radius !default;
// Carousel
$carousel-control-color: $white !default;
$carousel-control-width: 15% !default;
$carousel-control-opacity: .5 !default;
$carousel-indicator-width: 30px !default;
$carousel-indicator-height: 3px !default;
$carousel-indicator-spacer: 3px !default;
$carousel-indicator-active-bg: $white !default;
$carousel-caption-width: 70% !default;
$carousel-caption-color: $white !default;
$carousel-control-icon-width: 20px !default;
$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default;
$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default;
$carousel-transition: transform .6s ease !default; // Define transform transition first if using multiple transitons (e.g., `transform 2s ease, opacity .5s ease-out`)
// Close
$close-font-size: $font-size-base * 1.5 !default;
$close-font-weight: $font-weight-bold !default;
$close-color: $black !default;
$close-text-shadow: 0 1px 0 $white !default;
// Code
$code-font-size: 87.5% !default;
$code-color: $pink !default;
$kbd-padding-y: .2rem !default;
$kbd-padding-x: .4rem !default;
$kbd-font-size: $code-font-size !default;
$kbd-color: $white !default;
$kbd-bg: $gray-900 !default;
$pre-color: $gray-900 !default;
$pre-scrollable-max-height: 340px !default;
// Printing
$print-page-size: a3 !default;
$print-body-min-width: map-get($grid-breakpoints, "lg") !default;

@ -0,0 +1,145 @@
.theme__ribbon {
width: 155px;
height: 160px;
position: absolute;
right: 8%;
color: white;
padding: 10px;
z-index: 9999;
perspective: 800px;
backface-visibility: hidden;
outline: 1px solid transparent;
@media (max-width: 890px) {
right: 1%;
}
@media (max-width: 768px) {
display: none;
}
&--logo {
width: 100%;
padding: 35px 15px;
}
&--social {
display: flex;
position: absolute;
bottom: 0;
margin-bottom: 2px;
justify-content: center;
width: 100%;
&-icons {
display: flex;
font-size: 15px;
padding: 8px;
color: lighten($primary, 25%);
justify-content: space-between;
}
&-divider {
width: 1px;
padding: 0px !important;
background: lighten($primary, 25%);
}
}
}
.flex {
display: flex;
justify-content: center;
position: absolute;
bottom: 5px;
left: 1px;
margin-left: 8px;
}
//Ribbon FLip Syles
.card {
width: 100%;
height: 100%;
transition: all .5s;
backface-visibility: hidden;
position: absolute;
top: 0px;
left: 0px;
outline: 1px solid transparent;
}
.front {
z-index: 2;
background-color: $primary;
outline: 1px solid transparent;
box-shadow: 0 2px 2px 0 rgba(#212529, 0.16),
0 0px 2px 0 rgba(#212529, 0.12);
}
.back {
z-index: 1;
transform: rotateY(-180deg);
background-color: $primary;
outline: 1px solid transparent;
box-shadow: 0 2px 2px 0 rgba(#212529, 0.16),
0 0px 2px 0 rgba(#212529, 0.12);
& .switch-network {
font-size: 12px;
padding: 3px;
background-color: lighten($primary, 25%);
width: 115px;
}
& .switch-network-menu {
width: 115px;
}
& .switch-network-item {
padding: 3px 5px;
}
& .back-arrow {
position: absolute;
bottom: 0;
margin: 0px 0px 10px -10px;
}
}
.rotatecard, .rotatecardback{
z-index: 3;
cursor: pointer;
background: none;
border: none;
padding: 0px;
&:focus {
outline: none;
}
}
.flipped{
z-index: 1;
transform: rotateY(180deg);
backface-visibility: hidden;
outline: 1px solid transparent;
}
.backflip {
z-index: 2;
transform: rotateY(0deg);
transition: all .5s;
outline: 1px solid transparent;
}
.change-color svg {
width: 20px;
height: 20px;
path {
fill: $primary;
}
}

@ -1 +1 @@
@import "neutral-variables";
@import "poa_variables";

@ -0,0 +1,115 @@
// Base class
.tooltip {
position: absolute;
z-index: $zindex-tooltip;
display: block;
margin: $tooltip-margin;
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
// So reset our font and text properties to avoid inheriting weird values.
@include reset-text();
font-size: $tooltip-font-size;
// Allow breaking very long words so they don't overflow the tooltip's bounds
word-wrap: break-word;
opacity: 0;
&.show { opacity: $tooltip-opacity; }
.arrow {
position: absolute;
display: block;
width: $tooltip-arrow-width;
height: $tooltip-arrow-height;
&::before {
position: absolute;
content: "";
border-color: transparent;
border-style: solid;
}
}
}
.bs-tooltip-top {
padding: $tooltip-arrow-height 0;
.arrow {
bottom: 0;
&::before {
top: 0;
border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
border-top-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-right {
padding: 0 $tooltip-arrow-height;
.arrow {
left: 0;
width: $tooltip-arrow-height;
height: $tooltip-arrow-width;
&::before {
right: 0;
border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
border-right-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-bottom {
padding: $tooltip-arrow-height 0;
.arrow {
top: 0;
&::before {
bottom: 0;
border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
border-bottom-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-left {
padding: 0 $tooltip-arrow-height;
.arrow {
right: 0;
width: $tooltip-arrow-height;
height: $tooltip-arrow-width;
&::before {
left: 0;
border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
border-left-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-auto {
&[x-placement^="top"] {
@extend .bs-tooltip-top;
}
&[x-placement^="right"] {
@extend .bs-tooltip-right;
}
&[x-placement^="bottom"] {
@extend .bs-tooltip-bottom;
}
&[x-placement^="left"] {
@extend .bs-tooltip-left;
}
}
// Wrapper for the tooltip content
.tooltip-inner {
max-width: $tooltip-max-width;
padding: $tooltip-padding-y $tooltip-padding-x;
color: $tooltip-color;
text-align: center;
background-color: $tooltip-bg;
@include border-radius($tooltip-border-radius);
}

@ -21,3 +21,6 @@ import 'bootstrap'
// import socket from "./socket"
import './lib/sidebar'
import './lib/market_history_chart'
import './lib/card_flip'
import './lib/tooltip'
import './lib/clipboard_buttons'

@ -0,0 +1,11 @@
import $ from 'jquery'
$('.rotatecard').click(function () {
$(this).parents('.front').toggleClass('flipped')
$(this).parentsUntil('.theme__ribbon').next('.back').toggleClass('backflip')
})
$('.rotatecardback').click(function () {
$(this).parentsUntil('.panel').prev('.front').toggleClass('flipped')
$(this).parents('.back').toggleClass('backflip')
})

@ -0,0 +1,16 @@
import ClipboardJS from 'clipboard'
import $ from 'jquery'
const clipboard = new ClipboardJS('[data-clipboard-text]')
clipboard.on('success', ({trigger}) => {
const copyButton = $(trigger)
copyButton.tooltip({
title: 'Copied!',
trigger: 'click',
placement: 'top'
}).tooltip('show')
setTimeout(() => {
copyButton.tooltip('dispose')
}, 1000)
})

@ -71,9 +71,13 @@ function createMarketHistoryChart (ctx) {
}, {
id: 'marketCap',
position: 'right',
gridLines: {
display: false
},
ticks: {
callback: (value, index, values) => formatMarketCap(value),
maxTicksLimit: 6
maxTicksLimit: 6,
drawOnChartArea: false
}
}]
},

@ -0,0 +1,5 @@
import $ from 'jquery'
$(function () {
$('[data-toggle="tooltip"]').tooltip()
})

@ -1862,6 +1862,16 @@
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
"dev": true
},
"clipboard": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz",
"integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==",
"requires": {
"good-listener": "1.2.2",
"select": "1.1.2",
"tiny-emitter": "2.0.2"
}
},
"cliui": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
@ -2611,6 +2621,11 @@
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
},
"delegate": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
"integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@ -4505,6 +4520,14 @@
"minimatch": "3.0.4"
}
},
"good-listener": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
"integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
"requires": {
"delegate": "3.2.0"
}
},
"got": {
"version": "8.3.1",
"resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz",
@ -8867,6 +8890,11 @@
}
}
},
"select": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
"integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
},
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
@ -9609,6 +9637,11 @@
"setimmediate": "1.0.5"
}
},
"tiny-emitter": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz",
"integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow=="
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",

@ -21,6 +21,7 @@
"@fortawesome/fontawesome-free": "^5.1.0-4",
"bootstrap": "^4.1.0",
"chart.js": "^2.7.2",
"clipboard": "^2.0.1",
"humps": "^2.0.1",
"jquery": "^3.3.1",
"moment": "^2.22.1",

@ -1,4 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" width="68" height="68">
<path fill="#4786FF" fill-rule="evenodd" d="M34 68C15.222 68 0 52.778 0 34S15.222 0 34 0s34 15.222 34 34-15.222 34-34 34zm0-66C16.327 2 2 16.327 2 34c0 17.673 14.327 32 32 32 17.673 0 32-14.327 32-32C66 16.327 51.673 2 34 2z"/>
<path fill="#4786FF" fill-rule="evenodd" d="M34 60C19.641 60 8 48.359 8 34a1 1 0 0 1 2 0c0 13.255 10.745 24 24 24s24-10.745 24-24a1 1 0 0 1 2 0c0 14.359-11.641 26-26 26zm22.151-37.634l-3.464 2a1 1 0 0 1-1-1.732l3.464-2a1 1 0 0 1 1 1.732zm-10.785-6.053a1 1 0 1 1-1.732-1l2-3.464a1 1 0 0 1 1.732 1l-2 3.464zM34 49a8 8 0 0 1-8-8c0-4.079 3.055-7.438 7-7.931V19a1 1 0 0 1 2 0v14.069c3.945.493 7 3.852 7 7.931a8 8 0 0 1-8 8zm0-14a6 6 0 1 0 0 12 6 6 0 0 0 0-12zm0 10a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm0-6a2 2 0 1 0-.001 3.999A2 2 0 0 0 34 39zm0-25a1 1 0 0 1-1-1V9a1 1 0 0 1 2 0v4a1 1 0 0 1-1 1zm-10 2.68a1 1 0 0 1-1.366-.367l-2-3.464a1 1 0 0 1 1.732-1l2 3.464c.276.479.112 1.09-.366 1.367zm-8.687 7.686l-3.464-2a1 1 0 0 1 1-1.732l3.464 2a1 1 0 1 1-1 1.732z"/>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 68 68" style="enable-background:new 0 0 68 68;" xml:space="preserve">
<style type="text/css">
.st0{fill:#BAC4CB;stroke:#BAC4CB;stroke-width:3.3377;stroke-miterlimit:10;}
.st1{fill:#BAC4CB;stroke:#BAC4CB;stroke-width:1.6287;stroke-miterlimit:10;}
</style>
<path class="st0" d="M33.9,66C16.1,66,1.8,51.6,1.8,33.9S16.1,1.8,33.9,1.8S66,16.1,66,33.9S51.6,66,33.9,66z M33.9,3.6
C17.2,3.6,3.6,17.2,3.6,33.9s13.5,30.2,30.2,30.2s30.2-13.5,30.2-30.2S50.6,3.6,33.9,3.6z"/>
<path class="st1" d="M54.8,22.9l-3.3,1.9c-0.5,0.3-1,0.1-1.3-0.4c-0.3-0.4-0.1-1,0.3-1.3l3.3-1.9c0.5-0.3,1-0.1,1.3,0.4
C55.4,22,55.3,22.6,54.8,22.9z M44.6,17.2c-0.3,0.5-0.8,0.6-1.3,0.4c-0.5-0.3-0.6-0.8-0.4-1.3c0,0,0,0,0,0l1.9-3.3
c0.3-0.5,0.8-0.6,1.3-0.3c0.4,0.3,0.6,0.8,0.3,1.3L44.6,17.2z M33.8,60c-6.2,0-11.3-5.1-11.3-11.3c0-5.8,4.3-10.5,9.9-11.2V21.9
c0-0.8,0.6-1.4,1.4-1.4c0.8,0,1.4,0.6,1.4,1.4v15.6c5.6,0.7,9.9,5.4,9.9,11.2C45.1,54.9,40,60,33.8,60z M33.8,40.2
c-4.8,0-8.7,3.9-8.7,8.7s3.9,8.7,8.7,8.7s8.7-3.9,8.7-8.7S38.6,40.2,33.8,40.2z M33.9,46.6c-1.3,0-2.4,1-2.4,2.3
c0,1.3,1,2.4,2.3,2.4c0,0,0.1,0,0.1,0c1.3,0,2.3-1.1,2.3-2.4C36.2,47.7,35.1,46.7,33.9,46.6z M33.9,15c-0.5,0-0.9-0.4-0.9-0.9v-3.8
c0-0.5,0.4-0.9,0.9-0.9s0.9,0.4,0.9,0.9V14C34.8,14.6,34.4,15,33.9,15z M24.4,17.5c-0.5,0.3-1,0.1-1.3-0.3c0,0,0,0,0,0l-1.9-3.3
c-0.3-0.5-0.1-1,0.4-1.3c0.4-0.3,1-0.1,1.3,0.3l1.9,3.3C25,16.7,24.9,17.2,24.4,17.5z M16.2,24.8l-3.3-1.9c-0.5-0.3-0.6-0.8-0.3-1.3
c0.3-0.4,0.8-0.6,1.3-0.3l3.3,1.9c0.5,0.3,0.6,0.8,0.4,1.3C17.3,24.9,16.7,25,16.2,24.8C16.2,24.8,16.2,24.8,16.2,24.8z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,3 +1,19 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34" height="68">
<path fill="#4786FF" fill-rule="evenodd" d="M29.931 44.657A.98.98 0 0 1 30 45v13h3a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1v-8a1 1 0 0 1 1-1h3V45a.98.98 0 0 1 .069-.343c.495-4.824 3.633-8.86 7.938-10.654a13.005 13.005 0 0 1-7.924-10.607A1.006 1.006 0 0 1 4 23V10H1a1 1 0 0 1-1-1V1a1 1 0 0 1 1-1h32a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-3v13c0 .141-.031.274-.083.396a13.005 13.005 0 0 1-7.924 10.607c4.305 1.794 7.443 5.83 7.938 10.654zM2 66h30v-2H2v2zm0-6v2h30v-2H2zM2 2v2h30V2H2zm30 6V6H2v2h30zm-4 14V10H6v12c0 6.075 4.925 11 11 11s11-4.925 11-11zm0 24c0-6.075-4.925-11-11-11S6 39.925 6 46v12h22V46zm-5 7a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm-4 2a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0-4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm-2-4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm-2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm-4 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm4-2a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm1-24a1 1 0 1 1 2 0 1 1 0 0 1-2 0zm3-5a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm-4 2a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 34 68" style="enable-background:new 0 0 34 68;" xml:space="preserve">
<style type="text/css">
.st0{fill:#BAC4CB;}
</style>
<path class="st0" d="M29.7,44.2c0,0.1,0.1,0.2,0.1,0.3v12.8h2.9c0.5,0,1,0.4,1,1v7.9c0,0.5-0.4,1-1,1H1.2c-0.5,0-1-0.4-1-1v-7.9
c0-0.5,0.4-1,1-1h2.9V44.6c0-0.1,0-0.2,0.1-0.3c0.5-4.7,3.6-8.7,7.8-10.5C7.7,32,4.8,28,4.3,23.3c-0.1-0.1-0.1-0.3-0.1-0.4V10.2H1.2
c-0.5,0-1-0.4-1-1V1.3c0-0.5,0.4-1,1-1h31.4c0.5,0,1,0.4,1,1v7.9c0,0.5-0.4,1-1,1h-2.9v12.8c0,0.1,0,0.3-0.1,0.4
c-0.5,4.6-3.5,8.6-7.8,10.4C26.1,35.5,29.2,39.5,29.7,44.2z M2.3,6h29.5V4.5H2.3V6z M2.3,63.3h29.5v-1.5H2.3V63.3z M25.6,21.9v-9.4
H8.3v9.4c0,4.8,3.9,8.6,8.6,8.6S25.6,26.6,25.6,21.9z M26.1,45.6c0-5-4.1-9.1-9.1-9.1s-9.1,4.1-9.1,9.1v9.9h18.2V45.6z M22,53.8
c-1.1,0-2.1-0.9-2.1-2.1s0.9-2.1,2.1-2.1s2.1,0.9,2.1,2.1S23.2,53.8,22,53.8z M16.9,44.5c-1.1,0-2.1-0.9-2.1-2.1
c0-1.1,0.9-2.1,2.1-2.1s2.1,0.9,2.1,2.1C19,43.6,18.1,44.5,16.9,44.5z M11.6,53.8c-1.1,0-2.1-0.9-2.1-2.1s0.9-2.1,2.1-2.1
s2.1,0.9,2.1,2.1S12.8,53.8,11.6,53.8z M17.1,53.8c-1.1,0-2.1-0.9-2.1-2.1s0.9-2.1,2.1-2.1s2.1,0.9,2.1,2.1S18.2,53.8,17.1,53.8z
M15.4,27.9c0-1,0.8-1.8,1.8-1.8s1.8,0.8,1.8,1.8s-0.8,1.8-1.8,1.8S15.4,28.9,15.4,27.9z M20.7,22.1c1,0,1.8,0.8,1.8,1.8
s-0.8,1.8-1.8,1.8s-1.8-0.8-1.8-1.8S19.7,22.1,20.7,22.1z M13.7,25.6c-1,0-1.8-0.8-1.8-1.8s0.8-1.8,1.8-1.8s1.8,0.8,1.8,1.8
S14.6,25.6,13.7,25.6z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1014 B

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="490" height="490">
<path fill="none" stroke="#000" stroke-width="36" stroke-linecap="round"
d="m280,278a153,153 0 1,0-2,2l170,170m-91-117 110,110-26,26-110-110"/>
</svg>

Before

Width:  |  Height:  |  Size: 256 B

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 784.802 295.795"><defs><style>.cls-1{fill:#fff;}</style></defs><title>poa_logo</title><path class="cls-1" d="M396.219,268.878c-67.974,3.629-128.341-52.06-131.534-121.338-3.13-67.91,51.1-129.093,117.646-132.732,73.163-4,132.938,49.141,137.089,121.875C523.353,205.623,467.972,265.048,396.219,268.878Z"/><path class="cls-1" d="M11.9,141.308c0-34.343.283-68.69-.17-103.027C11.59,27.8,15.167,23.995,25.764,24.09c44.441.4,88.889-.137,133.33.255,49.985.441,91.942,43.057,93.616,94.385,1.574,48.276-37.962,93.594-85.93,98.278a242.125,242.125,0,0,1-24.193,1.036c-7.854-.023-11.592,2.835-12.116,11.258-1.95,31.322-2.173,31.308-33.906,31.308q-33.333,0-66.666-.008c-17.414-.022-17.988-.582-18-17.477Q11.875,192.216,11.9,141.308Z"/><path class="cls-1" d="M633.094,260.608q-63.645,0-127.289-.025c-15.248-.026-18.476-5.46-10.744-18.3Q559.1,135.943,623.33,29.714c7.883-13.036,13.493-12.908,21.482.331q63.82,105.768,127.5,211.619c8.277,13.763,5.324,18.9-10.719,18.921Q697.345,260.685,633.094,260.608Z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="24">
<path fill="#cdcdcc" fill-rule="evenodd" d="M21.998 17.936c0 .006-.004.011-.004.017.009.185-.013.374-.105.547a.892.892 0 0 1-.816.485c-.019.002-.036.011-.055.011l-9.467 4.887a1.11 1.11 0 0 1-.519.111A.113.113 0 0 1 11 24c-.011 0-.021-.006-.032-.006-.052 0-.104-.009-.156-.014-.018-.004-.038-.001-.056-.005a.984.984 0 0 1-.308-.092l-9.425-4.888c-.008 0-.015.005-.023.005-.03 0-.055-.013-.084-.015a.895.895 0 0 1-.805-.485 1.038 1.038 0 0 1-.105-.547c-.002-.01-.006-.019-.006-.03v-.046c.001-.031-.005-.061 0-.092V6.188c-.005-.031.001-.061 0-.092v-.019l.002-.013c0-.043.004-.086.01-.128a.788.788 0 0 1 .114-.459.98.98 0 0 1 .407-.336.928.928 0 0 1 .18-.079c.038-.01.074-.017.112-.024.053-.01.103-.03.157-.034L10.448.117c.156-.081.323-.103.49-.105C10.96.011 10.978 0 11 0s.04.011.062.012c.167.002.334.024.489.104l9.537 4.902c.179.021.343.09.483.199a.613.613 0 0 1 .058.042c.042.037.08.073.116.116.042.044.095.078.129.131.072.111.098.23.109.349A.826.826 0 0 1 22 6.16v11.652c.005.031-.001.062 0 .093v.018l-.002.013zM2 16.159l1.633-1.025c.44-.276 1.002-.112 1.256.366s.103 1.09-.337 1.366l-1.565.983L10 21.486v-8.645l-1.633 1.025c-.44.276-1.002.112-1.256-.366s-.103-1.09.337-1.366l1.573-.988L2 7.522v8.637zM12 2.492V4a1 1 0 0 1-2 0V2.503L3.226 6 10 9.497V8a1 1 0 0 1 2 0v1.508L18.825 6 12 2.492zm8 5.05l-7.017 3.606 1.569.986c.44.276.591.888.337 1.366-.254.478-.816.642-1.256.366L12 12.841v8.656l7.037-3.633-1.589-.998c-.44-.276-.591-.888-.337-1.366.254-.478.816-.642 1.256-.366L20 16.159V7.542z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 22 24" style="enable-background:new 0 0 22 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#BAC4CB;}
.st1{fill:none;stroke:#BAC4CB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st2{fill:none;stroke:#BAC4CB;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<path class="st0" d="M-1.8,17.9C-1.8,17.9-1.8,17.9-1.8,17.9c0,0.2,0,0.4-0.1,0.6C-2.1,18.8-2.4,19-2.7,19c0,0,0,0-0.1,0l-9.5,4.9
c-0.2,0.1-0.3,0.1-0.5,0.1c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0-0.1,0-0.2,0c0,0,0,0-0.1,0c-0.1,0-0.2,0-0.3-0.1l-9.4-4.9c0,0,0,0,0,0
c0,0-0.1,0-0.1,0c-0.3,0-0.6-0.2-0.8-0.5c-0.1-0.2-0.1-0.4-0.1-0.5c0,0,0,0,0,0v0c0,0,0-0.1,0-0.1V6.2c0,0,0-0.1,0-0.1v0l0,0
c0,0,0-0.1,0-0.1c0-0.2,0-0.3,0.1-0.5c0.1-0.1,0.2-0.3,0.4-0.3c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0l9.5-4.9
C-13.2,0-13,0-12.9,0c0,0,0,0,0.1,0s0,0,0.1,0c0.2,0,0.3,0,0.5,0.1L-2.7,5c0.2,0,0.3,0.1,0.5,0.2c0,0,0,0,0.1,0c0,0,0.1,0.1,0.1,0.1
c0,0,0.1,0.1,0.1,0.1c0.1,0.1,0.1,0.2,0.1,0.3c0,0.1,0,0.2,0,0.3v11.7C-1.8,17.8-1.8,17.9-1.8,17.9L-1.8,17.9L-1.8,17.9z
M-21.8,16.2l1.6-1c0.4-0.3,1-0.1,1.3,0.4s0.1,1.1-0.3,1.4l-1.6,1l7,3.6v-8.6l-1.6,1c-0.4,0.3-1,0.1-1.3-0.4
c-0.3-0.5-0.1-1.1,0.3-1.4l1.6-1l-7-3.6V16.2z M-11.8,2.5V4c0,0.6-0.4,1-1,1s-1-0.4-1-1V2.5L-20.6,6l6.8,3.5V8c0-0.6,0.4-1,1-1
s1,0.4,1,1v1.5L-5,6L-11.8,2.5z M-3.8,7.5l-7,3.6l1.6,1c0.4,0.3,0.6,0.9,0.3,1.4s-0.8,0.6-1.3,0.4l-1.6-1v8.7l7-3.6l-1.6-1
C-6.8,16.6-7,16-6.7,15.5s0.8-0.6,1.3-0.4l1.6,1C-3.8,16.2-3.8,7.5-3.8,7.5z"/>
<polygon class="st1" points="18.9,21.4 3.2,21.4 3.2,1.8 15.5,1.8 17.3,3.5 18.9,5.2 "/>
<polyline class="st1" points="18.8,7.4 12,8.6 12.2,2 "/>
<line class="st2" x1="6.2" y1="11.9" x2="15.8" y2="11.9"/>
<line class="st2" x1="6.2" y1="15" x2="15.8" y2="15"/>
<line class="st2" x1="6.2" y1="18.2" x2="15.8" y2="18.2"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 22 24" style="enable-background:new 0 0 22 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#BAC4CB;}
.st1{fill:none;stroke:#BAC4CB;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st2{fill:none;stroke:#BAC4CB;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<path class="st0" d="M-1.8,17.9C-1.8,17.9-1.8,17.9-1.8,17.9c0,0.2,0,0.4-0.1,0.6C-2.1,18.8-2.4,19-2.7,19c0,0,0,0-0.1,0l-9.5,4.9
c-0.2,0.1-0.3,0.1-0.5,0.1c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0-0.1,0-0.2,0c0,0,0,0-0.1,0c-0.1,0-0.2,0-0.3-0.1l-9.4-4.9c0,0,0,0,0,0
c0,0-0.1,0-0.1,0c-0.3,0-0.6-0.2-0.8-0.5c-0.1-0.2-0.1-0.4-0.1-0.5c0,0,0,0,0,0v0c0,0,0-0.1,0-0.1V6.2c0,0,0-0.1,0-0.1v0l0,0
c0,0,0-0.1,0-0.1c0-0.2,0-0.3,0.1-0.5c0.1-0.1,0.2-0.3,0.4-0.3c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0l9.5-4.9
C-13.2,0-13,0-12.9,0c0,0,0,0,0.1,0s0,0,0.1,0c0.2,0,0.3,0,0.5,0.1L-2.7,5c0.2,0,0.3,0.1,0.5,0.2c0,0,0,0,0.1,0c0,0,0.1,0.1,0.1,0.1
c0,0,0.1,0.1,0.1,0.1c0.1,0.1,0.1,0.2,0.1,0.3c0,0.1,0,0.2,0,0.3v11.7C-1.8,17.8-1.8,17.9-1.8,17.9L-1.8,17.9L-1.8,17.9z
M-21.8,16.2l1.6-1c0.4-0.3,1-0.1,1.3,0.4s0.1,1.1-0.3,1.4l-1.6,1l7,3.6v-8.6l-1.6,1c-0.4,0.3-1,0.1-1.3-0.4
c-0.3-0.5-0.1-1.1,0.3-1.4l1.6-1l-7-3.6V16.2z M-11.8,2.5V4c0,0.6-0.4,1-1,1s-1-0.4-1-1V2.5L-20.6,6l6.8,3.5V8c0-0.6,0.4-1,1-1
s1,0.4,1,1v1.5L-5,6L-11.8,2.5z M-3.8,7.5l-7,3.6l1.6,1c0.4,0.3,0.6,0.9,0.3,1.4s-0.8,0.6-1.3,0.4l-1.6-1v8.7l7-3.6l-1.6-1
C-6.8,16.6-7,16-6.7,15.5s0.8-0.6,1.3-0.4l1.6,1C-3.8,16.2-3.8,7.5-3.8,7.5z"/>
<polygon class="st1" points="41.7,21.4 26,21.4 26,1.8 38.3,1.8 40,3.5 41.7,5.2 "/>
<polyline class="st1" points="41.6,7.4 34.8,8.6 34.9,2 "/>
<line class="st2" x1="29" y1="11.9" x2="38.6" y2="11.9"/>
<line class="st2" x1="29" y1="15" x2="38.6" y2="15"/>
<line class="st2" x1="29" y1="18.2" x2="38.6" y2="18.2"/>
<circle class="st1" cx="10.9" cy="11.3" r="9.3"/>
<line class="st1" x1="10.9" y1="2" x2="10.9" y2="4.8"/>
<line class="st1" x1="10.9" y1="17.6" x2="10.9" y2="20.4"/>
<line class="st1" x1="20" y1="11.3" x2="17.6" y2="11.3"/>
<line class="st1" x1="4.2" y1="11.3" x2="1.8" y2="11.3"/>
<rect x="-33.7" y="-6" style="fill:none;" width="7.6" height="7.5"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@ -0,0 +1,15 @@
<div class="address-link">
<%= if @address do %>
<%= link to: address_path(@conn, :show, @conn.assigns.locale, @address),
"data-toggle": "tooltip",
"data-placement": "top",
class: "address-link__font",
title: @address do %>
<i class="address-link__type fas fa-address-card"></i>
<%= @address |> hash |> String.slice(0..3) %><i class="fas fa-ellipsis-v address-link__seperator"></i><%= @address |> hash |> String.slice(-4..-1) %>
<% end %>
<button class="address-link__copy-button" data-clipboard-text="<%= @address %>" aria-label="copy address">
<i class="fa fa-copy"></i>
</button>
<% end %>
</div>

@ -1,6 +1,6 @@
<div class="address__header">
<h1 class="address__heading"><%= gettext "Address" %></h1>
<h3 class="address__subheading"><%= @address %></h3>
<h3 class="address__subheading" data-test="address_detail_hash"><%= @address %></h3>
</div>
<div class="address__container">
<div class="address__attributes">

@ -1,24 +1,26 @@
<section class="container__section block">
<%= render ExplorerWeb.AddressView, "overview.html", assigns %>
<div class="address__container">
<div class="address__tabs">
<h2 class="address__tab address__tab">
<div>
<ul class="nav nav-tabs">
<li class="nav-item">
<%= link(
gettext("Transactions"),
class: "address__link address__link",
class: "nav-link",
to: address_transaction_path(@conn, :index, @conn.assigns.locale, @conn.params["address_id"])
) %>
</h2>
<h2 class="address__tab address__tab--active">
</li>
<li class="nav-item">
<%= link(
gettext("Internal Transactions"),
class: "address__link address__link--active",
class: "nav-link active",
"data-test": "internal_transactions_tab_link",
to: address_internal_transaction_path(@conn, :index, @conn.assigns.locale, @conn.params["address_id"])
) %>
</h2>
</li>
</ul>
</div>
<div class="dropdown u-float-right u-push-sm-right u-push-sm-bottom">
<div class="panels container__subsection">
<div class="dropdown u-float-right u-push-sm">
<button data-test="filter_dropdown" class="button button--secondary button--xsmall dropdown-toggle" type="button"
id="dropdownMenu2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Filter: <%= format_current_filter(@filter) %>
@ -56,45 +58,36 @@
) %>
</div>
</div>
<div class="internal-transaction__container">
<div class="panels__container">
<%= if length(@page.entries) > 0 do %>
<table class="internal-transaction__table">
<table class="table table-responsive-sm table-font">
<thead>
<th class="internal-transaction__column-header"><%= gettext "Parent Tx Hash" %></th>
<th class="internal-transaction__column-header"><%= gettext "Block" %></th>
<th class="internal-transaction__column-header"><%= gettext "Age" %></th>
<th class="internal-transaction__column-header"><%= gettext "From" %></th>
<th class="internal-transaction__column-header"><%= gettext "To" %></th>
<th class="internal-transaction__column-header"><%= gettext "Value" %></th>
<th><%= gettext "Parent Tx Hash" %></th>
<th><%= gettext "Block" %></th>
<th><%= gettext "Age" %></th>
<th><%= gettext "From" %></th>
<th><%= gettext "To" %></th>
<th><%= gettext "Value" %></th>
</thead>
<%= for internal_transaction <- @page do %>
<tgroup>
<tr data-test="internal_transaction">
<td>
<%= link(internal_transaction.transaction,
to: transaction_path(@conn, :show, @conn.assigns.locale, internal_transaction.transaction),
class: "transaction-log__link") %>
<%= render ExplorerWeb.TransactionView, "_link.html", conn: @conn, transaction: internal_transaction.transaction %>
</td>
<td>
<%= link(internal_transaction.transaction.block,
to: block_path(@conn, :show, @conn.assigns.locale, internal_transaction.transaction.block),
class: "transaction-log__link") %>
to: block_path(@conn, :show, @conn.assigns.locale, internal_transaction.transaction.block)
) %>
</td>
<td class="internal-transaction__to-address"><%= ExplorerWeb.BlockView.age(internal_transaction.transaction.block) %></td>
<td class="internal-transaction__from-address">
<%= link(internal_transaction.from_address,
to: address_path(@conn, :show, @conn.assigns.locale, internal_transaction.from_address),
class: "transaction-log__link") %>
<td><%= ExplorerWeb.BlockView.age(internal_transaction.transaction.block) %></td>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: internal_transaction.from_address %>
</td>
<td class="internal-transaction__to-address">
<% to_address = internal_transaction.to_address %>
<%= if to_address do %>
<%= link(to_address,
to: address_path(@conn, :show, @conn.assigns.locale, internal_transaction.to_address),
class: "transaction-log__link") %>
<% end %>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: internal_transaction.to_address %>
</td>
<td class="internal-transaction__to-address"><%= ExplorerWeb.TransactionView.value(internal_transaction) %></td>
<td><%= ExplorerWeb.TransactionView.value(internal_transaction) %></td>
</tr>
</tgroup>
<% end %>

@ -1,25 +1,26 @@
<section class="container__section block">
<section class="container__section">
<%= render ExplorerWeb.AddressView, "overview.html", assigns %>
<div class="address__container">
<div class="address__tabs">
<h2 class="address__tab address__tab--active">
<div>
<ul class="nav nav-tabs">
<li class="nav-item">
<%= link(
gettext("Transactions"),
class: "address__link address__link--active",
class: "nav-link active",
to: address_transaction_path(@conn, :index, @conn.assigns.locale, @conn.params["address_id"])
) %>
</h2>
<h2 class="address__tab address__tab">
</li>
<li class="nav-item">
<%= link(
gettext("Internal Transactions"),
class: "address__link address__link",
class: "nav-link",
"data-test": "internal_transactions_tab_link",
to: address_internal_transaction_path(@conn, :index, @conn.assigns.locale, @conn.params["address_id"])
) %>
</h2>
</li>
</ul>
</div>
<div class="dropdown u-float-right u-push-sm-right u-push-sm-bottom">
<div class="panels container__subsection">
<div class="dropdown u-float-right u-push-sm">
<button data-test="filter_dropdown" class="button button--secondary button--xsmall dropdown-toggle" type="button"
id="dropdownMenu2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Filter: <%= format_current_filter(@filter) %>
@ -57,72 +58,46 @@
) %>
</div>
</div>
<div class="transactions__container">
<table class="transactions__table">
<thead class="transactions__header">
<div class="panels__container">
<table class="table table-responsive-sm table-font">
<thead>
<tr>
<th class="transactions__column-header transactions__column-header--status">
<span class="transactions__column-title transactions__column-title--status"><%= gettext "Status" %></span>
</th>
<th class="transactions__column-header"><%= gettext "Hash" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "Block" %></th>
<th class="transactions__column-header"><%= gettext "Age" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "From" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "To" %></th>
<th class="transactions__column-header"><%= gettext "Value" %></th>
<th class="transactions__column-header"><%= gettext "Fee" %></th>
<th><%= gettext "Hash" %></th>
<th><%= gettext "Block" %></th>
<th><%= gettext "Age" %></th>
<th><%= gettext "From" %></th>
<th></th>
<th><%= gettext "To" %></th>
<th><%= gettext "Value" %> (<%= gettext "Ether" %>)</th>
<th><%= gettext "Fee" %></th>
</tr>
</thead>
<tbody>
<%= for transaction <- @page.entries do %>
<tr class="transactions__row">
<td class="transactions__column transactions__column--status">
<div class="transactions__dot transactions__dot--<%= status(transaction) %>"></div>
</td>
<td class="transactions__column transactions__column--hash">
<div class="transactions__hash">
<%= link(
hash(transaction),
to: transaction_path(@conn, :show, @conn.assigns.locale, transaction),
class: "transactions__link transactions__link--truncated transactions__link--long-hash",
"data-test": "transaction_hash"
) %>
</div>
<tr>
<td><div class="transaction__dot transaction__dot--<%= status(transaction) %>"></div></td>
<td>
<%= render ExplorerWeb.TransactionView, "_link.html", conn: @conn, transaction: transaction %>
</td>
<td class="transactions__column transactions__column--block transactions__column--optional">
<td>
<%= link(
block(transaction),
class: "transactions__link",
transaction.block,
to: block_path(@conn, :show, @conn.assigns.locale, transaction.block)
) %>
</td>
<td class="transactions__column transactions__column--age">
<%= transaction.block.timestamp |> Timex.from_now %>
</td>
<td class="transactions__column transactions__column--from transactions__column--optional">
<div class="transactions__hash">
<%= link(
from_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.from_address)
) %>
</div>
</td>
<td class="transactions__column transactions__column--to transactions__column--optional">
<div class="transactions__hash">
<%= link(
to_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.to_address)
) %>
</div>
</td>
<td class="transactions__column transactions__column--value">
<%= ExplorerWeb.TransactionView.value(transaction) %>
<td><%= transaction.block.timestamp |> Timex.from_now %></td>
<td class="address-cell">
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.from_address %>
</td>
<td class="transactions__column transactions__column--value">
<%= ExplorerWeb.TransactionView.fee(transaction) %>
<td class="u-text-center"><i class="fas fa-arrow-circle-right"></i></td>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.to_address %>
</td>
<td><%= ExplorerWeb.TransactionView.value(transaction, include_label: false) %></td>
<td><%= ExplorerWeb.TransactionView.fee(transaction) %></td>
</tr>
<% end %>
</tbody>

@ -1,62 +1,54 @@
<section class="container__section">
<div class="blocks__headline">
<h1 class="blocks__headline-title">
<div>
<h1>
Blocks
</h1>
<p>
<%= gettext(
"Showing #%{start_block} to #%{end_block}",
start_block: List.first(@blocks.entries).number,
end_block: List.last(@blocks.entries).number
) %>
</h1>
<div class="blocks__pagination">
<%= pagination_links(
@conn,
@blocks,
["en"],
distance: 1,
first: true,
next: Phoenix.HTML.raw("&rsaquo;"),
path: &block_path/4,
previous: Phoenix.HTML.raw("&lsaquo;"),
view_style: :bulma
) %>
</div>
</p>
</div>
<div class="blocks">
<div class="blocks__container">
<table class="blocks__table">
<thead class="blocks__header">
<div class="panels container__subsection">
<div class="panels__container">
<table class="table table-responsive-sm table-font">
<thead>
<tr>
<th class="blocks__column-header"><%= gettext "Height" %></th>
<th class="blocks__column-header"><%= gettext "Age" %></th>
<th class="blocks__column-header"><%= gettext "Transactions" %></th>
<th class="blocks__column-header blocks__column-header--optional"><%= gettext "Gas Used" %> (<%= gettext("Gas") %>)</th>
<th class="blocks__column-header blocks__column-header--optional"><%= gettext "Gas Limit" %> (<%= gettext("Gas") %>)</th>
<th class="blocks__column-header blocks__column-header--optional"><%= gettext "Gas Price" %></th>
<th><%= gettext "Height" %></th>
<th><%= gettext "Age" %></th>
<th><%= gettext "Transactions" %></th>
<th><%= gettext "Gas Used" %> (<%= gettext("Gas") %>)</th>
<th><%= gettext "Gas Limit" %> (<%= gettext("Gas") %>)</th>
<th><%= gettext "Gas Price" %></th>
</tr>
</thead>
<tbody>
<%= for block <- @blocks do %>
<tr class="blocks__row">
<td class="blocks__column blocks__column--height">
<tr>
<td>
<%= link(
block,
class: "blocks__link",
to: block_path(@conn, :show, @conn.assigns.locale, block)
to: block_path(@conn, :show, @conn.assigns.locale, block),
"data-test": "block_number",
"data-block-number": to_string(block.number)
) %>
</td>
<td class="transactions__column transactions__column--age"><%= block.timestamp |> Timex.from_now %></td>
<td class="blocks__column blocks__column--transactions-count">
<td><%= block.timestamp |> Timex.from_now %></td>
<td>
<%= gettext("%{count} transactions", count: block.transactions |> Enum.count) %>
</td>
<td class="blocks__column blocks__column--optional blocks__column--gas-used">
<td>
<%= block.gas_used |> Cldr.Number.to_string! %> (<%=
block.gas_used / block.gas_limit |> Cldr.Number.to_string!(format: "#.#%")
%>)
</td>
<td class="blocks__column blocks__column--optional blocks__column--gas-limit">
<td>
<%= block.gas_limit |> Cldr.Number.to_string! %>
</td>
<td class="blocks__column blocks__column--optional blocks__column--gas-price">
<td>
<%= average_gas_price(block) %>
</td>
</tr>
@ -65,4 +57,17 @@
</table>
</div>
</div>
<div class="blocks__pagination">
<%= pagination_links(
@conn,
@blocks,
["en"],
distance: 1,
first: true,
next: Phoenix.HTML.raw("&rsaquo;"),
path: &block_path/4,
previous: Phoenix.HTML.raw("&lsaquo;"),
view_style: :bulma
) %>
</div>
</section>

@ -1,148 +1,170 @@
<section class="container__section block">
<div class="block__header">
<h1 class="block__heading"><%= gettext("Block Details") %></h1>
<h2 class="block__subheading"><%= @block.number %></h2>
</div>
<div class="block__container">
<div class="block__attributes">
<div class="block__column">
<dl>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Timestamp" %></dt>
<dd class="block__item-value"><%= age(@block) %> (<%= formatted_timestamp(@block) %>)</dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Transactions" %></dt>
<dd class="block__item-value">
<section class="container__section">
<div>
<h1><%= gettext("Block Details") %></h1>
<h2 data-test="block_detail_number"><%= @block.number %></h2>
</div>
<div class="panels container__subsection">
<div class="panels__container row">
<div class="col-lg-6">
<table class="table table-font table-responsive-sm table-horizontal">
<tbody>
<tr>
<th scope="row">
<%= gettext "Timestamp" %>
</th>
<td>
<%= age(@block) %> (<%= formatted_timestamp(@block) %>)
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Transaction" %>
</th>
<td>
<%= gettext "%{count} transactions in this block", count: @block_transaction_count %>
</dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Hash" %></dt>
<dd class="block__item-value" title="<%= @block.hash %>"><%= @block.hash %></dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Parent Hash" %></dt>
<dd class="block__item-value" title="<%= @block.parent_hash %>">
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Hash" %>
</th>
<td title="<%= @block.hash %>">
<%= @block.hash %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Parent Hash" %>
</th>
<td title="<%= @block.parent_hash %>">
<%= link(
@block.parent_hash,
class: "block__link",
to: block_path(@conn, :show, @conn.assigns.locale, @block.number - 1)
) %>
</dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Miner" %></dt>
<dd class="block__item-value" title="<%= @block.miner %>"><%= @block.miner %></dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Difficulty" %></dt>
<dd class="block__item-value" title="<%= @block.difficulty %>">
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Miner" %>
</th>
<td title="<%= @block.miner %>">
<%= @block.miner %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Difficulty" %>
</th>
<td title="<%= @block.difficulty %>">
<%= @block.difficulty |> Cldr.Number.to_string! %>
</dd>
</div>
</dl>
</td>
</tr>
</tbody>
</table>
</div>
<div class="block__column">
<dl>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Total Difficulty" %></dt>
<dd class="block__item-value" title="<%= @block.total_difficulty %>">
<div class="col-lg-6">
<table class="table table-font table-responsive-sm table-horizontal">
<tbody>
<tr>
<th scope="row">
<%= gettext "Total Difficulty" %>
</th>
<td title="<%= @block.total_difficulty %>">
<%= @block.total_difficulty |> Cldr.Number.to_string! %>
</dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Size" %></dt>
<dd class="block__item-value"><%= Cldr.Unit.new(:byte, @block.size) |> Cldr.Unit.to_string! %></dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Gas Used" %></dt>
<dd class="block__item-value">
<%= @block.gas_used
|> Cldr.Number.to_string! %> (<%= (@block.gas_used / @block.gas_limit)
|> Cldr.Number.to_string!(format: "#.#%") %>)
</dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Gas Limit" %></dt>
<dd class="block__item-value"><%= @block.gas_limit |> Cldr.Number.to_string! %></dd>
</div>
<div class="block__item">
<dt class="block__item-key"><%= gettext "Nonce" %></dt>
<dd class="block__item-value"><%= @block.nonce %></dd>
</div>
</dl>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Size" %>
</th>
<td>
<%= Cldr.Unit.new(:byte, @block.size) |> Cldr.Unit.to_string! %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Gas Used" %>
</th>
<td>
<%= @block.gas_used |> Cldr.Number.to_string! %> (<%= (@block.gas_used / @block.gas_limit) |> Cldr.Number.to_string!(format: "#.#%") %>)
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Gas Limit" %>
</th>
<td>
<%= @block.gas_limit |> Cldr.Number.to_string! %>
</td>
</tr>
<tr>
<th scope="Nonce">
<%= gettext "Gas Limit" %>
</th>
<td>
<%= @block.nonce %>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="block__container">
<div class="block__tabs">
<h2 class="block__tab block__tab--active">
<div>
<ul class="nav nav-tabs">
<li class="nav-item">
<%= link(
gettext("Transactions"),
class: "block__link block__link--active",
class: "nav-link active",
to: block_transaction_path(@conn, :index, @conn.assigns.locale, @conn.params["block_id"])
) %>
</h2>
</li>
</ul>
</div>
<div class="transactions__container">
<table class="transactions__table">
<thead class="transactions__header">
<div class="panels container__subsection">
<div class="panels__container">
<table class="table table-responsive-sm table-font">
<thead>
<tr>
<th class="transactions__column-header transactions__column-header--status">
<span class="transactions__column-title transactions__column-title--status"><%= gettext "Status" %></span>
<th>
<%= gettext "Status" %>
</th>
<th class="transactions__column-header"><%= gettext "Hash" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "Block" %></th>
<th class="transactions__column-header"><%= gettext "Age" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "From" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "To" %></th>
<th class="transactions__column-header"><%= gettext "Value" %></th>
<th><%= gettext "Hash" %></th>
<th><%= gettext "Block" %></th>
<th><%= gettext "Age" %></th>
<th><%= gettext "From" %></th>
<th></th>
<th><%= gettext "To" %></th>
<th><%= gettext "Value" %></th>
</tr>
</thead>
<tbody>
<%= for transaction <- @page.entries do %>
<tr class="transactions__row">
<td class="transactions__column transactions__column--status">
<div class="transactions__dot transactions__dot--<%= status(transaction) %>"></div>
<tr>
<td>
<div class="transaction__dot transaction__dot--<%= status(transaction) %>"></div>
</td>
<td class="transactions__column transactions__column--hash">
<div class="transactions__hash">
<%= link(
hash(transaction),
class: "transactions__link transactions__link--truncated transactions__link--long-hash",
to: transaction_path(@conn, :show, @conn.assigns.locale, transaction)
) %></div>
<td>
<%= render ExplorerWeb.TransactionView, "_link.html", conn: @conn, transaction: transaction %>
</td>
<td class="transactions__column transactions__column--block transactions__column--optional">
<td>
<%= link(
block(transaction),
class: "transactions__link",
transaction.block,
to: block_path(@conn, :show, @conn.assigns.locale, transaction.block)
) %>
</td>
<td class="transactions__column transactions__column--age">
<td>
<%= transaction.block.timestamp |> Timex.from_now %>
</td>
<td class="transactions__column transactions__column--from transactions__column--optional">
<div class="transactions__hash">
<%= link(
from_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.from_address)
) %></div>
<td class="address-cell">
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.from_address %>
</td>
<td class="transactions__column transactions__column--to transactions__column--optional">
<div class="transactions__hash">
<%= link(
to_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.to_address)
) %></div>
<td class="u-text-center"><i class="fas fa-arrow-circle-right"></i></td>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.to_address %>
</td>
<td class="transactions__column transactions__column--value">
<td>
<%= ExplorerWeb.TransactionView.value(transaction) %>
</td>
</tr>

@ -0,0 +1,31 @@
<div class="panels container__subsection container__subsection-chain">
<div class="panels__container panels__container--title">
<%= link(gettext("View All"), to: block_path(@conn, :index, Gettext.get_locale), class: "button button--secondary button--xsmall u-float-right") %>
<h2 class="panels__title"><%= gettext "Blocks" %></h2>
</div>
<table class="table table-font table-responsive-sm">
<thead>
<th><%= gettext "Height" %></th>
<th><%= gettext "Age" %></th>
<th><%= gettext "TXNs" %></th>
<th><%= gettext "Gas" %></th>
<th><%= gettext "Validator" %></th>
</thead>
<tbody>
<%= for block <- @chain.blocks do %>
<tr data-test="chain_block">
<td>
<img src="<%= static_path(@conn, "/images/block.svg") %>" />
<%= link(block, to: block_path(@conn, :show, @conn.assigns.locale, block)) %>
</td>
<td><%= block.timestamp |> Timex.from_now %></td>
<td><%= block.transactions |> Enum.count %></td>
<td><%= block.gas_used |> Cldr.Number.to_string! %></td>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: block.miner %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>

@ -0,0 +1,32 @@
<div class="panels container__subsection container__subsection-chain">
<div class="panels__container panels__container--title">
<%= link(gettext("View All"), to: transaction_path(@conn, :index, Gettext.get_locale), class: "button button--secondary button--xsmall u-float-right") %>
<h2 class="panels__title"><%= gettext "Transactions" %></h2>
</div>
<table class="table table-font table-responsive-sm">
<thead>
<th><%= gettext "TX Hash" %></th>
<th><%= gettext "From" %></th>
<th><%= gettext "To" %></th>
<th><%= gettext "Value" %> (<%= gettext "Ether" %>)</th>
<th><%= gettext "Age" %></th>
</thead>
<tbody>
<%= for transaction <- @chain.transactions do %>
<tr data-test="chain_transaction">
<td>
<%= render ExplorerWeb.TransactionView, "_link.html", conn: @conn, transaction: transaction %>
</td>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.from_address %>
</td>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.to_address %>
</td>
<td><%= ExplorerWeb.TransactionView.value(transaction, include_label: false) %> </td>
<td><%= transaction.block.timestamp |> Timex.from_now() %></td>
</tr>
<% end %>
</tbody>
</table>
</div>

@ -2,24 +2,29 @@
<section class="container__section container__section--partitioned">
<div class="container__stats">
<div>
<img class="chain__image" src="<%= static_path(@conn, "/images/blocks.svg") %>" />
<div class="chain__title"><%= gettext("Block") %></div>
<div class="chain__title chain__title--data">#<%= @chain.number %></div>
<%= render ExplorerWeb.IconsView, "_block_icon.html", assigns %>
<div><%= gettext("Block") %></div>
<div> #<%= @chain.number %></div>
</div>
<div>
<img class="" src="<%= static_path(@conn, "/images/last_block.svg") %>" />
<div class="chain__title"><%= gettext("Last Block") %></div>
<div class="chain__title chain__title--data"><%= @chain.timestamp |> Timex.from_now() %></div>
<%= render ExplorerWeb.IconsView, "_hourglass_icon.html", assigns %>
<div> <%= gettext("Last Block") %></div>
<div> <%= @chain.timestamp |> Timex.from_now() %></div>
</div>
<div>
<img class="" src="<%= static_path(@conn, "/images/average_time.svg") %>" />
<div class=""><%= gettext("Avg Block Time") %></div>
<div class="stroke"> <%= render ExplorerWeb.IconsView, "_guage_icon.html", assigns %> </div>
<div><%= gettext("Avg Block Time") %></div>
<%= @chain.average_time |> Timex.format_duration(:humanized) %>
</div>
<div>
<%= render ExplorerWeb.IconsView, "_transaction_icon.html", assigns %>
<div> <%= gettext("TPM") %></div>
<div> <%= @chain.transaction_velocity |> Cldr.Number.to_string! %></div>
</div>
</div>
<div class="chain container__subsection u-push-sm-left">
<canvas data-chart="marketHistoryChart" data-current_exchange_rate ='<%= @exchange_rate.usd_value %>' data-available_supply='<%= @exchange_rate.available_supply %>' data-market_history_data='<%=raw encode_market_history_data(@market_history_data) %>' width="400" height="200"></canvas>
<div class="flex">
<div class="chain container__subsection container__subsection-chain">
<canvas data-chart="marketHistoryChart" data-current_exchange_rate ='<%= @exchange_rate.usd_value %>' data-available_supply='<%= @exchange_rate.available_supply %>' data-market_history_data='<%=raw encode_market_history_data(@market_history_data) %>' width="300" height="100"></canvas>
<div class="graph-flex">
<div class="u-push-md-left">
<div class="graph__squares graph__squares--price"></div>
<%= gettext "Price" %> </br>
@ -38,97 +43,7 @@
</div>
</section>
</section>
<section>
<section class="container__section container__section--partitioned">
<div class="blocks container__subsection">
<div class="blocks__container blocks__container--title">
<h2 class="blocks__title"><%= gettext "Blocks" %></h2>
<%= link to: block_path(@conn, :index, Gettext.get_locale), class: "header__link" do %>
<div class="button button--secondary button--xsmall u-float-right">View All</div>
<% end %>
</div>
<div>
</div>
<div class="blocks__container">
<table class="blocks__table">
<thead class="blocks__header">
<tr>
<th class="blocks__column-header"><%= gettext "Height" %></th>
<th class="blocks__column-header"><%= gettext "Age" %></th>
<th class="blocks__column-header"><%= gettext "Transactions" %></th>
<th class="blocks__column-header"><%= gettext "Gas Used" %></th>
</tr>
</thead>
<tbody>
<%= for block <- @chain.blocks do %>
<tr class="blocks__row">
<td class="blocks__column blocks__column--height">
<%= link(
block,
class: "blocks__link",
to: block_path(@conn, :show, @conn.assigns.locale, block)
) %>
</td>
<td class="blocks__column blocks__column--age"><%= block.timestamp |> Timex.from_now %></td>
<td class="blocks__column blocks__column--transactions-count">
<%= block.transactions |> Enum.count %>
</td>
<td class="blocks__column blocks__column--gas-used"><%= block.gas_used |> Cldr.Number.to_string! %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<div class="transactions container__subsection">
<div class="transactions__container transactions__container__flex transactions__container--title">
<h2 class="transactions__title"><%= gettext "Transactions" %></h2>
<%= link to: transaction_path(@conn, :index, Gettext.get_locale), class: "header__link" do %>
<div class="button button--secondary button--xsmall u-float-right">View All</div>
<% end %>
</div>
<div class="transactions__container">
<table class="transactions__table">
<thead class="transactions__header">
<tr>
<th class="transactions__column-header"><%= gettext "Hash" %></th>
<th class="transactions__column-header"><%= gettext "Block" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "Age" %></th>
<th class="transactions__column-header"><%= gettext "Value" %></th>
</tr>
</thead>
<tbody>
<%= for transaction <- @chain.transactions do %>
<tr class="transactions__row">
<td class="transactions__column transactions__column--hash">
<div class="transactions__hash-container" title="<%= transaction %>">
<%= link(
transaction,
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: transaction_path(@conn, :show, @conn.assigns.locale, transaction)
) %>
</div>
</td>
<td class="transactions__column transactions__column--block">
<%= link(
transaction.block,
class: "transactions__link",
to: block_path(@conn, :show, @conn.assigns.locale, transaction.block)
) %>
</td>
<td class="transactions__column transactions__column--age transactions__column--optional">
<%= transaction.block.timestamp |> Timex.from_now() %>
</td>
<td class="transactions__column transactions__column--value">
<%= ExplorerWeb.TransactionView.value(transaction) %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
</section>
<%= render ExplorerWeb.ChainView, "_blocks.html", assigns %>
<%= render ExplorerWeb.ChainView, "_transactions.html", assigns %>
</section>

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="24">
<path fill="#5d6165" fill-rule="evenodd" d="M21.998 17.936c0 .006-.004.011-.004.017.009.185-.013.374-.105.547a.892.892 0 0 1-.816.485c-.019.002-.036.011-.055.011l-9.467 4.887a1.11 1.11 0 0 1-.519.111A.113.113 0 0 1 11 24c-.011 0-.021-.006-.032-.006-.052 0-.104-.009-.156-.014-.018-.004-.038-.001-.056-.005a.984.984 0 0 1-.308-.092l-9.425-4.888c-.008 0-.015.005-.023.005-.03 0-.055-.013-.084-.015a.895.895 0 0 1-.805-.485 1.038 1.038 0 0 1-.105-.547c-.002-.01-.006-.019-.006-.03v-.046c.001-.031-.005-.061 0-.092V6.188c-.005-.031.001-.061 0-.092v-.019l.002-.013c0-.043.004-.086.01-.128a.788.788 0 0 1 .114-.459.98.98 0 0 1 .407-.336.928.928 0 0 1 .18-.079c.038-.01.074-.017.112-.024.053-.01.103-.03.157-.034L10.448.117c.156-.081.323-.103.49-.105C10.96.011 10.978 0 11 0s.04.011.062.012c.167.002.334.024.489.104l9.537 4.902c.179.021.343.09.483.199a.613.613 0 0 1 .058.042c.042.037.08.073.116.116.042.044.095.078.129.131.072.111.098.23.109.349A.826.826 0 0 1 22 6.16v11.652c.005.031-.001.062 0 .093v.018l-.002.013zM2 16.159l1.633-1.025c.44-.276 1.002-.112 1.256.366s.103 1.09-.337 1.366l-1.565.983L10 21.486v-8.645l-1.633 1.025c-.44.276-1.002.112-1.256-.366s-.103-1.09.337-1.366l1.573-.988L2 7.522v8.637zM12 2.492V4a1 1 0 0 1-2 0V2.503L3.226 6 10 9.497V8a1 1 0 0 1 2 0v1.508L18.825 6 12 2.492zm8 5.05l-7.017 3.606 1.569.986c.44.276.591.888.337 1.366-.254.478-.816.642-1.256.366L12 12.841v8.656l7.037-3.633-1.589-.998c-.44-.276-.591-.888-.337-1.366.254-.478.816-.642 1.256-.366L20 16.159V7.542z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,18 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 68 68" style="enable-background:new 0 0 68 68;" xml:space="preserve">
<style type="text/css">
.st0{fill:#4a4e52;stroke:#4a4e52;stroke-width:3.3377;}
.st1{fill:#4a4e52;stroke:#4a4e52;stroke-width:1.6287;}
</style>
<path d="M33.9,66C16.1,66,1.8,51.6,1.8,33.9S16.1,1.8,33.9,1.8S66,16.1,66,33.9S51.6,66,33.9,66z M33.9,3.6
C17.2,3.6,3.6,17.2,3.6,33.9s13.5,30.2,30.2,30.2s30.2-13.5,30.2-30.2S50.6,3.6,33.9,3.6z"/>
<path d="M54.8,22.9l-3.3,1.9c-0.5,0.3-1,0.1-1.3-0.4c-0.3-0.4-0.1-1,0.3-1.3l3.3-1.9c0.5-0.3,1-0.1,1.3,0.4
C55.4,22,55.3,22.6,54.8,22.9z M44.6,17.2c-0.3,0.5-0.8,0.6-1.3,0.4c-0.5-0.3-0.6-0.8-0.4-1.3c0,0,0,0,0,0l1.9-3.3
c0.3-0.5,0.8-0.6,1.3-0.3c0.4,0.3,0.6,0.8,0.3,1.3L44.6,17.2z M33.8,60c-6.2,0-11.3-5.1-11.3-11.3c0-5.8,4.3-10.5,9.9-11.2V21.9
c0-0.8,0.6-1.4,1.4-1.4c0.8,0,1.4,0.6,1.4,1.4v15.6c5.6,0.7,9.9,5.4,9.9,11.2C45.1,54.9,40,60,33.8,60z M33.8,40.2
c-4.8,0-8.7,3.9-8.7,8.7s3.9,8.7,8.7,8.7s8.7-3.9,8.7-8.7S38.6,40.2,33.8,40.2z M33.9,46.6c-1.3,0-2.4,1-2.4,2.3
c0,1.3,1,2.4,2.3,2.4c0,0,0.1,0,0.1,0c1.3,0,2.3-1.1,2.3-2.4C36.2,47.7,35.1,46.7,33.9,46.6z M33.9,15c-0.5,0-0.9-0.4-0.9-0.9v-3.8
c0-0.5,0.4-0.9,0.9-0.9s0.9,0.4,0.9,0.9V14C34.8,14.6,34.4,15,33.9,15z M24.4,17.5c-0.5,0.3-1,0.1-1.3-0.3c0,0,0,0,0,0l-1.9-3.3
c-0.3-0.5-0.1-1,0.4-1.3c0.4-0.3,1-0.1,1.3,0.3l1.9,3.3C25,16.7,24.9,17.2,24.4,17.5z M16.2,24.8l-3.3-1.9c-0.5-0.3-0.6-0.8-0.3-1.3
c0.3-0.4,0.8-0.6,1.3-0.3l3.3,1.9c0.5,0.3,0.6,0.8,0.4,1.3C17.3,24.9,16.7,25,16.2,24.8C16.2,24.8,16.2,24.8,16.2,24.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,17 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="22" height="24" x="0px" y="0px"
viewBox="0 0 34 68" style="enable-background:new 0 0 34 68;" xml:space="preserve">
<style type="text/css">
.st0{fill:#BAC4CB;}
</style>
<path class="" d="M29.7,44.2c0,0.1,0.1,0.2,0.1,0.3v12.8h2.9c0.5,0,1,0.4,1,1v7.9c0,0.5-0.4,1-1,1H1.2c-0.5,0-1-0.4-1-1v-7.9
c0-0.5,0.4-1,1-1h2.9V44.6c0-0.1,0-0.2,0.1-0.3c0.5-4.7,3.6-8.7,7.8-10.5C7.7,32,4.8,28,4.3,23.3c-0.1-0.1-0.1-0.3-0.1-0.4V10.2H1.2
c-0.5,0-1-0.4-1-1V1.3c0-0.5,0.4-1,1-1h31.4c0.5,0,1,0.4,1,1v7.9c0,0.5-0.4,1-1,1h-2.9v12.8c0,0.1,0,0.3-0.1,0.4
c-0.5,4.6-3.5,8.6-7.8,10.4C26.1,35.5,29.2,39.5,29.7,44.2z M2.3,6h29.5V4.5H2.3V6z M2.3,63.3h29.5v-1.5H2.3V63.3z M25.6,21.9v-9.4
H8.3v9.4c0,4.8,3.9,8.6,8.6,8.6S25.6,26.6,25.6,21.9z M26.1,45.6c0-5-4.1-9.1-9.1-9.1s-9.1,4.1-9.1,9.1v9.9h18.2V45.6z M22,53.8
c-1.1,0-2.1-0.9-2.1-2.1s0.9-2.1,2.1-2.1s2.1,0.9,2.1,2.1S23.2,53.8,22,53.8z M16.9,44.5c-1.1,0-2.1-0.9-2.1-2.1
c0-1.1,0.9-2.1,2.1-2.1s2.1,0.9,2.1,2.1C19,43.6,18.1,44.5,16.9,44.5z M11.6,53.8c-1.1,0-2.1-0.9-2.1-2.1s0.9-2.1,2.1-2.1
s2.1,0.9,2.1,2.1S12.8,53.8,11.6,53.8z M17.1,53.8c-1.1,0-2.1-0.9-2.1-2.1s0.9-2.1,2.1-2.1s2.1,0.9,2.1,2.1S18.2,53.8,17.1,53.8z
M15.4,27.9c0-1,0.8-1.8,1.8-1.8s1.8,0.8,1.8,1.8s-0.8,1.8-1.8,1.8S15.4,28.9,15.4,27.9z M20.7,22.1c1,0,1.8,0.8,1.8,1.8
s-0.8,1.8-1.8,1.8s-1.8-0.8-1.8-1.8S19.7,22.1,20.7,22.1z M13.7,25.6c-1,0-1.8-0.8-1.8-1.8s0.8-1.8,1.8-1.8s1.8,0.8,1.8,1.8
S14.6,25.6,13.7,25.6z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 19.8 24" style="enable-background:new 0 0 19.8 24;" xml:space="preserve">
<style type="text/css">
.st0{fill:#BAC4CB;}
.st1{fill:none;stroke:#BAC4CB;stroke-width:2.0697;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st2{fill:none;stroke:#BAC4CB;stroke-width:1.5523;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<path class="st0" d="M-5.6,12.5C-5.6,12.5-5.6,12.5-5.6,12.5c0,0.2,0,0.4-0.1,0.6c-0.2,0.3-0.5,0.5-0.8,0.5c0,0,0,0-0.1,0l-9.5,4.9
c-0.2,0.1-0.3,0.1-0.5,0.1c0,0,0,0,0,0c0,0,0,0,0,0c-0.1,0-0.1,0-0.2,0c0,0,0,0-0.1,0c-0.1,0-0.2,0-0.3-0.1l-9.4-4.9c0,0,0,0,0,0
c0,0-0.1,0-0.1,0c-0.3,0-0.6-0.2-0.8-0.5c-0.1-0.2-0.1-0.4-0.1-0.5c0,0,0,0,0,0v0c0,0,0-0.1,0-0.1V0.8c0,0,0-0.1,0-0.1v0l0,0
c0,0,0-0.1,0-0.1c0-0.2,0-0.3,0.1-0.5c0.1-0.1,0.2-0.3,0.4-0.3c0.1,0,0.1-0.1,0.2-0.1c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0l9.5-4.9
c0.2-0.1,0.3-0.1,0.5-0.1c0,0,0,0,0.1,0s0,0,0.1,0c0.2,0,0.3,0,0.5,0.1l9.5,4.9c0.2,0,0.3,0.1,0.5,0.2c0,0,0,0,0.1,0
c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1c0.1,0.1,0.1,0.2,0.1,0.3c0,0.1,0,0.2,0,0.3v11.7C-5.6,12.4-5.6,12.4-5.6,12.5L-5.6,12.5
L-5.6,12.5z M-25.6,10.7l1.6-1c0.4-0.3,1-0.1,1.3,0.4s0.1,1.1-0.3,1.4l-1.6,1l7,3.6V7.4l-1.6,1c-0.4,0.3-1,0.1-1.3-0.4
c-0.3-0.5-0.1-1.1,0.3-1.4l1.6-1l-7-3.6V10.7z M-15.6-2.9v1.5c0,0.6-0.4,1-1,1s-1-0.4-1-1v-1.5l-6.8,3.5l6.8,3.5V2.6
c0-0.6,0.4-1,1-1s1,0.4,1,1v1.5l6.8-3.5L-15.6-2.9z M-7.6,2.1l-7,3.6l1.6,1c0.4,0.3,0.6,0.9,0.3,1.4s-0.8,0.6-1.3,0.4l-1.6-1v8.7
l7-3.6l-1.6-1c-0.4-0.3-0.6-0.9-0.3-1.4s0.8-0.6,1.3-0.4l1.6,1C-7.6,10.7-7.6,2.1-7.6,2.1z"/>
<polygon class="st1" points="17.9,22.6 1.6,22.6 1.6,1.5 14.6,1.5 16.3,3.1 17.9,4.7 "/>
<polyline class="st2" points="17.7,5.4 12.3,6.6 13.6,1.7 "/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24">
<path fill="#BAC4CB" fill-rule="evenodd" d="M23 19H12.427l3.284 3.284a1.01 1.01 0 0 1-1.427 1.427l-4.995-4.995A1.01 1.01 0 0 1 8.994 18c0-.259.098-.519.295-.716l4.995-4.995a1.01 1.01 0 0 1 1.427 1.427L12.427 17H23a1 1 0 0 1 0 2zM14.711 6.716l-4.995 4.995a1.01 1.01 0 0 1-1.427-1.427L11.573 7H1a1 1 0 0 1 0-2h10.573L8.289 1.716A1.01 1.01 0 0 1 9.716.289l4.995 4.995c.197.197.295.457.295.716 0 .259-.098.519-.295.716z"/>
</svg>

After

Width:  |  Height:  |  Size: 494 B

@ -0,0 +1,61 @@
<div class="theme__ribbon">
<div class="front card">
<%= link to: chain_path(@conn, :show), "data-test": "header_logo" do %>
<img class="theme__ribbon--logo" src="<%= static_path(@conn, "/images/poa_logo.svg") %>" />
<% end %>
<div class="theme__ribbon--social" align="right">
<a href="https://www.facebook.com/PoaNetwork/" target="_blank">
<div class="theme__ribbon--social-icons">
<i class="fab fa-facebook-f"></i>
</div>
</a>
<a href="https://www.instagram.com/PoaNetwork/" target="_blank">
<div class="theme__ribbon--social-icons">
<i class="fab fa-instagram"></i>
</div>
</a>
<a href="https://www.twitter.com/PoaNetwork/" target="_blank">
<div class="theme__ribbon--social-icons">
<i class="fab fa-twitter"></i>
</div>
</a>
<a href="https://www.twitter.com/PoaNetwork/" target="_blank">
<div class="theme__ribbon--social-icons">
<i class="fab fa-telegram-plane"></i>
</div>
</a>
<div class="theme__ribbon--social-icons u-padding-none">
<i class="theme__ribbon--social-divider"></i>
</div>
<button class="rotatecard header__link">
<div class="theme__ribbon--social-icons ">
<i class="fa fa-sitemap"></i>
</div>
</button>
</div>
</div>
<div class="back card">
<%= link to: chain_path(@conn, :show) do %>
<img class="theme__ribbon--logo" src="<%= static_path(@conn, "/images/poa_logo.svg") %>" />
<% end %>
<div class="flex">
<div class="dropdown">
<button class="switch-network dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Switch Network
</button>
<div class="dropdown-menu switch-network-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item switch-network-item" href="https://explorer-core.poanetwork/">POA Core</a>
<a class="dropdown-item switch-network-item" href="https://explorer-sokol.poanetwork/">POA Sokol</a>
</div>
</div>
<div class="header__cell header__cell--social" align="right">
<button class="rotatecardback">
<div class="theme__ribbon--social-icons">
<i class="fa fa-arrow-left "></i>
</div>
</button>
</div>
</div>
</div>
</div>

@ -0,0 +1,60 @@
<div id="sidebar--container">
<nav id="sidebar">
<div class="sidebar-header">
<%= link to: chain_path(@conn, :show) do %>
<img class="" src="<%= static_path(@conn, "/images/poa_logo.svg") %>" />
<% end %>
</div>
<div class="menu-items">
<div tabindex="0" class="icon-locate">
<a href="#pageSubmenu" data-toggle="collapse" aria-expanded="false">
<i class="fa fa-sitemap fa-2x u-nudge-right u-nudge-top"></i>
<%= gettext("Switch Network ") %>
<i class="fa fa-caret-down"></i>
</a>
<ul class="collapse list-unstyled" id="pageSubmenu">
<li><a href="#">Explorer</a></li>
<li><a href="#">Sokol (Testnet)</a></li>
<li><a href="#">Mainnet</a></li>
</ul>
</div>
<%= link to: block_path(@conn, :index, Gettext.get_locale), class: "header__link" do %>
<div tabindex="0" class="icon-locate">
<i class="fas fa-home fa-2x u-nudge-right u-nudge-top"></i>
<%= gettext("Dashboard") %>
</div>
<% end %>
<%= link to: block_path(@conn, :index, Gettext.get_locale), class: "header__link" do %>
<div tabindex="0" class="icon-locate">
<img class="" src="<%= static_path(@conn, "/images/block.svg") %>" />
<%= gettext("Blocks") %>
</div>
<% end %>
<div tabindex="0" class="icon-locate">
<a href="#pageSubmenu-tx" data-toggle="collapse" aria-expanded="false">
<img class="" src="<%= static_path(@conn, "/images/transaction.svg") %>" />
<%= gettext("Transactions") %>
<i class="fa fa-caret-down"></i>
</a>
<ul class="collapse list-unstyled" id="pageSubmenu-tx">
<li><%= link(gettext("Validated"), to: transaction_path(@conn, :index, Gettext.get_locale)) %></li>
<li><%= link(gettext("Pending"), to: pending_transaction_path(@conn, :index, Gettext.get_locale)) %></li>
</ul>
</div>
</div>
<div class="social-media">
<a href="https://www.facebook.com/PoaNetwork/" target="_blank">
<i class="fab fa-facebook-f"></i>
</a>
<a href="https://www.instagram.com/PoaNetwork/" target="_blank">
<i class="fab fa-instagram"></i>
</a>
<a href="https://www.twitter.com/PoaNetwork/" target="_blank">
<i class="fab fa-twitter"></i>
</a>
<a href="https://www.twitter.com/PoaNetwork/" target="_blank">
<i class="fab fa-telegram-plane"></i>
</a>
</div>
</nav>
</div>

@ -0,0 +1,37 @@
<header class="header">
<div class="header__row header__row--search">
<div class="header__cell header__cell--search">
<%= form_for @conn, chain_path(@conn, :search, Gettext.get_locale), [class: "header__cell--search-form", method: :get, enforce_utf8: false], fn f -> %>
<i class="header__cell--search-glass fa fa-search"></i>
<%= search_input f, :q, class: 'header__cell--search-input', placeholder: gettext("Search by address, transaction hash, or block number"), "data-test": "search_input" %>
<% end %>
</div>
</div>
<div class="header__row header__row--topnav">
<div class="header__cell header__cell--links" align="right">
<%= link to: chain_path(@conn, :show) do %>
<div tabindex="0">
<i class="fas fa-home fa-2x"></i>
</div>
<% end %>
</div>
<div class="header__cell header__cell--links" align="right">
<%= link to: block_path(@conn, :index, Gettext.get_locale) do %>
<div tabindex="0">
<img src="<%= static_path(@conn, "/images/block.svg") %>" />
<%= gettext("Blocks") %>
</div>
<% end %>
</div>
<div class="header__cell header__cell--links dropdown">
<a class="dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img src="<%= static_path(@conn, "/images/transaction.svg") %>" />
<%= gettext("Transactions") %>
</a>
<div class="dropdown-menu topnav-dropdown" aria-labelledby="navbarDropdown">
<%= link(gettext("Validated"), to: transaction_path(@conn, :index, Gettext.get_locale), class: "dropdown-item topnav-dropdown-items") %>
<%= link(gettext("Pending"), to: pending_transaction_path(@conn, :index, Gettext.get_locale), class: "dropdown-item topnav-dropdown-items") %>
</div>
</div>
</div>
</header>

@ -11,34 +11,7 @@
<body>
<div class="content-wrapper">
<!-- Sidebar Holder -->
<div id="sidebar--container">
<nav id="sidebar">
<div class="sidebar-header">
<%= link to: chain_path(@conn, :show), "data-test": "header_logo" do %>
<img class="" src="<%= static_path(@conn, "/images/logo.svg") %>" />
<% end %>
</div>
<div class="menu-items">
<%= link to: block_path(@conn, :index, Gettext.get_locale), class: "header__link" do %>
<div tabindex="0" class="icon-locate">
<img class="" src="<%= static_path(@conn, "/images/block.svg") %>" />
<%= gettext("Blocks") %>
</div>
<% end %>
<div tabindex="0" class="icon-locate">
<a href="#pageSubmenu" data-toggle="collapse" aria-expanded="false">
<img class="" src="<%= static_path(@conn, "/images/transaction.svg") %>" />
<%= gettext("Transactions") %>
<i class="fa fa-caret-down"></i>
</a>
<ul class="collapse list-unstyled" id="pageSubmenu">
<li><%= link(gettext("Validated"), to: transaction_path(@conn, :index, Gettext.get_locale)) %></li>
<li><%= link(gettext("Pending"), to: pending_transaction_path(@conn, :index, Gettext.get_locale)) %></li>
</ul>
</div>
</div>
</nav>
</div>
<%= render ExplorerWeb.LayoutView, "_sidebar.html", assigns %>
<!-- Page Content Holder -->
<div id="content">
<div class="content-header">
@ -49,27 +22,8 @@
<span></span>
</button>
</nav>
<header class="header">
<div class="header__container" cellspacing="0" cellpadding="0" border="0">
<div class="header__row">
<div class="header__cell header__cell--search">
<%= form_for @conn, chain_path(@conn, :search, Gettext.get_locale), [class: "header__cell--search-form", method: :get, enforce_utf8: false], fn f -> %>
<%= img_tag :svg, src: static_path(@conn, "/images/mgi.svg"), class: "header__cell--search-glass" %>
<%= search_input f, :q, class: 'header__cell--search-input', placeholder: gettext "Search by address, transaction hash, or block number" %>
<% end %>
</div>
<div class="header__cell header__cell--links u-nudge-top" align="right">
<%= for {service, link} <- configured_social_media_services() do %>
<%= link to: link, class: "header__link", target: "_blank", "data-test": "#{service}_link" do %>
<div class="social-media">
<i class="fab fa-<%= service %>"></i>
</div>
<% end %>
<% end %>
</div>
</div>
</div>
</header>
<%= render ExplorerWeb.LayoutView, "_ribbon.html", assigns %>
<%= render ExplorerWeb.LayoutView, "_topnav.html", assigns %>
</div>
<div class="content-container">
<main>
@ -79,7 +33,6 @@
</main>
</div>
<%= render ExplorerWeb.LayoutView, "_footer.html", assigns %>
<!-- <%= render ExplorerWeb.LayoutView, "_footer.html", assigns %> -->
</div>
<script src="<%= static_path(@conn, "/js/app.js") %>"></script>
</body>

@ -1,82 +1,74 @@
<section class="container__section">
<section class="container__subsection">
<div class="transactions__headline">
<h1 class="transactions__headline-title">
<%= gettext("Showing %{count} Pending Transactions", count: @transaction_count) %>
<div>
<h1>
Transactions
</h1>
<p>
<%= gettext("Showing %{count} Pending Transactions", count: @transaction_count) %>
</p>
</div>
<div class="transactions">
<div class="transactions__tabs">
<h2 class="transactions__tab">
<div>
<ul class="nav nav-tabs">
<li class="nav-item">
<%= link(
gettext("Transactions"),
class: "transactions__tab-link",
gettext("Validated"),
class: "nav-link",
to: transaction_path(@conn, :index, @conn.assigns.locale)
) %>
</h2>
<h2 class="transactions__tab transactions__tab--active">
</li>
<li class="nav-item">
<%= link(
gettext("Pending"),
class: "transactions__tab-link transactions__tab-link--active",
class: "nav-link active",
to: pending_transaction_path(@conn, :index, @conn.assigns.locale)
) %>
</h2>
</li>
</ul>
</div>
<div class="transactions__container">
<table class="transactions__table">
<thead class="transactions__header">
<div class="panels container__subsection">
<div class="panels__container">
<table class="table table-responsive-sm table-font">
<thead>
<tr>
<th class="transactions__column-header transactions__column-header--status">
<span class="transactions__column-title transactions__column-title--status">
<th>
<%= gettext "Status" %>
</span>
</th>
<th class="transactions__column-header"><%= gettext "Hash" %></th>
<th class="transactions__column-header"><%= gettext "Last Seen" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "From" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "To" %></th>
<th class="transactions__column-header"><%= gettext "Value" %></th>
<th><%= gettext "Hash" %></th>
<th><%= gettext "Last Seen" %></th>
<th><%= gettext "From" %></th>
<th><%= gettext "To" %></th>
<th><%= gettext "Value" %> (<%= gettext "Ether" %>)</th>
</tr>
</thead>
<tbody>
<%= for transaction <- @transactions do %>
<tr class="transactions__row">
<td class="transactions__column transactions__column--status">
<div class="transactions__dot transactions__dot--pending"></div>
<tr>
<td>
<div class="transaction__dot transaction__dot--pending"></div>
</td>
<td class="transactions__column transactions__column--hash">
<%= link(
hash(transaction),
class: "transactions__link transactions__link--truncated transactions__link--long-hash",
to: transaction_path(@conn, :show, @conn.assigns.locale, transaction)
) %>
<td>
<%= render ExplorerWeb.TransactionView, "_link.html", conn: @conn, transaction: transaction %>
</td>
<td class="transactions__column transactions__column--last-seen"><%= last_seen(transaction) %></td>
<td class="transactions__column transactions__column--optional transactions__column--to-address">
<%= link(
from_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.from_address)
) %>
<td><%= last_seen(transaction) %></td>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.from_address %>
</td>
<td class="transactions__column transactions__column--optional transactions__column--from-address">
<%= link(
to_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.to_address)
) %>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.to_address %>
</td>
<td class="transactions__column transactions__column--value">
<%= ExplorerWeb.TransactionView.value(transaction) %>
<td>
<%= ExplorerWeb.TransactionView.value(transaction, include_label: false) %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<%= if @last_seen_pending_inserted_at do %>
<%= link(
gettext("Next Page"),
class: "transactions__link transactions__link--next-page",
class: "button button--secondary button--sm u-float-right",
to: pending_transaction_path(
@conn,
:index,
@ -88,7 +80,4 @@
)
) %>
<% end %>
</div>
</div>
</section>
</section>

@ -0,0 +1,8 @@
<%= link(@transaction |> hash |> String.slice(2..7),
to: transaction_path(@conn, :show, @conn.assigns.locale, @transaction),
"data-toggle": "tooltip",
"data-placement": "top",
"data-test": "transaction_hash",
"data-transaction-hash": @transaction.hash,
class: "monospace",
title: @transaction) %>

@ -1,96 +1,81 @@
<section class="container__section">
<section class="container__subsection">
<div class="transactions__headline">
<h1 class="transactions__headline-title">
<%= gettext("Showing %{count} Transactions", count: @transaction_count) %>
<h1>
Transactions
</h1>
</div>
<div class="transactions">
<div class="transactions__tabs">
<h2 class="transactions__tab transactions__tab--active">
<p>
<%= gettext("Showing %{count} Validated Transactions", count: @transaction_count) %>
</p>
<div>
<ul class="nav nav-tabs">
<li class="nav-item">
<%= link(
gettext("Transactions"),
class: "transactions__tab-link transactions__tab-link--active",
gettext("Validated"),
class: "nav-link active",
to: transaction_path(@conn, :index, @conn.assigns.locale)
) %>
</h2>
<h2 class="transactions__tab">
</li>
<li class="nav-item">
<%= link(
gettext("Pending"),
class: "transactions__tab-link",
to: pending_transaction_path(@conn, :index, @conn.assigns.locale)
class: "nav-link",
to: pending_transaction_path(@conn, :index, @conn.assigns.locale),
"data-test": "pending_transactions_link"
) %>
</h2>
</li>
</ul>
</div>
<div class="transactions__container">
<table class="transactions__table">
<thead class="transactions__header">
<div class="panels container__subsection">
<div class="panels__container">
<table class="table table-responsive-sm table-font">
<thead>
<tr>
<th class="transactions__column-header transactions__column-header--status">
<span class="transactions__column-title transactions__column-title--status">
<%= gettext "Status" %>
</span>
</th>
<th class="transactions__column-header"><%= gettext "Hash" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "Block" %></th>
<th class="transactions__column-header"><%= gettext "Age" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "From" %></th>
<th class="transactions__column-header transactions__column-header--optional"><%= gettext "To" %></th>
<th class="transactions__column-header"><%= gettext "Value" %></th>
<th><%= gettext "Status" %></th>
<th><%= gettext "Hash" %></th>
<th><%= gettext "Block" %></th>
<th><%= gettext "Age" %></th>
<th><%= gettext "From" %></th>
<th><%= gettext "To" %></th>
<th><%= gettext "Value" %> (<%= gettext "Ether" %>)</th>
</tr>
</thead>
<tbody>
<%= for transaction <- @transactions do %>
<tr class="transactions__row">
<td class="transactions__column transactions__column--status">
<div class="transactions__dot transactions__dot--<%= status(transaction) %>"></div>
<tr>
<td>
<div class="transaction__dot transaction__dot--<%= status(transaction) %>"></div>
</td>
<td class="transactions__column transactions__column--hash">
<div class="transactions__hash">
<%= link(
hash(transaction),
class: "transactions__link transactions__link--truncated transactions__link--long-hash",
to: transaction_path(@conn, :show, @conn.assigns.locale, transaction)
) %>
</div>
<td>
<%= render ExplorerWeb.TransactionView, "_link.html", conn: @conn, transaction: transaction %>
</td>
<td class="transactions__column transactions__column--block transactions__column--optional">
<td>
<%= link(
block(transaction),
transaction.block,
class: "transactions__link",
to: block_path(@conn, :show, @conn.assigns.locale, transaction.block)
) %>
</td>
<td class="transactions__column transactions__column--age">
<td>
<%= transaction.block.timestamp |> Timex.from_now %>
</td>
<td class="transactions__column transactions__column--from transactions__column--optional">
<div class="transactions__hash">
<%= link(
from_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.from_address)
) %></div>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.from_address %>
</td>
<td class="transactions__column transactions__column--to transactions__column--optional">
<div class="transactions__hash">
<%= link(
to_address(transaction),
class: "transactions__link transactions__link--truncated transactions__link--hash",
to: address_path(@conn, :show, @conn.assigns.locale, transaction.to_address)
) %></div>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.to_address %>
</td>
<td class="transactions__column transactions__column--value">
<%= value(transaction) %>
<td>
<%= ExplorerWeb.TransactionView.value(transaction, include_label: false) %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<%= if @last_seen_collated_hash do %>
<%= link(
gettext("Next Page"),
class: "transactions__link transactions__link--next-page",
class: "button button--secondary button--sm u-float-right",
to: transaction_path(
@conn,
:index,
@ -99,7 +84,4 @@
)
) %>
<% end %>
</div>
</div>
</section>
</section>

@ -1,24 +1,24 @@
<div class="transaction__header">
<h1 class="transaction__heading"><%= gettext "Transaction Details" %></h1>
<h3 class="transaction__subheading"><%= @transaction %></h3>
</div>
<div class="transaction__container">
<div class="transaction__attributes">
<div class="transaction__column">
<dl>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Transaction Status" %></dt>
<dd class="transaction__item-value transaction__item-value--status">
<div class="transaction__status">
<h1><%= gettext "Transaction Details" %></h1>
<p data-test="transaction_detail_hash"><%= @transaction %></p>
<div class="panels container__subsection">
<div class="panels__container row">
<div class="col-md-6">
<table class="table table-font table-responsive-sm table-horizontal">
<tbody>
<tr>
<th scope="row">
<%= gettext "Transaction Status" %>
</th>
<td>
<%= formatted_status(@transaction) %>
<div class="transaction__dot transaction__dot--<%= status(@transaction) %>"></div>
</div>
</dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Block Number" %></dt>
<dd class="transaction__item-value">
<span class="transaction__item--primary">
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Block Number" %>
</th>
<td>
<% block = @transaction.block %>
<%= if block do %>
<%= link(
@ -27,25 +27,30 @@
to: block_path(@conn, :show, @conn.assigns.locale, block)
) %>
<% end %>
</span>
<span class="transaction__item--secondary">
(<%= gettext "%{confirmations} block confirmations", confirmations: confirmations(@transaction, max_block_number: @max_block_number) %>)
</span>
</dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Age" %></dt>
<dd class="transaction__item-value" title="<%= formatted_timestamp(@transaction) %>">
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Age" %>
</th>
<td title="<%= formatted_timestamp(@transaction) %>">
<%= formatted_age(@transaction) %>
</dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Value" %></dt>
<dd class="transaction__item-value"><%= value(@transaction) %></dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "From" %></dt>
<dd class="transaction__item-value">
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Value" %>
</th>
<td>
<%= value(@transaction) %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "From" %>
</th>
<td>
<%= if @transaction.from_address do %>
<%= link(
@transaction.from_address,
@ -55,11 +60,13 @@
<% else %>
<%= gettext "Pending" %>
<% end %>
</dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "To" %></dt>
<dd class="transaction__item-value">
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "To" %>
</th>
<td>
<%= if @transaction.to_address do %>
<%= link(
@transaction.to_address,
@ -69,46 +76,75 @@
<% else %>
<%= gettext "Pending" %>
<% end %>
</dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Nonce" %></dt>
<dd class="transaction__item-value"><%= @transaction.nonce %></dd>
</div>
</dl>
</div>
<div class="transaction__column">
<dl>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "First Seen" %></dt>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Nonce" %>
</th>
<td>
<%= @transaction.nonce %>
</td>
</tr>
</tbody>
</table>
</div>
<div class="col-md-6">
<table class="table table-font table-responsive-sm table-horizontal">
<tbody>
<tr>
<th scope="row">
<%= gettext "First Seen" %>
</th>
<% first_seen = first_seen(@transaction) %>
<dd class="transaction__item-value" title="<%= first_seen %>"><%= first_seen %></dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Last Seen" %></dt>
<td title="<%= first_seen %>">
<%= first_seen %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Last Seen" %>
</th>
<% last_seen = last_seen(@transaction) %>
<dd class="transaction__item-value" title="<%= last_seen %>"><%= last_seen %></dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Gas Limit" %></dt>
<dd class="transaction__item-value"><%= format_gas_limit(@transaction.gas) %> <%= gettext("Gas") %></dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Gas Price" %></dt>
<dd class="transaction__item-value">
<td title="<%= last_seen %>">
<%= last_seen %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Gas Limit" %>
</th>
<td title="<%= last_seen %>">
<%= format_gas_limit(@transaction.gas) %> <%= gettext("Gas") %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Gas Price" %>
</th>
<td title="<%= last_seen %>">
<%= gas_price(@transaction, :wei) %>
(<%= gas_price(@transaction, :gwei) %>)
</dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Cumulative Gas Used" %></dt>
<dd class="transaction__item-value"><%= cumulative_gas_used(@transaction) %> <%= gettext("Wei") %></dd>
</div>
<div class="transaction__item">
<dt class="transaction__item-key"><%= gettext "Input" %></dt>
<dd class="transaction__item-value" title="<%= @transaction.input %>"><%= @transaction.input %></dd>
</div>
</dl>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Total Gas Used" %>
</th>
<td title="<%= last_seen %>">
<%= cumulative_gas_used(@transaction) %> <%= gettext("Wei") %>
</td>
</tr>
<tr>
<th scope="row">
<%= gettext "Input" %>
</th>
<td title="<%= @transaction.input %>">
<%= @transaction.input %>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>

@ -1,48 +1,44 @@
<section class="container__section transaction">
<section class="container__section">
<%= render "overview.html", assigns %>
<div class="transaction__container">
<div class="transaction__tabs">
<h2 class="transaction__tab transaction__tab--active">
<div>
<ul class="nav nav-tabs">
<li class="nav-item">
<%= link(
gettext("Internal Transactions"),
class: "transaction__link transaction__link--active",
class: "nav-link active",
to: transaction_path(@conn, :show, @conn.assigns.locale, @transaction)
) %>
</h2>
<h2 class="transaction__tab">
</li>
<li class="nav-item">
<%= link(
gettext("Logs"),
class: "transaction__link",
to: transaction_log_path(@conn, :index, @conn.assigns.locale, @transaction)
class: "nav-link",
to: transaction_log_path(@conn, :index, @conn.assigns.locale, @transaction),
"data-test": "transaction_logs_link"
) %>
</h2>
</li>
</ul>
</div>
<div class="internal-transaction__container">
<div class="panels container__subsection">
<div class="panels__container">
<%= if length(@internal_transactions.entries) > 0 do %>
<table class="internal-transaction__table">
<table class="table table-responsive-sm table-font">
<thead>
<th class="internal-transaction__column-header"><%= gettext "Type" %></th>
<th class="internal-transaction__column-header"><%= gettext "From" %></th>
<th class="internal-transaction__column-header"><%= gettext "To" %></th>
<th class="internal-transaction__column-header"><%= gettext "Value" %> (<%= gettext "Ether" %>)</th>
<th class="internal-transaction__column-header"><%= gettext "Gas Limit" %> (<%= gettext "Gas" %>)</th>
<th><%= gettext "Type" %></th>
<th><%= gettext "From" %></th>
<th><%= gettext "To" %></th>
<th><%= gettext "Value" %> (<%= gettext "Ether" %>)</th>
<th><%= gettext "Gas Limit" %> (<%= gettext "Gas" %>)</th>
</thead>
<%= for transaction <- @internal_transactions do %>
<tgroup>
<tr>
<td><%= transaction.call_type %></td>
<td class="internal-transaction__from-address">
<%= link(transaction.from_address,
to: address_path(@conn, :show, @conn.assigns.locale, transaction.from_address),
class: "transaction-log__link") %>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.from_address %>
</td>
<td class="internal-transaction__to-address">
<%= if transaction.to_address do %>
<%= link(transaction.to_address,
to: address_path(@conn, :show, @conn.assigns.locale, transaction.to_address),
class: "transaction-log__link") %>
<% end %>
<td>
<%= render ExplorerWeb.AddressView, "_link.html", conn: @conn, address: transaction.to_address %>
</td>
<td><%= value(transaction, include_label: false) %></td>
<td><%= gas(transaction) %></td>

@ -1,39 +1,40 @@
<section class="container__section">
<%= render ExplorerWeb.TransactionView, "overview.html", assigns %>
<div class="transaction-log">
<div class="transaction-log__tabs">
<h2 class="transaction__tab">
<div>
<ul class="nav nav-tabs">
<li class="nav-item">
<%= link(
gettext("Internal Transactions"),
class: "transaction__link",
class: "nav-link",
to: transaction_path(@conn, :show, @conn.assigns.locale, @transaction)
) %>
</h2>
<h2 class="transaction__tab transaction__tab--active">
</li>
<li class="nav-item">
<%= link(
gettext("Logs"),
class: "transaction__link transaction__link--active",
class: "nav-link active",
to: transaction_log_path(@conn, :index, @conn.assigns.locale, @transaction)
) %>
</h2>
</li>
</ul>
</div>
<div class="transaction-log__container">
<div class="panels container__subsection">
<div class="panels__container">
<%= if length(@logs.entries) > 0 do %>
<table class="transaction-log__table">
<table class="table table-responsive-sm table-font">
<thead>
<th class="transaction-log__column-header"><%= gettext "Address" %></th>
<th class="transaction-log__column-header"><%= gettext "Topic" %></th>
<th><%= gettext "Address" %></th>
<th><%= gettext "Topic" %></th>
</thead>
<%= for log <- @logs.entries do %>
<tgroup>
<tr>
<tr data-test="transaction_log">
<td>
<%= link(
log.address,
class: "transaction-log__link",
to: address_path(@conn, :show, @conn.assigns.locale, log.address)
to: address_path(@conn, :show, @conn.assigns.locale, log.address),
"data-test": "log_address_link",
"data-address-hash": log.address
) %>
</td>
<td><%= log.first_topic %></td>

@ -3,10 +3,6 @@ defmodule ExplorerWeb.AddressTransactionView do
alias ExplorerWeb.TransactionView
defdelegate block(transaction), to: TransactionView
defdelegate from_address(transaction), to: TransactionView
defdelegate hash(transaction), to: TransactionView
def format_current_filter(filter) do
case filter do
"to" -> gettext("To")
@ -16,5 +12,4 @@ defmodule ExplorerWeb.AddressTransactionView do
end
defdelegate status(transaction), to: TransactionView
defdelegate to_address(transaction), to: TransactionView
end

@ -13,4 +13,8 @@ defmodule ExplorerWeb.AddressView do
def balance(%Address{fetched_balance: balance}) do
format_wei_value(balance, :ether, fractional_digits: 18)
end
def hash(%Address{hash: hash}) do
to_string(hash)
end
end

@ -4,10 +4,6 @@ defmodule ExplorerWeb.BlockTransactionView do
alias ExplorerWeb.{BlockView, TransactionView}
defdelegate age(block), to: BlockView
defdelegate block(transaction), to: TransactionView
defdelegate formatted_timestamp(block), to: BlockView
defdelegate from_address(transaction), to: TransactionView
defdelegate hash(transaction), to: TransactionView
defdelegate status(transacton), to: TransactionView
defdelegate to_address(transaction), to: TransactionView
end

@ -0,0 +1,3 @@
defmodule ExplorerWeb.IconsView do
use ExplorerWeb, :view
end

@ -5,8 +5,5 @@ defmodule ExplorerWeb.PendingTransactionView do
@dialyzer :no_match
defdelegate from_address(transaction), to: TransactionView
defdelegate hash(transaction), to: TransactionView
defdelegate last_seen(transaction), to: TransactionView
defdelegate to_address(transaction), to: TransactionView
end

@ -3,16 +3,9 @@ defmodule ExplorerWeb.TransactionView do
alias Cldr.Number
alias Explorer.Chain
alias Explorer.Chain.{Address, Block, InternalTransaction, Transaction, Wei}
alias Explorer.Chain.{Block, InternalTransaction, Transaction, Wei}
alias ExplorerWeb.BlockView
def block(%Transaction{block: block}) do
case block do
nil -> gettext("Pending")
_ -> to_string(block.number)
end
end
def confirmations(%Transaction{block: block}, named_arguments) when is_list(named_arguments) do
case block do
nil -> 0
@ -62,10 +55,6 @@ defmodule ExplorerWeb.TransactionView do
end
end
def from_address(%Transaction{from_address: %Address{hash: hash}}) do
to_string(hash)
end
defguardp is_transaction_type(mod) when mod in [InternalTransaction, Transaction]
def gas(%type{gas: gas}) when is_transaction_type(type) do
@ -102,13 +91,6 @@ defmodule ExplorerWeb.TransactionView do
end
end
def to_address(%Transaction{to_address: to_address}) do
case to_address do
nil -> "Contract Creation"
_ -> to_string(to_address)
end
end
@doc """
Converts a transaction's Wei value to Ether and returns a formatted display value.

@ -1,25 +1,25 @@
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:65
#: lib/explorer_web/templates/address_transaction/index.html.eex:69
#: lib/explorer_web/templates/block/index.html.eex:30
#: lib/explorer_web/templates/block_transaction/index.html.eex:99
#: lib/explorer_web/templates/chain/show.html.eex:59
#: lib/explorer_web/templates/chain/show.html.eex:98
#: lib/explorer_web/templates/transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/overview.html.eex:37
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:67
#: lib/explorer_web/templates/address_transaction/index.html.eex:70
#: lib/explorer_web/templates/block/index.html.eex:20
#: lib/explorer_web/templates/block_transaction/index.html.eex:135
#: lib/explorer_web/templates/chain/_blocks.html.eex:9
#: lib/explorer_web/templates/chain/_transactions.html.eex:12
#: lib/explorer_web/templates/transaction/index.html.eex:35
#: lib/explorer_web/templates/transaction/overview.html.eex:35
msgid "Age"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:64
#: lib/explorer_web/templates/address_transaction/index.html.eex:68
#: lib/explorer_web/templates/block_transaction/index.html.eex:98
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:66
#: lib/explorer_web/templates/address_transaction/index.html.eex:69
#: lib/explorer_web/templates/block_transaction/index.html.eex:134
#: lib/explorer_web/templates/chain/show.html.eex:6
#: lib/explorer_web/templates/chain/show.html.eex:97
#: lib/explorer_web/templates/transaction/index.html.eex:35
#: lib/explorer_web/templates/transaction/index.html.eex:34
msgid "Block"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:46
#: lib/explorer_web/templates/layout/app.html.eex:25
#: lib/explorer_web/templates/chain/_blocks.html.eex:4
#: lib/explorer_web/templates/layout/_sidebar.html.eex:30
#: lib/explorer_web/templates/layout/_topnav.html.eex:22
msgid "Blocks"
msgstr ""
@ -27,23 +27,21 @@ msgstr ""
msgid "Copyright %{year} POA"
msgstr ""
#: lib/explorer_web/templates/block/index.html.eex:32
#: lib/explorer_web/templates/block_transaction/index.html.eex:60
#: lib/explorer_web/templates/chain/show.html.eex:61
#: lib/explorer_web/templates/block/index.html.eex:22
#: lib/explorer_web/templates/block_transaction/index.html.eex:87
msgid "Gas Used"
msgstr ""
#: lib/explorer_web/templates/address_transaction/index.html.eex:67
#: lib/explorer_web/templates/block_transaction/index.html.eex:22
#: lib/explorer_web/templates/block_transaction/index.html.eex:97
#: lib/explorer_web/templates/chain/show.html.eex:96
#: lib/explorer_web/templates/pending_transaction/index.html.eex:34
#: lib/explorer_web/templates/transaction/index.html.eex:34
#: lib/explorer_web/templates/address_transaction/index.html.eex:68
#: lib/explorer_web/templates/block_transaction/index.html.eex:29
#: lib/explorer_web/templates/block_transaction/index.html.eex:133
#: lib/explorer_web/templates/pending_transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/index.html.eex:33
msgid "Hash"
msgstr ""
#: lib/explorer_web/templates/block/index.html.eex:29
#: lib/explorer_web/templates/chain/show.html.eex:58
#: lib/explorer_web/templates/block/index.html.eex:19
#: lib/explorer_web/templates/chain/_blocks.html.eex:8
msgid "Height"
msgstr ""
@ -51,27 +49,24 @@ msgstr ""
msgid "POA Network Explorer"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:8
#: lib/explorer_web/templates/address_transaction/index.html.eex:8
#: lib/explorer_web/templates/block/index.html.eex:31
#: lib/explorer_web/templates/block_transaction/index.html.eex:16
#: lib/explorer_web/templates/block_transaction/index.html.eex:84
#: lib/explorer_web/templates/chain/show.html.eex:60
#: lib/explorer_web/templates/chain/show.html.eex:87
#: lib/explorer_web/templates/layout/app.html.eex:31
#: lib/explorer_web/templates/pending_transaction/index.html.eex:12
#: lib/explorer_web/templates/transaction/index.html.eex:12
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:7
#: lib/explorer_web/templates/address_transaction/index.html.eex:7
#: lib/explorer_web/templates/block/index.html.eex:21
#: lib/explorer_web/templates/block_transaction/index.html.eex:118
#: lib/explorer_web/templates/chain/_transactions.html.eex:4
#: lib/explorer_web/templates/layout/_sidebar.html.eex:36
#: lib/explorer_web/templates/layout/_topnav.html.eex:29
msgid "Transactions"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:68
#: lib/explorer_web/templates/address_transaction/index.html.eex:72
#: lib/explorer_web/templates/block_transaction/index.html.eex:102
#: lib/explorer_web/templates/chain/show.html.eex:99
#: lib/explorer_web/templates/pending_transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/index.html.eex:39
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:70
#: lib/explorer_web/templates/address_transaction/index.html.eex:74
#: lib/explorer_web/templates/block_transaction/index.html.eex:139
#: lib/explorer_web/templates/chain/_transactions.html.eex:11
#: lib/explorer_web/templates/pending_transaction/index.html.eex:40
#: lib/explorer_web/templates/transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/overview.html.eex:43
#: lib/explorer_web/templates/transaction/show.html.eex:28
#: lib/explorer_web/templates/transaction/show.html.eex:30
msgid "Value"
msgstr ""
@ -79,23 +74,23 @@ msgstr ""
msgid "Block #%{number} Details"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:40
#: lib/explorer_web/templates/block_transaction/index.html.eex:57
msgid "Difficulty"
msgstr ""
#: lib/explorer_web/templates/block/index.html.eex:33
#: lib/explorer_web/templates/block_transaction/index.html.eex:68
#: lib/explorer_web/templates/transaction/overview.html.eex:93
#: lib/explorer_web/templates/transaction/show.html.eex:29
#: lib/explorer_web/templates/block/index.html.eex:23
#: lib/explorer_web/templates/block_transaction/index.html.eex:95
#: lib/explorer_web/templates/block_transaction/index.html.eex:103
#: lib/explorer_web/templates/transaction/overview.html.eex:115
#: lib/explorer_web/templates/transaction/show.html.eex:31
msgid "Gas Limit"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:36
#: lib/explorer_web/templates/block_transaction/index.html.eex:49
msgid "Miner"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:72
#: lib/explorer_web/templates/transaction/overview.html.eex:75
#: lib/explorer_web/templates/transaction/overview.html.eex:83
msgid "Nonce"
msgstr ""
@ -103,19 +98,19 @@ msgstr ""
msgid "Number"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:26
#: lib/explorer_web/templates/block_transaction/index.html.eex:37
msgid "Parent Hash"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:56
#: lib/explorer_web/templates/block_transaction/index.html.eex:79
msgid "Size"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:12
#: lib/explorer_web/templates/block_transaction/index.html.eex:13
msgid "Timestamp"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:50
#: lib/explorer_web/templates/block_transaction/index.html.eex:71
msgid "Total Difficulty"
msgstr ""
@ -123,7 +118,7 @@ msgstr ""
msgid "Block Number"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:2
#: lib/explorer_web/templates/transaction/overview.html.eex:1
msgid "Transaction Details"
msgstr ""
@ -131,27 +126,28 @@ msgstr ""
msgid "Cumulative Gas Used"
msgstr ""
#: lib/explorer_web/templates/block/index.html.eex:32
#: lib/explorer_web/templates/block/index.html.eex:33
#: lib/explorer_web/templates/transaction/overview.html.eex:94
#: lib/explorer_web/templates/transaction/show.html.eex:29
#: lib/explorer_web/templates/block/index.html.eex:22
#: lib/explorer_web/templates/block/index.html.eex:23
#: lib/explorer_web/templates/chain/_blocks.html.eex:11
#: lib/explorer_web/templates/transaction/overview.html.eex:118
#: lib/explorer_web/templates/transaction/show.html.eex:31
msgid "Gas"
msgstr ""
#: lib/explorer_web/templates/block/index.html.eex:34
#: lib/explorer_web/templates/transaction/overview.html.eex:97
#: lib/explorer_web/templates/block/index.html.eex:24
#: lib/explorer_web/templates/transaction/overview.html.eex:123
msgid "Gas Price"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:108
#: lib/explorer_web/templates/transaction/overview.html.eex:140
msgid "Input"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:32
#: lib/explorer_web/templates/transaction/overview.html.eex:30
msgid "%{confirmations} block confirmations"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:18
#: lib/explorer_web/templates/block_transaction/index.html.eex:24
msgid "%{count} transactions in this block"
msgstr ""
@ -160,17 +156,18 @@ msgstr ""
msgid "Address"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:46
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:66
#: lib/explorer_web/templates/address_transaction/index.html.eex:47
#: lib/explorer_web/templates/address_transaction/index.html.eex:70
#: lib/explorer_web/templates/block_transaction/index.html.eex:100
#: lib/explorer_web/templates/pending_transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/overview.html.eex:47
#: lib/explorer_web/templates/transaction/show.html.eex:26
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:48
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:68
#: lib/explorer_web/templates/address_transaction/index.html.eex:48
#: lib/explorer_web/templates/address_transaction/index.html.eex:71
#: lib/explorer_web/templates/block_transaction/index.html.eex:136
#: lib/explorer_web/templates/chain/_transactions.html.eex:9
#: lib/explorer_web/templates/pending_transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/overview.html.eex:51
#: lib/explorer_web/templates/transaction/show.html.eex:28
#: lib/explorer_web/views/address_internal_transaction_view.ex:7
#: lib/explorer_web/views/address_transaction_view.ex:13
#: lib/explorer_web/views/address_transaction_view.ex:9
msgid "From"
msgstr ""
@ -179,21 +176,22 @@ msgstr ""
msgid "Overview"
msgstr ""
#: lib/explorer_web/views/transaction_view.ex:101
#: lib/explorer_web/views/transaction_view.ex:90
msgid "Success"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:34
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:67
#: lib/explorer_web/templates/address_transaction/index.html.eex:35
#: lib/explorer_web/templates/address_transaction/index.html.eex:71
#: lib/explorer_web/templates/block_transaction/index.html.eex:101
#: lib/explorer_web/templates/pending_transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/overview.html.eex:61
#: lib/explorer_web/templates/transaction/show.html.eex:27
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:36
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:69
#: lib/explorer_web/templates/address_transaction/index.html.eex:36
#: lib/explorer_web/templates/address_transaction/index.html.eex:73
#: lib/explorer_web/templates/block_transaction/index.html.eex:138
#: lib/explorer_web/templates/chain/_transactions.html.eex:10
#: lib/explorer_web/templates/pending_transaction/index.html.eex:39
#: lib/explorer_web/templates/transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/overview.html.eex:67
#: lib/explorer_web/templates/transaction/show.html.eex:29
#: lib/explorer_web/views/address_internal_transaction_view.ex:6
#: lib/explorer_web/views/address_transaction_view.ex:12
#: lib/explorer_web/views/address_transaction_view.ex:8
msgid "To"
msgstr ""
@ -220,11 +218,11 @@ msgstr ""
msgid "POA"
msgstr ""
#: lib/explorer_web/templates/block/index.html.eex:49
#: lib/explorer_web/templates/block/index.html.eex:41
msgid "%{count} transactions"
msgstr ""
#: lib/explorer_web/templates/block/index.html.eex:4
#: lib/explorer_web/templates/block/index.html.eex:7
msgid "Showing #%{start_block} to #%{end_block}"
msgstr ""
@ -232,34 +230,34 @@ msgstr ""
msgid "Showing %{count} Transactions"
msgstr ""
#: lib/explorer_web/templates/layout/app.html.eex:36
#: lib/explorer_web/templates/pending_transaction/index.html.eex:19
#: lib/explorer_web/templates/layout/_sidebar.html.eex:41
#: lib/explorer_web/templates/layout/_topnav.html.eex:33
#: lib/explorer_web/templates/pending_transaction/index.html.eex:21
#: lib/explorer_web/templates/transaction/index.html.eex:19
#: lib/explorer_web/templates/transaction/overview.html.eex:56
#: lib/explorer_web/templates/transaction/overview.html.eex:70
#: lib/explorer_web/views/transaction_view.ex:11
#: lib/explorer_web/views/transaction_view.ex:25
#: lib/explorer_web/templates/transaction/overview.html.eex:61
#: lib/explorer_web/templates/transaction/overview.html.eex:77
#: lib/explorer_web/views/transaction_view.ex:18
#: lib/explorer_web/views/transaction_view.ex:46
#: lib/explorer_web/views/transaction_view.ex:53
#: lib/explorer_web/views/transaction_view.ex:60
#: lib/explorer_web/views/transaction_view.ex:100
#: lib/explorer_web/views/transaction_view.ex:89
msgid "Pending"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:83
#: lib/explorer_web/templates/transaction/overview.html.eex:97
msgid "First Seen"
msgstr ""
#: lib/explorer_web/templates/pending_transaction/index.html.eex:35
#: lib/explorer_web/templates/transaction/overview.html.eex:88
#: lib/explorer_web/templates/pending_transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/overview.html.eex:106
msgid "Last Seen"
msgstr ""
#: lib/explorer_web/templates/transaction/show.html.eex:15
#: lib/explorer_web/templates/transaction_log/index.html.eex:15
#: lib/explorer_web/templates/transaction/show.html.eex:14
#: lib/explorer_web/templates/transaction_log/index.html.eex:14
msgid "Logs"
msgstr ""
#: lib/explorer_web/templates/pending_transaction/index.html.eex:5
#: lib/explorer_web/templates/pending_transaction/index.html.eex:7
msgid "Showing %{count} Pending Transactions"
msgstr ""
@ -299,23 +297,23 @@ msgstr ""
msgid "TPM"
msgstr ""
#: lib/explorer_web/templates/pending_transaction/index.html.eex:78
#: lib/explorer_web/templates/transaction/index.html.eex:92
#: lib/explorer_web/templates/pending_transaction/index.html.eex:70
#: lib/explorer_web/templates/transaction/index.html.eex:77
msgid "Next Page"
msgstr ""
#: lib/explorer_web/views/transaction_view.ex:98
#: lib/explorer_web/views/transaction_view.ex:87
msgid "Failed"
msgstr ""
#: lib/explorer_web/views/transaction_view.ex:99
#: lib/explorer_web/views/transaction_view.ex:88
msgid "Out of Gas"
msgstr ""
#: lib/explorer_web/templates/address_transaction/index.html.eex:65
#: lib/explorer_web/templates/block_transaction/index.html.eex:95
#: lib/explorer_web/templates/pending_transaction/index.html.eex:31
#: lib/explorer_web/templates/transaction/index.html.eex:31
#: lib/explorer_web/templates/address_transaction/index.html.eex:66
#: lib/explorer_web/templates/block_transaction/index.html.eex:131
#: lib/explorer_web/templates/pending_transaction/index.html.eex:34
#: lib/explorer_web/templates/transaction/index.html.eex:32
msgid "Status"
msgstr ""
@ -327,7 +325,11 @@ msgstr ""
msgid "Showing #%{number}"
msgstr ""
#: lib/explorer_web/templates/transaction/show.html.eex:28
#: lib/explorer_web/templates/address_transaction/index.html.eex:74
#: lib/explorer_web/templates/chain/_transactions.html.eex:11
#: lib/explorer_web/templates/pending_transaction/index.html.eex:40
#: lib/explorer_web/templates/transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/show.html.eex:30
#: lib/explorer_web/views/wei_helpers.ex:84
msgid "Ether"
msgstr ""
@ -337,23 +339,23 @@ msgstr ""
msgid "Gwei"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:15
#: lib/explorer_web/templates/address_transaction/index.html.eex:15
#: lib/explorer_web/templates/transaction/show.html.eex:8
#: lib/explorer_web/templates/transaction_log/index.html.eex:8
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:14
#: lib/explorer_web/templates/address_transaction/index.html.eex:14
#: lib/explorer_web/templates/transaction/show.html.eex:7
#: lib/explorer_web/templates/transaction_log/index.html.eex:7
msgid "Internal Transactions"
msgstr ""
#: lib/explorer_web/templates/layout/app.html.eex:58
#: lib/explorer_web/templates/layout/_topnav.html.eex:6
msgid "Search by address, transaction hash, or block number"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:103
#: lib/explorer_web/templates/transaction/show.html.eex:54
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:96
#: lib/explorer_web/templates/transaction/show.html.eex:50
msgid "There are no Internal Transactions"
msgstr ""
#: lib/explorer_web/templates/transaction_log/index.html.eex:63
#: lib/explorer_web/templates/transaction_log/index.html.eex:64
msgid "There are no logs currently."
msgstr ""
@ -369,27 +371,30 @@ msgstr ""
msgid "Transactions To"
msgstr ""
#: lib/explorer_web/templates/transaction/show.html.eex:25
#: lib/explorer_web/templates/transaction/show.html.eex:27
msgid "Type"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:105
#: lib/explorer_web/templates/transaction/overview.html.eex:135
#: lib/explorer_web/views/wei_helpers.ex:82
msgid "Wei"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:28
#: lib/explorer_web/templates/address_transaction/index.html.eex:29
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:30
#: lib/explorer_web/templates/address_transaction/index.html.eex:30
#: lib/explorer_web/views/address_internal_transaction_view.ex:8
#: lib/explorer_web/views/address_transaction_view.ex:14
#: lib/explorer_web/views/address_transaction_view.ex:10
msgid "All"
msgstr ""
#: lib/explorer_web/templates/address_transaction/index.html.eex:73
#: lib/explorer_web/templates/address_transaction/index.html.eex:75
msgid "Fee"
msgstr ""
#: lib/explorer_web/templates/layout/app.html.eex:35
#: lib/explorer_web/templates/layout/_sidebar.html.eex:40
#: lib/explorer_web/templates/layout/_topnav.html.eex:32
#: lib/explorer_web/templates/pending_transaction/index.html.eex:14
#: lib/explorer_web/templates/transaction/index.html.eex:12
msgid "Validated"
msgstr ""
@ -397,11 +402,11 @@ msgstr ""
msgid "Block Details"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:63
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:65
msgid "Parent Tx Hash"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:34
#: lib/explorer_web/templates/chain/show.html.eex:39
msgid "24h Volume"
msgstr ""
@ -409,20 +414,65 @@ msgstr ""
msgid "Avg Block Time"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:30
#: lib/explorer_web/templates/chain/show.html.eex:35
msgid "Market Cap"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:25
#: lib/explorer_web/templates/chain/show.html.eex:30
msgid "Price"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:26
#: lib/explorer_web/templates/chain/show.html.eex:31
#: lib/explorer_web/templates/chain/show.html.eex:35
#: lib/explorer_web/templates/chain/show.html.eex:36
#: lib/explorer_web/templates/chain/show.html.eex:40
msgid "USD"
msgstr ""
#: lib/explorer_web/templates/address/overview.html.eex:15
msgid "Number of Transactions"
msgstr ""
#: lib/explorer_web/templates/layout/_sidebar.html.eex:24
msgid "Dashboard"
msgstr ""
#: lib/explorer_web/templates/transaction/index.html.eex:6
msgid "Showing %{count} Validated Transactions"
msgstr ""
#: lib/explorer_web/templates/layout/_topnav.html.eex:48
msgid "Smart Contract"
msgstr ""
#: lib/explorer_web/templates/layout/_sidebar.html.eex:12
msgid "Switch Network "
msgstr ""
#: lib/explorer_web/templates/chain/_transactions.html.eex:8
msgid "TX Hash"
msgstr ""
#: lib/explorer_web/templates/chain/_blocks.html.eex:10
msgid "TXNs"
msgstr ""
#: lib/explorer_web/templates/layout/_topnav.html.eex:40
msgid "Tokens"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:132
msgid "Total Gas Used"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:21
msgid "Transaction"
msgstr ""
#: lib/explorer_web/templates/chain/_blocks.html.eex:12
msgid "Validator"
msgstr ""
#: lib/explorer_web/templates/chain/_blocks.html.eex:3
#: lib/explorer_web/templates/chain/_transactions.html.eex:3
msgid "View All"
msgstr ""

@ -10,28 +10,28 @@ msgid ""
msgstr ""
"Language: en\n"
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:65
#: lib/explorer_web/templates/address_transaction/index.html.eex:69
#: lib/explorer_web/templates/block/index.html.eex:30
#: lib/explorer_web/templates/block_transaction/index.html.eex:99
#: lib/explorer_web/templates/chain/show.html.eex:59
#: lib/explorer_web/templates/chain/show.html.eex:98
#: lib/explorer_web/templates/transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/overview.html.eex:37
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:67
#: lib/explorer_web/templates/address_transaction/index.html.eex:70
#: lib/explorer_web/templates/block/index.html.eex:20
#: lib/explorer_web/templates/block_transaction/index.html.eex:135
#: lib/explorer_web/templates/chain/_blocks.html.eex:9
#: lib/explorer_web/templates/chain/_transactions.html.eex:12
#: lib/explorer_web/templates/transaction/index.html.eex:35
#: lib/explorer_web/templates/transaction/overview.html.eex:35
msgid "Age"
msgstr "Age"
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:64
#: lib/explorer_web/templates/address_transaction/index.html.eex:68
#: lib/explorer_web/templates/block_transaction/index.html.eex:98
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:66
#: lib/explorer_web/templates/address_transaction/index.html.eex:69
#: lib/explorer_web/templates/block_transaction/index.html.eex:134
#: lib/explorer_web/templates/chain/show.html.eex:6
#: lib/explorer_web/templates/chain/show.html.eex:97
#: lib/explorer_web/templates/transaction/index.html.eex:35
#: lib/explorer_web/templates/transaction/index.html.eex:34
msgid "Block"
msgstr "Block"
#: lib/explorer_web/templates/chain/show.html.eex:46
#: lib/explorer_web/templates/layout/app.html.eex:25
#: lib/explorer_web/templates/chain/_blocks.html.eex:4
#: lib/explorer_web/templates/layout/_sidebar.html.eex:30
#: lib/explorer_web/templates/layout/_topnav.html.eex:22
msgid "Blocks"
msgstr "Blocks"
@ -39,23 +39,21 @@ msgstr "Blocks"
msgid "Copyright %{year} POA"
msgstr "%{year} POA Network Ltd. All rights reserved"
#: lib/explorer_web/templates/block/index.html.eex:32
#: lib/explorer_web/templates/block_transaction/index.html.eex:60
#: lib/explorer_web/templates/chain/show.html.eex:61
#: lib/explorer_web/templates/block/index.html.eex:22
#: lib/explorer_web/templates/block_transaction/index.html.eex:87
msgid "Gas Used"
msgstr "Gas Used"
#: lib/explorer_web/templates/address_transaction/index.html.eex:67
#: lib/explorer_web/templates/block_transaction/index.html.eex:22
#: lib/explorer_web/templates/block_transaction/index.html.eex:97
#: lib/explorer_web/templates/chain/show.html.eex:96
#: lib/explorer_web/templates/pending_transaction/index.html.eex:34
#: lib/explorer_web/templates/transaction/index.html.eex:34
#: lib/explorer_web/templates/address_transaction/index.html.eex:68
#: lib/explorer_web/templates/block_transaction/index.html.eex:29
#: lib/explorer_web/templates/block_transaction/index.html.eex:133
#: lib/explorer_web/templates/pending_transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/index.html.eex:33
msgid "Hash"
msgstr "Hash"
#: lib/explorer_web/templates/block/index.html.eex:29
#: lib/explorer_web/templates/chain/show.html.eex:58
#: lib/explorer_web/templates/block/index.html.eex:19
#: lib/explorer_web/templates/chain/_blocks.html.eex:8
msgid "Height"
msgstr "Height"
@ -63,27 +61,24 @@ msgstr "Height"
msgid "POA Network Explorer"
msgstr "POA Network Explorer"
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:8
#: lib/explorer_web/templates/address_transaction/index.html.eex:8
#: lib/explorer_web/templates/block/index.html.eex:31
#: lib/explorer_web/templates/block_transaction/index.html.eex:16
#: lib/explorer_web/templates/block_transaction/index.html.eex:84
#: lib/explorer_web/templates/chain/show.html.eex:60
#: lib/explorer_web/templates/chain/show.html.eex:87
#: lib/explorer_web/templates/layout/app.html.eex:31
#: lib/explorer_web/templates/pending_transaction/index.html.eex:12
#: lib/explorer_web/templates/transaction/index.html.eex:12
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:7
#: lib/explorer_web/templates/address_transaction/index.html.eex:7
#: lib/explorer_web/templates/block/index.html.eex:21
#: lib/explorer_web/templates/block_transaction/index.html.eex:118
#: lib/explorer_web/templates/chain/_transactions.html.eex:4
#: lib/explorer_web/templates/layout/_sidebar.html.eex:36
#: lib/explorer_web/templates/layout/_topnav.html.eex:29
msgid "Transactions"
msgstr "Transactions"
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:68
#: lib/explorer_web/templates/address_transaction/index.html.eex:72
#: lib/explorer_web/templates/block_transaction/index.html.eex:102
#: lib/explorer_web/templates/chain/show.html.eex:99
#: lib/explorer_web/templates/pending_transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/index.html.eex:39
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:70
#: lib/explorer_web/templates/address_transaction/index.html.eex:74
#: lib/explorer_web/templates/block_transaction/index.html.eex:139
#: lib/explorer_web/templates/chain/_transactions.html.eex:11
#: lib/explorer_web/templates/pending_transaction/index.html.eex:40
#: lib/explorer_web/templates/transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/overview.html.eex:43
#: lib/explorer_web/templates/transaction/show.html.eex:28
#: lib/explorer_web/templates/transaction/show.html.eex:30
msgid "Value"
msgstr "Value"
@ -91,23 +86,23 @@ msgstr "Value"
msgid "Block #%{number} Details"
msgstr "Block #%{number} Details"
#: lib/explorer_web/templates/block_transaction/index.html.eex:40
#: lib/explorer_web/templates/block_transaction/index.html.eex:57
msgid "Difficulty"
msgstr "Difficulty"
#: lib/explorer_web/templates/block/index.html.eex:33
#: lib/explorer_web/templates/block_transaction/index.html.eex:68
#: lib/explorer_web/templates/transaction/overview.html.eex:93
#: lib/explorer_web/templates/transaction/show.html.eex:29
#: lib/explorer_web/templates/block/index.html.eex:23
#: lib/explorer_web/templates/block_transaction/index.html.eex:95
#: lib/explorer_web/templates/block_transaction/index.html.eex:103
#: lib/explorer_web/templates/transaction/overview.html.eex:115
#: lib/explorer_web/templates/transaction/show.html.eex:31
msgid "Gas Limit"
msgstr "Gas Limit"
#: lib/explorer_web/templates/block_transaction/index.html.eex:36
#: lib/explorer_web/templates/block_transaction/index.html.eex:49
msgid "Miner"
msgstr "Validator"
#: lib/explorer_web/templates/block_transaction/index.html.eex:72
#: lib/explorer_web/templates/transaction/overview.html.eex:75
#: lib/explorer_web/templates/transaction/overview.html.eex:83
msgid "Nonce"
msgstr "Nonce"
@ -115,19 +110,19 @@ msgstr "Nonce"
msgid "Number"
msgstr "Height"
#: lib/explorer_web/templates/block_transaction/index.html.eex:26
#: lib/explorer_web/templates/block_transaction/index.html.eex:37
msgid "Parent Hash"
msgstr "Parent Hash"
#: lib/explorer_web/templates/block_transaction/index.html.eex:56
#: lib/explorer_web/templates/block_transaction/index.html.eex:79
msgid "Size"
msgstr "Size"
#: lib/explorer_web/templates/block_transaction/index.html.eex:12
#: lib/explorer_web/templates/block_transaction/index.html.eex:13
msgid "Timestamp"
msgstr "Timestamp"
#: lib/explorer_web/templates/block_transaction/index.html.eex:50
#: lib/explorer_web/templates/block_transaction/index.html.eex:71
msgid "Total Difficulty"
msgstr "Total Difficulty"
@ -135,7 +130,7 @@ msgstr "Total Difficulty"
msgid "Block Number"
msgstr "Block Height"
#: lib/explorer_web/templates/transaction/overview.html.eex:2
#: lib/explorer_web/templates/transaction/overview.html.eex:1
msgid "Transaction Details"
msgstr "Transaction Details"
@ -143,27 +138,28 @@ msgstr "Transaction Details"
msgid "Cumulative Gas Used"
msgstr "Cumulative Gas Used"
#: lib/explorer_web/templates/block/index.html.eex:32
#: lib/explorer_web/templates/block/index.html.eex:33
#: lib/explorer_web/templates/transaction/overview.html.eex:94
#: lib/explorer_web/templates/transaction/show.html.eex:29
#: lib/explorer_web/templates/block/index.html.eex:22
#: lib/explorer_web/templates/block/index.html.eex:23
#: lib/explorer_web/templates/chain/_blocks.html.eex:11
#: lib/explorer_web/templates/transaction/overview.html.eex:118
#: lib/explorer_web/templates/transaction/show.html.eex:31
msgid "Gas"
msgstr "Gas"
#: lib/explorer_web/templates/block/index.html.eex:34
#: lib/explorer_web/templates/transaction/overview.html.eex:97
#: lib/explorer_web/templates/block/index.html.eex:24
#: lib/explorer_web/templates/transaction/overview.html.eex:123
msgid "Gas Price"
msgstr "Gas Price"
#: lib/explorer_web/templates/transaction/overview.html.eex:108
#: lib/explorer_web/templates/transaction/overview.html.eex:140
msgid "Input"
msgstr "Input"
#: lib/explorer_web/templates/transaction/overview.html.eex:32
#: lib/explorer_web/templates/transaction/overview.html.eex:30
msgid "%{confirmations} block confirmations"
msgstr "%{confirmations} block confirmations"
#: lib/explorer_web/templates/block_transaction/index.html.eex:18
#: lib/explorer_web/templates/block_transaction/index.html.eex:24
msgid "%{count} transactions in this block"
msgstr "%{count} transactions in this block"
@ -172,17 +168,18 @@ msgstr "%{count} transactions in this block"
msgid "Address"
msgstr "Address"
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:46
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:66
#: lib/explorer_web/templates/address_transaction/index.html.eex:47
#: lib/explorer_web/templates/address_transaction/index.html.eex:70
#: lib/explorer_web/templates/block_transaction/index.html.eex:100
#: lib/explorer_web/templates/pending_transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/overview.html.eex:47
#: lib/explorer_web/templates/transaction/show.html.eex:26
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:48
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:68
#: lib/explorer_web/templates/address_transaction/index.html.eex:48
#: lib/explorer_web/templates/address_transaction/index.html.eex:71
#: lib/explorer_web/templates/block_transaction/index.html.eex:136
#: lib/explorer_web/templates/chain/_transactions.html.eex:9
#: lib/explorer_web/templates/pending_transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/index.html.eex:36
#: lib/explorer_web/templates/transaction/overview.html.eex:51
#: lib/explorer_web/templates/transaction/show.html.eex:28
#: lib/explorer_web/views/address_internal_transaction_view.ex:7
#: lib/explorer_web/views/address_transaction_view.ex:13
#: lib/explorer_web/views/address_transaction_view.ex:9
msgid "From"
msgstr "From"
@ -191,21 +188,22 @@ msgstr "From"
msgid "Overview"
msgstr "Overview"
#: lib/explorer_web/views/transaction_view.ex:101
#: lib/explorer_web/views/transaction_view.ex:90
msgid "Success"
msgstr "Success"
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:34
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:67
#: lib/explorer_web/templates/address_transaction/index.html.eex:35
#: lib/explorer_web/templates/address_transaction/index.html.eex:71
#: lib/explorer_web/templates/block_transaction/index.html.eex:101
#: lib/explorer_web/templates/pending_transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/overview.html.eex:61
#: lib/explorer_web/templates/transaction/show.html.eex:27
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:36
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:69
#: lib/explorer_web/templates/address_transaction/index.html.eex:36
#: lib/explorer_web/templates/address_transaction/index.html.eex:73
#: lib/explorer_web/templates/block_transaction/index.html.eex:138
#: lib/explorer_web/templates/chain/_transactions.html.eex:10
#: lib/explorer_web/templates/pending_transaction/index.html.eex:39
#: lib/explorer_web/templates/transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/overview.html.eex:67
#: lib/explorer_web/templates/transaction/show.html.eex:29
#: lib/explorer_web/views/address_internal_transaction_view.ex:6
#: lib/explorer_web/views/address_transaction_view.ex:12
#: lib/explorer_web/views/address_transaction_view.ex:8
msgid "To"
msgstr "To"
@ -232,11 +230,11 @@ msgstr "Balance"
msgid "POA"
msgstr "POA"
#: lib/explorer_web/templates/block/index.html.eex:49
#: lib/explorer_web/templates/block/index.html.eex:41
msgid "%{count} transactions"
msgstr "%{count} transactions"
#: lib/explorer_web/templates/block/index.html.eex:4
#: lib/explorer_web/templates/block/index.html.eex:7
msgid "Showing #%{start_block} to #%{end_block}"
msgstr "Showing #%{start_block} to #%{end_block}"
@ -244,34 +242,34 @@ msgstr "Showing #%{start_block} to #%{end_block}"
msgid "Showing %{count} Transactions"
msgstr "Showing %{count} Transactions"
#: lib/explorer_web/templates/layout/app.html.eex:36
#: lib/explorer_web/templates/pending_transaction/index.html.eex:19
#: lib/explorer_web/templates/layout/_sidebar.html.eex:41
#: lib/explorer_web/templates/layout/_topnav.html.eex:33
#: lib/explorer_web/templates/pending_transaction/index.html.eex:21
#: lib/explorer_web/templates/transaction/index.html.eex:19
#: lib/explorer_web/templates/transaction/overview.html.eex:56
#: lib/explorer_web/templates/transaction/overview.html.eex:70
#: lib/explorer_web/views/transaction_view.ex:11
#: lib/explorer_web/views/transaction_view.ex:25
#: lib/explorer_web/templates/transaction/overview.html.eex:61
#: lib/explorer_web/templates/transaction/overview.html.eex:77
#: lib/explorer_web/views/transaction_view.ex:18
#: lib/explorer_web/views/transaction_view.ex:46
#: lib/explorer_web/views/transaction_view.ex:53
#: lib/explorer_web/views/transaction_view.ex:60
#: lib/explorer_web/views/transaction_view.ex:100
#: lib/explorer_web/views/transaction_view.ex:89
msgid "Pending"
msgstr "Pending"
#: lib/explorer_web/templates/transaction/overview.html.eex:83
#: lib/explorer_web/templates/transaction/overview.html.eex:97
msgid "First Seen"
msgstr ""
#: lib/explorer_web/templates/pending_transaction/index.html.eex:35
#: lib/explorer_web/templates/transaction/overview.html.eex:88
#: lib/explorer_web/templates/pending_transaction/index.html.eex:37
#: lib/explorer_web/templates/transaction/overview.html.eex:106
msgid "Last Seen"
msgstr ""
#: lib/explorer_web/templates/transaction/show.html.eex:15
#: lib/explorer_web/templates/transaction_log/index.html.eex:15
#: lib/explorer_web/templates/transaction/show.html.eex:14
#: lib/explorer_web/templates/transaction_log/index.html.eex:14
msgid "Logs"
msgstr ""
#: lib/explorer_web/templates/pending_transaction/index.html.eex:5
#: lib/explorer_web/templates/pending_transaction/index.html.eex:7
msgid "Showing %{count} Pending Transactions"
msgstr ""
@ -311,23 +309,23 @@ msgstr ""
msgid "TPM"
msgstr ""
#: lib/explorer_web/templates/pending_transaction/index.html.eex:78
#: lib/explorer_web/templates/transaction/index.html.eex:92
#: lib/explorer_web/templates/pending_transaction/index.html.eex:70
#: lib/explorer_web/templates/transaction/index.html.eex:77
msgid "Next Page"
msgstr ""
#: lib/explorer_web/views/transaction_view.ex:98
#: lib/explorer_web/views/transaction_view.ex:87
msgid "Failed"
msgstr ""
#: lib/explorer_web/views/transaction_view.ex:99
#: lib/explorer_web/views/transaction_view.ex:88
msgid "Out of Gas"
msgstr ""
#: lib/explorer_web/templates/address_transaction/index.html.eex:65
#: lib/explorer_web/templates/block_transaction/index.html.eex:95
#: lib/explorer_web/templates/pending_transaction/index.html.eex:31
#: lib/explorer_web/templates/transaction/index.html.eex:31
#: lib/explorer_web/templates/address_transaction/index.html.eex:66
#: lib/explorer_web/templates/block_transaction/index.html.eex:131
#: lib/explorer_web/templates/pending_transaction/index.html.eex:34
#: lib/explorer_web/templates/transaction/index.html.eex:32
msgid "Status"
msgstr ""
@ -339,7 +337,11 @@ msgstr ""
msgid "Showing #%{number}"
msgstr ""
#: lib/explorer_web/templates/transaction/show.html.eex:28
#: lib/explorer_web/templates/address_transaction/index.html.eex:74
#: lib/explorer_web/templates/chain/_transactions.html.eex:11
#: lib/explorer_web/templates/pending_transaction/index.html.eex:40
#: lib/explorer_web/templates/transaction/index.html.eex:38
#: lib/explorer_web/templates/transaction/show.html.eex:30
#: lib/explorer_web/views/wei_helpers.ex:84
msgid "Ether"
msgstr "POA"
@ -349,23 +351,23 @@ msgstr "POA"
msgid "Gwei"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:15
#: lib/explorer_web/templates/address_transaction/index.html.eex:15
#: lib/explorer_web/templates/transaction/show.html.eex:8
#: lib/explorer_web/templates/transaction_log/index.html.eex:8
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:14
#: lib/explorer_web/templates/address_transaction/index.html.eex:14
#: lib/explorer_web/templates/transaction/show.html.eex:7
#: lib/explorer_web/templates/transaction_log/index.html.eex:7
msgid "Internal Transactions"
msgstr ""
#: lib/explorer_web/templates/layout/app.html.eex:58
#: lib/explorer_web/templates/layout/_topnav.html.eex:6
msgid "Search by address, transaction hash, or block number"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:103
#: lib/explorer_web/templates/transaction/show.html.eex:54
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:96
#: lib/explorer_web/templates/transaction/show.html.eex:50
msgid "There are no Internal Transactions"
msgstr ""
#: lib/explorer_web/templates/transaction_log/index.html.eex:63
#: lib/explorer_web/templates/transaction_log/index.html.eex:64
msgid "There are no logs currently."
msgstr ""
@ -381,27 +383,30 @@ msgstr ""
msgid "Transactions To"
msgstr ""
#: lib/explorer_web/templates/transaction/show.html.eex:25
#: lib/explorer_web/templates/transaction/show.html.eex:27
msgid "Type"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:105
#: lib/explorer_web/templates/transaction/overview.html.eex:135
#: lib/explorer_web/views/wei_helpers.ex:82
msgid "Wei"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:28
#: lib/explorer_web/templates/address_transaction/index.html.eex:29
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:30
#: lib/explorer_web/templates/address_transaction/index.html.eex:30
#: lib/explorer_web/views/address_internal_transaction_view.ex:8
#: lib/explorer_web/views/address_transaction_view.ex:14
#: lib/explorer_web/views/address_transaction_view.ex:10
msgid "All"
msgstr ""
#: lib/explorer_web/templates/address_transaction/index.html.eex:73
#: lib/explorer_web/templates/address_transaction/index.html.eex:75
msgid "Fee"
msgstr ""
#: lib/explorer_web/templates/layout/app.html.eex:35
#: lib/explorer_web/templates/layout/_sidebar.html.eex:40
#: lib/explorer_web/templates/layout/_topnav.html.eex:32
#: lib/explorer_web/templates/pending_transaction/index.html.eex:14
#: lib/explorer_web/templates/transaction/index.html.eex:12
msgid "Validated"
msgstr ""
@ -409,11 +414,11 @@ msgstr ""
msgid "Block Details"
msgstr ""
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:63
#: lib/explorer_web/templates/address_internal_transaction/index.html.eex:65
msgid "Parent Tx Hash"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:34
#: lib/explorer_web/templates/chain/show.html.eex:39
msgid "24h Volume"
msgstr ""
@ -421,20 +426,65 @@ msgstr ""
msgid "Avg Block Time"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:30
#: lib/explorer_web/templates/chain/show.html.eex:35
msgid "Market Cap"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:25
#: lib/explorer_web/templates/chain/show.html.eex:30
msgid "Price"
msgstr ""
#: lib/explorer_web/templates/chain/show.html.eex:26
#: lib/explorer_web/templates/chain/show.html.eex:31
#: lib/explorer_web/templates/chain/show.html.eex:35
#: lib/explorer_web/templates/chain/show.html.eex:36
#: lib/explorer_web/templates/chain/show.html.eex:40
msgid "USD"
msgstr ""
#: lib/explorer_web/templates/address/overview.html.eex:15
msgid "Number of Transactions"
msgstr ""
#: lib/explorer_web/templates/layout/_sidebar.html.eex:24
msgid "Dashboard"
msgstr ""
#: lib/explorer_web/templates/transaction/index.html.eex:6
msgid "Showing %{count} Validated Transactions"
msgstr ""
#: lib/explorer_web/templates/layout/_topnav.html.eex:48
msgid "Smart Contract"
msgstr ""
#: lib/explorer_web/templates/layout/_sidebar.html.eex:12
msgid "Switch Network "
msgstr ""
#: lib/explorer_web/templates/chain/_transactions.html.eex:8
msgid "TX Hash"
msgstr ""
#: lib/explorer_web/templates/chain/_blocks.html.eex:10
msgid "TXNs"
msgstr ""
#: lib/explorer_web/templates/layout/_topnav.html.eex:40
msgid "Tokens"
msgstr ""
#: lib/explorer_web/templates/transaction/overview.html.eex:132
msgid "Total Gas Used"
msgstr ""
#: lib/explorer_web/templates/block_transaction/index.html.eex:21
msgid "Transaction"
msgstr ""
#: lib/explorer_web/templates/chain/_blocks.html.eex:12
msgid "Validator"
msgstr ""
#: lib/explorer_web/templates/chain/_blocks.html.eex:3
#: lib/explorer_web/templates/chain/_transactions.html.eex:3
msgid "View All"
msgstr ""

@ -30,8 +30,7 @@ defmodule ExplorerWeb.AddressInternalTransactionControllerTest do
to_internal_transaction =
insert(:internal_transaction, transaction_hash: transaction.hash, to_address_hash: address.hash, index: 2)
path = address_internal_transaction_path(ExplorerWeb.Endpoint, :index, :en, address)
path = address_internal_transaction_path(conn, :index, :en, address)
conn = get(conn, path)
actual_transaction_ids =

@ -2,6 +2,7 @@ defmodule ExplorerWeb.AddressTransactionControllerTest do
use ExplorerWeb.ConnCase
import ExplorerWeb.Router.Helpers, only: [address_transaction_path: 4]
import ExplorerWeb.Factory
describe "GET index/2" do
test "with invalid address hash", %{conn: conn} do
@ -16,36 +17,30 @@ defmodule ExplorerWeb.AddressTransactionControllerTest do
assert html_response(conn, 404)
end
test "returns transactions to this address", %{conn: conn} do
test "returns transactions for the address", %{conn: conn} do
address = insert(:address)
block = insert(:block)
transaction = insert(:transaction, block_hash: block.hash, index: 0, to_address_hash: address.hash)
insert(:receipt, transaction_hash: transaction.hash, transaction_index: transaction.index)
conn = get(conn, address_transaction_path(ExplorerWeb.Endpoint, :index, :en, address))
from_transaction =
:transaction
|> insert(block_hash: block.hash, from_address_hash: address.hash, index: 0)
|> with_receipt()
assert html = html_response(conn, 200)
assert html |> Floki.find("tbody tr") |> length == 1
to_transaction =
:transaction
|> insert(block_hash: block.hash, to_address_hash: address.hash, index: 1)
|> with_receipt()
transaction_hash_divs = Floki.find(html, "td.transactions__column--hash div.transactions__hash a")
conn = get(conn, address_transaction_path(conn, :index, :en, address))
assert length(transaction_hash_divs) == 1
actual_transaction_hashes =
conn.assigns.page
|> Enum.map(fn transaction -> transaction.hash end)
assert List.first(transaction_hash_divs) |> Floki.attribute("href") == [
"/en/transactions/#{Phoenix.Param.to_param(transaction)}"
]
end
test "does not return transactions from this address", %{conn: conn} do
block = insert(:block)
transaction = insert(:transaction, block_hash: block.hash, index: 0)
insert(:receipt, transaction_hash: transaction.hash, transaction_index: transaction.index)
address = insert(:address)
conn = get(conn, address_transaction_path(ExplorerWeb.Endpoint, :index, :en, address))
assert html = html_response(conn, 200)
assert html |> Floki.find("tbody tr") |> length == 0
assert html_response(conn, 200)
assert Enum.member?(actual_transaction_hashes, from_transaction.hash)
assert Enum.member?(actual_transaction_hashes, to_transaction.hash)
end
test "does not return related transactions without a receipt", %{conn: conn} do
@ -62,32 +57,8 @@ defmodule ExplorerWeb.AddressTransactionControllerTest do
conn = get(conn, address_transaction_path(ExplorerWeb.Endpoint, :index, :en, address))
assert html = html_response(conn, 200)
assert html |> Floki.find("tbody tr") |> length == 0
end
test "does not return related transactions without a from address", %{conn: conn} do
block = insert(:block)
transaction = insert(:transaction, block_hash: block.hash, index: 0)
insert(:receipt, transaction_hash: transaction.hash, transaction_index: transaction.index)
address = insert(:address)
conn = get(conn, address_transaction_path(ExplorerWeb.Endpoint, :index, :en, address), filter: "from")
assert html = html_response(conn, 200)
assert html |> Floki.find("tbody tr") |> length == 0
end
test "does not return related transactions without a to address", %{conn: conn} do
address = insert(:address)
block = insert(:block)
transaction = insert(:transaction, block_hash: block.hash, index: 0, from_address_hash: address.hash, index: 0)
insert(:receipt, transaction_hash: transaction.hash, transaction_index: transaction.index)
conn = get(conn, address_transaction_path(ExplorerWeb.Endpoint, :index, :en, address), filter: "to")
assert html = html_response(conn, 200)
assert html |> Floki.find("tbody tr") |> length == 0
assert html_response(conn, 200)
assert Enum.empty?(conn.assigns.page)
end
end
end

@ -23,15 +23,8 @@ defmodule ExplorerWeb.BlockTransactionControllerTest do
conn = get(conn, block_transaction_path(ExplorerWeb.Endpoint, :index, :en, block.number))
assert html = html_response(conn, 200)
transaction_hash_divs = Floki.find(html, "td.transactions__column--hash div.transactions__hash a")
assert length(transaction_hash_divs) == 1
assert List.first(transaction_hash_divs) |> Floki.attribute("href") == [
"/en/transactions/#{Phoenix.Param.to_param(transaction)}"
]
assert html_response(conn, 200)
assert 1 == length(conn.assigns.page.entries)
end
test "does not return unrelated transactions", %{conn: conn} do
@ -40,7 +33,8 @@ defmodule ExplorerWeb.BlockTransactionControllerTest do
conn = get(conn, block_transaction_path(ExplorerWeb.Endpoint, :index, :en, block))
refute html_response(conn, 200) =~ ~r/transactions__row/
assert html_response(conn, 200)
assert Enum.empty?(conn.assigns.page)
end
test "does not return related transactions without a receipt", %{conn: conn} do
@ -49,7 +43,8 @@ defmodule ExplorerWeb.BlockTransactionControllerTest do
conn = get(conn, block_transaction_path(ExplorerWeb.Endpoint, :index, :en, block))
refute html_response(conn, 200) =~ ~r/transactions__row/
assert html_response(conn, 200)
assert Enum.empty?(conn.assigns.page)
end
test "does not return related transactions without a to address", %{conn: conn} do
@ -59,7 +54,8 @@ defmodule ExplorerWeb.BlockTransactionControllerTest do
conn = get(conn, block_transaction_path(ExplorerWeb.Endpoint, :index, :en, block))
refute html_response(conn, 200) =~ ~r/transactions__row/
assert html_response(conn, 200)
assert Enum.empty?(conn.assigns.page)
end
end
end

@ -10,10 +10,8 @@ defmodule ExplorerWeb.PendingTransactionControllerTest do
conn = get(conn, pending_transaction_path(ExplorerWeb.Endpoint, :index, :en))
assert html = html_response(conn, 200)
assert html =~ ~r/Showing 0 Pending Transactions/
refute html =~ ~r/transactions__row/
assert html_response(conn, 200)
assert Enum.empty?(conn.assigns.transactions)
end
test "does not count transactions that have a receipt", %{conn: conn} do
@ -23,10 +21,8 @@ defmodule ExplorerWeb.PendingTransactionControllerTest do
conn = get(conn, pending_transaction_path(ExplorerWeb.Endpoint, :index, :en))
assert html = html_response(conn, 200)
assert html =~ ~r/Showing 0 Pending Transactions/
refute html =~ ~r/transactions__row/
assert html_response(conn, 200)
assert Enum.empty?(conn.assigns.transactions)
end
test "returns pending transactions", %{conn: conn} do
@ -34,7 +30,12 @@ defmodule ExplorerWeb.PendingTransactionControllerTest do
conn = get(conn, pending_transaction_path(ExplorerWeb.Endpoint, :index, :en))
assert html_response(conn, 200) =~ to_string(transaction.hash)
actual_transaction_hashes =
conn.assigns.transactions
|> Enum.map(fn transaction -> transaction.hash end)
assert html_response(conn, 200)
assert Enum.member?(actual_transaction_hashes, transaction.hash)
end
test "returns a count of pending transactions", %{conn: conn} do
@ -42,7 +43,8 @@ defmodule ExplorerWeb.PendingTransactionControllerTest do
conn = get(conn, pending_transaction_path(ExplorerWeb.Endpoint, :index, :en))
assert html_response(conn, 200) =~ ~r/Showing 1 Pending Transactions/
assert html_response(conn, 200)
assert 1 == conn.assigns.transaction_count
end
test "paginates transactions using the last seen transaction", %{conn: conn} do
@ -51,41 +53,21 @@ defmodule ExplorerWeb.PendingTransactionControllerTest do
{:ok, second_inserted_at, 0} = DateTime.from_iso8601("2016-01-23T23:50:07Z")
insert(:transaction, inserted_at: second_inserted_at)
first_response_conn =
conn =
get(
conn,
pending_transaction_path(ExplorerWeb.Endpoint, :index, :en),
last_seen_pending_inserted_at: Timex.format!(first_inserted_at, "{ISO:Extended:Z}")
)
assert first_html = html_response(first_response_conn, 200)
assert first_html |> Floki.find("table.transactions__table tbody tr") |> Enum.count() == 1
second_response_conn =
get(
conn,
pending_transaction_path(ExplorerWeb.Endpoint, :index, :en),
last_seen_pending_inserted_at: Timex.format!(second_inserted_at, "{ISO:Extended:Z}")
)
assert second_html = html_response(second_response_conn, 200)
assert second_html |> Floki.find("table.transactions__table tbody tr") |> Enum.count() == 0
end
test "sends back an estimate of the number of transactions", %{conn: conn} do
insert(:transaction)
conn = get(conn, pending_transaction_path(ExplorerWeb.Endpoint, :index, :en))
assert html_response(conn, 200) =~ ~r/Showing 1 Pending Transactions/
assert html_response(conn, 200)
assert 1 == length(conn.assigns.transactions.entries)
end
test "works when there are no transactions", %{conn: conn} do
conn = get(conn, pending_transaction_path(conn, :index, :en))
assert html = html_response(conn, 200)
assert html =~ ~r/Showing 0 Pending Transactions/
refute html =~ ~r/transactions__row/
assert html_response(conn, 200)
end
end
end

@ -97,11 +97,9 @@ defmodule ExplorerWeb.TransactionControllerTest do
conn = get(conn, transaction_path(conn, :show, :en, transaction))
assert html = html_response(conn, 200)
assert html |> Floki.find("div.transaction__header h3") |> Floki.text() == to_string(transaction.hash)
assert html |> Floki.find("span.transaction__item--primary a") |> Floki.text() == to_string(block.number)
assert html_response(conn, 200)
assert transaction.hash == conn.assigns.transaction.hash
assert block.number == conn.assigns.transaction.block.number
end
test "returns a transaction without associated block data", %{conn: conn} do
@ -109,10 +107,8 @@ defmodule ExplorerWeb.TransactionControllerTest do
conn = get(conn, transaction_path(conn, :show, :en, transaction))
assert html = html_response(conn, 200)
assert html |> Floki.find("div.transaction__header h3") |> Floki.text() == to_string(transaction.hash)
assert html |> Floki.find("span.transaction__item--primary a") |> Floki.text() == ""
assert html_response(conn, 200)
assert transaction.hash == conn.assigns.transaction.hash
end
test "returns internal transactions for the transaction", %{conn: conn} do

@ -1,280 +0,0 @@
defmodule ExplorerWeb.ContributorBrowsingTest do
use ExplorerWeb.FeatureCase, async: true
import Wallaby.Query, only: [css: 1, css: 2, link: 1]
alias Explorer.Chain.{Credit, Debit}
@logo css("[data-test='header_logo']")
test "browses the home page", %{session: session} do
session |> visit("/")
assert current_path(session) == "/en"
session
|> click(@logo)
|> assert_has(css("main", text: "Blocks"))
end
test "search for blocks", %{session: session} do
block = insert(:block, number: 42)
refute block.miner_hash == nil
session
|> visit("/")
|> fill_in(css(".header__cell--search-input"), with: to_string(block.number))
|> send_keys([:enter])
|> assert_has(css(".block__item", text: to_string(block.miner_hash)))
end
test "search for transactions", %{session: session} do
transaction = insert(:transaction, input: "0x736f636b73")
session
|> visit("/")
|> fill_in(
css(".header__cell--search-input"),
with: to_string(transaction.hash)
)
|> send_keys([:enter])
|> assert_has(css(".transaction__item", text: to_string(transaction.input)))
end
test "search for address", %{session: session} do
address = insert(:address)
session
|> visit("/")
|> fill_in(
css(".header__cell--search-input"),
with: to_string(address.hash)
)
|> send_keys([:enter])
|> assert_has(css(".address__subheading", text: to_string(address.hash)))
end
test "views blocks", %{session: session} do
timestamp = Timex.now() |> Timex.shift(hours: -1)
Enum.map(307..310, &insert(:block, number: &1, timestamp: timestamp, gas_used: 10))
fifth_block =
insert(:block, %{
gas_limit: 5_030_101,
gas_used: 1_010_101,
nonce: 123_456_789,
number: 311,
size: 9_999_999,
timestamp: timestamp
})
transaction = insert(:transaction, block_hash: fifth_block.hash, index: 0)
insert(:transaction, block_hash: fifth_block.hash, index: 1)
insert(:transaction, block_hash: fifth_block.hash, index: 2)
insert(:receipt, transaction_hash: transaction.hash, transaction_index: transaction.index)
Credit.refresh()
Debit.refresh()
session
|> visit("/en")
|> assert_has(css(".blocks__title", text: "Blocks"))
|> assert_has(css(".blocks__column--height", count: 2, text: "1"))
|> assert_has(css(".blocks__column--transactions-count", count: 5))
|> assert_has(css(".blocks__column--transactions-count", count: 1, text: "3"))
|> assert_has(css(".blocks__column--age", count: 5, text: "1 hour ago"))
|> assert_has(css(".blocks__column--gas-used", count: 5, text: "10"))
session
|> click(link("Blocks"))
|> assert_has(css(".blocks__column--height", text: "311"))
|> click(link("311"))
|> assert_has(css(".block__item", text: to_string(fifth_block.hash)))
|> assert_has(css(".block__item", text: to_string(fifth_block.miner_hash)))
|> assert_has(css(".block__item", text: "9,999,999"))
|> assert_has(css(".block__item", text: "1 hour ago"))
|> assert_has(css(".block__item", text: "5,030,101"))
|> assert_has(css(".block__item", text: to_string(fifth_block.nonce)))
|> assert_has(css(".block__item", text: "1,010,101"))
|> click(css(".block__link", text: "Transactions"))
|> assert_has(css(".transactions__link--long-hash", text: to_string(transaction.hash)))
end
describe "transactions and address pages" do
setup do
block =
insert(:block, %{
number: 555,
timestamp: Timex.now() |> Timex.shift(hours: -2),
gas_used: 123_987
})
for index <- 0..3, do: insert(:transaction, block_hash: block.hash, index: index)
pending = insert(:transaction, block_hash: nil, gas: 5891, index: nil)
lincoln = insert(:address)
taft = insert(:address)
transaction =
insert(
:transaction,
block_hash: block.hash,
value: Explorer.Chain.Wei.from(Decimal.new(5656), :ether),
gas: Decimal.new(1_230_000_000_000_123_123),
gas_price: Decimal.new(7_890_000_000_898_912_300_045),
index: 4,
input: "0x000012",
nonce: 99045,
inserted_at: Timex.parse!("1970-01-01T00:00:18-00:00", "{ISO:Extended}"),
updated_at: Timex.parse!("1980-01-01T00:00:18-00:00", "{ISO:Extended}"),
from_address_hash: taft.hash,
to_address_hash: lincoln.hash
)
receipt = insert(:receipt, status: :ok, transaction_hash: transaction.hash, transaction_index: transaction.index)
insert(:log, address_hash: lincoln.hash, index: 0, transaction_hash: receipt.transaction_hash)
# From Lincoln to Taft.
txn_from_lincoln =
insert(
:transaction,
block_hash: block.hash,
index: 5,
from_address_hash: lincoln.hash,
to_address_hash: taft.hash
)
internal_receipt =
insert(:receipt, transaction_hash: txn_from_lincoln.hash, transaction_index: txn_from_lincoln.index)
internal = insert(:internal_transaction, transaction_hash: internal_receipt.transaction_hash)
Credit.refresh()
Debit.refresh()
{:ok,
%{
pending: pending,
internal: internal,
lincoln: lincoln,
taft: taft,
transaction: transaction,
txn_from_lincoln: txn_from_lincoln
}}
end
test "views transactions", %{session: session} do
session
|> visit("/en")
|> assert_has(css(".transactions__title", text: "Transactions"))
|> assert_has(css(".transactions__column--hash", count: 5))
|> assert_has(css(".transactions__column--value", count: 5))
|> assert_has(css(".transactions__column--age", count: 5))
end
test "can see pending transactions", %{pending: pending, session: session} do
session
|> visit("/transactions")
|> click(css(".transactions__tab-link", text: "Pending"))
|> click(css(".transactions__link", text: to_string(pending.hash)))
|> assert_has(css(".transaction__item-value--status", text: "Pending"))
end
test "don't see pending transactions by default", %{session: session} do
session
|> visit("/transactions")
|> refute_has(css(".transactions__column--block", text: "Pending"))
end
test "can see a transaction's details", %{lincoln: lincoln, session: session, taft: taft, transaction: transaction} do
session
|> visit("/transactions")
|> click(link(to_string(transaction.hash)))
|> assert_has(css(".transaction__subheading", text: to_string(transaction.hash)))
|> assert_has(css(".transaction__item", text: "123,987"))
|> assert_has(css(".transaction__item", text: "5,656 POA"))
|> assert_has(css(".transaction__item", text: "Success"))
|> assert_has(
css(
".transaction__item",
text: "7,890,000,000,898,912,300,045 Wei (7,890,000,000,898.912 Gwei)"
)
)
|> assert_has(css(".transaction__item", text: "1,230,000,000,000,123,123 Gas"))
|> assert_has(css(".transaction__item", text: to_string(transaction.input)))
|> assert_has(css(".transaction__item", text: "99045"))
|> assert_has(css(".transaction__item", text: "123,987"))
|> assert_has(css(".transaction__item", text: to_string(lincoln.hash)))
|> assert_has(css(".transaction__item", text: to_string(taft.hash)))
|> assert_has(css(".transaction__item", text: "49 years ago"))
|> assert_has(css(".transaction__item", text: "38 years ago"))
end
test "can view a transaction's logs", %{lincoln: lincoln, session: session, transaction: transaction} do
session
|> visit("/en/transactions/#{Phoenix.Param.to_param(transaction)}")
|> click(link("Logs"))
|> assert_has(css(".transaction-log__link", text: to_string(lincoln.hash)))
end
test "can visit an address from the transaction logs page", %{
lincoln: lincoln,
session: session,
transaction: transaction
} do
session
|> visit("/en/transactions/#{Phoenix.Param.to_param(transaction)}/logs")
|> click(css(".transaction-log__link", text: to_string(lincoln.hash)))
|> assert_has(css(".address__subheading", text: to_string(lincoln.hash)))
end
test "see's all addresses transactions by default", %{
lincoln: lincoln,
session: session,
transaction: transaction,
txn_from_lincoln: txn_from_lincoln
} do
session
|> visit("/en/addresses/#{Phoenix.Param.to_param(lincoln)}")
|> assert_has(css(".transactions__link--long-hash", text: to_string(transaction.hash)))
|> assert_has(css(".transactions__link--long-hash", text: to_string(txn_from_lincoln.hash)))
end
test "can filter to only see transactions to an address", %{
lincoln: lincoln,
session: session,
transaction: transaction,
txn_from_lincoln: txn_from_lincoln
} do
session
|> visit("/en/addresses/#{Phoenix.Param.to_param(lincoln)}")
|> click(css("[data-test='filter_dropdown']", text: "Filter: All"))
|> click(css(".address__link", text: "To"))
|> assert_has(css(".transactions__link--long-hash", text: to_string(transaction.hash)))
|> refute_has(css(".transactions__link--long-hash", text: to_string(txn_from_lincoln.hash)))
end
test "can filter to only see transactions from an address", %{
lincoln: lincoln,
session: session,
transaction: transaction,
txn_from_lincoln: txn_from_lincoln
} do
session
|> visit("/en/addresses/#{Phoenix.Param.to_param(lincoln)}")
|> click(css("[data-test='filter_dropdown']", text: "Filter: All"))
|> click(css(".address__link", text: "From"))
|> assert_has(css(".transactions__link--long-hash", text: to_string(txn_from_lincoln.hash)))
|> refute_has(css(".transactions__link--long-hash", text: to_string(transaction.hash)))
end
end
test "views addresses", %{session: session} do
address = insert(:address, fetched_balance: 500)
session
|> visit("/en/addresses/#{Phoenix.Param.to_param(address)}")
|> assert_has(css(".address__balance", text: "0.000,000,000,000,000,500 POA"))
end
end

@ -19,6 +19,10 @@ defmodule ExplorerWeb.AddressPage do
click(session, css("[data-test='internal_transactions_tab_link']"))
end
def detail_hash(%Address{hash: address_hash}) do
css("[data-test='address_detail_hash']", text: to_string(address_hash))
end
def internal_transactions(count: count) do
css("[data-test='internal_transaction']", count: count)
end
@ -32,7 +36,7 @@ defmodule ExplorerWeb.AddressPage do
end
def transaction(transaction_hash) do
css("[data-test='transaction_hash']", text: transaction_hash)
css("[data-test='transaction_hash'][data-transaction-hash='#{transaction_hash}']")
end
def transaction_count do

@ -0,0 +1,17 @@
defmodule ExplorerWeb.BlockListPage do
@moduledoc false
use Wallaby.DSL
import Wallaby.Query, only: [css: 1]
alias Explorer.Chain.Block
def visit_page(session) do
visit(session, "/en/blocks")
end
def block(%Block{number: block_number}) do
css("[data-test='block_number'][data-block-number='#{block_number}']")
end
end

@ -0,0 +1,13 @@
defmodule ExplorerWeb.BlockPage do
@moduledoc false
use Wallaby.DSL
import Wallaby.Query, only: [css: 2]
alias Explorer.Chain.Block
def detail_number(%Block{number: block_number}) do
css("[data-test='block_detail_number']", text: to_string(block_number))
end
end

@ -0,0 +1,25 @@
defmodule ExplorerWeb.HomePage do
@moduledoc false
use Wallaby.DSL
import Wallaby.Query, only: [css: 1, css: 2]
def blocks(count: count) do
css("[data-test='chain_block']", count: count)
end
def search(session, text) do
session
|> fill_in(css("[data-test='search_input']"), with: text)
|> send_keys([:enter])
end
def visit_page(session) do
visit(session, "/")
end
def transactions(count: count) do
css("[data-test='chain_transaction']", count: count)
end
end

@ -0,0 +1,25 @@
defmodule ExplorerWeb.TransactionListPage do
@moduledoc false
use Wallaby.DSL
import Wallaby.Query, only: [css: 1]
alias Explorer.Chain.Transaction
def click_transaction(session, %Transaction{hash: transaction_hash}) do
click(session, css("[data-test='transaction_hash'][data-transaction-hash='#{transaction_hash}']"))
end
def visit_page(session) do
visit(session, "/en/transactions")
end
def click_pending(session) do
click(session, css("[data-test='pending_transactions_link']"))
end
def transaction(%Transaction{hash: transaction_hash}) do
css("[data-test='transaction_hash'][data-transaction-hash='#{transaction_hash}']")
end
end

@ -0,0 +1,23 @@
defmodule ExplorerWeb.TransactionLogsPage do
@moduledoc false
use Wallaby.DSL
import Wallaby.Query, only: [css: 1, css: 2]
import ExplorerWeb.Router.Helpers, only: [transaction_log_path: 4]
alias Explorer.Chain.{Address, Transaction}
alias ExplorerWeb.Endpoint
def logs(count: count) do
css("[data-test='transaction_log']", count: count)
end
def visit_page(session, %Transaction{} = transaction) do
visit(session, transaction_log_path(Endpoint, :index, :en, transaction))
end
def click_address(session, %Address{hash: address_hash}) do
click(session, css("[data-test='log_address_link'][data-address-hash='#{address_hash}']"))
end
end

@ -0,0 +1,21 @@
defmodule ExplorerWeb.TransactionPage do
@moduledoc false
use Wallaby.DSL
import Wallaby.Query, only: [css: 1, css: 2]
alias Explorer.Chain.{Transaction, Hash}
def click_logs(session) do
click(session, css("[data-test='transaction_logs_link']"))
end
def detail_hash(%Transaction{hash: transaction_hash}) do
css("[data-test='transaction_detail_hash']", text: Hash.to_string(transaction_hash))
end
def visit_page(session, %Transaction{hash: transaction_hash}) do
visit(session, "/en/transactions/#{transaction_hash}")
end
end

@ -1,7 +1,7 @@
defmodule ExplorerWeb.AddressPageTest do
defmodule ExplorerWeb.ViewingAddressesTest do
use ExplorerWeb.FeatureCase, async: true
alias ExplorerWeb.AddressPage
alias ExplorerWeb.{AddressPage, HomePage}
setup do
block = insert(:block)
@ -27,6 +27,15 @@ defmodule ExplorerWeb.AddressPageTest do
}}
end
test "search for address", %{session: session} do
address = insert(:address)
session
|> HomePage.visit_page()
|> HomePage.search(to_string(address.hash))
|> assert_has(AddressPage.detail_hash(address))
end
test "viewing address overview information", %{session: session} do
address = insert(:address, fetched_balance: 500)

@ -0,0 +1,43 @@
defmodule ExplorerWeb.ViewingBlocksTest do
use ExplorerWeb.FeatureCase, async: true
alias ExplorerWeb.{BlockListPage, BlockPage, HomePage}
setup do
timestamp = Timex.now() |> Timex.shift(hours: -1)
Enum.map(307..310, &insert(:block, number: &1, timestamp: timestamp, gas_used: 10))
block =
insert(:block, %{
gas_limit: 5_030_101,
gas_used: 1_010_101,
nonce: 123_456_789,
number: 311,
size: 9_999_999,
timestamp: timestamp
})
{:ok, block: block}
end
test "search for blocks", %{session: session} do
block = insert(:block, number: 42)
session
|> HomePage.visit_page()
|> HomePage.search(to_string(block.number))
|> assert_has(BlockPage.detail_number(block))
end
test "viewing blocks on the home page", %{session: session} do
session
|> HomePage.visit_page()
|> assert_has(HomePage.blocks(count: 5))
end
test "viewing the blocks index page", %{block: block, session: session} do
session
|> BlockListPage.visit_page()
|> assert_has(BlockListPage.block(block))
end
end

@ -0,0 +1,136 @@
defmodule ExplorerWeb.ViewingTransactionsTest do
@moduledoc false
use ExplorerWeb.FeatureCase, async: true
alias Explorer.Chain.{Credit, Debit, Wei}
alias ExplorerWeb.{AddressPage, HomePage, TransactionListPage, TransactionLogsPage, TransactionPage}
setup do
block =
insert(:block, %{
number: 555,
timestamp: Timex.now() |> Timex.shift(hours: -2),
gas_used: 123_987
})
for index <- 0..3, do: insert(:transaction, block_hash: block.hash, index: index)
pending = insert(:transaction, block_hash: nil, gas: 5891, index: nil)
lincoln = insert(:address)
taft = insert(:address)
transaction =
insert(
:transaction,
block_hash: block.hash,
value: Wei.from(Decimal.new(5656), :ether),
gas: Decimal.new(1_230_000_000_000_123_123),
gas_price: Decimal.new(7_890_000_000_898_912_300_045),
index: 4,
input: "0x000012",
nonce: 99045,
inserted_at: Timex.parse!("1970-01-01T00:00:18-00:00", "{ISO:Extended}"),
updated_at: Timex.parse!("1980-01-01T00:00:18-00:00", "{ISO:Extended}"),
from_address_hash: taft.hash,
to_address_hash: lincoln.hash
)
receipt = insert(:receipt, status: :ok, transaction_hash: transaction.hash, transaction_index: transaction.index)
insert(:log, address_hash: lincoln.hash, index: 0, transaction_hash: receipt.transaction_hash)
# From Lincoln to Taft.
txn_from_lincoln =
insert(
:transaction,
block_hash: block.hash,
index: 5,
from_address_hash: lincoln.hash,
to_address_hash: taft.hash
)
internal_receipt =
insert(:receipt, transaction_hash: txn_from_lincoln.hash, transaction_index: txn_from_lincoln.index)
internal = insert(:internal_transaction, transaction_hash: internal_receipt.transaction_hash)
Credit.refresh()
Debit.refresh()
{:ok,
%{
pending: pending,
internal: internal,
lincoln: lincoln,
taft: taft,
transaction: transaction,
txn_from_lincoln: txn_from_lincoln
}}
end
test "search for transactions", %{session: session} do
transaction = insert(:transaction, input: "0x736f636b73")
session
|> HomePage.visit_page()
|> HomePage.search(to_string(transaction.hash))
|> assert_has(TransactionPage.detail_hash(transaction))
end
describe "viewing transaction lists" do
test "transactions on the home page", %{session: session} do
session
|> HomePage.visit_page()
|> assert_has(HomePage.transactions(count: 5))
end
test "viewing the default transactions tab", %{session: session, transaction: transaction, pending: pending} do
session
|> TransactionListPage.visit_page()
|> assert_has(TransactionListPage.transaction(transaction))
|> refute_has(TransactionListPage.transaction(pending))
end
test "viewing the pending tab", %{pending: pending, session: session} do
session
|> TransactionListPage.visit_page()
|> TransactionListPage.click_pending()
|> assert_has(TransactionListPage.transaction(pending))
# |> click(css(".transactions__link", text: to_string(pending.hash)))
end
end
describe "viewing a transaction page" do
test "can navigate to transaction show from list page", %{session: session, transaction: transaction} do
session
|> TransactionListPage.visit_page()
|> TransactionListPage.click_transaction(transaction)
|> assert_has(TransactionPage.detail_hash(transaction))
end
test "can see a transaction's details", %{session: session, transaction: transaction} do
session
|> TransactionPage.visit_page(transaction)
|> assert_has(TransactionPage.detail_hash(transaction))
end
test "can view a transaction's logs", %{session: session, transaction: transaction} do
session
|> TransactionPage.visit_page(transaction)
|> TransactionPage.click_logs()
|> assert_has(TransactionLogsPage.logs(count: 1))
end
test "can visit an address from the transaction logs page", %{
lincoln: lincoln,
session: session,
transaction: transaction
} do
session
|> TransactionLogsPage.visit_page(transaction)
|> TransactionLogsPage.click_address(lincoln)
|> assert_has(AddressPage.detail_hash(lincoln))
end
end
end
Loading…
Cancel
Save