mirror of
https://github.com/seigler/dash-visualizer
synced 2025-07-27 01:36:10 +00:00
initial commit
This commit is contained in:
commit
18e533c525
7 changed files with 214 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/bower_components/
|
||||||
|
/node_modules/
|
||||||
|
/.brackets.json
|
7
README.md
Normal file
7
README.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
This simple project uses the Insight Web Sockets API and Socket.io to stream transactions from the Dash blockchain as they are broadcast.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
Download the project. No build step is necessary.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
Open `index.html`.
|
76
app.js
Normal file
76
app.js
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var socket = io("http://insight.masternode.io:3000/");
|
||||||
|
|
||||||
|
function playSound(url){
|
||||||
|
var audio = document.createElement('audio');
|
||||||
|
audio.style.display = "none";
|
||||||
|
audio.src = url;
|
||||||
|
audio.autoplay = true;
|
||||||
|
audio.loop = false;
|
||||||
|
audio.onended = function(){
|
||||||
|
audio.remove() //Remove when played.
|
||||||
|
};
|
||||||
|
document.body.appendChild(audio);
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrollToEnd() {
|
||||||
|
window.scrollTo(0,document.body.scrollHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
var onTransaction = function(data) {
|
||||||
|
console.log(data);
|
||||||
|
playSound('assets/bell.mp3');
|
||||||
|
var tx = document.createElement('div');
|
||||||
|
tx.className = 'tx';
|
||||||
|
var txValue = document.createElement('a');
|
||||||
|
txValue.className = 'txValue';
|
||||||
|
txValue.href = 'http://insight.masternode.io:3000/tx/' + data.txid;
|
||||||
|
txValue.target = '_blank';
|
||||||
|
txValue.setAttribute('rel', 'noopener');
|
||||||
|
var txOutputs = document.createElement('div');
|
||||||
|
txOutputs.className = 'txOutputs';
|
||||||
|
txValue.appendChild(document.createTextNode(data.valueOut));
|
||||||
|
tx.appendChild(txValue);
|
||||||
|
tx.appendChild(txOutputs);
|
||||||
|
var transactions = data.vout.sort(function(a, b) { // sort descending by tx value
|
||||||
|
return b[Object.keys(b)[0]] - a[Object.keys(a)[0]];
|
||||||
|
});
|
||||||
|
transactions.forEach(function(value, index, array) {
|
||||||
|
var txOut = document.createElement('div');
|
||||||
|
var outputSatoshis = value[Object.keys(value)[0]];
|
||||||
|
txOut.className = 'txOut';
|
||||||
|
txOut.style.width = (outputSatoshis * 0.00001).toFixed(4) + 'px';
|
||||||
|
txOut.title = (value[Object.keys(value)[0]] * 0.00000001);
|
||||||
|
txOutputs.appendChild(txOut);
|
||||||
|
});
|
||||||
|
document.getElementById('transactionList').appendChild(tx);
|
||||||
|
scrollToEnd();
|
||||||
|
};
|
||||||
|
|
||||||
|
var onBlock = function(data) {
|
||||||
|
console.log(data);
|
||||||
|
playSound('assets/whoosh.mp3');
|
||||||
|
var newBlock = document.createElement('a');
|
||||||
|
newBlock.className = 'blockDivider';
|
||||||
|
newBlock.href = 'http://insight.masternode.io:3000/block/' + data;
|
||||||
|
newBlock.target = '_blank';
|
||||||
|
newBlock.setAttribute('rel', 'noopener');
|
||||||
|
newBlock.appendChild(document.createTextNode(data));
|
||||||
|
document.getElementById('transactionList').appendChild(newBlock);
|
||||||
|
scrollToEnd();
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.on('connect', function() {
|
||||||
|
document.getElementById('connectionStatus').className = 'is-connected';
|
||||||
|
// Join the room.
|
||||||
|
socket.emit('subscribe', 'inv');
|
||||||
|
})
|
||||||
|
socket.on('tx', onTransaction);
|
||||||
|
socket.on('block', onBlock);
|
||||||
|
socket.on('disconnect', function() {
|
||||||
|
document.getElementById('connectionStatus').className = 'is-disconnected';
|
||||||
|
});
|
||||||
|
socket.on('reconnecting', function() {
|
||||||
|
document.getElementById('connectionStatus').className = 'is-connecting';
|
||||||
|
});
|
BIN
assets/bell.mp3
Normal file
BIN
assets/bell.mp3
Normal file
Binary file not shown.
BIN
assets/whoosh.mp3
Normal file
BIN
assets/whoosh.mp3
Normal file
Binary file not shown.
17
index.html
Normal file
17
index.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Dash transaction visualizer</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="connectionStatus" class="is-connecting"></div>
|
||||||
|
|
||||||
|
<div id="transactionList">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="http://insight.masternode.io:3000/socket.io/socket.io.js"></script>
|
||||||
|
<script src="app.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
111
style.css
Normal file
111
style.css
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
body {
|
||||||
|
padding: 2em 0 4em;
|
||||||
|
margin: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-family: sans-serif;
|
||||||
|
background-image: linear-gradient(to bottom right, hsl(208, 73%, 43%), hsl(208, 73%, 21.5%));
|
||||||
|
background-color: hsl(208, 73%, 43%);
|
||||||
|
color: white;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
box-sizing: inherit;
|
||||||
|
transition: color 0.1s;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
#transactionList {
|
||||||
|
padding: 0 1em;
|
||||||
|
}
|
||||||
|
.tx {
|
||||||
|
position: relative;
|
||||||
|
margin: 4px auto;
|
||||||
|
border-radius: 4px;
|
||||||
|
width: 20em;
|
||||||
|
min-width: 80%;
|
||||||
|
max-width: 100%;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
.txValue {
|
||||||
|
display: block;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
line-height: 1.25;
|
||||||
|
}
|
||||||
|
.txOutputs {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
flex-direction: row;
|
||||||
|
align-content: stretch;
|
||||||
|
}
|
||||||
|
.txOut {
|
||||||
|
position: relative;
|
||||||
|
flex: 1 1 auto;
|
||||||
|
border-bottom: 2px solid white;
|
||||||
|
border-width: 0 2px 2px 0;
|
||||||
|
text-align: right;
|
||||||
|
height: 0.25em;
|
||||||
|
}
|
||||||
|
.txOut:after {
|
||||||
|
content: '';
|
||||||
|
width: 2px;
|
||||||
|
height: 0.75em;
|
||||||
|
background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(255,255,255,0.5) 80%, white);
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blockDivider {
|
||||||
|
display: block;
|
||||||
|
margin: -2em -1em 1em;
|
||||||
|
background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(255,255,255,0.125));
|
||||||
|
padding: 2.5em 1em 0;
|
||||||
|
color: rgba(0,0,0,0);
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.blockDivider:hover, .blockDivider:focus {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#connectionStatus {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
font-size: 0.8em;
|
||||||
|
background: white;
|
||||||
|
border-radius: 0 0 0 0.5em;
|
||||||
|
border: solid black;
|
||||||
|
border-width: 0 0 0.1em 0.1em;
|
||||||
|
padding: 0.5em;
|
||||||
|
}
|
||||||
|
#connectionStatus:before {
|
||||||
|
display: block;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: bold;
|
||||||
|
width: 8em;
|
||||||
|
text-align: center;
|
||||||
|
transition: transform 0.5s;
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
#connectionStatus.is-disconnected:before {
|
||||||
|
content: 'Disconnected';
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
#connectionStatus.is-connecting:before {
|
||||||
|
content: 'Connecting...';
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
#connectionStatus.is-connected:before {
|
||||||
|
content: 'Connected';
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
#connectionStatus.is-connected {
|
||||||
|
transition: transform 0.5s;
|
||||||
|
transition-delay: 2s;
|
||||||
|
transform: translate3d(0, -100%, 0);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue