Initial commit

This commit is contained in:
aglkm
2024-05-03 14:23:37 +03:00
commit a5ca343c52
25 changed files with 26114 additions and 0 deletions

228
templates/base.html.tera Normal file
View File

@@ -0,0 +1,228 @@
<!doctype html>
<html>
<head>
<title>Grin Blockchain Explorer</title>
<meta property="og:site_name" content="Grincoin.org (GRIN) Blockchain Explorer" />
<meta property="og:url" content="https://grincoin.org" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Grin Blockchain Explorer" />
<meta property="og:description" content="Grincoin.org website allows you to explore Grin blockchain." />
<meta name="description" content="Grincoin.org website allows you to explore Grin blockchain." />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type= "text/css" href="/static/styles/style.css" />
<link rel= "stylesheet" type= "text/css" href= "/static/styles/bootstrap.css" />
<link rel= "stylesheet" type= "text/css" href= "/static/styles/bootstrap-icons.css" />
<link rel="shortcut icon" type="image/png" href="/static/icon/grin-logo.png" />
<script src="/static/scripts/darkmode.js"></script>
<script src="/static/scripts/darkmode_toggle.js"></script>
<script src="/static/scripts/bootstrap.bundle.js"></script>
<script src="/static/scripts/htmx.min.js"></script>
</head>
<body class="d-flex flex-column min-vh-100 dark-mode">
<nav class="navbar bg-style navbar-expand-lg shadow-sm py-0">
<div class="container-fluid">
<code><a class="navbar-brand fs-2" href="/"><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 191 191" height="35" width="35" style="enable-background:new 0 0 191 191;" xml:space="preserve"><style type="text/css">.st0{fill:#f2a900;}</style><circle cx="95.5" cy="95.5" r="95.5"/><circle class="st0" cx="95.3" cy="95.5" r="85.3"/><path d="M135.7,63.5c-2-4.6-3.9-13.6-9.1-15.6c-6.7-2.6-10.9,14.3-11.9,18.6h-1c-1.7-7.3-4-17.7-12-20c-3.7,15.6,3.9,32.5,11,46
c7.6-3.6,11.3-15,12-23h1l8,24c6.4-1.8,8.7-8.2,11-14c5-12.4,9.2-27.7,6-41C141.1,41.2,138.2,55,135.7,63.5 M39.7,95.5
c8.6-4.1,12.7-17.1,14-26h1c1,4.3,3.7,15.4,9.1,16.1c6.8,0.9,10.4-14.3,10.9-19.1h1c2.2,7.5,4.5,17.3,12,21
c2.8-11.7-0.5-24.1-4.8-35c-1.1-2.8-3.3-10.4-7.2-10.4c-6.3,0-9.9,16.7-11,21.4h-1l-8-24C41.6,46.2,34,82,39.7,95.5 M24.7,107.5
c10.4,45.6,58.6,71.4,102,52.1c15.8-7,28.3-19.5,35.5-35.1c1.9-4,5.5-11.4,3.4-16.7c-2.1-5.3-22.8,3.4-27.9,5.6
c-0.7,0.3-1.2,1-1.4,1.8c-0.3,2.2,1.2,4.3,3.4,4.6c0.1,0,0.2,0,0.3,0l8.7,0.7c-15.7,30.4-58.1,43.8-88,19.5
C54,134.6,48,128.2,44,120.5c-1.9-3.7-3.7-8.4-7-11C33.8,107.1,29,106.3,24.7,107.5L24.7,107.5z"/></svg></a></code>
<button class="navbar-toggler my-3" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav me-auto">
{% if route == "index" %}
<li class="nav-item">
<a class="nav-link" href="/"><div class="darkorange-text"><i class="bi bi-speedometer"></i> Dashboard</div></a>
</li>
<li class="nav-item">
<a class="nav-link" href="/block_list"><i class="bi bi-box"></i> Blocks</a>
</li>
{% elif route == "block_list" or route == "block_list_by_height" %}
<li class="nav-item">
<a class="nav-link" href="/"><i class="bi bi-speedometer"></i> Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/block_list"><div class="darkorange-text"><i class="bi bi-box"></i> Blocks</div></a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="/"><i class="bi bi-speedometer"></i> Dashboard</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/block_list"><i class="bi bi-box"></i> Blocks</a>
</li>
{% endif %}
</ul>
<div class="row">
<div class="col-12">
<form class="input-group my-3" role="search" action="/search" method="POST" autocomplete="off">
<input class="form-control ms-0 me-2" type="search" placeholder="Explore Grin Network" aria-label="Search" name="search" required>
<button class="btn btn-outline-secondary btn-search" type="submit">
<i class="bi bi-search"></i>
</button>
</form>
</div>
</div>
</div>
</div>
</nav>
<div class="container-fluid">
<br>
{% block content %}{% endblock content %}
</div>
<footer class="shadow">
<code>
<br>
<div class="container-fluid">
<div class="card-group">
<div class="card border-0">
<div class="card-body" align="left">
<div class="darkorange-text">Community</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://grin.mw/">Grin.MW</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://forum.grin.mw/">Forum</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://www.grincc.mw/">Council</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://keybase.io/team/grincoin">Keybase</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="me-3">
<a class="text-decoration-none" href="https://t.me/grinprivacy">
<h2><i class="bi bi-telegram"></i></h2>
</a>
</div>
<div class="me-3">
<a class="text-decoration-none" href="https://discord.gg/5p4vCQY9km">
<h2><i class="bi bi-discord"></i></h2>
</a>
</div>
<div class="me-3">
<a class="text-decoration-none" href="https://www.reddit.com/r/grincoin/">
<h2><i class="bi bi-reddit"></i></h2>
</a>
</div>
</div>
</div>
</div>
<div class="card border-0">
<div class="card-body" align="left">
<div class="darkorange-text">Resources</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://docs.grin.mw/about-grin/story/">
About Grin
</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://phyro.github.io/what-is-grin">
What Is Grin
</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://phyro.github.io/grinvestigation/why_grin.html">Why Grin</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://grinnode.live/">Grinnode</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://grinflation.com/">Grinflation</a>
</div>
</div>
</div>
</div>
<div class="card border-0">
<div class="card-body" align="left">
<div class="darkorange-text">Build</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://github.com/mimblewimble/grin">
Github
</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://docs.grin.mw/">Documentation</a>
</div>
</div>
<br>
<div class="d-flex justify-content-start">
<div class="value-text">
<a class="text-decoration-none" href="https://github.com/mimblewimble/docs/wiki/A-Brief-History-of-MimbleWimble-White-Paper">Whitepaper</a>
</div>
</div>
</div>
</div>
</div>
<br>
<div class="row">
<div class="col d-flex justify-content-center">
<span class="custom-control custom-switch custom-control-inline ms-0">
<button class="btn-sm btn-outline-secondary" onclick="darkModeFunc()">
<h3><i class="bi bi-brightness-low"></i></h3>
</button>
</span>
</div>
</div>
<div class="row">
<div class="col d-flex justify-content-center" style="color:grey">
Powered by CoinGecko
</div>
</div>
</div>
</div>
<br>
</code>
</footer>
<script>
checkDarkMode()
</script>
</body>
</html>

