[NC-1759] switched quickstart to use alethio light block explorer (#140)

Signed-off-by: Adrian Sutton <adrian.sutton@consensys.net>
pull/2/head
Chris Mckay 6 years ago committed by GitHub
parent 005bf5037b
commit 36c471f45c
  1. 5
      .gitattributes
  2. 1
      quickstart/block-explorer-light/.gitignore
  3. 4
      quickstart/block-explorer-light/Dockerfile
  4. 561
      quickstart/block-explorer-light/dist/css/_base.css
  5. 1
      quickstart/block-explorer-light/dist/css/app.f776fd31.css
  6. 4
      quickstart/block-explorer-light/dist/css/buefy.min.css
  7. 2
      quickstart/block-explorer-light/dist/css/materialdesignicons.min.css
  8. 7
      quickstart/block-explorer-light/dist/css/materialdesignicons.min.css.map
  9. BIN
      quickstart/block-explorer-light/dist/favicon.ico
  10. BIN
      quickstart/block-explorer-light/dist/fonts/materialdesignicons-webfont.eot
  11. 8394
      quickstart/block-explorer-light/dist/fonts/materialdesignicons-webfont.svg
  12. BIN
      quickstart/block-explorer-light/dist/fonts/materialdesignicons-webfont.ttf
  13. BIN
      quickstart/block-explorer-light/dist/fonts/materialdesignicons-webfont.woff
  14. BIN
      quickstart/block-explorer-light/dist/fonts/materialdesignicons-webfont.woff2
  15. 1
      quickstart/block-explorer-light/dist/index.html
  16. 2
      quickstart/block-explorer-light/dist/js/app.769a0f91.js
  17. 1
      quickstart/block-explorer-light/dist/js/app.769a0f91.js.map
  18. 80
      quickstart/block-explorer-light/dist/js/chunk-vendors.79a7999a.js
  19. 1
      quickstart/block-explorer-light/dist/js/chunk-vendors.79a7999a.js.map
  20. 37
      quickstart/block-explorer-light/nginx.vh.conf
  21. 11
      quickstart/docker-compose.yml
  22. 35
      quickstart/explorer/App.js.patch
  23. 20
      quickstart/explorer/Dockerfile
  24. BIN
      quickstart/explorer/favicon.png
  25. 13
      quickstart/explorer/index.html.patch
  26. 10
      quickstart/explorer/index.js.patch
  27. 11
      quickstart/explorer/init.js.patch
  28. 17
      quickstart/listQuickstartServices.sh
  29. 24
      quickstart/src/test/java/tech/pegasys/pantheon/tests/quickstart/DockerQuickstartTest.java

5
.gitattributes vendored

@ -3,3 +3,8 @@
*.bat -text
*.pcap binary
*.blocks binary
*.eot binary
*.svg binary
*.ttf binary
*.woff binary
*.woff2 binary

@ -0,0 +1,4 @@
FROM nginx:alpine
COPY dist /usr/share/nginx/html
RUN sed -i 's@NODE_ENV:"production",BASE_URL:"/"@NODE_URL:"/jsonrpc",CONNECTION_TYPE:"json_rpc"@g' /usr/share/nginx/html/js/*.js
COPY nginx.vh.conf /etc/nginx/conf.d/default.conf

@ -0,0 +1,561 @@
html, body {
font-family: 'Barlow', sans-serif;
margin: 0;
overflow: auto;
}
div {
overflow: visible;
}
#app {
overflow: auto;
}
.flex-box {
display: flex;
}
.blockSidebar {
width: 240px !important;
min-width: 240px !important;
overflow: visible;
}
.block-logo-container {
padding: 55px 56px 0 72px;
}
.block-logo {
padding: 18px 27px 18px 9px;
}
.block-logo-bg {
padding: 17px 19px 21px 20px;
background-color: #357CFF;
}
.block-logo-text {
font-weight: 700;
font-size: 32px;
line-height: 38px;
color: white;
}
.blocks-list {
margin: 52px 83px 0 81px;
max-width: 76px;
overflow: visible;
}
.content {
width: 100%;
}
.block-content {
padding-top: 55px;
padding-left: 50px;
}
.pair {
display: flex;
align-items: center;
}
.minW140 {
min-width: 140px;
}
.label {
font-size: 12px;
line-height: 14px;
letter-spacing: 0.4px;
font-weight: 600;
text-transform: uppercase;
text-align: right;
padding: 16px;
color: #A7B5D1;
}
.value {
color: #273656;
font-weight: 500;
font-size: 20px;
line-height: 24px;
letter-spacing: 0.2px;
padding: 11px 16px 13px;
}
.counter-container {
padding: 10px 8px;
}
.tx-counter {
background-color: #273656;
padding: 1px 8px 3px;
color: white;
font-size: 20px;
line-height: 24px;
letter-spacing: 0.2px;
font-weight: 500;
}
.uncle-counter {
padding: 1px 8px 3px;
font-size: 20px;
line-height: 24px;
letter-spacing: 0.2px;
font-weight: 500;
border: 1px solid #357CFF;
color: #357CFF;
}
.erc-counter {
background-color: #48E2A2;
padding: 1px 8px 3px;
color: white;
font-size: 20px;
line-height: 24px;
letter-spacing: 0.2px;
font-weight: 500;
}
.txs-table-container {
padding-top: 16px;
}
tr:nth-child(odd) {
background: white;
}
tr:nth-child(even) {
background: #F7F8FA;
}
.table {
width: 100%;
border-bottom: solid 1px #D9E4EF;
border-spacing: 0;
}
.first-column {
padding: 7px 32px 8px;
text-align: right;
font-weight: 500;
font-size: 14px;
line-height: 17px;
letter-spacing: 0.2px;
color: #273656;
border-right: 1px solid #D0DEF2;
}
.normal-column {
padding: 7px 32px 8px;
font-weight: 500;
font-size: 14px;
line-height: 17px;
letter-spacing: 0.2px;
color: #273656;
text-align: center;
border-right: 1px solid #D0DEF2;
}
.last-column {
text-align: left;
padding: 7px 32px 8px;
font-weight: 500;
font-size: 14px;
line-height: 17px;
letter-spacing: 0.2px;
color: #273656;
}
.normal-column a {
text-decoration: none;
color: #357CFF;
}
.normal-column a:visited {
color: #357CFF;
}
.th-wrap {
padding: 9px 32px 10px;
font-weight: 600;
font-size: 12px;
line-height: 14px;
letter-spacing: 0.4px;
color: #A7B5D1;
background-color: #F7F8FA;
border-right: 1px solid #D0DEF2;
border-bottom: 1px solid #D0DEF2;
border-spacing: 0;
margin: 0;
cursor: pointer;
}
.is-sortable {
padding: 0;
}
.is-current-sort .th-wrap {
padding: 9px 32px;
margin: 0;
}
.table-mobile-sort {
display: none;
}
.pagination {
display: flex;
align-items: center;
}
.is-desc i:before {
transform: rotate(180deg);
}
th:first-child {
text-align: right;
}
th:last-child {
text-align: left;
}
.tx-logo-container {
padding: 55px 56px 45px 72px;
}
.tx-logo {
padding: 15px 24px 15px 6px;
}
.tx-logo-bg {
border-radius: 50%;
background-color: #273656;
padding: 20px 25px 24px;
font-size: 32px;
line-height: 38px;
letter-spacing: -1px;
font-weight: 700;
color: white;
}
.tx-value-label {
margin: 15px 8px;
font-size: 12px;
line-height: 12px;
height: 12px;
text-transform: uppercase;
background-color: rgb(72, 226, 162);
font-weight: 600;
letter-spacing: 0.5px;
margin-right: 10px;
color: rgb(255, 255, 255);
position: relative;
padding: 4px 8px;
overflow: visible;
}
.tx-value-label:before {
content: "";
position: absolute;
top: 0;
right: -10px;
transform: scaleX(0.8);
transform-origin: left center 0px;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
border-left: 10px solid rgb(72, 226, 162);
}
.tx-sideBar {
padding-bottom: 40px;
box-sizing: border-box;
}
.separated {
padding-top: 56px;
}
.gray {
color: #A7B5D1;
}
.value-grayed {
background-color: #D0DEF2;
}
.value-grayed:before {
border-left-color: #D0DEF2;
}
.percentage {
padding-left: 10px;
color: #FF9F1C;
}
.txList {
max-width: 144px;
margin: 0 auto;
display: flex;
flex-wrap: wrap;
}
.account-avatar-container {
padding: 55px 115px 0 72px;
}
.account-avatar {
padding: 10px 27px 18px 9px;
}
.identicon-container {
border: 1px solid rgb(208, 222, 242);
max-height: 74px;
}
.account-content {
padding-top: 55px;
height: max-content;
}
.account-code {
padding: 12px 60px 40px 17px;
font-family: 'Roboto Mono', monospace;
word-break: break-all;
}
.top-menu {
position: fixed;
z-index: 9999;
width: 100%;
display: flex;
align-items: center;
background: #FFFFFF;
border: 1px solid #D9E4EF;
box-shadow: 0 2px 6px 0 rgba(0,0,0,0.04);
padding-bottom: 5px;
margin: 0;
}
.modal {
position: fixed;
top: 0;
left: 0;
z-index: 10000;
width: 100%;
height: 100%;
margin: 0;
}
.modal-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(255,255, 255, 0.8);
filter: blur(8px);
-webkit-filter: blur(8px);
}
.modal-card-body {
display: flex;
align-items: center;
flex-direction: column;
}
.modal-card {
border: 1px solid #D9E4EF;
border-radius: 4px;
box-shadow: 0 2px 6px 0 rgba(0,0,0,0.04);
padding: 32px;
background-color: white;
position: absolute;
left: 30%;
width: 40%;
height: 230px;
top: calc(50% - 150px);
margin: auto;
box-sizing: border-box;
}
.media {
display: flex;
}
.media-content p {
color: #273656;
font-weight: 500;
font-size: 20px;
line-height: 24px;
letter-spacing: 0.2px;
padding-bottom: 32px;
margin: 0;
}
.control input:focus {
outline: none;
}
.control input {
background: #FFFFFF;
border: 1px solid #D9E4EF;
box-shadow: 0 2px 6px 0 rgba(0,0,0,0.04);
border-radius: 4px;
padding: 8px 16px;
font-size: 14px;
line-height: 20px;
font-weight: 500;
color: #273656;
width: 415px;
}
.button {
cursor: pointer;
}
.button:active {
outline: none;
}
.modal-card-foot .is-primary {
margin-right: 30px;
background-color: #357CFF;
transition: background-color 0.2s ease-in-out 0s;
}
.modal-card-foot .is-primary:hover{
background-color: rgba(53, 124, 255, 0.8);
}
.modal-card-foot {
display: flex;
flex-direction: row-reverse;
width: max-content;
margin: 0 auto;
}
.left-header {
min-width: 80px;
width: 80px;
min-height: 100%;
border-right: 1px solid #D0DEF2;
padding-top: 24px;
box-sizing: border-box;
}
.iconAlethio {
cursor: pointer;
fill: #273656 !important;
overflow: visible;
}
.iconAlethio svg {
overflow: visible;
}
.iconSearch {
cursor: pointer;
fill: #D0DEF2 !important;
transition: fill linear 0.2s;
}
.iconSearch:hover {
fill: #357CFF !important;
}
.search-icon-container {
padding: 32px 20px;
}
.min100 {
min-height: max-content;
height: 100%;
}
.home {
background-color: #F7F8FA;
display: flex;
flex-direction: column;
position: relative;
}
.centered-absolute {
position: absolute;
top: calc(50% - 65px);
left: 0;
right: 0;
margin: 0 auto;
width: 830px;
}
.home-search-container {
margin-top: 24px;
box-sizing: border-box;
padding: 16px;
background-color: #FFFFFF;
box-shadow: 0 8px 16px 0 rgba(51,69,100,0.07);
display: flex;
justify-content: space-between;
align-items: center;
}
.searchbar-alethio-logo {
fill: #273656 !important;
}
.home-search-container input:focus {
outline: none;
}
.home-search-container input {
box-sizing: border-box;
font-family: 'Barlow', sans-serif !important;
width: 663px;
min-width: 663px;
border: none;
padding: 0 56px 4px 12px;
font-size: 18px;
line-height: 22px;
letter-spacing: 0;
font-weight: 500;
color: #273656;
}
::-webkit-input-placeholder { /* Chrome/Opera/Safari */
font-family: 'Barlow', sans-serif !important;
color: #273656;;
}
::-moz-placeholder { /* Firefox 19+ */
font-family: 'Barlow', sans-serif !important;
color: #273656;;
}
:-ms-input-placeholder { /* IE 10+ */
font-family: 'Barlow', sans-serif !important;
color: #273656;;
}
:-moz-placeholder { /* Firefox 18- */
font-family: 'Barlow', sans-serif !important;
color: #273656;;
}
.submit-container {
cursor: pointer;
display: flex;
background-color: #357CFF;
border-radius: 4px;
transition: background-color 0.2s ease-in-out 0s;
color: white;
padding: 8px 16px 6px 8px;
text-transform: uppercase;
font-size: 12px;
line-height: 14px;
font-weight: 600;
letter-spacing: 0.4px;
}
.submit-container:hover {
background-color: rgba(53, 124, 255, 0.8);
}
.searchbar-search-icon {
fill: white !important;
}
.search-text {
padding-left: 12px;
}
.white-bg-value {
background-color: white;
padding: 1px 8px 3px;
}
.error-container {
box-sizing: border-box;
position: absolute;
top: calc(50% - 100px);
left: calc(50% - 240px);
height: 200px;
width: 480px;
border: 1px solid #D0DEF2;
background-color: #FFFFFF;
box-shadow: 0 2px 6px 0 rgba(0,0,0,0.04);
padding-top: 45px;
display: flex;
flex-direction: column;
align-items: center;
}
.error-text {
padding: 20px 45px 45px;
font-size: 16px;
letter-spacing: -0.16px;
line-height: 20px;
text-align: center;
color: #A7B5D1;
}
.is-empty {
background: #F7F8FA !important;
}
.no-txs {
padding-left: 222px;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 3.0 MiB

@ -0,0 +1 @@
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><link rel=stylesheet href=/css/_base.css><link href=/css/materialdesignicons.min.css media=all rel=stylesheet type=text/css><link href="https://fonts.googleapis.com/css?family=Barlow:400,500,600,700" rel=stylesheet><link href="https://fonts.googleapis.com/css?family=Roboto+Mono:400,500,700" rel=stylesheet><title>ethstats-light</title><link href=/css/app.f776fd31.css rel=preload as=style><link href=/js/app.769a0f91.js rel=preload as=script><link href=/js/chunk-vendors.79a7999a.js rel=preload as=script><link href=/css/app.f776fd31.css rel=stylesheet></head><body><noscript><strong>We're sorry but ethstats-light doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.79a7999a.js></script><script src=/js/app.769a0f91.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,37 @@
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location /jsonrpc {
rewrite /jsonrpc/?(.*) /$1 break;
proxy_pass http://rpcnode:8545;
proxy_redirect off;
proxy_set_header Host $host;
}
location /jsonws {
rewrite /jsonws/?(.*) /$1 break;
proxy_pass http://rpcnode:8546;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location / {
root /usr/share/nginx/html;
try_files $uri /index.html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

@ -39,15 +39,16 @@ services:
depends_on:
- bootnode
ports:
- "${RPC_PORT_MAPPING}8545"
- "${WS_PORT_MAPPING}8546"
- "8545"
- "8546"
explorer:
build:
context: explorer
image: ethereum-explorer:latest
context: block-explorer-light
dockerfile: Dockerfile
image: quickstart/block-explorer-light:latest
depends_on:
- rpcnode
ports:
- "${EXPLORER_PORT_MAPPING}3000"
- "${EXPLORER_PORT_MAPPING}80"
volumes:
public-keys:

@ -1,35 +0,0 @@
diff --git a/src/components/App.js b/src/components/App.js
index c39c931..16c3bb5 100644
--- a/src/components/App.js
+++ b/src/components/App.js
@@ -4,7 +4,6 @@ import { Link } from 'react-router-dom';
import { getIsUsingFallback } from '@/adapters/web3/init';
import Error from './Error';
-import Logo from '@/svgs/Logo';
import Search from './Search';
import Switcher from './ReactRouter/Switcher';
@@ -16,7 +15,7 @@ const App = () => (
<h1 className='mix-header__title'>Block Explorer</h1>
</Link>
<p className='mix-header__fineprint'>Connected to {getIsUsingFallback()
- ? 'MIX (rpc2.mix-blockchain.org)'
+ ? 'Pantheon Ethereum private Docker network (rpcHostPlaceHolder)'
: 'your Web3 browser extension (e.g. Metamask)'}
</p>
</div>
@@ -24,13 +23,6 @@ const App = () => (
</header>
<Switcher />
<Error />
- <a href='https://www.mix-blockchain.org/'>
- <footer className='mix-footer'>
- <p>powered by</p>
- <Logo className='mix-footer__logo' />
- <p>MIX Blockchain</p>
- </footer>
- </a>
</div>
);

@ -1,20 +0,0 @@
FROM node:8-alpine
RUN apk update && apk upgrade && \
apk add --no-cache git sed python make g++
RUN git clone https://github.com/mix-blockchain/block-explorer.git explorer
WORKDIR explorer/
RUN npm install
COPY *.patch ./
COPY favicon.png public/favicon.png
RUN git apply *.patch
CMD npm start
# List Exposed Ports
EXPOSE 3000

Binary file not shown.

@ -1,13 +0,0 @@
diff --git a/public/index.html b/public/index.html
index e1df6b2..a403d3e 100644
--- a/public/index.html
+++ b/public/index.html
@@ -4,7 +4,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.png">
- <title>MIX Block Explorer</title>
+ <title>Block Explorer</title>
</head>
<body>
<noscript>

@ -1,10 +0,0 @@
diff --git a/src/constants/index.js b/src/constants/index.js
index 5a3abd8..f417840 100644
--- a/src/constants/index.js
+++ b/src/constants/index.js
@@ -1,4 +1,4 @@
-export const fallbackUrl = 'https://rpc2.mix-blockchain.org:8647';
+export const fallbackUrl = 'fallbackUrlPlaceHolder';
export const maxBlocksPerPage = 10;
export const tableFields = {

@ -1,11 +0,0 @@
diff --git a/src/adapters/web3/init.js b/src/adapters/web3/init.js
index a327258..2b611f4 100644
--- a/src/adapters/web3/init.js
+++ b/src/adapters/web3/init.js
@@ -30,5 +30,5 @@ export function getIsUsingFallback() {
}
export function getCurrency() {
- return isUsingFallback ? 'MIX' : 'ETH';
+ return 'ETH';
}

@ -28,9 +28,7 @@ HOST=${DOCKER_PORT_2375_TCP_ADDR:-"localhost"}
docker-compose ${COMPOSE_CONFIG_FILE_OPTION} ps
# Get individual port mapping for exposed services
rpcMapping=`docker-compose ${COMPOSE_CONFIG_FILE_OPTION} port rpcnode 8545`
wsMapping=`docker-compose ${COMPOSE_CONFIG_FILE_OPTION} port rpcnode 8546`
explorerMapping=`docker-compose ${COMPOSE_CONFIG_FILE_OPTION} port explorer 3000`
explorerMapping=`docker-compose ${COMPOSE_CONFIG_FILE_OPTION} port explorer 80`
#Check if we run in a tty before using exec and otherwise set $TERM as it fails if not set.
if [ ! -t 1 ] ;
@ -38,15 +36,6 @@ then
export TERM=xterm-color
fi
# replaces the mix explorer rpc endpoint by ours
`docker-compose ${COMPOSE_CONFIG_FILE_OPTION} exec -T ${EXPLORER_SERVICE} /bin/sed -i \
"s/fallbackUrlPlaceHolder/http:\/\/${HOST}:${rpcMapping##*:}/g" \
src/constants/index.js`
`docker-compose ${COMPOSE_CONFIG_FILE_OPTION} exec -T ${EXPLORER_SERVICE} /bin/sed -i \
"s/rpcHostPlaceHolder/http:\/\/${HOST}:${rpcMapping##*:}/g" \
src/components/App.js`
# Displays links to exposed services
ORANGE='\033[0;33m'
CYAN='\033[0;36m'
@ -54,8 +43,6 @@ BOLD=$(tput bold)
NORMAL=$(tput sgr0)
echo "${CYAN}****************************************************************"
echo "JSON-RPC ${BOLD}HTTP${NORMAL}${CYAN} service endpoint : ${ORANGE}http://${HOST}:${rpcMapping##*:}${CYAN} *"
echo "JSON-RPC ${BOLD}WebSocket${NORMAL}${CYAN} service endpoint : ${ORANGE}http://${HOST}:${wsMapping##*:}${CYAN} *"
dots=""
maxRetryCount=50
while [ "$(curl -m 1 -s -o /dev/null -w ''%{http_code}'' http://${HOST}:${explorerMapping##*:})" != "200" ] && [ ${#dots} -le ${maxRetryCount} ]
@ -69,6 +56,8 @@ if [ ${#dots} -gt ${maxRetryCount} ]; then
(>&2 echo "${ORANGE}ERROR: Web block explorer is not started at http://${HOST}:${explorerMapping##*:}$ !${CYAN} * ")
echo "****************************************************************${NORMAL}"
else
echo "JSON-RPC ${BOLD}HTTP${NORMAL}${CYAN} service endpoint : ${ORANGE}http://${HOST}:${explorerMapping##*:}/jsonrpc${CYAN} *"
echo "JSON-RPC ${BOLD}WebSocket${NORMAL}${CYAN} service endpoint : ${ORANGE}http://${HOST}:${explorerMapping##*:}/jsonws${CYAN} *"
echo "${CYAN}Web block explorer address : ${ORANGE}http://${HOST}:${explorerMapping##*:}${CYAN} * "
echo "****************************************************************${NORMAL}"
fi

@ -37,9 +37,6 @@ import io.vertx.core.Vertx;
import io.vertx.core.http.HttpClientOptions;
import io.vertx.core.http.RequestOptions;
import io.vertx.core.http.WebSocket;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.awaitility.Awaitility;
import org.junit.After;
import org.junit.AfterClass;
@ -268,27 +265,6 @@ public class DockerQuickstartTest {
}
}
@Test
public void explorerShouldHaveModifiedHttpRpcEndpoint() throws IOException {
// we have to check that the sed command well replaced the endpoint placeholder with the
// real dynamic endpoint. But as this is a react app, we have to search for the value in the JS
// as we can't find it in the HTML page because source code is rendered dynamically.
final Request request =
new Request.Builder()
.get()
.url(endpoints.get(EndpointsIdentifier.EXPLORER) + "/static/js/bundle.js")
.build();
final OkHttpClient httpClient = new OkHttpClient();
try (final Response resp = httpClient.newCall(request).execute()) {
assertThat(resp.code()).isEqualTo(200);
assertThat(resp.body()).isNotNull();
assertThat(resp.body().string())
.containsOnlyOnce(
"var fallbackUrl = '" + endpoints.get(EndpointsIdentifier.HTTP_RPC) + "';");
}
}
private enum ServicesIdentifier {
BOOTNODE,
EXPLORER,

Loading…
Cancel
Save