From d42065b9d7392e42844d14ef814b6c894b069bde Mon Sep 17 00:00:00 2001 From: g1tman <32861951+g1tman@users.noreply.github.com> Date: Mon, 30 Oct 2017 18:13:21 +0530 Subject: [PATCH 01/56] Fixed Capitalisation --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 777140c04..d18142b6c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ An open source block explorer written in node.js. * [Neoscoin](http://explorer.infernopool.com/) * [C2Chain](http://c2chain.info/) -*note: If you would like your instance mentioned here contact me* +*Note: If you would like your instance mentioned here contact me* ### Requires @@ -34,7 +34,7 @@ Create user with read/write access: > db.createUser( { user: "iquidus", pwd: "3xp!0reR", roles: [ "readWrite" ] } ) -*note: If you're using mongo shell 2.4.x, use the following to create your user: +*Note: If you're using mongo shell 2.4.x, use the following to create your user: > db.addUser( { user: "username", pwd: "password", roles: [ "readWrite"] }) @@ -56,7 +56,7 @@ Create user with read/write access: npm start -*note: mongod must be running to start the explorer* +*Note: mongod must be running to start the explorer* As of version 1.4.0 the explorer defaults to cluster mode, forking an instance of its process to each cpu core. This results in increased performance and stability. Load balancing gets automatically taken care of and any instances that for some reason die, will be restarted automatically. For testing/development (or if you just wish to) a single instance can be launched with From a1e352a42ac6febbab123fd8fddb59eafde7ec15 Mon Sep 17 00:00:00 2001 From: g1tman <32861951+g1tman@users.noreply.github.com> Date: Mon, 30 Oct 2017 18:15:53 +0530 Subject: [PATCH 02/56] Fixed Comma Splice --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 777140c04..7d96a3487 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ sync.js (located in scripts/) is used for updating the local databases. This scr ### Wallet -Iquidus Explorer is intended to be generic so it can be used with any wallet following the usual standards. The wallet must be running with atleast the following flags +Iquidus Explorer is intended to be generic, so it can be used with any wallet following the usual standards. The wallet must be running with atleast the following flags -daemon -txindex From b17cc3934fadc634a540d35bd80e25eb436b0b89 Mon Sep 17 00:00:00 2001 From: Richa Date: Mon, 14 May 2018 12:16:38 +0530 Subject: [PATCH 03/56] Get Tx detail REST API --- routes/index.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/routes/index.js b/routes/index.js index 73a5dc418..0476e78e6 100644 --- a/routes/index.js +++ b/routes/index.js @@ -35,6 +35,66 @@ function route_get_block(res, blockhash) { } /* GET functions */ +function route_get_tx_details(res, txid) { + if (txid == settings.genesis_tx) { + route_get_block(res, settings.genesis_block); + } else { + db.get_tx(txid, function(tx) { + if (tx) { + lib.get_blockcount(function(blockcount) { + res.json({ active: 'tx', tx: tx, confirmations: settings.confirmations, blockcount: blockcount}); + }); + } + else { + lib.get_rawtransaction(txid, function(rtx) { + if (rtx.txid) { + lib.prepare_vin(rtx, function(vin) { + lib.prepare_vout(rtx.vout, rtx.txid, vin, function(rvout, rvin) { + lib.calculate_total(rvout, function(total){ + if (!rtx.confirmations > 0) { + var utx = { + txid: rtx.txid, + vin: rvin, + vout: rvout, + total: total.toFixed(8), + timestamp: rtx.time, + blockhash: '-', + blockindex: -1, + }; + res.json({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount:-1}); + } else { + var utx = { + txid: rtx.txid, + vin: rvin, + vout: rvout, + total: total.toFixed(8), + timestamp: rtx.time, + blockhash: rtx.blockhash, + blockindex: rtx.blockheight, + }; + lib.get_blockcount(function(blockcount) { + res.json({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount: blockcount}); + }); + } + }); + }); + }); + } else { + route_get_index2(res, null); + } + }); + } + }); + } +} + + +function route_get_index2(res, error) { + res.json({ active: 'home', error: error, warning: null}); +} + +/* GET functions */ + function route_get_tx(res, txid) { if (txid == settings.genesis_tx) { route_get_block(res, settings.genesis_block); @@ -215,6 +275,10 @@ router.get('/reward', function(req, res){ //}); }); +router.get('/txDetail/:txid', function(req, res) { + route_get_tx_details(res, req.param('txid')); +}); + router.get('/tx/:txid', function(req, res) { route_get_tx(res, req.param('txid')); }); From 2145f5f82ee8bfacbf0e3e1a30359fd54a49ab74 Mon Sep 17 00:00:00 2001 From: SHI Date: Sun, 26 Aug 2018 13:46:49 +0300 Subject: [PATCH 04/56] layout: fix missing space --- views/layout.jade | 49 ++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/views/layout.jade b/views/layout.jade index 630e447da..15eaac04d 100644 --- a/views/layout.jade +++ b/views/layout.jade @@ -17,14 +17,14 @@ html script(src='/vendor/jqplot/plugins/jqplot.barRenderer.min.js') script(src='/vendor/jqplot/plugins/jqplot.categoryAxisRenderer.min.js') script(src='https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js') - script(src='//cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js') + script(src='//cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js') script(src='//cdn.datatables.net/responsive/1.0.1/js/dataTables.responsive.js') script(src='//cdn.datatables.net/plug-ins/725b2a2115b/integration/bootstrap/3/dataTables.bootstrap.js') script(src='/javascripts/chart.js') script. $(document).ready(function(){ $('##{active}').addClass('active'); - function update_stats(){ + function update_stats(){ $.ajax({url: '/ext/summary', success: function(json){ $("#supply").text(json.data[0].supply); $("#difficulty").text(json.data[0].difficulty); @@ -38,15 +38,15 @@ html } $('.block-last-next').tooltip({ animation: true, - delay: { hide: 500 }, + delay: { hide: 500 }, }); - $('.history-table').dataTable( { + $('.history-table').dataTable( { searching: false, ordering: false, responsive: true }); $('.iquidus').css('color',$('.table').css('color')); - $(window).resize(function () { + $(window).resize(function () { $($.fn.dataTable.tables( true ) ).DataTable().columns.adjust(); }); setInterval( function() { @@ -56,7 +56,7 @@ html }); body - function format_unixtime(unixtime) { - - var a = new Date(unixtime*1000); + - var a = new Date(unixtime*1000); - var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; - var year = a.getFullYear(); - var month = months[a.getMonth()]; @@ -77,7 +77,7 @@ html - min = '0' + min if sec < 10 - sec = '0' + sec - - var time = date + suffix + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ; + - var time = date + suffix + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ; - return time - }; .nav.navbar.navbar-default.navbar-fixed-top(role='navigation') @@ -92,7 +92,7 @@ html .collapse.navbar-collapse(id='navbar-collapse') ul.nav.navbar-nav li#home - a.navbar-link(href='/') + a.navbar-link(href='/') span.glyphicon.glyphicon-search span.menu-text #{settings.locale.menu_explorer} if settings.heavy == true @@ -101,8 +101,8 @@ html span.fa.fa-star span.menu-text #{settings.locale.menu_reward} if settings.display.movement == true - li#movement - a.navbar-link.loading(href='/movement') + li#movement + a.navbar-link.loading(href='/movement') span.fa.fa-money span.menu-text #{settings.locale.menu_movement} if settings.display.network == true @@ -117,7 +117,7 @@ html span.menu-text #{settings.locale.menu_richlist} if settings.display.markets == true li#markets - a.navbar-link.loading(href='/markets/#{settings.markets.default}') + a.navbar-link.loading(href='/markets/#{settings.markets.default}') span.fa.fa-line-chart span.menu-text #{settings.locale.menu_markets} if settings.display.api == true @@ -144,11 +144,11 @@ html strong #{settings.locale.network} (H/s) .panel-body if settings.index.difficulty == 'Hybrid' - label#hashrate - + label#hashrate -
- label#lblX1 - else - label#hashrate - + label#lblX1 + else + label#hashrate - .col-md-2 .panel.panel-default.hidden-sm.hidden-xs .panel-heading @@ -168,11 +168,11 @@ html strong #{settings.locale.ex_supply} (#{settings.symbol}) .panel-body if settings.index.difficulty == 'Hybrid' - label#supply - + label#supply -
label#lblX1 else - label#supply - + label#supply - .col-md-2 .panel.panel-default.hidden-sm.hidden-xs .panel-heading @@ -183,10 +183,10 @@ html
label#lblX1 else - label#lastPrice - - + label#lastPrice - + .row.text-center(style='margin-top:10px;margin-bottom:20px;') - form.form-inline(method='post', action='/search') + form.form-inline(method='post', action='/search') #index-search.form-group input.form-control(type='text', name='search', placeholder='#{settings.locale.ex_search_message}', style='min-width:80%;margin-right:5px;') button.btn.btn-success(type='submit') #{settings.locale.ex_search_button} @@ -213,14 +213,11 @@ html li.pull-left a#youtube-icon(href="https://www.youtube.com/channel/#{settings.youtube}", target='_blank') span.glyphicon.fa.fa-youtube - .col-md-4 + .col-md-4 ul.nav li.text-center(style='margin-left:80px;margin-right:80px;') - p(style='margin-top:15px;') - a.navbar-link(href='https://github.com/iquidus/explorer', target='_blank') Powered by Iquidus Explorer + p(style='margin-top:15px;') + a.navbar-link(href='https://github.com/iquidus/explorer', target='_blank') Powered by Iquidus Explorer span.connections label#lblBlockcount.label.label-default - label#lblConnections.label.label-default - - - - From e7d39f2a012b281d5ad1a8882c0cd8feccef8d22 Mon Sep 17 00:00:00 2001 From: VDamas Date: Thu, 30 Aug 2018 10:35:46 +0100 Subject: [PATCH 05/56] Fixed facebook settings --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 81dd91e5b..48859cc99 100644 --- a/app.js +++ b/app.js @@ -114,7 +114,7 @@ app.set('locale', locale); app.set('display', settings.display); app.set('markets', settings.markets); app.set('twitter', settings.twitter); -app.set('facebook', settings.youtube); +app.set('facebook', settings.facebook); app.set('googleplus', settings.googleplus); app.set('youtube', settings.youtube); app.set('genesis_block', settings.genesis_block); From 18184b31b7ae6dbe07e49168a7dfced3b60c8fa6 Mon Sep 17 00:00:00 2001 From: VDamas Date: Thu, 30 Aug 2018 10:39:24 +0100 Subject: [PATCH 06/56] Facebook fix --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 48859cc99..f9b19b943 100644 --- a/app.js +++ b/app.js @@ -114,7 +114,7 @@ app.set('locale', locale); app.set('display', settings.display); app.set('markets', settings.markets); app.set('twitter', settings.twitter); -app.set('facebook', settings.facebook); +app.set('facebook', settings.facebook); app.set('googleplus', settings.googleplus); app.set('youtube', settings.youtube); app.set('genesis_block', settings.genesis_block); From d24dd9f235aa3642b696f7aef1920a1113842355 Mon Sep 17 00:00:00 2001 From: M-Shahbaz Date: Mon, 4 Mar 2019 18:06:24 +0400 Subject: [PATCH 07/56] Full address history with DataTables ajax loading --- app.js | 36 ++++++++ lib/database.js | 132 ++++++++++++++++++++-------- models/addresstx.js | 10 +++ routes/index.js | 90 ++++++++----------- scripts/sync.js | 85 +++++++++--------- views/address.jade | 26 +++--- views/includes/address_history.jade | 94 ++++++++++++-------- 7 files changed, 287 insertions(+), 186 deletions(-) create mode 100644 models/addresstx.js diff --git a/app.js b/app.js index 81dd91e5b..4421f1530 100644 --- a/app.js +++ b/app.js @@ -100,6 +100,42 @@ app.use('/ext/getlasttxs/:min', function(req,res){ }); }); +app.use('/ext/getaddresstxsajax', function(req,res){ + if(req.query.length > settings.txcount){ + req.query.length = settings.txcount; + } + db.get_address_txs_ajax(req.query.address, req.query.start, req.query.length,function(txs, count){ + var data = []; + for(i=0; i settings.txcount ) { - tx_array.shift(); - } - Address.update({a_id:hash}, { - txs: tx_array, - received: received, - sent: sent, - balance: received - sent - }, function() { - return cb(); - }); - } else { - if (type == tx_array[index].type) { - return cb(); //duplicate + //Considering no duplicate + var tx_array = []; + var received = address.received; + var sent = address.sent; + if (type == 'vin') { + sent = sent + amount; + } else { + received = received + amount; + } + + tx_array.push({addresses: txid, type: type}); + + Address.update({a_id:hash}, { + received: received, + sent: sent, + balance: received - sent + }, function() { + + var newAddressTx = new AddressTx({ + a_id: hash, + addresses: txid, + type: type + }); + newAddressTx.save(function(err) { + if (err) { + return cb(err); } else { - Address.update({a_id:hash}, { - txs: tx_array, - received: received, - sent: sent, - balance: received - sent - }, function() { - return cb(); - }); + //console.log('address saved: %s', hash); + //console.log(newAddress); + return cb(); } - } + }); + return cb(); }); } } else { @@ -95,14 +92,12 @@ function update_address(hash, txid, amount, type, cb) { if (type == 'vin') { var newAddress = new Address({ a_id: hash, - txs: [ {addresses: txid, type: 'vin'} ], sent: amount, balance: amount, }); } else { var newAddress = new Address({ a_id: hash, - txs: [ {addresses: txid, type: 'vout'} ], received: amount, balance: amount, }); @@ -114,6 +109,21 @@ function update_address(hash, txid, amount, type, cb) { } else { //console.log('address saved: %s', hash); //console.log(newAddress); + + var newAddressTx = new AddressTx({ + a_id: hash, + addresses: txid, + type: type + }); + newAddressTx.save(function(err) { + if (err) { + return cb(err); + } else { + //console.log('address saved: %s', hash); + //console.log(newAddress); + return cb(); + } + }); return cb(); } }); @@ -379,6 +389,54 @@ module.exports = { }); }, + get_address_txs_ajax: function(hash, start, length, cb) { + var totalCount = 0; + Address.findOne({a_id: hash}, function(err, addressTotalTxs) { + + if(err) { + return cb(err); + } else { + AddressTx.find({a_id: hash}).count({}, function(err, count){ + if(err) { + return cb(err); + } else { + totalCount = count; + AddressTx.find({a_id: hash}).sort({_id: 'desc'}).skip(Number(start)).limit(Number(length)).exec(function (err, address) { + if (err) { + return cb(err); + } else { + //console.log(address); + var txs = []; + var count = address.length; + var hashes = address; + + var txs = []; + + lib.syncLoop(count, function (loop) { + var i = loop.iteration(); + find_tx(hashes[i].addresses, function (tx) { + if (tx) { + txs.push(tx); + loop.next(); + } else { + txs.push("1. Not found"); + loop.next(); + } + }) + }, function () { + return cb(txs, totalCount); + }); + } + }); + } + }); + + } + }); + + + }, + create_market: function(coin, exchange, market, cb) { var newMarkets = new Markets({ market: market, diff --git a/models/addresstx.js b/models/addresstx.js new file mode 100644 index 000000000..178a1dd31 --- /dev/null +++ b/models/addresstx.js @@ -0,0 +1,10 @@ +var mongoose = require('mongoose') + , Schema = mongoose.Schema; + +var AddressTXSchema = new Schema({ + a_id: { type: String, index: true}, + addresses: { type: String, lowercase: true}, + type: { type: String } +}, {id: false}); + +module.exports = mongoose.model('AddressTx', AddressTXSchema); diff --git a/routes/index.js b/routes/index.js index 73a5dc418..6a753ebae 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,10 +1,10 @@ var express = require('express') - , router = express.Router() - , settings = require('../lib/settings') - , locale = require('../lib/locale') - , db = require('../lib/database') - , lib = require('../lib/explorer') - , qr = require('qr-image'); + , router = express.Router() + , settings = require('../lib/settings') + , locale = require('../lib/locale') + , db = require('../lib/database') + , lib = require('../lib/explorer') + , qr = require('qr-image'); function route_get_block(res, blockhash) { lib.get_block(blockhash, function (block) { @@ -96,25 +96,7 @@ function route_get_address(res, hash, count) { db.get_address(hash, function(address) { if (address) { var txs = []; - var hashes = address.txs.reverse(); - if (address.txs.length < count) { - count = address.txs.length; - } - lib.syncLoop(count, function (loop) { - var i = loop.iteration(); - db.get_tx(hashes[i].addresses, function(tx) { - if (tx) { - txs.push(tx); - loop.next(); - } else { - loop.next(); - } - }); - }, function(){ - - res.render('address', { active: 'address', address: address, txs: txs}); - }); - + res.render('address', { active: 'address', address: address, txs: txs}); } else { route_get_index(res, hash + ' not found'); } @@ -196,22 +178,22 @@ router.get('/network', function(req, res) { router.get('/reward', function(req, res){ //db.get_stats(settings.coin, function (stats) { - console.log(stats); - db.get_heavy(settings.coin, function (heavy) { - //heavy = heavy; - var votes = heavy.votes; - votes.sort(function (a,b) { - if (a.count < b.count) { - return -1; - } else if (a.count > b.count) { - return 1; - } else { - return 0; - } - }); - - res.render('reward', { active: 'reward', stats: stats, heavy: heavy, votes: heavy.votes }); + console.log(stats); + db.get_heavy(settings.coin, function (heavy) { + //heavy = heavy; + var votes = heavy.votes; + votes.sort(function (a,b) { + if (a.count < b.count) { + return -1; + } else if (a.count > b.count) { + return 1; + } else { + return 0; + } }); + + res.render('reward', { active: 'reward', stats: stats, heavy: heavy, votes: heavy.votes }); + }); //}); }); @@ -285,12 +267,12 @@ router.get('/ext/summary', function(req, res) { lib.get_difficulty(function(difficulty) { difficultyHybrid = '' if (difficulty['proof-of-work']) { - if (settings.index.difficulty == 'Hybrid') { - difficultyHybrid = 'POS: ' + difficulty['proof-of-stake']; - difficulty = 'POW: ' + difficulty['proof-of-work']; - } else if (settings.index.difficulty == 'POW') { - difficulty = difficulty['proof-of-work']; - } else { + if (settings.index.difficulty == 'Hybrid') { + difficultyHybrid = 'POS: ' + difficulty['proof-of-stake']; + difficulty = 'POW: ' + difficulty['proof-of-work']; + } else if (settings.index.difficulty == 'POW') { + difficulty = difficulty['proof-of-work']; + } else { difficulty = difficulty['proof-of-stake']; } } @@ -302,14 +284,14 @@ router.get('/ext/summary', function(req, res) { hashrate = 0; } res.send({ data: [{ - difficulty: difficulty, - difficultyHybrid: difficultyHybrid, - supply: stats.supply, - hashrate: hashrate, - lastPrice: stats.last_price, - connections: connections, - blockcount: blockcount - }]}); + difficulty: difficulty, + difficultyHybrid: difficultyHybrid, + supply: stats.supply, + hashrate: hashrate, + lastPrice: stats.last_price, + connections: connections, + blockcount: blockcount + }]}); }); }); }); diff --git a/scripts/sync.js b/scripts/sync.js index f7728a8c2..1f93c27f4 100644 --- a/scripts/sync.js +++ b/scripts/sync.js @@ -1,11 +1,12 @@ var mongoose = require('mongoose') - , db = require('../lib/database') - , Tx = require('../models/tx') - , Address = require('../models/address') - , Richlist = require('../models/richlist') - , Stats = require('../models/stats') - , settings = require('../lib/settings') - , fs = require('fs'); + , db = require('../lib/database') + , Tx = require('../models/tx') + , Address = require('../models/address') + , AddressTx = require('../models/addresstx') + , Richlist = require('../models/richlist') + , Stats = require('../models/stats') + , settings = require('../lib/settings') + , fs = require('fs'); var mode = 'update'; var database = 'index'; @@ -23,10 +24,10 @@ function usage() { console.log('check checks index for (and adds) any missing transactions/addresses'); console.log('reindex Clears index then resyncs from genesis to current block'); console.log(''); - console.log('notes:'); + console.log('notes:'); console.log('* \'current block\' is the latest created block when script is executed.'); console.log('* The market database only supports (& defaults to) reindex mode.'); - console.log('* If check mode finds missing data(ignoring new data since last sync),'); + console.log('* If check mode finds missing data(ignoring new data since last sync),'); console.log(' index_timeout in settings.json is set too low.') console.log(''); process.exit(0); @@ -39,17 +40,17 @@ if (process.argv[2] == 'index') { } else { switch(process.argv[3]) { - case 'update': - mode = 'update'; - break; - case 'check': - mode = 'check'; - break; - case 'reindex': - mode = 'reindex'; - break; - default: - usage(); + case 'update': + mode = 'update'; + break; + case 'check': + mode = 'check'; + break; + case 'reindex': + mode = 'reindex'; + break; + default: + usage(); } } } else if (process.argv[2] == 'market'){ @@ -87,7 +88,7 @@ function remove_lock(cb) { }); } else { return cb(); - } + } } function is_locked(cb) { @@ -102,7 +103,7 @@ function is_locked(cb) { }); } else { return cb(); - } + } } function exit() { @@ -140,34 +141,36 @@ is_locked(function (exists) { db.get_stats(settings.coin, function(stats){ if (settings.heavy == true) { db.update_heavy(settings.coin, stats.count, 20, function(){ - + }); } if (mode == 'reindex') { - Tx.remove({}, function(err) { - Address.remove({}, function(err2) { - Richlist.update({coin: settings.coin}, { - received: [], - balance: [], - }, function(err3) { - Stats.update({coin: settings.coin}, { - last: 0, - }, function() { - console.log('index cleared (reindex)'); - }); - db.update_tx_db(settings.coin, 1, stats.count, settings.update_timeout, function(){ - db.update_richlist('received', function(){ - db.update_richlist('balance', function(){ - db.get_stats(settings.coin, function(nstats){ - console.log('reindex complete (block: %s)', nstats.last); - exit(); + Tx.remove({}, function(err) { + Address.remove({}, function(err2) { + AddressTx.remove({}, function(err3) { + Richlist.update({coin: settings.coin}, { + received: [], + balance: [], + }, function(err3) { + Stats.update({coin: settings.coin}, { + last: 0, + }, function() { + console.log('index cleared (reindex)'); + }); + db.update_tx_db(settings.coin, 1, stats.count, settings.update_timeout, function(){ + db.update_richlist('received', function(){ + db.update_richlist('balance', function(){ + db.get_stats(settings.coin, function(nstats){ + console.log('reindex complete (block: %s)', nstats.last); + exit(); + }); }); }); }); }); }); }); - }); + }); } else if (mode == 'check') { db.update_tx_db(settings.coin, 1, stats.count, settings.check_timeout, function(){ db.get_stats(settings.coin, function(nstats){ diff --git a/views/address.jade b/views/address.jade index 132520c6e..c7751dc2d 100644 --- a/views/address.jade +++ b/views/address.jade @@ -4,25 +4,25 @@ block content - var balance = (address.received - address.sent) / 100000000; - var sent = address.sent /100000000 - var received = address.received / 100000000 - img.qrcode.pull-right.hidden-xs(src='/qr/#{address.a_id}') + img.qrcode.pull-right.hidden-xs(src='/qr/#{address.a_id}') .col-xs-12.col-md-10.col-md-offset-1 .panel.panel-default.panel-address-summary - .panel-heading(style='position:relative;') + .panel-heading(style='position:relative;') strong #{address.a_id} if settings.labels[address.a_id] - if settings.labels[address.a_id].type + if settings.labels[address.a_id].type label(class='label label-#{settings.labels[address.a_id].type} pull-right hidden-xs', style='margin-left:15px;') =settings.labels[address.a_id].label if settings.labels[address.a_id].url a(href='#{settings.labels[address.a_id].url}', target='_blank') span.fa.fa-question-circle(style='margin-left:5px;') else - label.label.label-default.pull-right.hidden-xs(style='margin-left:15px;') + label.label.label-default.pull-right.hidden-xs(style='margin-left:15px;') =settings.labels[address.a_id].label if settings.labels[address.a_id].url a(href='#{settings.labels[address.a_id].url}', target='_blank') span.fa.fa-question-circle(style='margin-left:5px;') - table.table.table-bordered.table-striped.summary-table + table.table.table-bordered.table-striped.summary-table thead tr if settings.show_sent_received == true @@ -31,23 +31,17 @@ block content if settings.show_sent_received == true th #{settings.locale.total_received} (#{settings.symbol}) th #{settings.locale.rl_balance} (#{settings.symbol}) - tbody + tbody tr - if settings.show_sent_received == true + if settings.show_sent_received == true td #{sent.toFixed(8)} if address.a_id !== 'coinbase' if settings.show_sent_received == true td #{received.toFixed(8)} td #{balance.toFixed(8)} - .panel.panel-default.hidden-xs - .panel-heading - strong #{settings.locale.ex_latest_transactions} - table.table.table-bordered.table-striped.history-table - include ./includes/address_history.jade - .panel.panel-default.hidden-lg.hidden-md + .panel.panel-default .panel-heading strong #{settings.locale.ex_latest_transactions} table.table.table-bordered.table-striped - include ./includes/address_history.jade - .footer-padding - \ No newline at end of file + include ./includes/address_history.jade + .footer-padding \ No newline at end of file diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index b0d5b90f8..c76ab3c34 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -1,39 +1,57 @@ -thead - tr - th.hidden-xs #{settings.locale.timestamp} - th.hidden-xs #{settings.locale.tx_hash} - th #{settings.locale.mkt_amount} (#{settings.symbol}) -tbody - each tx in txs - - var time = format_unixtime(tx.timestamp) +script. + var hashAddress = "#{address.a_id}"; + $(document).ready(function () { + var rtable = $('#address-txs').dataTable({ + autoWidth: true, + searching: false, + ordering: false, + responsive: true, + lengthChange: true, + processing: true, + serverSide: true, + ajax: { + "url": '/ext/getaddresstxsajax', + "data": { + "address": hashAddress + } + }, + rowCallback: function (row, data, index) { + var timestamp = data[0]; //variables for better readability + var txhash = data[1]; //variables for better readability + var out = data[2]; //variables for better readability + var vin = data[3]; //variables for better readability + + $("td:eq(0)", row).html(timestamp); + $("td:eq(1)", row).html('' + txhash + ''); + + var amount = 0; + + if(out > 0 && vin > 0) { + amount = (out - vin) / 100000000 + if (amount < 0) { + amount = amount * -1 + $("td:eq(2)", row).html("-" + amount.toFixed(8)).addClass("info"); + } else if (amount > 0) { + ammount = amount.toFixed(8); + $("td:eq(2)", row).html("+" + amount).addClass("info"); + } else { + $("td:eq(2)", row).html(amount.toFixed(8)).addClass("info"); + } + }else if(out > 0) { + amount = out / 100000000; + $("td:eq(2)", row).html("+" + amount.toFixed(8)).addClass("success"); + }else{ + amount = vin / 100000000; + $("td:eq(2)", row).html("-" + amount.toFixed(8)).addClass("danger"); + } + + }, + }); + }); +table#address-txs.table.table-bordered.table-striped + thead tr - td.hidden-xs #{time} - td.hidden-xs - a(href='/tx/#{tx.txid}') #{tx.txid} - - var done = false - - var out = 0 - - var vin = 0 - each r in tx.vout - if r.addresses == address.a_id - - out = r.amount - each s in tx.vin - if s.addresses == address.a_id - - vin = s.amount - if out > 0 && vin > 0 - td.info - - var amount = (out - vin) / 100000000 - if amount < 0 - - amount = amount * -1 - | - #{amount.toFixed(8)} - else if amount > 0 - | + #{amount.toFixed(8)} - else - | #{amount.toFixed(8)} - else if out > 0 - td.success - - var amount = out / 100000000 - | + #{amount.toFixed(8)} - else - td.danger - - var amount = vin / 100000000 - | - #{amount.toFixed(8)} \ No newline at end of file + th.hidden-xs #{settings.locale.timestamp} + th.hidden-xs #{settings.locale.tx_hash} + th #{settings.locale.mkt_amount} (#{settings.symbol}) + tbody \ No newline at end of file From 1aa2dfb6d9deb2a169959d18daa626fdaa7dc65c Mon Sep 17 00:00:00 2001 From: Tim Garrity Date: Tue, 12 Mar 2019 09:28:38 +0400 Subject: [PATCH 08/56] Update routes/index.js Commented out, prior to my PR, so its unrelated! Co-Authored-By: M-Shahbaz --- routes/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/index.js b/routes/index.js index 6a753ebae..bd7da637b 100644 --- a/routes/index.js +++ b/routes/index.js @@ -177,7 +177,7 @@ router.get('/network', function(req, res) { }); router.get('/reward', function(req, res){ - //db.get_stats(settings.coin, function (stats) { + db.get_stats(settings.coin, function (stats) { console.log(stats); db.get_heavy(settings.coin, function (heavy) { //heavy = heavy; From f12ccfbf7c26ef728ed4b5c93e90f51155cf944e Mon Sep 17 00:00:00 2001 From: M Shahbaz Date: Wed, 13 Mar 2019 09:59:21 +0400 Subject: [PATCH 09/56] Fixed null query length DOS issue --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 4421f1530..88b60c6e3 100644 --- a/app.js +++ b/app.js @@ -101,7 +101,7 @@ app.use('/ext/getlasttxs/:min', function(req,res){ }); app.use('/ext/getaddresstxsajax', function(req,res){ - if(req.query.length > settings.txcount){ + if(typeof req.query.length === 'undefined' || req.query.length > settings.txcount){ req.query.length = settings.txcount; } db.get_address_txs_ajax(req.query.address, req.query.start, req.query.length,function(txs, count){ From bca3582bb59370891a9e49db4c152ee0bd4bd7f4 Mon Sep 17 00:00:00 2001 From: M Shahbaz Date: Wed, 13 Mar 2019 11:29:27 +0400 Subject: [PATCH 10/56] Fixed string type query length vulnerabilty If the query.length is type string, it will parse to integer and will work for both: 1-Undefined 2-String type --- app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 88b60c6e3..910a65b6e 100644 --- a/app.js +++ b/app.js @@ -101,7 +101,8 @@ app.use('/ext/getlasttxs/:min', function(req,res){ }); app.use('/ext/getaddresstxsajax', function(req,res){ - if(typeof req.query.length === 'undefined' || req.query.length > settings.txcount){ + req.query.length = parseInt(req.query.length); + if(isNaN(req.query.length) || req.query.length > settings.index.last_txs){ req.query.length = settings.txcount; } db.get_address_txs_ajax(req.query.address, req.query.start, req.query.length,function(txs, count){ From bf99bb56eb4f0437c59d54a424882c2f839ca521 Mon Sep 17 00:00:00 2001 From: Luke Williams Date: Thu, 6 Jun 2019 05:28:48 +0200 Subject: [PATCH 11/56] Update README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index ba9e13486..bbb57a153 100644 --- a/README.md +++ b/README.md @@ -106,11 +106,6 @@ Iquidus Explorer is intended to be generic so it can be used with any wallet fol -daemon -txindex -### Donate - - BTC: 168hdKA3fkccPtkxnX8hBrsxNubvk4udJi - JBS: JZp9893FMmrm1681bDuJBU7c6w11kyEY7D - ### Known Issues **script is already running.** From 1ed4734a3bf2a21a713be5d0339e6834aafb4890 Mon Sep 17 00:00:00 2001 From: Luke Williams Date: Thu, 12 Sep 2019 09:19:52 +0200 Subject: [PATCH 12/56] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bbb57a153..7d57e276e 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,10 @@ sync.js (located in scripts/) is used for updating the local databases. This scr Iquidus Explorer is intended to be generic so it can be used with any wallet following the usual standards. The wallet must be running with atleast the following flags -daemon -txindex + +### Security + +Ensure mongodb is not exposed to the outside world via your mongo config or a firewall to prevent outside tampering of the indexed chain data. ### Known Issues From ef2bc210e6fef9925f7fe025c9ec84ad195c48c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 13:41:50 +0000 Subject: [PATCH 13/56] Bump mongoose from 4.1.10 to 5.7.7 Bumps [mongoose](https://github.com/Automattic/mongoose) from 4.1.10 to 5.7.7. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md) - [Commits](https://github.com/Automattic/mongoose/compare/4.1.10...5.7.7) Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fcf52b44f..892ac6d7f 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "request": "2.74.0", "jsonminify": "0.2.3", "mongodb": "2.0.45", - "mongoose": "4.1.10", + "mongoose": "5.7.7", "markdown-js": "0.0.3", "qr-image": "~2.0.0" }, From ef8af683d48f4717f8818473743846ea2d83b920 Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Mon, 11 Nov 2019 12:18:40 +0000 Subject: [PATCH 14/56] Add Altmarkets.io Exchange to markets --- lib/database.js | 8 ++- lib/locale.js | 1 + lib/markets/altmarkets.js | 103 ++++++++++++++++++++++++++++++ locale/en.json | 1 + views/markets/altmarkets.jade | 117 ++++++++++++++++++++++++++++++++++ 5 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 lib/markets/altmarkets.js create mode 100644 views/markets/altmarkets.jade diff --git a/lib/database.js b/lib/database.js index 619f3a15e..dfd6c4dd3 100644 --- a/lib/database.js +++ b/lib/database.js @@ -15,7 +15,8 @@ var mongoose = require('mongoose') , cryptopia = require('./markets/cryptopia') , yobit = require('./markets/yobit') , empoex = require('./markets/empoex') - , ccex = require('./markets/ccex'); + , ccex = require('./markets/ccex') + , altmarkets = require('./markets/altmarkets'); // , BTC38 = require('./markets/BTC38'); function find_address(hash, cb) { @@ -190,6 +191,11 @@ function save_tx(txid, cb) { function get_market_data(market, cb) { switch(market) { + case 'altmarkets': + altmarkets.get_data(settings.markets.coin, settings.markets.exchange, function(err, obj){ + return cb(err, obj); + }); + break; case 'bittrex': bittrex.get_data(settings.markets.coin, settings.markets.exchange, function(err, obj){ return cb(err, obj); diff --git a/lib/locale.js b/lib/locale.js index 4cdb5333a..219eb006f 100644 --- a/lib/locale.js +++ b/lib/locale.js @@ -136,6 +136,7 @@ exports.heavy_lastxvotes = "Last 20 votes", exports.poloniex = "Poloniex", exports.bittrex = "Bittrex", +exports.altmarkets = "AltMarkets", exports.bleutrade = "Bleutrade", exports.yobit = "Yobit", exports.cryptsy = "Cryptsy", diff --git a/lib/markets/altmarkets.js b/lib/markets/altmarkets.js new file mode 100644 index 000000000..c9e19b0b5 --- /dev/null +++ b/lib/markets/altmarkets.js @@ -0,0 +1,103 @@ +var request = require('request'); + +var base_url = 'https://altmarkets.io/api/v2/'; + +function get_summary(coin, exchange, cb) { + var req_url = base_url + 'tickers/' + coin.toLowerCase() + exchange.toLowerCase(); + var summary = {}; + request({uri: req_url, json: true}, function (error, response, body) { + if (error) { + return cb(error, null); + } else { + if (body.error) { + return cb(body.error, null); + } else { + summary['bid'] = parseFloat(body['ticker']['buy']).toFixed(8); + summary['ask'] = parseFloat(body['ticker']['sell']).toFixed(8); + summary['volume'] = parseFloat(body['ticker']['vol']).toFixed(8); + summary['volume_btc'] = parseFloat(body['ticker']['quotevol']).toFixed(8); + summary['high'] = parseFloat(body['ticker']['high']).toFixed(8); + summary['low'] = parseFloat(body['ticker']['low']).toFixed(8); + summary['last'] = parseFloat(body['ticker']['last']).toFixed(8); + request({ uri: base_url + 'k?market=' + coin.toLowerCase() + "" + exchange.toLowerCase() + '&period=1&time_to=' + (Math.round(Date.now()/1000)-(60*60*24)) + '&limit=1', json: true }, function (error, response, body) { + if (error) { + return cb(error, null); + } else { + if (body.error) { + return cb(body.error, null); + } else { + var prevlast = body[0][4]; + summary['change'] = -(100-(((1/prevlast)*summary['last'])*100)); + return cb(null, summary); + } + } + }); + } + } + }); +} + +function get_trades(coin, exchange, cb) { + var req_url = base_url + "trades?market=" + coin.toLowerCase() + "" + exchange.toLowerCase() + "&limit=50&order_by=desc"; + request({uri: req_url, json: true}, function (error, response, body) { + if (body.error) { + return cb(body.error, null); + } else { + return cb (null, body); + } + }); +} + +function get_orders(coin, exchange, cb) { + var req_url = base_url + 'depth?market=' + coin.toLowerCase() + exchange.toLowerCase(); + request({uri: req_url, json: true}, function (error, response, body) { + if (body.error) { + return cb(body.error, [], []) + } else { + var orders = body; + var buys = []; + var sells = []; + if (orders['bids'].length > 0){ + for (var i = 0; i < orders['bids'].length; i++) { + var order = { + amount: parseFloat(orders.bids[i][1]).toFixed(8), + price: parseFloat(orders.bids[i][0]).toFixed(8), + // total: parseFloat(orders.bids[i].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(orders.bids[i][1]).toFixed(8) * parseFloat(orders.bids[i][0])).toFixed(8) + } + buys.push(order); + } + } else {} + if (orders['asks'].length > 0) { + for (var x = 0; x < orders['asks'].length; x++) { + var order = { + amount: parseFloat(orders.asks[x][1]).toFixed(8), + price: parseFloat(orders.asks[x][0]).toFixed(8), + // total: parseFloat(orders.asks[x].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(orders.asks[x][1]).toFixed(8) * parseFloat(orders.asks[x][0])).toFixed(8) + } + sells.push(order); + } + } else {} + return cb(null, buys, sells); + } + }); +} + +module.exports = { + get_data: function(coin, exchange, cb) { + var error = null; + get_orders(coin, exchange, function(err, buys, sells) { + if (err) { error = err; } + get_trades(coin, exchange, function(err, trades) { + if (err) { error = err; } + get_summary(coin, exchange, function(err, stats) { + if (err) { error = err; } + return cb(error, {buys: buys, sells: sells, chartdata: [], trades: trades, stats: stats}); + }); + }); + }); + } +}; diff --git a/locale/en.json b/locale/en.json index 443d75916..ff2e3afdb 100644 --- a/locale/en.json +++ b/locale/en.json @@ -127,6 +127,7 @@ // Markets "poloniex": "Poloniex", "bittrex": "Bittrex", + "altmarkets": "AltMarkets", "bleutrade": "Bleutrade", "yobit": "Yobit", "empoex": "Empoex", diff --git a/views/markets/altmarkets.jade b/views/markets/altmarkets.jade new file mode 100644 index 000000000..8b309dee8 --- /dev/null +++ b/views/markets/altmarkets.jade @@ -0,0 +1,117 @@ +extends menu + +block market_view + .row + .col-md-12 + .panel.panel-default + .panel-heading + strong #{settings.locale.altmarkets} - #{marketdata.coin}/#{marketdata.exchange} - #{settings.locale.mkt_hours} + a(href='#') + span.fa.fa-line-chart.pull-right.view-chart-disabled.iquidus.market-toggle(data-toggle='tooltip', data-placement='bottom', title='#{settings.locale.mkt_no_chart}') + table.table.table-bordered.summary-table + thead + tr + th #{settings.locale.mkt_high} + th #{settings.locale.mkt_low} + th #{settings.locale.mkt_volume} (#{marketdata.coin}) + th #{settings.locale.mkt_volume} (#{marketdata.exchange}) + th.hidden-xs #{settings.locale.mkt_top_bid} + th.hidden-xs #{settings.locale.mkt_top_ask} + th.hidden-xs #{settings.locale.mkt_last} + th #{settings.locale.mkt_change} + tbody + tr + td #{marketdata.data.summary.high} + td #{marketdata.data.summary.low} + td #{marketdata.data.summary.volume} + td #{marketdata.data.summary.volume_btc} + td.hidden-xs #{marketdata.data.summary.bid} + td.hidden-xs #{marketdata.data.summary.ask} + td.hidden-xs #{marketdata.data.summary.last} + - var altmarkets_change = (marketdata.data.summary.change).toFixed(4); + if altmarkets_change >= 0 + td.success +#{altmarkets_change} % + else + td.danger #{altmarkets_change} % + .row + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_buy_orders} + table.table.table-striped.table-bordered.order-table + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each buy in marketdata.data.buys + tr + td + =buy.price + td + =buy.amount + td.hidden-xs + =buy.total + + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_sell_orders} + table.table.table-striped.table-bordered.order-table + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each sell in marketdata.data.sells + tr + td + =sell.price + td + =sell.amount + td.hidden-xs + =sell.total + .row + .col-md-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_trade_history} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th.hidden-xs #{settings.locale.mkt_type} + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_total} (#{marketdata.exchange}) + th.hidden-xs #{settings.locale.mkt_time_stamp} + tbody + each order in marketdata.data.history + if order.side == 'up' + tr.success + td.hidden-xs + =order.side + td + =parseFloat(order.volume).toFixed(8) + td + =parseFloat(order.price).toFixed(8) + td + =parseFloat(order.funds).toFixed(8) + td.hidden-xs + =(new Date(order.timestamp * 1000).toUTCString()) + else + tr.danger + td.hidden-xs + =order.side + td + =parseFloat(order.volume).toFixed(8) + td + =parseFloat(order.price).toFixed(8) + td + =parseFloat(order.funds).toFixed(8) + td.hidden-xs + =(new Date(order.timestamp * 1000).toUTCString()) + + .footer-padding + From b17cdf6ea1d9afeae5eb5edeb97611d1ddb813e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2019 17:34:03 +0000 Subject: [PATCH 15/56] Bump debug from 0.7.4 to 4.1.1 Bumps [debug](https://github.com/visionmedia/debug) from 0.7.4 to 4.1.1. - [Release notes](https://github.com/visionmedia/debug/releases) - [Commits](https://github.com/visionmedia/debug/compare/0.7.4...4.1.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fcf52b44f..44d9374cb 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "morgan": "~1.0.0", "cookie-parser": "~1.0.1", "body-parser": "~1.0.0", - "debug": "~0.7.4", + "debug": "~4.1.1", "jade": "~1.3.0", "bitcoin-node-api": "0.1.0", "request": "2.74.0", From e5f6ad42d5484f94c55bcba360ced9ff38fce6d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2019 17:34:06 +0000 Subject: [PATCH 16/56] Bump morgan from 1.0.1 to 1.9.1 Bumps [morgan](https://github.com/expressjs/morgan) from 1.0.1 to 1.9.1. - [Release notes](https://github.com/expressjs/morgan/releases) - [Changelog](https://github.com/expressjs/morgan/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/morgan/compare/1.0.1...1.9.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fcf52b44f..60e13787c 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "dependencies": { "express": "~4.2.0", "static-favicon": "~1.0.0", - "morgan": "~1.0.0", + "morgan": "~1.9.1", "cookie-parser": "~1.0.1", "body-parser": "~1.0.0", "debug": "~0.7.4", From c8b328066acbbdde149ef7af86a34103e8479968 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2019 17:34:08 +0000 Subject: [PATCH 17/56] Bump express from 4.2.0 to 4.17.1 Bumps [express](https://github.com/expressjs/express) from 4.2.0 to 4.17.1. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.2.0...4.17.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fcf52b44f..acff3e8bf 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "test": "node ./node_modules/jasmine/bin/jasmine.js" }, "dependencies": { - "express": "~4.2.0", + "express": "~4.17.1", "static-favicon": "~1.0.0", "morgan": "~1.0.0", "cookie-parser": "~1.0.1", From 08ec73fba7b89f01b0be4e431028a0f6e99c89fd Mon Sep 17 00:00:00 2001 From: Min Khang Aung Date: Sun, 10 Nov 2019 06:43:16 +0000 Subject: [PATCH 18/56] Add Crex24 exchange support --- lib/database.js | 8 ++- lib/locale.js | 1 + lib/markets/crex.js | 150 ++++++++++++++++++++++++++++++++++++++++ locale/en.json | 1 + views/markets/crex.jade | 113 ++++++++++++++++++++++++++++++ 5 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 lib/markets/crex.js create mode 100644 views/markets/crex.jade diff --git a/lib/database.js b/lib/database.js index dfd6c4dd3..01b4ef704 100644 --- a/lib/database.js +++ b/lib/database.js @@ -16,7 +16,8 @@ var mongoose = require('mongoose') , yobit = require('./markets/yobit') , empoex = require('./markets/empoex') , ccex = require('./markets/ccex') - , altmarkets = require('./markets/altmarkets'); + , altmarkets = require('./markets/altmarkets') + , crex = require('./markets/crex'); // , BTC38 = require('./markets/BTC38'); function find_address(hash, cb) { @@ -236,6 +237,11 @@ function get_market_data(market, cb) { return cb(err, obj); }); break; + case 'crex': + crex.get_data(settings.markets.coin, settings.markets.exchange, function (err, obj){ + return cb(err, obj); + }); + break; default: return cb(null); } diff --git a/lib/locale.js b/lib/locale.js index 219eb006f..564094934 100644 --- a/lib/locale.js +++ b/lib/locale.js @@ -143,6 +143,7 @@ exports.cryptsy = "Cryptsy", exports.cryptopia = "Cryptopia", exports.empoex = "Empoex", exports.ccex = "C-Cex", +exports.crex = "Crex24", exports.reloadLocale = function reloadLocale(locale) { // Discover where the locale file lives diff --git a/lib/markets/crex.js b/lib/markets/crex.js new file mode 100644 index 000000000..cf912aaaf --- /dev/null +++ b/lib/markets/crex.js @@ -0,0 +1,150 @@ +var request = require('request'); + +var base_url = 'https://api.crex24.com/v2/public'; + +/** + * Get the Trades from the Crex24 API + * + * Request : https://api.crex24.com/v2/public/tickers?instrument=CPU-BTC + * + * + * @param {*} coin = ips + * @param {*} exchange = btc + * @param {*} cb = Callback + */ +function get_summary(coin, exchange, cb) { + var summary = {}; + var url=base_url + '/tickers?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); + //console.log("Request send to URL:" + url); + request({uri: url, json: true}, function (error, response, body) { + if (error) { + return cb(error, null); + } else if (body.error !== true) { + summary['ask'] = parseFloat(body[0]['ask']).toFixed(8); + summary['bid'] = parseFloat(body[0]['bid']).toFixed(8); + summary['volume'] = parseFloat(body[0]['baseVolume']).toFixed(8); + summary['volume_btc'] = parseFloat(body[0]['volumeInBtc']).toFixed(8); + summary['high'] = parseFloat(body[0]['high']).toFixed(8); + summary['low'] = parseFloat(body[0]['low']).toFixed(8); + summary['last'] = parseFloat(body[0]['last']).toFixed(8); + summary['change'] = parseFloat(body[0]['percentChange']); + return cb(null, summary); + } else { + return cb(error, null); + } + }); +} + +/** + * Get the Latest Trades from the Crex24 API + * + * Request : https://api.crex24.com/v2/public/recentTrades?instrument=CPU-BTC + * Issues : Label is not present in API + * @param {*} coin = cpu + * @param {*} exchange = btc + * @param {*} cb = Callback + */ +function get_trades(coin, exchange, cb) { + var req_url = base_url + '/recentTrades?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); + //console.log("send request to - " + req_url) + request({ uri: req_url, json: true }, function (error, response, body) { + if(error) + return cb(error, null); + else if (body.error !== true) { + var tTrades = body; + var trades = []; + for (var i = 0; i < tTrades.length; i++) { + var Trade = { + orderpair: tTrades[i].Label, + ordertype: tTrades[i].side, + amount: parseFloat(tTrades[i].volume).toFixed(8), + price: parseFloat(tTrades[i].price).toFixed(8), + // total: parseFloat(tTrades[i].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(tTrades[i].volume).toFixed(8) * parseFloat(tTrades[i].price)).toFixed(8), + timestamp: parseInt((new Date(tTrades[i].timestamp).getTime() / 1000).toFixed(0)) + } + trades.push(Trade); + } + //console.log("Buy orders: %j", trades); + return cb(null, trades); + } else { + return cb(body.Message, null); + } + }); +} + +/** + * Get the Latest Orders from the Crex24 API + * + * Request : https://api.crex24.com/v2/public/orderBook?instrument=CPU-BTC + * + * @param {*} coin = cpu + * @param {*} exchange = btc + * @param {*} cb = Callback + */ +function get_orders(coin, exchange, cb) { + var req_url = base_url + '/orderBook?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); + //console.log("send request to - " + req_url) + request({ uri: req_url, json: true }, function (error, response, body) { + if(error) + return cb(error, null); + else if (body.error !== true) { + var buyorders = body['buyLevels']; + var sellorders = body['sellLevels']; + + //console.log('Buy orders: ' + buyorders); + //console.log('Sell orders: ' + sellorders); + + var buys = []; + var sells = []; + if (buyorders.length > 0){ + for (var i = 0; i < buyorders.length; i++) { + var order = { + amount: parseFloat(buyorders[i].volume).toFixed(8), + price: parseFloat(buyorders[i].price).toFixed(8), + // total: parseFloat(orders.BuyOrders[i].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(buyorders[i].volume).toFixed(8) * parseFloat(buyorders[i].price)).toFixed(8) + } + buys.push(order); + } + //console.log("Buy orders: %j", buys); + } else {} + if (sellorders.length > 0) { + for (var x = 0; x < sellorders.length; x++) { + var order = { + amount: parseFloat(sellorders[x].volume).toFixed(8), + price: parseFloat(sellorders[x].price).toFixed(8), + // total: parseFloat(orders.SellOrders[x].Total).toFixed(8) + // Necessary because API will return 0.00 for small volume transactions + total: (parseFloat(sellorders[x].volume).toFixed(8) * parseFloat(sellorders[x].price)).toFixed(8) + } + sells.push(order); + } + //console.log("Sell orders: %j", sells); + } else { + } + return cb(null, buys, sells); + } else { + return cb(body.Message, [], []) + } + }); +} + +module.exports = { + get_data: function(coin, exchange, cb) { + var error = null; + get_orders(coin, exchange, function(err, buys, sells) { + if (err) { error = err; } + get_trades(coin, exchange, function(err, trades) { + if (err) { error = err; } + get_summary(coin, exchange, function(err, stats) { + if (err) { error = err; } + //return cb(error, {buys: buys, sells: sells, chartdata: [], trades: trades, stats: stats}); + return cb(error, {buys: buys, sells: sells, chartdata: [], trades: trades, stats: stats}); + }); + }); + }); + } +}; diff --git a/locale/en.json b/locale/en.json index ff2e3afdb..b618d38e3 100644 --- a/locale/en.json +++ b/locale/en.json @@ -134,6 +134,7 @@ "cryptsy": "Cryptsy", "cryptopia": "Cryptopia", "ccex": "C-Cex", + "crex": "Crex24", // Heavy rewards view "heavy_title": "Reward/voting information", diff --git a/views/markets/crex.jade b/views/markets/crex.jade new file mode 100644 index 000000000..4e6378299 --- /dev/null +++ b/views/markets/crex.jade @@ -0,0 +1,113 @@ +extends menu + +block market_view + .row + .col-md-12 + .panel.panel-default + .panel-heading + strong #{settings.locale.crex} - #{marketdata.coin}/#{marketdata.exchange} - #{settings.locale.mkt_hours} + a(href='https://crex24.com/exchange/#{marketdata.coin}-#{marketdata.exchange}') + span.fa.fa-line-chart.pull-right.view-chart-disabled.iquidus.market-toggle(data-toggle='tooltip', data-placement='bottom', title='#{settings.locale.mkt_no_chart}') + table.table.table-bordered.summary-table + thead + tr + th #{settings.locale.mkt_high} + th #{settings.locale.mkt_low} + th #{settings.locale.mkt_volume} + th.hidden-xs #{settings.locale.mkt_top_bid} + th.hidden-xs #{settings.locale.mkt_top_ask} + th.hidden-xs #{settings.locale.mkt_last} + th #{settings.locale.mkt_change} + tbody + tr + td #{marketdata.data.summary.high} + td #{marketdata.data.summary.low} + td #{marketdata.data.summary.volume} + td.hidden-xs #{marketdata.data.summary.bid} + td.hidden-xs #{marketdata.data.summary.ask} + td.hidden-xs #{marketdata.data.summary.last} + - var crex_change = (marketdata.data.summary.change); + if crex_change >= 0 + td.success +#{crex_change} % + else + td.danger #{crex_change} % + .row + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_buy_orders} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each buy in marketdata.data.buys + tr + td + =buy.price + td + =buy.amount + td.hidden-xs + =buy.total + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_sell_orders} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each sell in marketdata.data.sells + tr + td + =sell.price + td + =sell.amount + td.hidden-xs + =sell.total + .row + .col-md-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_trade_history} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th.hidden-xs #{settings.locale.mkt_type} + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_total} (#{marketdata.exchange}) + th.hidden-xs #{settings.locale.mkt_time_stamp} + tbody + each order in marketdata.data.history + if order.ordertype == "sell" + tr.danger + td.hidden-xs + =order.ordertype + td + =order.amount + td + =order.price + td + =order.total + td.hidden-xs + =format_unixtime(order.timestamp) + else + tr.success + td.hidden-xs + =order.ordertype + td + =order.amount + td + =order.price + td + =order.total + td.hidden-xs + =format_unixtime(order.timestamp) + + .footer-padding From ee20f9bec2ab05a8abda85bffc7290f6a5ea2ffb Mon Sep 17 00:00:00 2001 From: Min Khang Aung Date: Sun, 24 Nov 2019 05:25:35 +0000 Subject: [PATCH 19/56] Update --- lib/markets/crex.js | 44 ----------------------------------------- views/markets/crex.jade | 2 +- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/lib/markets/crex.js b/lib/markets/crex.js index cf912aaaf..f885d3f41 100644 --- a/lib/markets/crex.js +++ b/lib/markets/crex.js @@ -2,20 +2,9 @@ var request = require('request'); var base_url = 'https://api.crex24.com/v2/public'; -/** - * Get the Trades from the Crex24 API - * - * Request : https://api.crex24.com/v2/public/tickers?instrument=CPU-BTC - * - * - * @param {*} coin = ips - * @param {*} exchange = btc - * @param {*} cb = Callback - */ function get_summary(coin, exchange, cb) { var summary = {}; var url=base_url + '/tickers?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); - //console.log("Request send to URL:" + url); request({uri: url, json: true}, function (error, response, body) { if (error) { return cb(error, null); @@ -35,18 +24,8 @@ function get_summary(coin, exchange, cb) { }); } -/** - * Get the Latest Trades from the Crex24 API - * - * Request : https://api.crex24.com/v2/public/recentTrades?instrument=CPU-BTC - * Issues : Label is not present in API - * @param {*} coin = cpu - * @param {*} exchange = btc - * @param {*} cb = Callback - */ function get_trades(coin, exchange, cb) { var req_url = base_url + '/recentTrades?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); - //console.log("send request to - " + req_url) request({ uri: req_url, json: true }, function (error, response, body) { if(error) return cb(error, null); @@ -59,14 +38,11 @@ function get_trades(coin, exchange, cb) { ordertype: tTrades[i].side, amount: parseFloat(tTrades[i].volume).toFixed(8), price: parseFloat(tTrades[i].price).toFixed(8), - // total: parseFloat(tTrades[i].Total).toFixed(8) - // Necessary because API will return 0.00 for small volume transactions total: (parseFloat(tTrades[i].volume).toFixed(8) * parseFloat(tTrades[i].price)).toFixed(8), timestamp: parseInt((new Date(tTrades[i].timestamp).getTime() / 1000).toFixed(0)) } trades.push(Trade); } - //console.log("Buy orders: %j", trades); return cb(null, trades); } else { return cb(body.Message, null); @@ -74,18 +50,8 @@ function get_trades(coin, exchange, cb) { }); } -/** - * Get the Latest Orders from the Crex24 API - * - * Request : https://api.crex24.com/v2/public/orderBook?instrument=CPU-BTC - * - * @param {*} coin = cpu - * @param {*} exchange = btc - * @param {*} cb = Callback - */ function get_orders(coin, exchange, cb) { var req_url = base_url + '/orderBook?instrument=' + coin.toUpperCase() + '-' + exchange.toUpperCase(); - //console.log("send request to - " + req_url) request({ uri: req_url, json: true }, function (error, response, body) { if(error) return cb(error, null); @@ -93,9 +59,6 @@ function get_orders(coin, exchange, cb) { var buyorders = body['buyLevels']; var sellorders = body['sellLevels']; - //console.log('Buy orders: ' + buyorders); - //console.log('Sell orders: ' + sellorders); - var buys = []; var sells = []; if (buyorders.length > 0){ @@ -103,26 +66,20 @@ function get_orders(coin, exchange, cb) { var order = { amount: parseFloat(buyorders[i].volume).toFixed(8), price: parseFloat(buyorders[i].price).toFixed(8), - // total: parseFloat(orders.BuyOrders[i].Total).toFixed(8) - // Necessary because API will return 0.00 for small volume transactions total: (parseFloat(buyorders[i].volume).toFixed(8) * parseFloat(buyorders[i].price)).toFixed(8) } buys.push(order); } - //console.log("Buy orders: %j", buys); } else {} if (sellorders.length > 0) { for (var x = 0; x < sellorders.length; x++) { var order = { amount: parseFloat(sellorders[x].volume).toFixed(8), price: parseFloat(sellorders[x].price).toFixed(8), - // total: parseFloat(orders.SellOrders[x].Total).toFixed(8) - // Necessary because API will return 0.00 for small volume transactions total: (parseFloat(sellorders[x].volume).toFixed(8) * parseFloat(sellorders[x].price)).toFixed(8) } sells.push(order); } - //console.log("Sell orders: %j", sells); } else { } return cb(null, buys, sells); @@ -141,7 +98,6 @@ module.exports = { if (err) { error = err; } get_summary(coin, exchange, function(err, stats) { if (err) { error = err; } - //return cb(error, {buys: buys, sells: sells, chartdata: [], trades: trades, stats: stats}); return cb(error, {buys: buys, sells: sells, chartdata: [], trades: trades, stats: stats}); }); }); diff --git a/views/markets/crex.jade b/views/markets/crex.jade index 4e6378299..1dc2a7036 100644 --- a/views/markets/crex.jade +++ b/views/markets/crex.jade @@ -6,7 +6,7 @@ block market_view .panel.panel-default .panel-heading strong #{settings.locale.crex} - #{marketdata.coin}/#{marketdata.exchange} - #{settings.locale.mkt_hours} - a(href='https://crex24.com/exchange/#{marketdata.coin}-#{marketdata.exchange}') + a(href='#') span.fa.fa-line-chart.pull-right.view-chart-disabled.iquidus.market-toggle(data-toggle='tooltip', data-placement='bottom', title='#{settings.locale.mkt_no_chart}') table.table.table-bordered.summary-table thead From b7e10f49930d28afbc378194938fed6a85b8ed3b Mon Sep 17 00:00:00 2001 From: Min Khang Aung Date: Fri, 26 Jul 2019 22:17:39 +0900 Subject: [PATCH 20/56] Add TradeSatoshi Support --- lib/database.js | 8 ++- lib/locale.js | 1 + lib/markets/tradesatoshi.js | 81 +++++++++++++++++++++++ locale/en.json | 1 + views/markets/tradesatoshi.jade | 113 ++++++++++++++++++++++++++++++++ 5 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 lib/markets/tradesatoshi.js create mode 100644 views/markets/tradesatoshi.jade diff --git a/lib/database.js b/lib/database.js index 01b4ef704..5832d821f 100644 --- a/lib/database.js +++ b/lib/database.js @@ -17,7 +17,8 @@ var mongoose = require('mongoose') , empoex = require('./markets/empoex') , ccex = require('./markets/ccex') , altmarkets = require('./markets/altmarkets') - , crex = require('./markets/crex'); + , crex = require('./markets/crex') + , tradesatoshi = require('./markets/tradesatoshi'); // , BTC38 = require('./markets/BTC38'); function find_address(hash, cb) { @@ -242,6 +243,11 @@ function get_market_data(market, cb) { return cb(err, obj); }); break; + case 'tradesatoshi': + tradesatoshi.get_data(settings.markets.coin, settings.markets.exchange, function (err, obj){ + return cb(err, obj); + }); + break; default: return cb(null); } diff --git a/lib/locale.js b/lib/locale.js index 564094934..4d0c20c88 100644 --- a/lib/locale.js +++ b/lib/locale.js @@ -144,6 +144,7 @@ exports.cryptopia = "Cryptopia", exports.empoex = "Empoex", exports.ccex = "C-Cex", exports.crex = "Crex24", +exports.tradesatoshi = "TradeSatoshi", exports.reloadLocale = function reloadLocale(locale) { // Discover where the locale file lives diff --git a/lib/markets/tradesatoshi.js b/lib/markets/tradesatoshi.js new file mode 100644 index 000000000..9de06a949 --- /dev/null +++ b/lib/markets/tradesatoshi.js @@ -0,0 +1,81 @@ +var request = require('request'); + +var base_url = 'https://tradesatoshi.com/api/public/'; +function get_summary(coin, exchange, cb) { + var summary = {}; + request({ uri: base_url + 'getmarketsummary?market=' + coin + '_' + exchange, json: true }, function (error, response, body) { + if (error) { + return cb(error, null); + } else { + summary['bid'] = body.result['bid']; + summary['ask'] = body.result['ask']; + summary['volume'] = body.result['volume']; + summary['high'] = body.result['high']; + summary['low'] = body.result['low']; + summary['last'] = body.result['last']; + summary['change'] = body.result['change']; + return cb(null, summary); + } + }); +} + +function get_trades(coin, exchange, cb) { + var req_url = base_url + 'getmarkethistory?market=' + coin + '_' + exchange + '&count=1000'; + request({uri: req_url, json: true}, function (error, response, body) { + if (body.success == true) { + return cb (null, body['result']); + } else { + return cb(body.message, null); + } + }); + } + +function get_orders(coin, exchange, cb) { + var req_url = base_url + 'getorderbook?market=' + coin + '_' + exchange + '&type=both&depth=1000'; + request({ uri: req_url, json: true }, function (error, response, body) { + if (body.success) { + var orders = body.result; + var buys = []; + var sells = []; + if (orders['buy'].length > 0){ + for (var i = 0; i < orders['buy'].length; i++) { + var order = { + amount: parseFloat(orders.buy[i].quantity).toFixed(8), + price: parseFloat(orders.buy[i].rate).toFixed(8), + total: (parseFloat(orders.buy[i].quantity).toFixed(8) * parseFloat(orders.buy[i].rate)).toFixed(8) + } + buys.push(order); + } + } + if (orders['sell'].length > 0) { + for (var x = 0; x < orders['sell'].length; x++) { + var order = { + amount: parseFloat(orders.sell[x].quantity).toFixed(8), + price: parseFloat(orders.sell[x].rate).toFixed(8), + total: (parseFloat(orders.sell[x].quantity).toFixed(8) * parseFloat(orders.sell[x].rate)).toFixed(8) + } + sells.push(order); + } + } + return cb(null, buys, sells); + } else { + return cb(body.Message, [], []) + } + }); +} + +module.exports = { + get_data: function(coin, exchange, cb) { + var error = null; + get_orders(coin, exchange, function(err, buys, sells) { + if (err) { error = err; } + get_trades(coin, exchange, function(err, trades) { + if (err) { error = err; } + get_summary(coin, exchange, function(err, stats) { + if (err) { error = err; } + return cb(error, {buys: buys, sells: sells, chartdata: [], trades: trades, stats: stats}); + }); + }); + }); + } + }; diff --git a/locale/en.json b/locale/en.json index b618d38e3..0c3c10fd8 100644 --- a/locale/en.json +++ b/locale/en.json @@ -135,6 +135,7 @@ "cryptopia": "Cryptopia", "ccex": "C-Cex", "crex": "Crex24", + "tradesatoshi": "TradeSatoshi", // Heavy rewards view "heavy_title": "Reward/voting information", diff --git a/views/markets/tradesatoshi.jade b/views/markets/tradesatoshi.jade new file mode 100644 index 000000000..9768ec8ab --- /dev/null +++ b/views/markets/tradesatoshi.jade @@ -0,0 +1,113 @@ +extends menu + +block market_view + .row + .col-md-12 + .panel.panel-default + .panel-heading + strong #{settings.locale.tradesatoshi} - #{marketdata.coin}/#{marketdata.exchange} - #{settings.locale.mkt_hours} + a(href='https://coinmarketcap.com/currencies/#{settings.coin}/#charts') + span.fa.fa-line-chart.pull-right.view-chart-disabled.iquidus.market-toggle(data-toggle='tooltip', data-placement='bottom', title='#{settings.locale.mkt_no_chart}') + table.table.table-bordered.summary-table + thead + tr + th #{settings.locale.mkt_high} + th #{settings.locale.mkt_low} + th #{settings.locale.mkt_volume} + th.hidden-xs #{settings.locale.mkt_top_bid} + th.hidden-xs #{settings.locale.mkt_top_ask} + th.hidden-xs #{settings.locale.mkt_last} + th #{settings.locale.mkt_change} + tbody + tr + td #{marketdata.data.summary.high.toFixed(8)} + td #{marketdata.data.summary.low.toFixed(8)} + td #{marketdata.data.summary.volume.toFixed(2).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1")} + td.hidden-xs #{marketdata.data.summary.bid.toFixed(8)} + td.hidden-xs #{marketdata.data.summary.ask.toFixed(8)} + td.hidden-xs #{marketdata.data.summary.last.toFixed(8)} + - var tradesatoshi_change = parseFloat(marketdata.data.summary.change).toFixed(4).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1"); + if tradesatoshi_change >= 0 + td.success +#{tradesatoshi_change} % + else + td.danger #{tradesatoshi_change} % + .row + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_buy_orders} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each buy in marketdata.data.buys + tr + td + =buy.price + td + =buy.amount + td.hidden-xs + =buy.total + + .col-md-6.col-xs-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_sell_orders} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th.hidden-xs #{settings.locale.mkt_total} (#{marketdata.exchange}) + tbody + each sell in marketdata.data.sells + tr + td + =sell.price + td + =sell.amount + td.hidden-xs + =sell.total + .row + .col-md-12 + .panel.panel-default + .panel-heading + h3.panel-title #{settings.locale.mkt_trade_history} + table.table.table-hover.history-table.table-bordered(cellspacing="0") + thead + tr + th.hidden-xs #{settings.locale.mkt_type} + th #{settings.locale.mkt_amount} (#{marketdata.coin}) + th #{settings.locale.mkt_price} (#{marketdata.exchange}) + th #{settings.locale.mkt_total} (#{marketdata.exchange}) + th.hidden-xs #{settings.locale.mkt_time_stamp} + tbody + each result in marketdata.data.history + if result.orderType == 'Sell' + tr.danger + td.hidden-xs + =result.orderType + td + =result.quantity.toFixed(8).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1") + td + =result.price.toFixed(8) + td + =result.total.toFixed(8).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1") + td.hidden-xs + =result.timeStamp.substr(0, 19).replace("T", " ") + else + tr.success + td.hidden-xs + =result.orderType + td + =result.quantity.toFixed(8).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1") + td + =result.price.toFixed(8) + td + =result.total.toFixed(8).replace(/(?:\.0+|(\.\d+?)0+)$/, "$1") + td.hidden-xs + =result.timeStamp.substr(0, 19).replace("T", " ") + .footer-padding From f9ec6d1115d86ef8035f666765a12418441b3638 Mon Sep 17 00:00:00 2001 From: Min Khang Aung Date: Thu, 19 Dec 2019 15:19:45 +0000 Subject: [PATCH 21/56] Remove link --- views/markets/tradesatoshi.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/markets/tradesatoshi.jade b/views/markets/tradesatoshi.jade index 9768ec8ab..0093af628 100644 --- a/views/markets/tradesatoshi.jade +++ b/views/markets/tradesatoshi.jade @@ -6,7 +6,7 @@ block market_view .panel.panel-default .panel-heading strong #{settings.locale.tradesatoshi} - #{marketdata.coin}/#{marketdata.exchange} - #{settings.locale.mkt_hours} - a(href='https://coinmarketcap.com/currencies/#{settings.coin}/#charts') + a(href='#') span.fa.fa-line-chart.pull-right.view-chart-disabled.iquidus.market-toggle(data-toggle='tooltip', data-placement='bottom', title='#{settings.locale.mkt_no_chart}') table.table.table-bordered.summary-table thead From c8069c52e77b9af34fa90ecc8f4ec5603b489726 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 20 Dec 2019 09:04:30 +0000 Subject: [PATCH 22/56] Update advised node version for latest dependency security patches --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 24bbd11b4..1a3e05ae5 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ An open source block explorer written in node.js. ### Requires -* node.js >= 0.10.28 +* node.js >= 0.10.28 (6.17.1 is advised for updated dependencies) * mongodb 2.6.x * *coind From 35819fcb019c120286950aded6219cc3dcf3e1d1 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 16 Dec 2019 09:35:44 +0000 Subject: [PATCH 23/56] Sync, Update_richlist: Fix memory overflow indexing 1000s of TXs Richlist doesn't need to store every TX in memory when compiling balances for each Address. Includes Sync script fixes for reindexing as well as a function to delete and recreate the richlist --- lib/database.js | 15 +++++++++++++-- scripts/sync.js | 45 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/lib/database.js b/lib/database.js index 5832d821f..1b14ace3c 100644 --- a/lib/database.js +++ b/lib/database.js @@ -319,7 +319,7 @@ module.exports = { //property: 'received' or 'balance' update_richlist: function(list, cb){ if(list == 'received') { - Address.find({}).sort({received: 'desc'}).limit(100).exec(function(err, addresses){ + Address.find({}, 'a_id balance received').sort({received: 'desc'}).limit(100).exec(function(err, addresses){ Richlist.update({coin: settings.coin}, { received: addresses, }, function() { @@ -327,7 +327,7 @@ module.exports = { }); }); } else { //balance - Address.find({}).sort({balance: 'desc'}).limit(100).exec(function(err, addresses){ + Address.find({}, 'a_id balance received').sort({balance: 'desc'}).limit(100).exec(function(err, addresses){ Richlist.update({coin: settings.coin}, { balance: addresses, }, function() { @@ -454,6 +454,17 @@ module.exports = { } }); }, + + // drops richlist data for given coin + delete_richlist: function(coin, cb) { + Richlist.findOneAndRemove({coin: coin}, function(err, exists) { + if(exists) { + return cb(true); + } else { + return cb(false); + } + }); + }, // checks richlist data exists for given coin check_richlist: function(coin, cb) { Richlist.findOne({coin: coin}, function(err, exists) { diff --git a/scripts/sync.js b/scripts/sync.js index f7728a8c2..9aed788bf 100644 --- a/scripts/sync.js +++ b/scripts/sync.js @@ -1,9 +1,9 @@ var mongoose = require('mongoose') , db = require('../lib/database') - , Tx = require('../models/tx') - , Address = require('../models/address') - , Richlist = require('../models/richlist') - , Stats = require('../models/stats') + , Tx = require('../models/tx') + , Address = require('../models/address') + , Richlist = require('../models/richlist') + , Stats = require('../models/stats') , settings = require('../lib/settings') , fs = require('fs'); @@ -48,6 +48,9 @@ if (process.argv[2] == 'index') { case 'reindex': mode = 'reindex'; break; + case 'reindex-rich': + mode = 'reindex-rich'; + break; default: usage(); } @@ -152,10 +155,12 @@ is_locked(function (exists) { }, function(err3) { Stats.update({coin: settings.coin}, { last: 0, + count: 0, + supply: 0, }, function() { console.log('index cleared (reindex)'); }); - db.update_tx_db(settings.coin, 1, stats.count, settings.update_timeout, function(){ + db.update_tx_db(settings.coin, 1, stats.count, settings.check_timeout, function(){ db.update_richlist('received', function(){ db.update_richlist('balance', function(){ db.get_stats(settings.coin, function(nstats){ @@ -167,7 +172,7 @@ is_locked(function (exists) { }); }); }); - }); + }); } else if (mode == 'check') { db.update_tx_db(settings.coin, 1, stats.count, settings.check_timeout, function(){ db.get_stats(settings.coin, function(nstats){ @@ -186,6 +191,34 @@ is_locked(function (exists) { }); }); }); + } else if (mode == 'reindex-rich') { + console.log('update started'); + db.update_tx_db(settings.coin, stats.last, stats.count, settings.check_timeout, function(){ + console.log('update finished'); + db.check_richlist(settings.coin, function(exists){ + if (exists == true) { + console.log('richlist entry found, deleting now..'); + } + db.delete_richlist(settings.coin, function(deleted) { + if (deleted == true) { + console.log('richlist entry deleted'); + } + db.create_richlist(settings.coin, function() { + console.log('richlist created.'); + db.update_richlist('received', function(){ + console.log('richlist updated received.'); + db.update_richlist('balance', function(){ + console.log('richlist updated balance.'); + db.get_stats(settings.coin, function(nstats){ + console.log('update complete (block: %s)', nstats.last); + exit(); + }); + }); + }); + }); + }); + }); + }); } }); }); From 0354fcb265f2b7ffdd3359e04ce1ff8cff21813b Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 20 Dec 2019 22:58:08 +0000 Subject: [PATCH 24/56] Mongoose deprecation warning fix --- lib/database.js | 20 ++++++++++++-------- scripts/sync.js | 8 ++++---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/database.js b/lib/database.js index 1b14ace3c..2d91f593c 100644 --- a/lib/database.js +++ b/lib/database.js @@ -21,6 +21,10 @@ var mongoose = require('mongoose') , tradesatoshi = require('./markets/tradesatoshi'); // , BTC38 = require('./markets/BTC38'); +mongoose.set('useCreateIndex', true); +mongoose.set('useUnifiedTopology', true); +mongoose.set('useNewUrlParser', true); + function find_address(hash, cb) { Address.findOne({a_id: hash}, function(err, address) { if(address) { @@ -47,7 +51,7 @@ function update_address(hash, txid, amount, type, cb) { if (address) { // if coinbase (new coins PoW), update sent only and return cb. if ( hash == 'coinbase' ) { - Address.update({a_id:hash}, { + Address.updateOne({a_id:hash}, { sent: address.sent + amount, balance: 0, }, function() { @@ -320,7 +324,7 @@ module.exports = { update_richlist: function(list, cb){ if(list == 'received') { Address.find({}, 'a_id balance received').sort({received: 'desc'}).limit(100).exec(function(err, addresses){ - Richlist.update({coin: settings.coin}, { + Richlist.updateOne({coin: settings.coin}, { received: addresses, }, function() { return cb(); @@ -328,7 +332,7 @@ module.exports = { }); } else { //balance Address.find({}, 'a_id balance received').sort({balance: 'desc'}).limit(100).exec(function(err, addresses){ - Richlist.update({coin: settings.coin}, { + Richlist.updateOne({coin: settings.coin}, { balance: addresses, }, function() { return cb(); @@ -577,7 +581,7 @@ module.exports = { }); }, function(){ console.log(newVotes); - Heavy.update({coin: coin}, { + Heavy.updateOne({coin: coin}, { lvote: vote, reward: reward, supply: supply, @@ -606,7 +610,7 @@ module.exports = { update_markets_db: function(market, cb) { get_market_data(market, function (err, obj) { if (err == null) { - Markets.update({market:market}, { + Markets.updateOne({market:market}, { chartdata: JSON.stringify(obj.chartdata), buys: obj.buys, sells: obj.sells, @@ -614,7 +618,7 @@ module.exports = { summary: obj.stats, }, function() { if ( market == settings.markets.default ) { - Stats.update({coin:settings.coin}, { + Stats.updateOne({coin:settings.coin}, { last_price: obj.stats.last, }, function(){ return cb(null); @@ -638,7 +642,7 @@ module.exports = { } lib.get_supply( function (supply){ lib.get_connectioncount(function (connections) { - Stats.update({coin: coin}, { + Stats.updateOne({coin: coin}, { coin: coin, count : count, supply: supply, @@ -658,7 +662,7 @@ module.exports = { var x = loop.iteration(); if (x % 5000 === 0) { Tx.find({}).where('blockindex').lt(start + x).sort({timestamp: 'desc'}).limit(settings.index.last_txs).exec(function(err, txs){ - Stats.update({coin: coin}, { + Stats.updateOne({coin: coin}, { last: start + x - 1, last_txs: '' //not used anymore left to clear out existing objects }, function() {}); diff --git a/scripts/sync.js b/scripts/sync.js index 9aed788bf..3362db1e7 100644 --- a/scripts/sync.js +++ b/scripts/sync.js @@ -147,13 +147,13 @@ is_locked(function (exists) { }); } if (mode == 'reindex') { - Tx.remove({}, function(err) { - Address.remove({}, function(err2) { - Richlist.update({coin: settings.coin}, { + Tx.deleteMany({}, function(err) { + Address.deleteMany({}, function(err2) { + Richlist.updateOne({coin: settings.coin}, { received: [], balance: [], }, function(err3) { - Stats.update({coin: settings.coin}, { + Stats.updateOne({coin: settings.coin}, { last: 0, count: 0, supply: 0, From 35ae94e1c82b24179e36186d3a4d34b1a6c2c1bd Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Mon, 11 Nov 2019 14:44:10 +0000 Subject: [PATCH 25/56] AltMarkets: 24H price change - New API method & Reverse Sells order --- lib/markets/altmarkets.js | 17 ++++++++++++----- views/markets/altmarkets.jade | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/markets/altmarkets.js b/lib/markets/altmarkets.js index c9e19b0b5..41d1d36dc 100644 --- a/lib/markets/altmarkets.js +++ b/lib/markets/altmarkets.js @@ -19,15 +19,21 @@ function get_summary(coin, exchange, cb) { summary['high'] = parseFloat(body['ticker']['high']).toFixed(8); summary['low'] = parseFloat(body['ticker']['low']).toFixed(8); summary['last'] = parseFloat(body['ticker']['last']).toFixed(8); - request({ uri: base_url + 'k?market=' + coin.toLowerCase() + "" + exchange.toLowerCase() + '&period=1&time_to=' + (Math.round(Date.now()/1000)-(60*60*24)) + '&limit=1', json: true }, function (error, response, body) { + summary['change'] = 0; + request({ uri: base_url + 'currency/trades?currency=' + coin.toLowerCase(), json: true }, function (error, response, body) { if (error) { - return cb(error, null); + return cb(null, summary); } else { if (body.error) { - return cb(body.error, null); + return cb(null, summary); } else { - var prevlast = body[0][4]; - summary['change'] = -(100-(((1/prevlast)*summary['last'])*100)); + summary['change'] = 0; + for (var i = 0; i < body.length; i++) { + if (exchange.toLowerCase() in body[i]) { + summary['change'] = parseFloat(body[i][exchange.toLowerCase()]['change']); + break; + } + } return cb(null, summary); } } @@ -81,6 +87,7 @@ function get_orders(coin, exchange, cb) { sells.push(order); } } else {} + var sells = sells.reverse(); return cb(null, buys, sells); } }); diff --git a/views/markets/altmarkets.jade b/views/markets/altmarkets.jade index 8b309dee8..3e611b84b 100644 --- a/views/markets/altmarkets.jade +++ b/views/markets/altmarkets.jade @@ -28,7 +28,7 @@ block market_view td.hidden-xs #{marketdata.data.summary.bid} td.hidden-xs #{marketdata.data.summary.ask} td.hidden-xs #{marketdata.data.summary.last} - - var altmarkets_change = (marketdata.data.summary.change).toFixed(4); + - var altmarkets_change = (marketdata.data.summary.change); if altmarkets_change >= 0 td.success +#{altmarkets_change} % else From b30a27686f2269982babf852d924e47df3533441 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 20 Dec 2019 15:53:15 +0000 Subject: [PATCH 26/56] Fix cluster for later node versions --- bin/cluster | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/bin/cluster b/bin/cluster index 7bcdd6692..493d1c110 100644 --- a/bin/cluster +++ b/bin/cluster @@ -11,11 +11,16 @@ if (cluster.isMaster) { //ensure workers exit cleanly process.on('SIGINT', function() { console.log('Cluster shutting down..'); - for (var id in cluster.workers) { - cluster.workers[id].kill(); - } - // exit the master process - process.exit(0); + setTimeout(function() { + for (var id in cluster.workers) { + console.log('Worker shutting down (' + id + ')'); + cluster.workers[id].kill(); + } + setTimeout(function() { + // exit the master process + process.exit(0); + }, 3000); + }, 1000); }); // Count the machine's CPUs @@ -27,8 +32,13 @@ if (cluster.isMaster) { } // Listen for dying workers - cluster.on('exit', function () { - cluster.fork(); + cluster.on('exit', function (worker, code, signal) { + if (worker['process']['exitCode'] === 0) { + console.log('Worker shut down.'); + } else if ((signal != 'SIGINT') && (worker['process']['exitCode'] !== 0) && (worker.exitedAfterDisconnect !== true)) { + console.log('Cluster restarting...'); + cluster.fork(); + } }); } }); From fbf3c4ccf51ed63c3f1e846b171663e43ca3a46a Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 22 Dec 2019 13:30:28 +0000 Subject: [PATCH 27/56] Better API route for TXDetail --- app.js | 50 ++++++++++++++++++++++++++++++++++++++ routes/index.js | 64 ------------------------------------------------- views/info.jade | 4 ++++ 3 files changed, 54 insertions(+), 64 deletions(-) diff --git a/app.js b/app.js index bfc4cab26..fa468e939 100644 --- a/app.js +++ b/app.js @@ -74,6 +74,56 @@ app.use('/ext/getaddress/:hash', function(req,res){ }); }); +app.use('/ext/gettx/:txid', function(req, res) { + var txid = req.param('txid'); + db.get_tx(txid, function(tx) { + if (tx) { + lib.get_blockcount(function(blockcount) { + res.send({ active: 'tx', tx: tx, confirmations: settings.confirmations, blockcount: blockcount}); + }); + } + else { + lib.get_rawtransaction(txid, function(rtx) { + if (rtx.txid) { + lib.prepare_vin(rtx, function(vin) { + lib.prepare_vout(rtx.vout, rtx.txid, vin, function(rvout, rvin) { + lib.calculate_total(rvout, function(total){ + if (!rtx.confirmations > 0) { + var utx = { + txid: rtx.txid, + vin: rvin, + vout: rvout, + total: total.toFixed(8), + timestamp: rtx.time, + blockhash: '-', + blockindex: -1, + }; + res.send({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount:-1}); + } else { + var utx = { + txid: rtx.txid, + vin: rvin, + vout: rvout, + total: total.toFixed(8), + timestamp: rtx.time, + blockhash: rtx.blockhash, + blockindex: rtx.blockheight, + }; + lib.get_blockcount(function(blockcount) { + res.send({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount: blockcount}); + }); + } + }); + }); + }); + } else { + res.send({ error: 'tx not found.', hash: txid}); + } + }); + } + }); +}); + app.use('/ext/getbalance/:hash', function(req,res){ db.get_address(req.param('hash'), function(address){ if (address) { diff --git a/routes/index.js b/routes/index.js index 0476e78e6..73a5dc418 100644 --- a/routes/index.js +++ b/routes/index.js @@ -35,66 +35,6 @@ function route_get_block(res, blockhash) { } /* GET functions */ -function route_get_tx_details(res, txid) { - if (txid == settings.genesis_tx) { - route_get_block(res, settings.genesis_block); - } else { - db.get_tx(txid, function(tx) { - if (tx) { - lib.get_blockcount(function(blockcount) { - res.json({ active: 'tx', tx: tx, confirmations: settings.confirmations, blockcount: blockcount}); - }); - } - else { - lib.get_rawtransaction(txid, function(rtx) { - if (rtx.txid) { - lib.prepare_vin(rtx, function(vin) { - lib.prepare_vout(rtx.vout, rtx.txid, vin, function(rvout, rvin) { - lib.calculate_total(rvout, function(total){ - if (!rtx.confirmations > 0) { - var utx = { - txid: rtx.txid, - vin: rvin, - vout: rvout, - total: total.toFixed(8), - timestamp: rtx.time, - blockhash: '-', - blockindex: -1, - }; - res.json({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount:-1}); - } else { - var utx = { - txid: rtx.txid, - vin: rvin, - vout: rvout, - total: total.toFixed(8), - timestamp: rtx.time, - blockhash: rtx.blockhash, - blockindex: rtx.blockheight, - }; - lib.get_blockcount(function(blockcount) { - res.json({ active: 'tx', tx: utx, confirmations: settings.confirmations, blockcount: blockcount}); - }); - } - }); - }); - }); - } else { - route_get_index2(res, null); - } - }); - } - }); - } -} - - -function route_get_index2(res, error) { - res.json({ active: 'home', error: error, warning: null}); -} - -/* GET functions */ - function route_get_tx(res, txid) { if (txid == settings.genesis_tx) { route_get_block(res, settings.genesis_block); @@ -275,10 +215,6 @@ router.get('/reward', function(req, res){ //}); }); -router.get('/txDetail/:txid', function(req, res) { - route_get_tx_details(res, req.param('txid')); -}); - router.get('/tx/:txid', function(req, res) { route_get_tx(res, req.param('txid')); }); diff --git a/views/info.jade b/views/info.jade index 7bcc9f918..736e8e3e9 100644 --- a/views/info.jade +++ b/views/info.jade @@ -100,6 +100,10 @@ block content *Returns information for given address* [#{address}/ext/getaddress/#{hashes.address}](/ext/getaddress/#{hashes.address}) + * **gettx (/ext/gettx/hash)** + *Returns information for given tx hash* + [#{address}/ext/gettx/#{hashes.txhash}](/ext/gettx/#{hashes.txhash}) + * **getbalance (/ext/getbalance/hash)** *Returns current balance of given address* [#{address}/ext/getbalance/#{hashes.address}](/ext/getbalance/#{hashes.address}) From 8b9ed64d276dbab21e0e592c77465d28405c0be4 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 22 Dec 2019 15:18:44 +0000 Subject: [PATCH 28/56] Network: Add tab with information to easily get addnode information for Wallets --- lib/database.js | 22 ++++++++++ models/peers.js | 1 + scripts/peers.js | 8 ++++ views/includes/net_addnodes.jade | 71 ++++++++++++++++++++++++++++++++ views/includes/net_list.jade | 40 ++++++++++++++++++ views/network.jade | 53 +++++------------------- 6 files changed, 153 insertions(+), 42 deletions(-) create mode 100644 views/includes/net_addnodes.jade create mode 100644 views/includes/net_list.jade diff --git a/lib/database.js b/lib/database.js index 2d91f593c..cf4faaaea 100644 --- a/lib/database.js +++ b/lib/database.js @@ -744,6 +744,28 @@ module.exports = { }) }, + drop_peer: function(address, cb) { + Peers.deleteOne({address: address}, function(err) { + if (err) { + console.log(err); + return cb(); + } else { + return cb () + } + }) + }, + + drop_peers: function(cb) { + Peers.deleteMany({}, function(err) { + if (err) { + console.log(err); + return cb(); + } else { + return cb () + } + }) + }, + get_peers: function(cb) { Peers.find({}, function(err, peers) { if (err) { diff --git a/models/peers.js b/models/peers.js index 887ffa222..1a739c9de 100644 --- a/models/peers.js +++ b/models/peers.js @@ -4,6 +4,7 @@ var mongoose = require('mongoose') var PeersSchema = new Schema({ createdAt: { type: Date, expires: 86400, default: Date.now()}, address: { type: String, default: "" }, + port: { type: String, default: "" }, protocol: { type: String, default: "" }, version: { type: String, default: "" }, country: { type: String, default: "" } diff --git a/scripts/peers.js b/scripts/peers.js index 4c42f189c..2af6aeb34 100644 --- a/scripts/peers.js +++ b/scripts/peers.js @@ -27,14 +27,22 @@ mongoose.connect(dbString, function(err) { lib.syncLoop(body.length, function (loop) { var i = loop.iteration(); var address = body[i].addr.split(':')[0]; + var port = body[i].addr.split(':')[1]; db.find_peer(address, function(peer) { if (peer) { + if (isNaN(peer['port']) || peer['port'].length < 2) { + db.drop_peers(function() { + console.log('Saved peers missing ports, dropping peers. Re-reun this script afterwards.'); + exit(); + }); + } // peer already exists loop.next(); } else { request({uri: 'http://freegeoip.net/json/' + address, json: true}, function (error, response, geo) { db.create_peer({ address: address, + port: port, protocol: body[i].version, version: body[i].subver.replace('/', '').replace('/', ''), country: geo.country_name diff --git a/views/includes/net_addnodes.jade b/views/includes/net_addnodes.jade new file mode 100644 index 000000000..9275ef474 --- /dev/null +++ b/views/includes/net_addnodes.jade @@ -0,0 +1,71 @@ +script. + $(document).ready(function(){ + var ctable = $('#addnodes-table').dataTable( { + autoWidth: true, + searching: false, + ordering: false, + responsive: true, + lengthChange: true, + processing: true, + ajax: { + url: '/ext/connections', + dataSrc: function ( json ) { + var rows = [] + for ( var i=0;i Open Wallet Configuration File* + table#addnodes-table.table.table-bordered.table-striped + thead + tr + th.text-center AddNode Config Lines + tbody.text-center + + .panel-body + :markdown + Alternatively you can try one of these lines in the coin wallet debug window, or add them with *coindaemon*-cli + table#addnodes2-table.table.table-bordered.table-striped + thead + tr + th.text-center OneTry Node Lines + tbody.text-center diff --git a/views/includes/net_list.jade b/views/includes/net_list.jade new file mode 100644 index 000000000..ca9034342 --- /dev/null +++ b/views/includes/net_list.jade @@ -0,0 +1,40 @@ +script. + $(document).ready(function(){ + var ctable = $('#connections-table').dataTable( { + autoWidth: true, + searching: false, + ordering: false, + responsive: true, + lengthChange: true, + processing: true, + ajax: { + url: '/ext/connections', + dataSrc: function ( json ) { + /*for ( var i=0;i" + json.data[i]['txid'] + ""; + json.data[i]['blockindex'] = "" + json.data[i]['blockindex'] + ""; + var amount = json.data[i]['total'] / 100000000; + json.data[i]['total'] = amount.toFixed(8); + json.data[i]['recipients'] = json.data[i]['vout'].length; + }*/ + return json.data; + } + }, + columns: [ + { data: 'address', width: '25%' }, + { data: 'protocol', width: '25%' }, + { data: 'version', width:'25%' }, + { data: 'country', width: '25%'} + ] + }); + }); +.panel.panel-default + table#connections-table.table.table-bordered.table-striped + thead + tr + th.text-center #{settings.locale.net_address} + th.text-center #{settings.locale.net_protocol} + th.text-center #{settings.locale.net_subversion} + th.text-center #{settings.locale.net_country} + tbody.text-center diff --git a/views/network.jade b/views/network.jade index e6bf445a9..9b3588718 100644 --- a/views/network.jade +++ b/views/network.jade @@ -1,48 +1,17 @@ extends layout block content - script. - $(document).ready(function(){ - var ctable = $('#connections-table').dataTable( { - autoWidth: true, - searching: false, - ordering: false, - responsive: true, - lengthChange: true, - processing: true, - ajax: { - url: '/ext/connections', - dataSrc: function ( json ) { - /*for ( var i=0;i" + json.data[i]['txid'] + ""; - json.data[i]['blockindex'] = "" + json.data[i]['blockindex'] + ""; - var amount = json.data[i]['total'] / 100000000; - json.data[i]['total'] = amount.toFixed(8); - json.data[i]['recipients'] = json.data[i]['vout'].length; - }*/ - return json.data; - } - }, - columns: [ - { data: 'address', width: '25%' }, - { data: 'protocol', width: '25%' }, - { data: 'version', width:'25%' }, - { data: 'country', width: '25%'} - ] - }); - }); .col-md-12(style="margin-bottom: 4%") .row.text-center(style='margin-bottom:15px;') i #{settings.locale.net_warning} - .panel.panel-default - .panel-heading - strong #{settings.locale.net_connections} - table#connections-table.table.table-bordered.table-striped - thead - tr - th.text-center #{settings.locale.net_address} - th.text-center #{settings.locale.net_protocol} - th.text-center #{settings.locale.net_subversion} - th.text-center #{settings.locale.net_country} - tbody.text-center + .tabpanel + ul.nav.nav-tabs(role='tablist') + li.active(role='presentation') + a(href='#connections', aria-controls='connections', role='tab', data-toggle='tab') #{settings.locale.net_connections} + li(role='presentation') + a(href='#addnodes', aria-controls='addnodes', role='tab', data-toggle='tab') Add Nodes + .tab-content + #connections.tabpanel.tab-pane.active + include ./includes/net_list.jade + #addnodes.tabpanel.tab-pane + include ./includes/net_addnodes.jade From 10dc8263be3e04e6bc0e240fd439c59e2b9b4d45 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 13:09:17 +0000 Subject: [PATCH 29/56] Update valid explorer links --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1a3e05ae5..a96f66777 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,13 @@ An open source block explorer written in node.js. ### See it in action * [Deutsche eMark](http://b.emark.tk/) -* [Sphere](http://sphere.iquidus.io) * [Vertcoin](http://explorer.vertcoin.info/) -* [Vivo](http://vivo.explorerz.top:3003) +* [TheHolyRogerCoin (ROGER) Explorer](https://explorer.theholyroger.com/) +* [CPUChain (CPU) Explorer](https://explorer.cpuchain.org/) +* [Omega Blockchain Explorer](http://explorer.omegablockchain.net/) +* [Sugarchain Explorer](https://1explorer.sugarchain.org/) * [Florincoin](https://florincoin.info/info) * [Maxcoin Explorer 1](https://explorer.maxcoinproject.net/) -* [Maxcoin Explorer 2](https://explorer2.maxcoinproject.net/) *Note: If you would like your instance mentioned here contact me* From bb153106ed9a446658e9d084ec6a1702c10e19d5 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 14:03:27 +0000 Subject: [PATCH 30/56] Peers: Use new freegeoip.app for IP geolocation --- scripts/peers.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/peers.js b/scripts/peers.js index 2af6aeb34..17909f00e 100644 --- a/scripts/peers.js +++ b/scripts/peers.js @@ -30,16 +30,16 @@ mongoose.connect(dbString, function(err) { var port = body[i].addr.split(':')[1]; db.find_peer(address, function(peer) { if (peer) { - if (isNaN(peer['port']) || peer['port'].length < 2) { + if (isNaN(peer['port']) || peer['port'].length < 2 || peer['country'].length < 1) { db.drop_peers(function() { - console.log('Saved peers missing ports, dropping peers. Re-reun this script afterwards.'); + console.log('Saved peers missing ports or country, dropping peers. Re-reun this script afterwards.'); exit(); }); } // peer already exists loop.next(); } else { - request({uri: 'http://freegeoip.net/json/' + address, json: true}, function (error, response, geo) { + request({uri: 'https://freegeoip.app/json/' + address, json: true}, function (error, response, geo) { db.create_peer({ address: address, port: port, From 94551f24301d863d4433b32ef47e5e62c3956398 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 21 Dec 2019 00:03:41 +0000 Subject: [PATCH 31/56] Security: Update advised node version for latest dependency security patches --- README.md | 2 +- package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 16a7f4c2a..077a0f382 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ An open source block explorer written in node.js. ### Requires -* node.js >= 0.10.28 (6.17.1 is advised for updated dependencies) +* node.js >= 0.10.28 (8.17.0 is advised for updated dependencies) * mongodb 2.6.x * *coind diff --git a/package.json b/package.json index d6edd76c8..e58572aa8 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ }, "dependencies": { "bitcoin-node-api": "0.1.0", - "body-parser": "~1.0.0", - "cookie-parser": "~1.0.1", + "body-parser": "^1.19.0", + "cookie-parser": "^1.4.4", "debug": "~4.1.1", "express": "~4.17.1", "intl": "^1.2.5", @@ -21,7 +21,7 @@ "mongoose": "5.7.7", "morgan": "~1.9.1", "qr-image": "~2.0.0", - "request": "2.74.0", + "request": "^2.88.0", "static-favicon": "~1.0.0" }, "devDependencies": { From 35d43bf578f460296ff2240107c0490d29cc8373 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 21 Dec 2019 11:52:24 +0000 Subject: [PATCH 32/56] Better API params for addressTX --- app.js | 11 +++++++---- views/includes/address_history.jade | 5 +---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app.js b/app.js index e3c09e667..7e0f3424d 100644 --- a/app.js +++ b/app.js @@ -150,12 +150,15 @@ app.use('/ext/getlasttxs/:min', function(req,res){ }); }); -app.use('/ext/getaddresstxsajax', function(req,res){ +app.use('/ext/getaddresstxsajax/:address', function(req,res){ req.query.length = parseInt(req.query.length); if(isNaN(req.query.length) || req.query.length > settings.txcount){ req.query.length = settings.txcount; } - db.get_address_txs_ajax(req.query.address, req.query.start, req.query.length,function(txs, count){ + if(isNaN(req.query.start) || req.query.start < 0){ + req.query.start = 0; + } + db.get_address_txs_ajax(req.params.address, req.query.start, req.query.length,function(txs, count){ var data = []; for(i=0; i Date: Sat, 21 Dec 2019 13:04:18 +0000 Subject: [PATCH 33/56] Clean up deprecated address.txs fields --- app.js | 1 - models/address.js | 1 - 2 files changed, 2 deletions(-) diff --git a/app.js b/app.js index 7e0f3424d..f77e4e8b7 100644 --- a/app.js +++ b/app.js @@ -65,7 +65,6 @@ app.use('/ext/getaddress/:hash', function(req,res){ sent: (address.sent / 100000000), received: (address.received / 100000000), balance: (address.balance / 100000000).toString().replace(/(^-+)/mg, ''), - last_txs: address.txs, }; res.send(a_ext); } else { diff --git a/models/address.js b/models/address.js index 348fc8b5b..d8780b79f 100644 --- a/models/address.js +++ b/models/address.js @@ -3,7 +3,6 @@ var mongoose = require('mongoose') var AddressSchema = new Schema({ a_id: { type: String, unique: true, index: true}, - txs: { type: Array, default: [] }, received: { type: Number, default: 0 }, sent: { type: Number, default: 0 }, balance: {type: Number, default: 0}, From 64048925043693307d01d2b66b173a07b4fd15a5 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 21 Dec 2019 13:25:02 +0000 Subject: [PATCH 34/56] Change dataTables default max rows relative to settings --- views/includes/address_history.jade | 8 ++++++++ views/index.jade | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index 831f1cd91..a2e78b884 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -1,5 +1,12 @@ script. var hashAddress = "#{address.a_id}"; + var setting_maxTxCount = parseInt("#{settings.txcount}"); + if (setting_maxTxCount < 100) { + var displayLengthMax = setting_maxTxCount; + } else { + var displayLengthMax = 100; + } + $(document).ready(function () { var rtable = $('#address-txs').dataTable({ autoWidth: true, @@ -9,6 +16,7 @@ script. lengthChange: true, processing: true, serverSide: true, + iDisplayLength: displayLengthMax, ajax: { "url": '/ext/getaddresstxsajax/'+hashAddress }, diff --git a/views/index.jade b/views/index.jade index 1fb85ceb2..d7786cdf7 100644 --- a/views/index.jade +++ b/views/index.jade @@ -2,6 +2,12 @@ extends layout block content script. + var setting_maxTxCount = parseInt("#{settings.index.last_txs}"); + if (setting_maxTxCount < 100) { + var displayLengthMax = setting_maxTxCount; + } else { + var displayLengthMax = 100; + } $(document).ready(function(){ var stable = $('#block-table').dataTable( { autoWidth: true, @@ -36,6 +42,7 @@ block content responsive: true, lengthChange: true, processing: true, + iDisplayLength: displayLengthMax, ajax: { url: '/ext/getlasttxs/0.00000001', dataSrc: function ( json ) { From b277566ff16629387503a7f98b9e39241a62a8bf Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 21 Dec 2019 18:55:15 +0000 Subject: [PATCH 35/56] AddressTX: include balance history and show in address history --- CHANGELOG | 1 + app.js | 1 + lib/database.js | 14 +++++++++++++- models/addresstx.js | 3 ++- views/includes/address_history.jade | 7 +++++-- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4e6940787..445085363 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ 1.6.2 * Indexing is now MUCH faster. * Added AddressTX model/collection - REQUIRES REINDEX +* Added balance history to Address TX History * Added support for AJAX loading of Address TX History, using txcount setting for loading * Stopped maximum TX count trimming TX's in AddressTX collection * Removed tx_array from Address collection -> AddressTX diff --git a/app.js b/app.js index f77e4e8b7..961dbf536 100644 --- a/app.js +++ b/app.js @@ -181,6 +181,7 @@ app.use('/ext/getaddresstxsajax/:address', function(req,res){ row.push(txs[i].txid); row.push(out); row.push(vin); + row.push(txs[i].balance); data.push(row); } } diff --git a/lib/database.js b/lib/database.js index 60495dc11..724230688 100644 --- a/lib/database.js +++ b/lib/database.js @@ -87,6 +87,7 @@ function update_address(hash, txid, amount, type, cb) { if (typeof address_tx == "undefined") { var newAddressTx = new AddressTx({ a_id: hash, + balance: received - sent, txid: txid }); newAddressTx.save(function(err) { @@ -97,7 +98,13 @@ function update_address(hash, txid, amount, type, cb) { } }); } else { - return cb(); //duplicate + AddressTx.updateOne({a_id: hash, txid: txid}, { + a_id: hash, + balance: received - sent, + txid: txid + }, function() { + return cb(); + }); } }); }); @@ -124,6 +131,7 @@ function update_address(hash, txid, amount, type, cb) { } else { var newAddressTx = new AddressTx({ a_id: hash, + balance: amount, txid: txid }); newAddressTx.save(function(err) { @@ -509,9 +517,13 @@ module.exports = { var i = loop.iteration(); find_tx(hashes[i].txid, function (tx) { if (tx && !txs.includes(tx)) { + // tx = {...hashes[i], ...tx} + tx.balance = hashes[i].balance; txs.push(tx); loop.next(); } else if (!txs.includes(tx)) { + // tx = {...hashes[i], ...tx} + tx.balance = hashes[i].balance; txs.push("1. Not found"); loop.next(); } else { diff --git a/models/addresstx.js b/models/addresstx.js index d05747589..ceb50b8d0 100644 --- a/models/addresstx.js +++ b/models/addresstx.js @@ -3,7 +3,8 @@ var mongoose = require('mongoose') var AddressTXSchema = new Schema({ a_id: { type: String, index: true}, - txid: { type: String, lowercase: true, index: true} + txid: { type: String, lowercase: true, index: true}, + balance: { type: Number, default: 0} }, {id: false}); module.exports = mongoose.model('AddressTx', AddressTXSchema); diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index a2e78b884..c3350582d 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -25,6 +25,7 @@ script. var txhash = data[1]; //variables for better readability var out = data[2]; //variables for better readability var vin = data[3]; //variables for better readability + var balance = (data[4] / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); //variables for better readability $("td:eq(0)", row).html(timestamp); $("td:eq(1)", row).html('' + txhash + ''); @@ -43,13 +44,14 @@ script. amount = amount.toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); $("td:eq(2)", row).html(amount).addClass("info"); } - }else if(out > 0) { + } else if (out > 0) { amount = (out / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); $("td:eq(2)", row).html("+" + amount).addClass("success"); - }else{ + } else { amount = (vin / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); $("td:eq(2)", row).html("-" + amount).addClass("danger"); } + $("td:eq(3)", row).html(balance); }, }); @@ -60,4 +62,5 @@ table#address-txs.table.table-bordered.table-striped th.hidden-xs #{settings.locale.timestamp} th.hidden-xs #{settings.locale.tx_hash} th #{settings.locale.mkt_amount} (#{settings.symbol}) + th #{settings.locale.rl_balance} (#{settings.symbol}) tbody From a17ff45377af3ce7aa3faab95810a5343032fbed Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 22 Dec 2019 09:48:36 +0000 Subject: [PATCH 36/56] Use separate CSS class for digits after decimal place --- public/stylesheets/style.css | 5 +++++ views/address.jade | 16 +++++++++++----- views/block.jade | 8 ++++++-- views/includes/address_history.jade | 24 ++++++++++++++++++------ views/includes/rl_balance.jade | 9 ++++----- views/includes/rl_received.jade | 9 ++++----- views/index.jade | 5 +++-- views/tx.jade | 21 +++++++++++++++------ 8 files changed, 66 insertions(+), 31 deletions(-) diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 2c0b953c5..cbae1d860 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -164,3 +164,8 @@ tr { bottom: 0px; } + +.decimal { + font-size: 0.7em; +} + diff --git a/views/address.jade b/views/address.jade index 2cd951069..a39c475b6 100644 --- a/views/address.jade +++ b/views/address.jade @@ -2,8 +2,11 @@ extends layout block content - var balance = ((address.received - address.sent) / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - - var sent = (address.sent /100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}) - - var received = (address.received / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}) + - var balanceParts = balance.split('.'); + - var sent = (address.sent /100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); + - var sentParts = sent.split('.'); + - var received = (address.received / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); + - var receivedParts = received.split('.'); img.qrcode.pull-right.hidden-xs(src='/qr/#{address.a_id}') .col-xs-12.col-md-10.col-md-offset-1 .panel.panel-default.panel-address-summary @@ -34,11 +37,14 @@ block content tbody tr if settings.show_sent_received == true - td #{sent} + td #{sentParts[0]}. + span.decimal #{sentParts[1]} if address.a_id !== 'coinbase' if settings.show_sent_received == true - td #{received} - td #{balance} + td #{receivedParts[0]}. + span.decimal #{receivedParts[1]} + td #{balanceParts[0]}. + span.decimal #{balanceParts[1]} .panel.panel-default .panel-heading strong #{settings.locale.ex_latest_transactions} diff --git a/views/block.jade b/views/block.jade index 265904015..0601a7a4f 100644 --- a/views/block.jade +++ b/views/block.jade @@ -92,10 +92,14 @@ block content td #{txn.vout.length} if txn.vout.length > 0 - var total = (txn.total / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - td #{total} + - var totalParts = total.split('.') + td #{totalParts[0]}. + span.decimal #{totalParts[1]} else - var total = (txn.total).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - td #{total} + - var totalParts = total.split('.') + td #{totalParts[0]}. + span.decimal #{totalParts[1]} td.view_tx a(href='/tx/#{txn.txid}') span.glyphicon.glyphicon-eye-open diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index c3350582d..353716391 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -27,31 +27,43 @@ script. var vin = data[3]; //variables for better readability var balance = (data[4] / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); //variables for better readability + var balanceParts = balance.split('.'); + $("td:eq(0)", row).html(timestamp); $("td:eq(1)", row).html('' + txhash + ''); var amount = 0; + var updown = ""; + var rowclass = "info"; if(out > 0 && vin > 0) { amount = (out - vin) / 100000000 if (amount < 0) { amount = (amount * -1).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - $("td:eq(2)", row).html("-" + amount).addClass("info"); + updown = "-"; + //- $("td:eq(2)", row).html("-" + amount).addClass("info"); } else if (amount > 0) { amount = amount.toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - $("td:eq(2)", row).html("+" + amount).addClass("info"); + updown = "+"; + //- $("td:eq(2)", row).html("+" + amount).addClass("info"); } else { amount = amount.toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - $("td:eq(2)", row).html(amount).addClass("info"); + //- $("td:eq(2)", row).html(amount).addClass("info"); } } else if (out > 0) { amount = (out / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - $("td:eq(2)", row).html("+" + amount).addClass("success"); + updown = "+"; + rowclass = "success"; + //- $("td:eq(2)", row).html("+" + amount).addClass("success"); } else { amount = (vin / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - $("td:eq(2)", row).html("-" + amount).addClass("danger"); + updown = "-"; + rowclass = "danger"; + //- $("td:eq(2)", row).html("-" + amount).addClass("danger"); } - $("td:eq(3)", row).html(balance); + var amountParts = amount.split('.'); + $("td:eq(2)", row).html(updown + amountParts[0] + '.' + amountParts[1] + '').addClass(rowclass); + $("td:eq(3)", row).html(balanceParts[0] + '.' + balanceParts[1] + ''); }, }); diff --git a/views/includes/rl_balance.jade b/views/includes/rl_balance.jade index 6f13b7c2d..8d3172f77 100644 --- a/views/includes/rl_balance.jade +++ b/views/includes/rl_balance.jade @@ -13,9 +13,8 @@ - var count = 0 each item in balance - count = count + 1 - - var itemFixed = (parseInt(item.balance) / 100000000); - - var itemFixedParts = itemFixed.toFixed(0).toString().split("."); - - var itemFixedStr = itemFixedParts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",") + (itemFixedParts[1] ? "." + itemFixedParts[1] : ""); + - var itemFixed = (parseInt(item.balance) / 100000000) + - var itemFixedParts = itemFixed.toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}).split("."); - var percentage = (itemFixed / stats.supply) * 100; tr td(style='text-align:center;') @@ -23,7 +22,7 @@ td a(href='/address/#{item.a_id}') #{item.a_id} include ./rl_labels.jade - td.hidden-xs - =itemFixedStr + td.hidden-xs #{itemFixedParts[0]}. + span.decimal #{itemFixedParts[1]} td.hidden-xs(style='text-align:center;') =percentage.toFixed(2) \ No newline at end of file diff --git a/views/includes/rl_received.jade b/views/includes/rl_received.jade index 6ae9818e8..b89143945 100644 --- a/views/includes/rl_received.jade +++ b/views/includes/rl_received.jade @@ -12,14 +12,13 @@ - var count = 0 each item in received - count = count + 1; - - var itemFixed = (parseInt(item.received) / 100000000); - - var itemFixedParts = itemFixed.toFixed(0).toString().split("."); - - var itemFixedStr = itemFixedParts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",") + (itemFixedParts[1] ? "." + itemFixedParts[1] : ""); + - var itemFixed = (parseInt(item.received) / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}) + - var itemFixedParts = itemFixed.split("."); tr td(style='text-align:center;') =count td a(href='/address/#{item.a_id}') #{item.a_id} include ./rl_labels.jade - td.hidden-xs - =itemFixedStr \ No newline at end of file + td.hidden-xs #{itemFixedParts[0]}. + span.decimal #{itemFixedParts[1]} \ No newline at end of file diff --git a/views/index.jade b/views/index.jade index d7786cdf7..6da03ee8b 100644 --- a/views/index.jade +++ b/views/index.jade @@ -50,8 +50,9 @@ block content json.data[i]['timestamp'] = new Date((json.data[i]['timestamp']) * 1000).toUTCString(); json.data[i]['txid'] = "" + json.data[i]['txid'] + ""; json.data[i]['blockindex'] = "" + json.data[i]['blockindex'] + ""; - var amount = json.data[i]['total'] / 100000000; - json.data[i]['total'] = amount.toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); + var amount = (json.data[i]['total'] / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); + var amountParts = amount.split('.'); + json.data[i]['total'] = amountParts[0] + '.' + amountParts[1] + ''; json.data[i]['recipients'] = json.data[i]['vout'].length; } return json.data; diff --git a/views/tx.jade b/views/tx.jade index 2a81d32ca..2d96c1953 100644 --- a/views/tx.jade +++ b/views/tx.jade @@ -72,13 +72,16 @@ block content td #{settings.locale.new_coins} else - var ramount = (r.amount / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}) + - var ramountParts = ramount.split('.') tr td a.loading(href='/address/#{r.addresses}') =r.addresses - td.danger.hidden-xs #{ramount} + td.danger.hidden-xs #{ramountParts[0]}. + span.decimal #{ramountParts[1]} tr.hidden-lg.hidden-md - td.danger #{ramount} #{settings.symbol} + td.danger #{ramountParts[0]}. + span.decimal #{ramountParts[1]} #{settings.symbol} else tr.info(style='text-align:center') td #{settings.locale.proof_of_stake} @@ -95,20 +98,26 @@ block content each r in tx.vout if tx.vout.length > 0 - var ramount = (r.amount / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}) + - var ramountParts = ramount.split('.') tr td a.loading(href='/address/#{r.addresses}') =r.addresses - td.success.hidden-xs #{ramount} + td.success.hidden-xs #{ramountParts[0]}. + span.decimal #{ramountParts[1]} tr.hidden-lg.hidden-md - td.success #{ramount} #{settings.symbol} + td.success #{ramountParts[0]}. + span.decimal #{ramountParts[1]} #{settings.symbol} else - var ramount = (r.amount / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}) + - var ramountParts = ramount.split('.') tr td a.loading(href='/address/#{r.addresses}') =r.addresses - td.success.hidden-xs #{ramount} + td.success.hidden-xs #{ramountParts[0]}. + span.decimal #{ramountParts[1]} tr.hidden-lg.hidden-md - td.success #{ramount} #{settings.symbol} + td.success #{ramountParts[0]}. + span.decimal #{ramountParts[1]} #{settings.symbol} .footer-padding From 98e9aad8ec1262989f9b4b48f4a8b61428c20682 Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Sun, 22 Dec 2019 10:46:54 +0000 Subject: [PATCH 37/56] Add more entry options to dataTables relative to settings --- views/includes/address_history.jade | 12 ++++++++++-- views/index.jade | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index 353716391..7a45194fb 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -1,10 +1,17 @@ script. var hashAddress = "#{address.a_id}"; var setting_maxTxCount = parseInt("#{settings.txcount}"); - if (setting_maxTxCount < 100) { + var lengthMenuOpts = [ 10, 25, 50, 75, 100 ]; + if (setting_maxTxCount >= 500) { + lengthMenuOpts.push(500); + } + if (setting_maxTxCount >= 1000) { + lengthMenuOpts.push(1000); + } + if (setting_maxTxCount < (lengthMenuOpts[lengthMenuOpts.length-1])) { var displayLengthMax = setting_maxTxCount; } else { - var displayLengthMax = 100; + var displayLengthMax = (lengthMenuOpts[lengthMenuOpts.length-1]); } $(document).ready(function () { @@ -17,6 +24,7 @@ script. processing: true, serverSide: true, iDisplayLength: displayLengthMax, + lengthMenu: lengthMenuOpts, ajax: { "url": '/ext/getaddresstxsajax/'+hashAddress }, diff --git a/views/index.jade b/views/index.jade index 6da03ee8b..c499927af 100644 --- a/views/index.jade +++ b/views/index.jade @@ -3,10 +3,17 @@ extends layout block content script. var setting_maxTxCount = parseInt("#{settings.index.last_txs}"); - if (setting_maxTxCount < 100) { + var lengthMenuOpts = [ 10, 25, 50, 75, 100 ]; + if (setting_maxTxCount >= 500) { + lengthMenuOpts.push(500); + } + if (setting_maxTxCount >= 1000) { + lengthMenuOpts.push(1000); + } + if (setting_maxTxCount < (lengthMenuOpts[lengthMenuOpts.length-1])) { var displayLengthMax = setting_maxTxCount; } else { - var displayLengthMax = 100; + var displayLengthMax = (lengthMenuOpts[lengthMenuOpts.length-1]); } $(document).ready(function(){ var stable = $('#block-table').dataTable( { @@ -43,6 +50,7 @@ block content lengthChange: true, processing: true, iDisplayLength: displayLengthMax, + lengthMenu: lengthMenuOpts, ajax: { url: '/ext/getlasttxs/0.00000001', dataSrc: function ( json ) { From d01b32abf74f34335b7df90bb3cde4653f297365 Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Sun, 22 Dec 2019 11:33:58 +0000 Subject: [PATCH 38/56] Latest Transactions (Front page) AJAX calls for dataTables (like addrhistory) --- app.js | 23 +++++++++++++++++++++++ lib/database.js | 12 ++++++++++++ views/index.jade | 41 ++++++++++++++++++----------------------- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/app.js b/app.js index 961dbf536..47e9e4e82 100644 --- a/app.js +++ b/app.js @@ -149,6 +149,29 @@ app.use('/ext/getlasttxs/:min', function(req,res){ }); }); +app.use('/ext/getlasttxsajax', function(req,res){ + if(typeof req.query.length === 'undefined' || isNaN(req.query.length) || req.query.length > settings.index.last_txs){ + req.query.length = settings.index.last_txs; + } + if(typeof req.query.start === 'undefined' || isNaN(req.query.start) || req.query.start < 0){ + req.query.start = 0; + } + db.get_last_txs_ajax(req.query.start, req.query.length,function(txs, count){ + var data = []; + for(i=0; i settings.txcount){ diff --git a/lib/database.js b/lib/database.js index 724230688..640136535 100644 --- a/lib/database.js +++ b/lib/database.js @@ -491,6 +491,18 @@ module.exports = { }); }, + get_last_txs_ajax: function(start, length, cb) { + Tx.countDocuments({'total': {$gt: 1}}, function(err, count){ + Tx.find({'total': {$gt: 1}}).sort({blockindex: 'desc'}).skip(Number(start)).limit(Number(length)).exec(function(err, txs){ + if (err) { + return cb(err); + } else { + return cb(txs, count); + } + }); + }); + }, + get_address_txs_ajax: function(hash, start, length, cb) { var totalCount = 0; Address.findOne({a_id: hash}, function(err, addressTotalTxs) { diff --git a/views/index.jade b/views/index.jade index c499927af..d793ca965 100644 --- a/views/index.jade +++ b/views/index.jade @@ -43,36 +43,31 @@ block content ] }); var rtable = $('#recent-table').dataTable( { - autoWidth: true, + autoWidth: false, searching: false, ordering: false, - responsive: true, + responsive: false, lengthChange: true, processing: true, + serverSide: true, iDisplayLength: displayLengthMax, lengthMenu: lengthMenuOpts, - ajax: { - url: '/ext/getlasttxs/0.00000001', - dataSrc: function ( json ) { - for ( var i=0;i" + json.data[i]['txid'] + ""; - json.data[i]['blockindex'] = "" + json.data[i]['blockindex'] + ""; - var amount = (json.data[i]['total'] / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - var amountParts = amount.split('.'); - json.data[i]['total'] = amountParts[0] + '.' + amountParts[1] + ''; - json.data[i]['recipients'] = json.data[i]['vout'].length; - } - return json.data; - } + ajax: '/ext/getlasttxsajax', + rowCallback: function(row, data, index) { + var blockindex = data[0]; //variables for better readability + var blockhash = data[1]; //variables for better readability + var txhash = data[2]; //variables for better readability + var outputs = data[3]; //variables for better readability + var amount = (data[4] / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); //variables for better readability + var amountParts = amount.split('.'); + var amount = amountParts[0] + '.' + amountParts[1] + ''; + var timestamp = data[5]; //variables for better readability + $("td:eq(0)", row).html('' + blockindex + ''); + $("td:eq(1)", row).html('' + txhash + '').addClass("d-none d-md-none d-lg-table-cell text-center"); + $("td:eq(2)", row).html(outputs).addClass("d-none d-md-none d-lg-table-cell text-center"); + $("td:eq(3)", row).html(amount); + $("td:eq(4)", row).html(timestamp); }, - columns: [ - { data: 'blockindex', width: '8%' }, - { data: 'txid', width: '40%' }, - { data: 'recipients', width:'5%' }, - { data: 'total', width: '15%' }, - { data: 'timestamp', width: '25%' }, - ] }); setInterval( function () { rtable.api().ajax.reload(null, false); From 7da00879ac20f6b2f1e1d4ac5c375105cf500542 Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Sun, 22 Dec 2019 12:30:02 +0000 Subject: [PATCH 39/56] Address History responsive column sizing fix --- views/includes/address_history.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index 7a45194fb..a54bb3732 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -37,8 +37,8 @@ script. var balanceParts = balance.split('.'); - $("td:eq(0)", row).html(timestamp); - $("td:eq(1)", row).html('' + txhash + ''); + $("td:eq(0)", row).html(timestamp).addClass('hidden-xs'); + $("td:eq(1)", row).html('' + txhash + '').addClass('hidden-xs'); var amount = 0; var updown = ""; From d9f1c11649c616a88d2eb6ebce9d254b756b49ab Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Sun, 22 Dec 2019 12:36:48 +0000 Subject: [PATCH 40/56] Latest Transactions responsive column sizing fix --- views/index.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/index.jade b/views/index.jade index d793ca965..cdc4bbda7 100644 --- a/views/index.jade +++ b/views/index.jade @@ -63,8 +63,8 @@ block content var amount = amountParts[0] + '.' + amountParts[1] + ''; var timestamp = data[5]; //variables for better readability $("td:eq(0)", row).html('' + blockindex + ''); - $("td:eq(1)", row).html('' + txhash + '').addClass("d-none d-md-none d-lg-table-cell text-center"); - $("td:eq(2)", row).html(outputs).addClass("d-none d-md-none d-lg-table-cell text-center"); + $("td:eq(1)", row).html('' + txhash + '').addClass("d-none d-md-none d-lg-table-cell text-center hidden-xs"); + $("td:eq(2)", row).html(outputs).addClass("d-none d-md-none d-lg-table-cell text-center hidden-xs"); $("td:eq(3)", row).html(amount); $("td:eq(4)", row).html(timestamp); }, From 77bd096f153b5e342c781e175b1d48bbb96697ab Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 22 Dec 2019 16:42:44 +0000 Subject: [PATCH 41/56] AddrHistory: dataTables entries default to 100, add 250 option --- views/includes/address_history.jade | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index a54bb3732..dc339b7a1 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -2,16 +2,19 @@ script. var hashAddress = "#{address.a_id}"; var setting_maxTxCount = parseInt("#{settings.txcount}"); var lengthMenuOpts = [ 10, 25, 50, 75, 100 ]; + if (setting_maxTxCount >= 250) { + lengthMenuOpts.push(250); + } if (setting_maxTxCount >= 500) { lengthMenuOpts.push(500); } if (setting_maxTxCount >= 1000) { lengthMenuOpts.push(1000); } - if (setting_maxTxCount < (lengthMenuOpts[lengthMenuOpts.length-1])) { + if (setting_maxTxCount < 50) { var displayLengthMax = setting_maxTxCount; } else { - var displayLengthMax = (lengthMenuOpts[lengthMenuOpts.length-1]); + var displayLengthMax = 50; } $(document).ready(function () { From 83ef39c9a41c38016990c80c1379e4ef0941b521 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 10:38:01 +0000 Subject: [PATCH 42/56] Address page: Move QR Code to Summary table --- lib/locale.js | 1 + locale/en.json | 1 + public/stylesheets/style.css | 11 +++++++++-- views/address.jade | 14 ++++++++------ 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/locale.js b/lib/locale.js index 4d0c20c88..ba5af263e 100644 --- a/lib/locale.js +++ b/lib/locale.js @@ -59,6 +59,7 @@ exports.initial_index_alert = "Indexing is currently incomplete, functionality i exports.a_menu_showing = "Showing", exports.a_menu_txs = "transactions", exports.a_menu_all = "All", +exports.a_qr = "QR Code", exports.rl_received_coins = "Top 100 - Received Coins", exports.rl_current_balance = "Top 100 - Current Balance", diff --git a/locale/en.json b/locale/en.json index 0c3c10fd8..6d01ffdbe 100644 --- a/locale/en.json +++ b/locale/en.json @@ -62,6 +62,7 @@ "a_menu_showing": "Showing last", "a_menu_txs": "transactions", "a_menu_all": "All", + "a_qr": "QR Code", //richlist "rl_received_coins": "Top 100 - Received Coins", diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index cbae1d860..9bfb2eccc 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -152,10 +152,17 @@ tr { width: 150px !important; } } +.table>tbody>tr>td.addr-summary { + line-height: 7.7; + font-size: 1.3em; + font-weight: 800; + text-align: center; +} + .qrcode { - position: absolute; + /*position: absolute; top: 65px; - right: 15px; + right: 15px;*/ } .footer-logo { diff --git a/views/address.jade b/views/address.jade index a39c475b6..4797fd568 100644 --- a/views/address.jade +++ b/views/address.jade @@ -7,7 +7,6 @@ block content - var sentParts = sent.split('.'); - var received = (address.received / 100000000).toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}); - var receivedParts = received.split('.'); - img.qrcode.pull-right.hidden-xs(src='/qr/#{address.a_id}') .col-xs-12.col-md-10.col-md-offset-1 .panel.panel-default.panel-address-summary .panel-heading(style='position:relative;') @@ -29,22 +28,25 @@ block content thead tr if settings.show_sent_received == true - th #{settings.locale.total_sent} (#{settings.symbol}) + th.hidden-xs #{settings.locale.total_sent} (#{settings.symbol}) if address.a_id !== 'coinbase' if settings.show_sent_received == true - th #{settings.locale.total_received} (#{settings.symbol}) + th.hidden-xs #{settings.locale.total_received} (#{settings.symbol}) th #{settings.locale.rl_balance} (#{settings.symbol}) + th #{settings.locale.a_qr} tbody tr if settings.show_sent_received == true - td #{sentParts[0]}. + td.addr-summary.hidden-xs #{sentParts[0]}. span.decimal #{sentParts[1]} if address.a_id !== 'coinbase' if settings.show_sent_received == true - td #{receivedParts[0]}. + td.addr-summary.hidden-xs #{receivedParts[0]}. span.decimal #{receivedParts[1]} - td #{balanceParts[0]}. + td.addr-summary #{balanceParts[0]}. span.decimal #{balanceParts[1]} + td.addr-summary + img.qrcode(src='/qr/#{address.a_id}') .panel.panel-default .panel-heading strong #{settings.locale.ex_latest_transactions} From 9c9aca00aa947e134be9da5de220a5dd8316c198 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 12:36:53 +0000 Subject: [PATCH 43/56] Address page: small currency symbol --- views/includes/address_history.jade | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index dc339b7a1..eb7d67eea 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -84,6 +84,8 @@ table#address-txs.table.table-bordered.table-striped tr th.hidden-xs #{settings.locale.timestamp} th.hidden-xs #{settings.locale.tx_hash} - th #{settings.locale.mkt_amount} (#{settings.symbol}) - th #{settings.locale.rl_balance} (#{settings.symbol}) + th #{settings.locale.mkt_amount} + span.small (#{settings.symbol}) + th #{settings.locale.rl_balance} + span.small (#{settings.symbol}) tbody From 7545eaf2366e966877ed9b6a44ad267b99b36c87 Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Mon, 23 Dec 2019 19:07:06 +0000 Subject: [PATCH 44/56] Latest TX & AddrHistory: dataTables entries logic simplified --- views/includes/address_history.jade | 15 ++++++--------- views/index.jade | 16 ++++++++-------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index eb7d67eea..05cc43ba6 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -1,15 +1,12 @@ script. var hashAddress = "#{address.a_id}"; var setting_maxTxCount = parseInt("#{settings.txcount}"); - var lengthMenuOpts = [ 10, 25, 50, 75, 100 ]; - if (setting_maxTxCount >= 250) { - lengthMenuOpts.push(250); - } - if (setting_maxTxCount >= 500) { - lengthMenuOpts.push(500); - } - if (setting_maxTxCount >= 1000) { - lengthMenuOpts.push(1000); + var lengthMenuOpts = []; + var lengthMenuOptsAdd = [ 10, 25, 50, 75, 100, 250, 500, 1000 ]; + for (i=0; i < lengthMenuOptsAdd.length; i++) { + if (setting_maxTxCount >= lengthMenuOptsAdd[i]) { + lengthMenuOpts.push(lengthMenuOptsAdd[i]); + } } if (setting_maxTxCount < 50) { var displayLengthMax = setting_maxTxCount; diff --git a/views/index.jade b/views/index.jade index cdc4bbda7..ba3ac8deb 100644 --- a/views/index.jade +++ b/views/index.jade @@ -3,17 +3,17 @@ extends layout block content script. var setting_maxTxCount = parseInt("#{settings.index.last_txs}"); - var lengthMenuOpts = [ 10, 25, 50, 75, 100 ]; - if (setting_maxTxCount >= 500) { - lengthMenuOpts.push(500); + var lengthMenuOpts = []; + var lengthMenuOptsAdd = [ 10, 25, 50, 75, 100, 250, 500, 1000 ]; + for (i=0; i < lengthMenuOptsAdd.length; i++) { + if (setting_maxTxCount >= lengthMenuOptsAdd[i]) { + lengthMenuOpts.push(lengthMenuOptsAdd[i]); + } } - if (setting_maxTxCount >= 1000) { - lengthMenuOpts.push(1000); - } - if (setting_maxTxCount < (lengthMenuOpts[lengthMenuOpts.length-1])) { + if (setting_maxTxCount < 10) { var displayLengthMax = setting_maxTxCount; } else { - var displayLengthMax = (lengthMenuOpts[lengthMenuOpts.length-1]); + var displayLengthMax = 10; } $(document).ready(function(){ var stable = $('#block-table').dataTable( { From 976db88799abd61d2a19fec1ce93e05545c09bed Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 22:13:50 +0000 Subject: [PATCH 45/56] Updated BodyParser - deprecated warning fix --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index 47e9e4e82..ccb7cc136 100644 --- a/app.js +++ b/app.js @@ -44,7 +44,7 @@ app.set('view engine', 'jade'); app.use(favicon(path.join(__dirname, settings.favicon))); app.use(logger('dev')); app.use(bodyParser.json()); -app.use(bodyParser.urlencoded()); +app.use(bodyParser.urlencoded({ extended: true })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); From b810eab10228ee517a30e71102dbd131c2ffc244 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 22:25:28 +0000 Subject: [PATCH 46/56] Updated Express: req.param deprecated - > req.params --- app.js | 10 +++++----- routes/index.js | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app.js b/app.js index ccb7cc136..dbf8c5933 100644 --- a/app.js +++ b/app.js @@ -58,7 +58,7 @@ app.use('/ext/getmoneysupply', function(req,res){ }); app.use('/ext/getaddress/:hash', function(req,res){ - db.get_address(req.param('hash'), function(address){ + db.get_address(req.params.hash, function(address){ if (address) { var a_ext = { address: address.a_id, @@ -68,13 +68,13 @@ app.use('/ext/getaddress/:hash', function(req,res){ }; res.send(a_ext); } else { - res.send({ error: 'address not found.', hash: req.param('hash')}) + res.send({ error: 'address not found.', hash: req.params.hash}) } }); }); app.use('/ext/gettx/:txid', function(req, res) { - var txid = req.param('txid'); + var txid = req.params.txid; db.get_tx(txid, function(tx) { if (tx) { lib.get_blockcount(function(blockcount) { @@ -124,11 +124,11 @@ app.use('/ext/gettx/:txid', function(req, res) { }); app.use('/ext/getbalance/:hash', function(req,res){ - db.get_address(req.param('hash'), function(address){ + db.get_address(req.params.hash, function(address){ if (address) { res.send((address.balance / 100000000).toString().replace(/(^-+)/mg, '')); } else { - res.send({ error: 'address not found.', hash: req.param('hash')}) + res.send({ error: 'address not found.', hash: req.params.hash}) } }); }); diff --git a/routes/index.js b/routes/index.js index 34aa47bdb..e1ebef70a 100644 --- a/routes/index.js +++ b/routes/index.js @@ -204,19 +204,19 @@ router.get('/reward', function(req, res){ }); router.get('/tx/:txid', function(req, res) { - route_get_tx(res, req.param('txid')); + route_get_tx(res, req.params.txid); }); router.get('/block/:hash', function(req, res) { - route_get_block(res, req.param('hash')); + route_get_block(res, req.params.hash); }); router.get('/address/:hash', function(req, res) { - route_get_address(res, req.param('hash'), settings.txcount); + route_get_address(res, req.params.hash, settings.txcount); }); router.get('/address/:hash/:count', function(req, res) { - route_get_address(res, req.param('hash'), req.param('count')); + route_get_address(res, req.params.hash, req.params.count); }); router.post('/search', function(req, res) { @@ -257,8 +257,8 @@ router.post('/search', function(req, res) { }); router.get('/qr/:string', function(req, res) { - if (req.param('string')) { - var address = qr.image(req.param('string'), { + if (req.params.string) { + var address = qr.image(req.params.string, { type: 'png', size: 4, margin: 1, From 5954387ef226cf945f38cf837c78374c6868e574 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 23 Dec 2019 22:37:41 +0000 Subject: [PATCH 47/56] Locale: "Add Nodes" phrase --- lib/locale.js | 1 + locale/en.json | 1 + views/network.jade | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/locale.js b/lib/locale.js index 4d0c20c88..d752e7617 100644 --- a/lib/locale.js +++ b/lib/locale.js @@ -71,6 +71,7 @@ exports.rl_top75 = "Top 51-75", exports.rl_top100 = "Top 76-100", exports.rl_hundredplus = "101+", +exports.net_addnodes = "Add Nodes", exports.net_connections = "Connections", exports.net_address = "Address", exports.net_protocol = "Protocol", diff --git a/locale/en.json b/locale/en.json index 0c3c10fd8..4c46e56d1 100644 --- a/locale/en.json +++ b/locale/en.json @@ -75,6 +75,7 @@ "rl_top100": "Top 76-100", "rl_hundredplus": "101+", + "net_addnodes": "Add Nodes", "net_connections": "Connections", "net_address": "Address", "net_protocol": "Protocol", diff --git a/views/network.jade b/views/network.jade index 9b3588718..0b8f3d8f5 100644 --- a/views/network.jade +++ b/views/network.jade @@ -9,7 +9,7 @@ block content li.active(role='presentation') a(href='#connections', aria-controls='connections', role='tab', data-toggle='tab') #{settings.locale.net_connections} li(role='presentation') - a(href='#addnodes', aria-controls='addnodes', role='tab', data-toggle='tab') Add Nodes + a(href='#addnodes', aria-controls='addnodes', role='tab', data-toggle='tab') #{settings.locale.net_addnodes} .tab-content #connections.tabpanel.tab-pane.active include ./includes/net_list.jade From a57e734a6887697821fe1c34d8268776bab03d8c Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 24 Dec 2019 11:30:42 +0000 Subject: [PATCH 48/56] Movement: Use new lasttxsajax call and remove old code --- .gitignore | 4 +++ app.js | 17 ++++++------- lib/database.js | 16 +++--------- views/index.jade | 2 +- views/info.jade | 6 ++--- views/movement.jade | 59 ++++++++++++++++++++++++++++----------------- 6 files changed, 56 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index cc96762a1..93d97efb7 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,7 @@ settings.json *.ico *.png + +.DS_Store + +package-lock.json diff --git a/app.js b/app.js index dbf8c5933..16412e08a 100644 --- a/app.js +++ b/app.js @@ -143,20 +143,19 @@ app.use('/ext/getdistribution', function(req,res){ }); }); -app.use('/ext/getlasttxs/:min', function(req,res){ - db.get_last_txs(settings.index.last_txs, (req.params.min * 100000000), function(txs){ - res.send({data: txs}); - }); -}); - -app.use('/ext/getlasttxsajax', function(req,res){ +app.use('/ext/getlasttxsajax/:min', function(req,res){ if(typeof req.query.length === 'undefined' || isNaN(req.query.length) || req.query.length > settings.index.last_txs){ req.query.length = settings.index.last_txs; } if(typeof req.query.start === 'undefined' || isNaN(req.query.start) || req.query.start < 0){ - req.query.start = 0; + req.query.start = 0; + } + if(typeof req.params.min === 'undefined' || isNaN(req.params.min ) || req.params.min < 0){ + req.params.min = 0; + } else { + req.params.min = (req.params.min * 100000000); } - db.get_last_txs_ajax(req.query.start, req.query.length,function(txs, count){ + db.get_last_txs_ajax(req.query.start, req.query.length, req.params.min,function(txs, count){ var data = []; for(i=0; i= lengthMenuOptsAdd[i]) { + lengthMenuOpts.push(lengthMenuOptsAdd[i]); + } + } + if (setting_maxTxCount < 10) { + var displayLengthMax = setting_maxTxCount; + } else { + var displayLengthMax = 10; + } var rplot; var colors = [ "#0071bc" ]; $(document).ready(function(){ @@ -35,31 +48,33 @@ block content searching: false, ordering: false, //responsive: true, - lengthChange: false, + lengthChange: true, + processing: true, + serverSide: true, + iDisplayLength: displayLengthMax, + lengthMenu: lengthMenuOpts, //processing: true, - ajax: { - url: '/ext/getlasttxs/#{min_amount}', - dataSrc: function ( json ) { - for ( var i=0;i" + json.data[i]['txid'] + "" - var amount = json.data[i]['total'] / 100000000; - if (amount > '#{flagb}') { - json .data[i]['total'] = ""; - } else if (amount > '#{flaga}') { - json .data[i]['total'] = ""; - } else { - json .data[i]['total'] = ""; - } - } - return json.data; + ajax: '/ext/getlasttxsajax/#{min_amount}', + rowCallback: function(row, data, index) { + var blockindex = data[0]; //variables for better readability + var blockhash = data[1]; //variables for better readability + var txhash = data[2]; //variables for better readability + var outputs = data[3]; //variables for better readability + var amount = (data[4] / 100000000); //variables for better readability + var amountParts = amount.toLocaleString('en',{'minimumFractionDigits':2,'maximumFractionDigits':8,'useGrouping':true}).split('.'); + var amountStr = amountParts[0] + '.' + amountParts[1] + ''; + var timestamp = data[5]; //variables for better readability + if (amount > '#{flagb}') { + var total = ""; + } else if (amount > '#{flaga}') { + var total = ""; + } else { + var total = ""; } + $("td:eq(0)", row).html(timestamp); + $("td:eq(1)", row).html('' + txhash + ''); + $("td:eq(2)", row).html(total); }, - columns: [ - { data: 'timestamp', width: '25%' }, - { data: 'txid', width: '60%' }, - { data: 'total', width: '15%' }, - ] }); setInterval( function () { rtable.api().ajax.reload(null, false); From 800b4a8d088122e1d07a2bfe43d5bb44989380d1 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 24 Dec 2019 12:46:22 +0000 Subject: [PATCH 49/56] Add two more settings to pick default dataTables entries per page --- app.js | 1 + lib/settings.js | 4 +++- settings.json.template | 4 +++- views/includes/address_history.jade | 5 +++-- views/index.jade | 5 +++-- views/movement.jade | 5 +++-- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app.js b/app.js index 16412e08a..d383c3b3a 100644 --- a/app.js +++ b/app.js @@ -234,6 +234,7 @@ app.set('index', settings.index); app.set('heavy', settings.heavy); app.set('lock_during_index', settings.lock_during_index); app.set('txcount', settings.txcount); +app.set('txcount_per_page', settings.txcount_per_page); app.set('nethash', settings.nethash); app.set('nethash_units', settings.nethash_units); app.set('show_sent_received', settings.show_sent_received); diff --git a/lib/settings.js b/lib/settings.js index ff3887dfb..d072557ce 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -105,7 +105,8 @@ exports.movement = { exports.index = { "show_hashrate": false, "difficulty": "POW", - "last_txs": 100 + "last_txs": 100, + "txs_per_page": 10 }; // twitter @@ -128,6 +129,7 @@ exports.genesis_block = "b2926a56ca64e0cd2430347e383f63ad7092f406088b9b86d6d68c2 exports.heavy = false; exports.lock_during_index = false; exports.txcount = 100; +exports.txcount_per_page = 50; exports.show_sent_received = true; exports.supply = "COINBASE"; exports.nethash = "getnetworkhashps"; diff --git a/settings.json.template b/settings.json.template index d252a869a..461813776 100644 --- a/settings.json.template +++ b/settings.json.template @@ -76,7 +76,8 @@ "index": { "show_hashrate": true, "difficulty": "POW", - "last_txs": 100 + "last_txs": 100, + "txs_per_page": 10 }, // ensure links on API page are valid @@ -133,6 +134,7 @@ //amount of txs to index per address (stores latest n txs) "txcount": 100, + "txcount_per_page": 50, //show total sent & received on address page (set false if PoS) "show_sent_received": true, diff --git a/views/includes/address_history.jade b/views/includes/address_history.jade index 05cc43ba6..218e0fa8e 100644 --- a/views/includes/address_history.jade +++ b/views/includes/address_history.jade @@ -1,6 +1,7 @@ script. var hashAddress = "#{address.a_id}"; var setting_maxTxCount = parseInt("#{settings.txcount}"); + var setting_txPerPage = parseInt("#{settings.txcount_per_page}"); var lengthMenuOpts = []; var lengthMenuOptsAdd = [ 10, 25, 50, 75, 100, 250, 500, 1000 ]; for (i=0; i < lengthMenuOptsAdd.length; i++) { @@ -8,10 +9,10 @@ script. lengthMenuOpts.push(lengthMenuOptsAdd[i]); } } - if (setting_maxTxCount < 50) { + if (setting_maxTxCount < setting_txPerPage) { var displayLengthMax = setting_maxTxCount; } else { - var displayLengthMax = 50; + var displayLengthMax = setting_txPerPage; } $(document).ready(function () { diff --git a/views/index.jade b/views/index.jade index d69a7cab4..7b99a8e63 100644 --- a/views/index.jade +++ b/views/index.jade @@ -3,6 +3,7 @@ extends layout block content script. var setting_maxTxCount = parseInt("#{settings.index.last_txs}"); + var setting_txPerPage = parseInt("#{settings.index.txs_per_page}"); var lengthMenuOpts = []; var lengthMenuOptsAdd = [ 10, 25, 50, 75, 100, 250, 500, 1000 ]; for (i=0; i < lengthMenuOptsAdd.length; i++) { @@ -10,10 +11,10 @@ block content lengthMenuOpts.push(lengthMenuOptsAdd[i]); } } - if (setting_maxTxCount < 10) { + if (setting_maxTxCount < setting_txPerPage) { var displayLengthMax = setting_maxTxCount; } else { - var displayLengthMax = 10; + var displayLengthMax = setting_txPerPage; } $(document).ready(function(){ var stable = $('#block-table').dataTable( { diff --git a/views/movement.jade b/views/movement.jade index ef116373f..8395ef191 100644 --- a/views/movement.jade +++ b/views/movement.jade @@ -3,6 +3,7 @@ extends layout block content script. var setting_maxTxCount = parseInt("#{settings.index.last_txs}"); + var setting_txPerPage = parseInt("#{settings.index.txs_per_page}"); var lengthMenuOpts = []; var lengthMenuOptsAdd = [ 10, 25, 50, 75, 100, 250, 500, 1000 ]; for (i=0; i < lengthMenuOptsAdd.length; i++) { @@ -10,10 +11,10 @@ block content lengthMenuOpts.push(lengthMenuOptsAdd[i]); } } - if (setting_maxTxCount < 10) { + if (setting_maxTxCount < setting_txPerPage) { var displayLengthMax = setting_maxTxCount; } else { - var displayLengthMax = 10; + var displayLengthMax = setting_txPerPage; } var rplot; var colors = [ "#0071bc" ]; From bccdab3ec0cb863ce98ff2a91c11f8790a0b5ee9 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 24 Dec 2019 14:02:25 +0000 Subject: [PATCH 50/56] Add settings for use_rpc, default to false, use for getblock, getblockhash Another indexing speed-up --- CHANGELOG | 1 + UPGRADE | 3 +++ app.js | 1 + lib/explorer.js | 43 ++++++++++++++++++++++++++++++++++-------- lib/settings.js | 1 + package.json | 1 + settings.json.template | 2 ++ 7 files changed, 44 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 445085363..592dd55fe 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -8,6 +8,7 @@ * Fix mismatching balances/sent/received, negative balances etc * Added new file lock during database indexing: tmp/db_index.pid * New setting to lock during indexing: lock_during_index +* Add setting to call bitcoin-core directly or use RPC during indexing 1.6.1 * fixed last_txs setting diff --git a/UPGRADE b/UPGRADE index 8ca8efaec..77737283b 100644 --- a/UPGRADE +++ b/UPGRADE @@ -4,6 +4,9 @@ Note: All updates require the explorer to be restarted * remove tmp/db_index.pid (if it exists) * Add new settings to settings.json (see settings.json.template) * lock_during_index + * use_rpc + * txcount_per_page + * index.txs_per_page * Reindex explorerdb (node --stack-size=15000 scripts/sync.js index reindex) to build new address TX collection 1.6.0 -> 1.6.1 diff --git a/app.js b/app.js index d383c3b3a..84099c7b9 100644 --- a/app.js +++ b/app.js @@ -231,6 +231,7 @@ app.set('googleplus', settings.googleplus); app.set('youtube', settings.youtube); app.set('genesis_block', settings.genesis_block); app.set('index', settings.index); +app.set('use_rpc', settings.use_rpc); app.set('heavy', settings.heavy); app.set('lock_during_index', settings.lock_during_index); app.set('txcount', settings.txcount); diff --git a/lib/explorer.js b/lib/explorer.js index 56908e2a6..a0b8fef79 100644 --- a/lib/explorer.js +++ b/lib/explorer.js @@ -4,6 +4,9 @@ var request = require('request') var base_url = 'http://127.0.0.1:' + settings.port + '/api/'; +const Client = require('bitcoin-core'); +const client = new Client(settings.wallet); + // returns coinbase total sent as current coin supply function coinbase_supply(cb) { @@ -95,17 +98,41 @@ module.exports = { }, get_blockhash: function(height, cb) { - var uri = base_url + 'getblockhash?height=' + height; - request({uri: uri, json: true}, function (error, response, body) { - return cb(body); - }); + if (settings.use_rpc) { + var uri = base_url + 'getblockhash?height=' + height; + request({uri: uri, json: true}, function (error, response, body) { + return cb(body); + }); + } else { + client.command([{method:'getblockhash', parameters: [height]}], function(err, response){ + if(err){console.log('Error: ', err); onlyConsole.trace(err)} + else{ + if(response[0].name == 'RpcError'){ + return cb('There was an error. Check your console.'); + } + return cb(response[0]); + } + }); + } }, get_block: function(hash, cb) { - var uri = base_url + 'getblock?hash=' + hash; - request({uri: uri, json: true}, function (error, response, body) { - return cb(body); - }); + if (settings.use_rpc) { + var uri = base_url + 'getblock?hash=' + hash; + request({uri: uri, json: true}, function (error, response, body) { + return cb(body); + }); + } else { + client.command([{method:'getblock', parameters: [hash]}], function(err, response){ + if(err){console.log('Error: ', err); onlyConsole.trace(err)} + else{ + if(response[0].name == 'RpcError'){ + return cb('There was an error. Check your console.'); + } + return cb(response[0]); + } + }); + } }, get_rawtransaction: function(hash, cb) { diff --git a/lib/settings.js b/lib/settings.js index d072557ce..951de5983 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -126,6 +126,7 @@ exports.check_timeout = 250; exports.genesis_tx = "65f705d2f385dc85763a317b3ec000063003d6b039546af5d8195a5ec27ae410"; exports.genesis_block = "b2926a56ca64e0cd2430347e383f63ad7092f406088b9b86d6d68c2a34baef51"; +exports.use_rpc = false; exports.heavy = false; exports.lock_during_index = false; exports.txcount = 100; diff --git a/package.json b/package.json index e58572aa8..a03dd037f 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "test": "node ./node_modules/jasmine/bin/jasmine.js" }, "dependencies": { + "bitcoin-core": "^2.0.0", "bitcoin-node-api": "0.1.0", "body-parser": "^1.19.0", "cookie-parser": "^1.4.4", diff --git a/settings.json.template b/settings.json.template index 461813776..03d1d7c24 100644 --- a/settings.json.template +++ b/settings.json.template @@ -45,6 +45,8 @@ "check_timeout": 250, // wallet settings + "use_rpc": false, + "wallet": { "host": "localhost", "port": 9332, From d769c9650a84b68c32e6a5ed17bcfee50d9bf5b4 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 24 Dec 2019 15:29:11 +0000 Subject: [PATCH 51/56] Another mongoose deprecated .update() fix --- lib/database.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/database.js b/lib/database.js index 789a13b47..c971cd8e7 100644 --- a/lib/database.js +++ b/lib/database.js @@ -859,7 +859,7 @@ module.exports = { }); }, function(){ Tx.find({}).sort({timestamp: 'desc'}).limit(settings.index.last_txs).exec(function(err, txs){ - Stats.update({coin: coin}, { + Stats.updateOne({coin: coin}, { last: end, last_txs: '' //not used anymore left to clear out existing objects }, function() { From 1b409b39089267a04b18407d35116985fc48af94 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 24 Dec 2019 18:11:31 +0000 Subject: [PATCH 52/56] Add client command for getrawtransaction, more indexing speed-up --- lib/database.js | 96 +++++++++++++++++++------------------------------ lib/explorer.js | 20 ++++++++--- 2 files changed, 52 insertions(+), 64 deletions(-) diff --git a/lib/database.js b/lib/database.js index c971cd8e7..7d84025e5 100644 --- a/lib/database.js +++ b/lib/database.js @@ -157,56 +157,50 @@ function find_tx(txid, cb) { }); } -function save_tx(txid, cb) { +function save_tx(txid, blockheight, cb) { //var s_timer = new Date().getTime(); lib.get_rawtransaction(txid, function(tx){ if (tx != 'There was an error. Check your console.') { - lib.get_block(tx.blockhash, function(block){ - if (block) { - lib.prepare_vin(tx, function(vin) { - lib.prepare_vout(tx.vout, txid, vin, function(vout, nvin) { - lib.syncLoop(vin.length, function (loop) { - var i = loop.iteration(); - update_address(nvin[i].addresses, txid, nvin[i].amount, 'vin', function(){ - loop.next(); + lib.prepare_vin(tx, function(vin) { + lib.prepare_vout(tx.vout, txid, vin, function(vout, nvin) { + lib.syncLoop(vin.length, function (loop) { + var i = loop.iteration(); + update_address(nvin[i].addresses, txid, nvin[i].amount, 'vin', function(){ + loop.next(); + }); + }, function(){ + lib.syncLoop(vout.length, function (subloop) { + var t = subloop.iteration(); + if (vout[t].addresses) { + update_address(vout[t].addresses, txid, vout[t].amount, 'vout', function(){ + subloop.next(); }); - }, function(){ - lib.syncLoop(vout.length, function (subloop) { - var t = subloop.iteration(); - if (vout[t].addresses) { - update_address(vout[t].addresses, txid, vout[t].amount, 'vout', function(){ - subloop.next(); - }); + } else { + subloop.next(); + } + }, function(){ + lib.calculate_total(vout, function(total){ + var newTx = new Tx({ + txid: tx.txid, + vin: nvin, + vout: vout, + total: total.toFixed(8), + timestamp: tx.time, + blockhash: tx.blockhash, + blockindex: blockheight, + }); + newTx.save(function(err) { + if (err) { + return cb(err); } else { - subloop.next(); + //console.log('txid: '); + return cb(); } - }, function(){ - lib.calculate_total(vout, function(total){ - var newTx = new Tx({ - txid: tx.txid, - vin: nvin, - vout: vout, - total: total.toFixed(8), - timestamp: tx.time, - blockhash: tx.blockhash, - blockindex: block.height, - }); - newTx.save(function(err) { - if (err) { - return cb(err); - } else { - //console.log('txid: '); - return cb(); - } - }); - }); }); }); }); }); - } else { - return cb('block not found: ' + tx.blockhash); - } + }); }); } else { return cb('tx not found: ' + txid); @@ -440,24 +434,6 @@ module.exports = { }); }, - create_tx: function(txid, cb) { - is_locked("db_index", function (exists) { - if (exists) { - console.log("db_index lock file exists..."); - return cb(); - } else { - save_tx(txid, function(err){ - if (err) { - return cb(err); - } else { - //console.log('tx stored: %s', txid); - return cb(); - } - }); - } - }); - }, - create_txs: function(block, cb) { is_locked("db_index", function (exists) { if (exists) { @@ -466,7 +442,7 @@ module.exports = { } else { lib.syncLoop(block.tx.length, function (loop) { var i = loop.iteration(); - save_tx(block.tx[i], function(err){ + save_tx(block.tx[i], block.height, function(err){ if (err) { loop.next(); } else { @@ -830,7 +806,7 @@ module.exports = { tx = null; subloop.next(); } else { - save_tx(block.tx[i], function(err){ + save_tx(block.tx[i], block.height, function(err){ if (err) { console.log(err); } else { diff --git a/lib/explorer.js b/lib/explorer.js index a0b8fef79..260e1b09e 100644 --- a/lib/explorer.js +++ b/lib/explorer.js @@ -136,10 +136,22 @@ module.exports = { }, get_rawtransaction: function(hash, cb) { - var uri = base_url + 'getrawtransaction?txid=' + hash + '&decrypt=1'; - request({uri: uri, json: true}, function (error, response, body) { - return cb(body); - }); + if (settings.use_rpc) { + var uri = base_url + 'getrawtransaction?txid=' + hash + '&decrypt=1'; + request({uri: uri, json: true}, function (error, response, body) { + return cb(body); + }); + } else { + client.command([{method:'getrawtransaction', parameters: [hash, 1]}], function(err, response){ + if(err){console.log('Error: ', err); onlyConsole.trace(err)} + else{ + if(response[0].name == 'RpcError'){ + return cb('There was an error. Check your console.'); + } + return cb(response[0]); + } + }); + } }, get_maxmoney: function(cb) { From 904479284b8a371c7a95fdd72905c3b248a1be53 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 24 Dec 2019 18:21:58 +0000 Subject: [PATCH 53/56] EOF newline --- views/includes/rl_balance.jade | 2 +- views/includes/rl_received.jade | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/includes/rl_balance.jade b/views/includes/rl_balance.jade index 8d3172f77..33248d51f 100644 --- a/views/includes/rl_balance.jade +++ b/views/includes/rl_balance.jade @@ -25,4 +25,4 @@ td.hidden-xs #{itemFixedParts[0]}. span.decimal #{itemFixedParts[1]} td.hidden-xs(style='text-align:center;') - =percentage.toFixed(2) \ No newline at end of file + =percentage.toFixed(2) diff --git a/views/includes/rl_received.jade b/views/includes/rl_received.jade index b89143945..3f04860dd 100644 --- a/views/includes/rl_received.jade +++ b/views/includes/rl_received.jade @@ -21,4 +21,4 @@ a(href='/address/#{item.a_id}') #{item.a_id} include ./rl_labels.jade td.hidden-xs #{itemFixedParts[0]}. - span.decimal #{itemFixedParts[1]} \ No newline at end of file + span.decimal #{itemFixedParts[1]} From 42a8f69be0f5e81a3ad35610517616708ecb565e Mon Sep 17 00:00:00 2001 From: TheHolyRoger Date: Tue, 24 Dec 2019 19:54:41 +0000 Subject: [PATCH 54/56] Error logging fix --- lib/explorer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/explorer.js b/lib/explorer.js index 260e1b09e..61466e8c1 100644 --- a/lib/explorer.js +++ b/lib/explorer.js @@ -105,7 +105,7 @@ module.exports = { }); } else { client.command([{method:'getblockhash', parameters: [height]}], function(err, response){ - if(err){console.log('Error: ', err); onlyConsole.trace(err)} + if(err){console.log('Error: ', err); } else{ if(response[0].name == 'RpcError'){ return cb('There was an error. Check your console.'); @@ -124,7 +124,7 @@ module.exports = { }); } else { client.command([{method:'getblock', parameters: [hash]}], function(err, response){ - if(err){console.log('Error: ', err); onlyConsole.trace(err)} + if(err){console.log('Error: ', err); } else{ if(response[0].name == 'RpcError'){ return cb('There was an error. Check your console.'); @@ -143,7 +143,7 @@ module.exports = { }); } else { client.command([{method:'getrawtransaction', parameters: [hash, 1]}], function(err, response){ - if(err){console.log('Error: ', err); onlyConsole.trace(err)} + if(err){console.log('Error: ', err); } else{ if(response[0].name == 'RpcError'){ return cb('There was an error. Check your console.'); From 29a1b709a88372d5b3ce655047b146c81e9c448b Mon Sep 17 00:00:00 2001 From: TheHolyRoger <39387497+TheHolyRoger@users.noreply.github.com> Date: Tue, 24 Dec 2019 20:46:46 +0000 Subject: [PATCH 55/56] Version bump --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 077a0f382..7b40dd26a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Iquidus Explorer - 1.6.1 +Iquidus Explorer - 1.6.2 ================ An open source block explorer written in node.js. From 71f0114e84de92c624983a1c07378c180f42e97b Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 25 Dec 2019 23:30:49 +0000 Subject: [PATCH 56/56] Fix for search by block height on non-RPC --- lib/explorer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/explorer.js b/lib/explorer.js index 61466e8c1..5c4662db1 100644 --- a/lib/explorer.js +++ b/lib/explorer.js @@ -104,7 +104,7 @@ module.exports = { return cb(body); }); } else { - client.command([{method:'getblockhash', parameters: [height]}], function(err, response){ + client.command([{method:'getblockhash', parameters: [parseInt(height)]}], function(err, response){ if(err){console.log('Error: ', err); } else{ if(response[0].name == 'RpcError'){