View File

@@ -0,0 +1,128 @@
{% extends "base" %}
{% block content %}
<code>
<div class="card">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-box"></i> BLOCK {{ block.height }}</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Time&nbsp;</div>
<div class="value-text text-end">{{ block.time }}</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Hash&nbsp;</div>
<div class="value-text text-break text-end">{{ block.hash }}</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Fees&nbsp;</div>
<div class="value-text text-end">ツ {{ block.fees / 1000000000.0 }}</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Weight&nbsp;</div>
<div class="value-text text-end">{{ block.weight }} %</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Version&nbsp;</div>
<div class="value-text text-end">{{ block.version }}</div>
</div>
</div>
</div>
<br>
<div class="card">
<div class="card-body mb-2" align="left">
<div class="darkorange-text"><i class="bi bi-receipt"></i> TRANSACTIONS</div>
<br>
<div class="value-text" align="center">Kernels ({{ block.ker_len }})</div>
{% for i in range(end=block.ker_len) %}
<br>
<div class="row">
<!-- kernels[i][0] - Hash
kernels[i][1] - Type
kernels[i][2] - Fee -->
{% if block.kernels[i][1] == "Coinbase" %}
<div class="col-sm value-text" align="left">
<span class="badge bg-dark-subtle text-black px-2 py-1">ツ {{ block.kernels[i][2] }}</span> <span class="badge bg-info text-black px-2 py-1">{{ block.kernels[i][1] }}&nbsp;<i class="bi bi-hammer"></i></span>
</div>
{% else %}
<div class="col-sm value-text" align="left">
<span class="badge bg-dark-subtle text-black px-2 py-1">ツ {{ block.kernels[i][2] }}</span> <span class="badge bg-dark-subtle text-black px-2 py-1">{{ block.kernels[i][1] }}</span>
</div>
{% endif %}
<div class="col-sm value-text">{{ block.kernels[i][0] }}</div>
<div class="col-sm value-text"></div>
</div>
{% endfor %}
</div>
<div class="card-body mb-2" align="center">
<div class="d-flex flex-row justify-content-center">
<i class="bi bi-asterisk me-4"></i>
<i class="bi bi-asterisk me-4"></i>
<i class="bi bi-asterisk"></i>
</div>
</div>
<div class="card-body mb-1" align="center">
<div class="value-text">Inputs ({{ block.in_len }})</div>
{% for i in range(end=block.in_len) %}
<br>
<div class="row">
<div class="col-sm"></div>
<div class="col-sm" align="left">{{ block.inputs[i] }}</div>
<div class="col-sm"></div>
</div>
{% endfor %}
</div>
<div class="card-body mb-1" align="center">
<h2><i class="bi bi-arrow-down-circle"></i></h2>
</div>
<div class="card-body" align="center">
<div class="value-text">Outputs ({{ block.out_len }})</div>
{% for i in range(end=block.out_len) %}
<br>
<div class="row">
<!-- outputs[i][0] - Hash
outputs[i][1] - Type -->
{% if block.outputs[i][1] == "Coinbase" %}
<div class="col-sm value-text" align="left">
<span class="badge bg-info text-black px-2 py-1">{{ block.outputs[i][1] }}&nbsp;<i class="bi bi-hammer"></i></span>
</div>
{% else %}
<div class="col-sm value-text" align="left">
<span class="badge bg-dark-subtle text-black px-2 py-1">{{ block.outputs[i][1] }}</span>
</div>
{% endif %}
<div class="col-sm value-text" align="left">{{ block.outputs[i][0] }}</div>
<div class="col-sm value-text"></div>
</div>
{% endfor %}
</div>
</div>
<br>
<div class="card">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-layout-text-sidebar-reverse"></i> RAW DATA</div>
<br>
<div class="value-text">{{ block.raw_data }}</div>
</div>
</div>
<br>
</code>
{% endblock %}

View File

@@ -0,0 +1,264 @@
{% extends "base" %}
{% block content %}
<code>
<div class="d-none d-md-block mb-4"> <!-- Show on >= md screens -->
<div class="card-group">
<div class="card rounded-0">
<div class="card-body">
<div class="darkorange-text">
HEIGHT
</div>
</div>
</div>
<div class="card rounded-0">
<div class="card-body">
<div class="darkorange-text">
AGE
</div>
</div>
</div>
<div class="card rounded-0">
<div class="card-body">
<div class="darkorange-text">
KERNELS
</div>
</div>
</div>
<div class="card rounded-0">
<div class="card-body">
<div class="darkorange-text">
INPUTS
</div>
</div>
</div>
<div class="card rounded-0">
<div class="card-body">
<div class="darkorange-text">
OUTPUTS
</div>
</div>
</div>
<div class="card rounded-0">
<div class="card-body">
<div class="darkorange-text">
FEES
</div>
</div>
</div>
<div class="card rounded-0">
<div class="card-body">
<div class="darkorange-text">
WEIGHT
</div>
</div>
</div>
</div>
{% for i in range(end=10) %}
<div class="card-group rounded-0">
<div class="card rounded-0 mt-1">
<div class="card-body">
{% if route == "block_list_by_height" %}
<div class="value-text">
<a class="text-decoration-none" href="/block/{{ blocks[i].height }}">
{{ blocks[i].height }}
</a>
</div>
{% else %}
<div class="value-text" hx-get="/rpc/block/link" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
<div class="card rounded-0 mt-1">
<div class="card-body">
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].time }}</div>
{% else %}
<div class="value-text" hx-get="/rpc/block/time" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
<div class="card rounded-0 mt-1">
<div class="card-body">
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].ker_len }}</div>
{% else %}
<div class="value-text" hx-get="/rpc/block/kernels" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
<div class="card rounded-0 mt-1">
<div class="card-body">
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].in_len }}</div>
{% else %}
<div class="value-text" hx-get="/rpc/block/inputs" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
<div class="card rounded-0 mt-1">
<div class="card-body">
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].out_len }}</div>
{% else %}
<div class="value-text" hx-get="/rpc/block/outputs" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
<div class="card rounded-0 mt-1">
<div class="card-body">
{% if route == "block_list_by_height" %}
<div class="value-text">ツ {{ blocks[i].fees / 1000000000.0 }}</div>
{% else %}
<div class="value-text" hx-get="/rpc/block/fees" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
<div class="card rounded-0 mt-1">
<div class="card-body">
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].weight }} %</div>
{% else %}
<div class="value-text" hx-get="/rpc/block/weight" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
<div class="d-md-none mb-4"> <!-- Show on < md screens-->
{% for i in range(end=10) %}
<div class="card mb-3">
<div class="card-body" align="left">
<div class="d-flex justify-content-between">
<div class="value-text">Block</div>
{% if route == "block_list_by_height" %}
<div class="value-text">
<a class="text-decoration-none darkorange-text" href="/block/{{ blocks[i].height }}">
{{ blocks[i].height }}
</a>
</div>
{% else %}
<div class="value-text text-end" hx-get="/rpc/block/link_color" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Age</div>
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].time }}</div>
{% else %}
<div class="value-text text-end" hx-get="/rpc/block/time" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Kernels</div>
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].ker_len }}</div>
{% else %}
<div class="value-text text-end" hx-get="/rpc/block/kernels" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Inputs</div>
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].in_len }}</div>
{% else %}
<div class="value-text text-end" hx-get="/rpc/block/inputs" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Outputs</div>
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].out_len }}</div>
{% else %}
<div class="value-text text-end" hx-get="/rpc/block/outputs" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Fees</div>
{% if route == "block_list_by_height" %}
<div class="value-text">ツ {{ blocks[i].fees / 1000000000.0 }}</div>
{% else %}
<div class="value-text text-end" hx-get="/rpc/block/fees" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Weight</div>
{% if route == "block_list_by_height" %}
<div class="value-text">{{ blocks[i].weight }} %</div>
{% else %}
<div class="value-text text-end" hx-get="/rpc/block/weight" hx-vals='{"count": "{{ i }}"}' hx-trigger="load, every 10s"></div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
{% if route == "block_list_by_height" %}
<div class="d-flex justify-content-center sticky-bottom mb-3">
<div class="me-5">
{% if height >= (index + 10) %}
<a class="text-decoration-none" href="/block_list/{{ index + 10 }}">
{% elif height >= (index) and height < (index + 10) %}
<a class="text-decoration-none" href="/block_list/{{ height }}">
{% endif %}
<h2><i class="bi bi-arrow-left-square"></i></h2>
</a>
</div>
<div class="me-5">
<a class="text-decoration-none" href="/block_list">
<h2><i class="bi bi-house"></i></h2>
</a>
</div>
<div>
{% if index >= 20 %}
<a class="text-decoration-none" href="/block_list/{{ index - 10 }}">
{% elif index >= 10 and index < 20 %}
<a class="text-decoration-none" href="/block_list/{{ 9 }}">
{% else %}
<a class="text-decoration-none disabled" href="">
{% endif %}
<h2><i class="bi bi-arrow-right-square"></i></h2>
</a>
</div>
</div>
{% else %}
<div class="d-flex justify-content-center sticky-bottom mb-3">
<div class="me-5">
<a class="text-decoration-none disabled" href="">
<h2><i class="bi bi-arrow-left-square"></i></h2>
</a>
</div>
<div class="me-5">
<a class="text-decoration-none" href="/block_list">
<h2><i class="bi bi-house"></i></h2>
</a>
</div>
<div>
<div hx-get="/rpc/block_list/index" hx-trigger="load, every 10s"></div>
</div>
</div>
{% endif %}
</code>
{% endblock %}

23
templates/error.html.tera Normal file
View File

@@ -0,0 +1,23 @@
{% extends "base" %}
{% block content %}
<code>
<div class="card">
<div class="card-body">
<h4>No results found.</h4><br>
Explorer supports requests by block number, block hash or kernel hash.<br><br>
Examples:<br>
Block number - <a class="text-decoration-none" href="/block/2765726">2765726</a><br>
Block hash - <a class="text-decoration-none" href="/hash/0000fc4d93e5717579b955ab840165d96603f009804a228be22da76f6f906a3c">0000fc4d93e5717579b955ab840165d96603f009804a228be22da76f6f906a3c</a><br>
Kernel hash - <a class="text-decoration-none" href="/kernel/084caeb931b7e8cb73d6419ea74ea157a3cef19f6e9307108a8a808df58437a4ef">084caeb931b7e8cb73d6419ea74ea157a3cef19f6e9307108a8a808df58437a4ef</a>
</div>
</div>
</code>
<br>
{% endblock %}

427
templates/index.html.tera Normal file
View File

@@ -0,0 +1,427 @@
{% extends "base" %}
{% block content %}
<code>
<div class="d-none d-md-block"> <!-- Show on >= md screens -->
<div class="card-group mb-2">
<div class="card me-2">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-cash-coin"></i> PRICE</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">GRIN_BTC&nbsp;</div><div class="value-text text-end" hx-get="/rpc/price/btc" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">GRIN_USD&nbsp;</div><div class="value-text text-end" hx-get="/rpc/price/usd" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">24H Volume (USD)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/volume_usd" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">24H Volume (BTC)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/volume_btc" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-bank"></i> MARKET</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Yearly Inflation Rate&nbsp;</div><div class="value-text text-end" hx-get="/rpc/inflation/rate" hx-trigger="load, every 10s"> %</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Coin Supply&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/supply" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Soft Total Supply
<!-- Button trigger soft supply explanation modal -->
<button class="btn-sm shadow-none" data-bs-toggle="modal" data-bs-target="#soft_sup">
<i class="bi bi-question-circle"></i>
</button>
&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/soft_supply" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Market Cap (USD)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/cap_usd" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Market Cap (BTC)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/cap_btc" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
</div>
<div class="card-group mb-2">
<div class="card me-2">
<div class="card-body" align="left">
<div class="d-flex justify-content-between">
<div class="darkorange-text"><i class="bi bi-grid"></i> BLOCKCHAIN</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Size&nbsp;</div><div class="value-text text-end" hx-get="/rpc/disk/usage" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Block Height&nbsp;</div><div class="value-text text-end" hx-get="/rpc/block/latest" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Time Since Last Block&nbsp;</div><div class="value-text text-end" hx-get="/rpc/block/time_since_last" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card me-2">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-hammer"></i> MINING</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Hashrate (1440 Blocks)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/network/hashrate" hx-trigger="load, every 10s"> KG/s</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Difficulty&nbsp;</div><div class="value-text text-end" hx-get="/rpc/network/difficulty" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Block Reward&nbsp;</div><div class="value-text text-end">ツ 60</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Estimated Mining Cost
<!-- Button trigger mining cost explanation modal -->
<button type="button" class="btn-sm" data-bs-toggle="modal" data-bs-target="#mining_cost">
<i class="bi bi-question-circle"></i>
</button>
&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mining/production_cost" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Reward/Cost Ratio
<!-- Button trigger ratio explanation modal -->
<button type="button" class="btn-sm" data-bs-toggle="modal" data-bs-target="#ratio">
<i class="bi bi-question-circle"></i>
</button>
&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mining/reward_ratio" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-speedometer2"></i> TRANSACTIONS & FEES</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">1H Period (60 Blocks)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/txns/count_1h" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">24H Period (1440 Blocks)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/txns/count_24h" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
</div>
<div class="card-group mb-4">
<div class="card me-2">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-receipt"></i> MEMPOOL</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Transactions&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mempool/txns" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Stem&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mempool/stem" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card me-2">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-diagram-3"></i> CONNECTIONS</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Inbound&nbsp;</div><div class="value-text text-end" hx-get="/rpc/peers/inbound" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Outbound&nbsp;</div><div class="value-text text-end" hx-get="/rpc/peers/outbound" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-pc-display-horizontal"></i> NODE</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Version&nbsp;</div><div class="value-text text-end">{{ node_ver }}</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text me-1">Protocol&nbsp;</div><div class="value-text text-end">{{ proto_ver }}</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text me-1">Sync Status&nbsp;</div><div class="value-text text-end" hx-get="/rpc/sync/status" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
</div>
</div>
<div class="d-md-none"> <!-- Show on < md screens-->
<div class="card mb-3">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-cash-coin"></i> PRICE</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">GRIN_BTC&nbsp;</div><div class="value-text text-end" hx-get="/rpc/price/btc" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">GRIN_USD&nbsp;</div><div class="value-text text-end" hx-get="/rpc/price/usd" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">24H Volume (USD)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/volume_usd" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">24H Volume (BTC)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/volume_btc" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-bank"></i> MARKET</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Yearly Inflation Rate&nbsp;</div><div class="value-text text-end" hx-get="/rpc/inflation/rate" hx-trigger="load, every 10s"> %</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Coin Supply&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/supply" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Soft Total Supply
<!-- Button trigger soft supply explanation modal -->
<button type="button" class="btn-sm" data-bs-toggle="modal" data-bs-target="#soft_sup">
<i class="bi bi-question-circle"></i>
</button>
&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/soft_supply" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Market Cap (USD)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/cap_usd" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Market Cap (BTC)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/market/cap_btc" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body" align="left">
<div class="d-flex justify-content-between">
<div class="darkorange-text"><i class="bi bi-grid"></i> BLOCKCHAIN</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Size&nbsp;</div><div class="value-text text-end" hx-get="/rpc/disk/usage" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Block Height&nbsp;</div><div class="value-text text-end" hx-get="/rpc/block/latest" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Time Since Last Block&nbsp;</div><div class="value-text text-end" hx-get="/rpc/block/time_since_last" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-hammer"></i> MINING</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Hashrate (1440 Blocks)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/network/hashrate" hx-trigger="load, every 10s"> KG/s</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Difficulty&nbsp;</div><div class="value-text text-end" hx-get="/rpc/network/difficulty" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Block Reward&nbsp;</div><div class="value-text text-end">ツ 60</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Estimated Mining Cost
<!-- Button trigger mining cost explanation modal -->
<button type="button" class="btn-sm" data-bs-toggle="modal" data-bs-target="#mining_cost">
<i class="bi bi-question-circle"></i>
</button>
&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mining/production_cost" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Reward/Cost Ratio
<!-- Button trigger ratio explanation modal -->
<button type="button" class="btn-sm" data-bs-toggle="modal" data-bs-target="#ratio">
<i class="bi bi-question-circle"></i>
</button>
&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mining/reward_ratio" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-speedometer2"></i> TRANSACTIONS & FEES</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">1H Period (60 Blocks)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/txns/count_1h" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">24H Period (1440 Blocks)&nbsp;</div><div class="value-text text-end" hx-get="/rpc/txns/count_24h" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-receipt"></i> MEMPOOL</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Transactions&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mempool/txns" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Stem&nbsp;</div><div class="value-text text-end" hx-get="/rpc/mempool/stem" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card mb-3">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-diagram-3"></i> CONNECTIONS</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Inbound&nbsp;</div><div class="value-text text-end" hx-get="/rpc/peers/inbound" hx-trigger="load, every 10s"></div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Outbound&nbsp;</div><div class="value-text text-end" hx-get="/rpc/peers/outbound" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
<div class="card mb-4">
<div class="card-body" align="left">
<div class="darkorange-text"><i class="bi bi-pc-display-horizontal"></i> NODE</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text">Version&nbsp;</div><div class="value-text text-end">{{ node_ver }}</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text me-1">Protocol&nbsp;</div><div class="value-text text-end">{{ proto_ver }}</div>
</div>
<br>
<div class="d-flex justify-content-between">
<div class="value-text me-1">Sync Status&nbsp;</div><div class="value-text text-end" hx-get="/rpc/sync/status" hx-trigger="load, every 10s"></div>
</div>
</div>
</div>
</div>
<!-- Modals. Explanations of several dashboard stats. -->
<div class="card border-0">
<div class="modal fade" id="soft_sup" tabindex="-1" aria-labelledby="soft_sup_label" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="soft_sup_label">Soft Total Supply</h1>
<div data-bs-theme="light">
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
</div>
<div class="modal-body">
Percentage of issued coins from the soft total supply (3150M) when inflation will reach <1%.
<br>
<br>
<a class="text-decoration-none" href="https://john-tromp.medium.com/a-case-for-using-soft-total-supply-1169a188d153">https://john-tromp.medium.com/a-case-for-using-soft-total-supply-1169a188d153</a>
</div>
</div>
</div>
</div>
<div class="modal fade" id="mining_cost" tabindex="-1" aria-labelledby="mining_cost_label" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="mining_cost_label">Estimated Mining Cost</h1>
<div data-bs-theme="light">
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
</div>
<div class="modal-body">
Mining cost to produce 1 grin coin.<br>
Assuming that:<br>
Miner is G1-mini ASIC.<br>
Electricity cost is $0.07 per kW/h.<br>
<br>
<a class="text-decoration-none" href="https://ipollo.com/products/ipollo-g1-mini">https://ipollo.com/products/ipollo-g1-mini</a>
</div>
</div>
</div>
</div>
<div class="modal fade" id="ratio" tabindex="-1" aria-labelledby="ratio_label" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="ratio_label">Reward/Cost Ratio</h1>
<div data-bs-theme="light">
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
</div>
<div class="modal-body">
Shows the result of the following formula:<br>
Price of 1 Grin (USD) / Mining Cost of 1 Grin (USD).<br>
<br>
<i class="bi bi-hand-thumbs-down"></i> - <= 1<br>
<i class="bi bi-hand-thumbs-up"></i> - from 1 to 2<br>
<i class="bi bi-emoji-sunglasses"></i> - from 2 to 3<br>
<i class='bi bi-rocket-takeoff'></i> - >= 3
</div>
</div>
</div>
</div>
</div>
</code>
{% endblock content%}