Add support for newer Dash masternode format

-Automatically detect if using newer or older Dash masternode format and display applicable columns and data
-Added new fields 'ip_address' and 'last_paid_block' to the Masternode collection
This commit is contained in:
joeuhren
2021-05-03 12:28:08 -06:00
parent 269e51cc2d
commit f8c008ecd4
5 changed files with 110 additions and 42 deletions
+3
View File
@@ -57,6 +57,9 @@ db.connect(dbString, function() {
// Add new field(s) to tx collection if missing
db.check_txes(function(exists) {});
// Add new field(s) to masternode collection if missing
db.check_masternodes(function(exists) {});
db.check_richlist(settings.coin.name, function(exists) {
if (exists == false) {
console.log('no richlist entry found, creating now..');
+54 -24
View File
@@ -289,7 +289,7 @@ module.exports = {
// loop through masternode addresses
for (m = 0; m < masternodes.length; m++) {
// check if this is the correct address
if (masternodes[m].addr == hash) {
if ((masternodes[m].proTxHash != null ? masternodes[m].payee : masternodes[m].addr) == hash) {
// update the claim name
masternodes[m]['claim_name'] = claim_name;
// mark as updated
@@ -1043,14 +1043,30 @@ module.exports = {
});
},
check_masternodes: function(cb) {
Masternode.findOne({}, function(err, masternode) {
if (masternode) {
// collection has data
// determine if ip_address field exists
check_add_db_field(Masternode, 'ip_address', null, function(exists) {
// determine if last_paid_block field exists
check_add_db_field(Masternode, 'last_paid_block', null, function(exists) {
return cb(true);
});
});
} else
return cb(false);
});
},
// determine if masternode exists and save masternode to collection
save_masternode: function (raw_masternode, cb) {
// lookup masternode in local collection
module.exports.find_masternode(raw_masternode.txhash, raw_masternode.outidx, function (masternode) {
module.exports.find_masternode((raw_masternode.proTxHash != null ? raw_masternode.proTxHash : raw_masternode.txhash), function (masternode) {
// determine if the claim address feature is enabled
if (settings.claim_address_page.enabled == true) {
// claim address is enabled so lookup the address claim name
find_address(raw_masternode.addr, false, function(address) {
find_address((raw_masternode.proTxHash != null ? raw_masternode.payee : raw_masternode.addr), false, function(address) {
if (address) {
// save claim name to masternode obejct
raw_masternode.claim_name = address.name;
@@ -1075,26 +1091,40 @@ module.exports = {
// add or update a single masternode
add_update_masternode(masternode, add, cb) {
if (!masternode.txhash == null || !masternode.outidx == null) {
console.log('Masternode Update - TX or Outidx is missing');
console.log(masternode.txhash);
console.log(masternode.outidx);
if (masternode.proTxHash == null && masternode.txhash == null) {
console.log('Masternode Update - TXid is missing');
return cb(false);
} else {
var mn = new Masternode({
rank: masternode.rank,
network: masternode.network,
txhash: masternode.txhash,
outidx: masternode.outidx,
status: masternode.status,
addr: masternode.addr,
version: masternode.version,
lastseen: masternode.lastseen,
activetime: masternode.activetime,
lastpaid: masternode.lastpaid,
claim_name: (masternode.claim_name == null ? '' : masternode.claim_name)
});
// Check if this older or newer Dash masternode format
if (masternode.proTxHash != null) {
// This is the newer Dash format
var mn = new Masternode({
txhash: masternode.proTxHash,
status: masternode.status,
addr: masternode.payee,
lastpaid: masternode.lastpaidtime,
ip_address: masternode.address,
last_paid_block: masternode.lastpaidblock,
lastseen: Math.floor(Date.now() / 1000),
claim_name: (masternode.claim_name == null ? '' : masternode.claim_name)
});
} else {
// This is the older Dash format, or an unknown format
var mn = new Masternode({
rank: masternode.rank,
network: masternode.network,
txhash: masternode.txhash,
outidx: masternode.outidx,
status: masternode.status,
addr: masternode.addr,
version: masternode.version,
lastseen: masternode.lastseen,
activetime: masternode.activetime,
lastpaid: masternode.lastpaid,
claim_name: (masternode.claim_name == null ? '' : masternode.claim_name)
});
}
if (add) {
// add new masternode to collection
@@ -1107,7 +1137,7 @@ module.exports = {
});
} else {
// update existing masternode in local collection
Masternode.updateOne({ txhash: masternode.txhash, outidx: masternode.outidx }, masternode, function (err) {
Masternode.updateOne({ txhash: (masternode.proTxHash != null ? masternode.proTxHash : masternode.txhash) }, masternode, function (err) {
if (err) {
console.log(err);
return cb(false);
@@ -1118,9 +1148,9 @@ module.exports = {
}
},
// find masternode by txid and offset
find_masternode: function (txhash, outidx, cb) {
Masternode.findOne({ txhash: txhash, outidx: outidx }, function (err, masternode) {
// find masternode by txid
find_masternode: function (txhash, cb) {
Masternode.findOne({ txhash: txhash }, function (err, masternode) {
if (err)
return cb(null);
else {
+3 -1
View File
@@ -12,7 +12,9 @@ var MasternodeSchema = new Schema({
lastseen: { type: Number, default: 0 },
activetime: { type: Number, default: 0 },
lastpaid: { type: Number, default: 0 },
claim_name: { type: String, default: '', index: true }
claim_name: { type: String, default: '', index: true },
ip_address: { type: String, default: '', index: true },
last_paid_block: {type: Number, default: 0}
}, {id: false});
module.exports = mongoose.model('Masternode', MasternodeSchema);
+13 -3
View File
@@ -209,14 +209,24 @@ if (database == 'peers') {
} else {
lib.get_masternodelist(function (body) {
if (body != null) {
lib.syncLoop(body.length, function (loop) {
var isObject = false;
var objectKeys = null;
// Check if the masternode data is an array or an object
if (body.length == null) {
// Process data as an object
objectKeys = Object.keys(body);
isObject = true;
}
lib.syncLoop((isObject ? objectKeys : body).length, function (loop) {
var i = loop.iteration();
db.save_masternode(body[i], function (success) {
db.save_masternode((isObject ? body[objectKeys[i]] : body[i]), function (success) {
if (success)
loop.next();
else {
console.log('error: cannot save masternode %s.', (body[i].addr ? body[i].addr : 'UNKNOWN'));
console.log('error: cannot save masternode %s.', (isObject ? (body[objectKeys[i]].payee ? body[objectKeys[i]].payee : 'UNKNOWN') : (body[i].addr ? body[i].addr : 'UNKNOWN')));
exit();
}
});
+37 -14
View File
@@ -27,6 +27,7 @@ block content
return ('0' + dy).slice(-2) + " day" + (('0' + dy).slice(-2) == 1 ? "" : "s") + " " + ('0' + h).slice(-2) + "h " + ('0' + m).slice(-2) + "m " + ('0' + s).slice(-2) + "s";
}
$(document).ready(function() {
var useNewDashFormat = false;
var labels = !{JSON.stringify(settings.labels)};
var ctable = $('#masternodes-table').dataTable({
autoWidth: true,
@@ -70,34 +71,42 @@ block content
json[i]['addr'] = '<div><label class="badge badge-default" style="margin-bottom:10px;">' + labels[addr].label + (labels[addr].url ? '<a href="' + labels[addr].url + '" target="_blank", alt="Visit site", title="Visit site" data-toggle="tooltip" data-placement="top"><span class="fa fa-question-circle" style="margin-left:5px"></span></a>' : '') + '</label></div>' + json[i]['addr'];
}
}
useNewDashFormat = json.length > 0 && json[0].ip_address != null && json[0].ip_address != '';
return json;
}
},
columns: [
{ data: 'rank' },
{ data: 'network' },
{ data: 'addr' },
{ data: 'version' },
{ data: 'lastseen' },
{ data: 'lastpaid' },
{ data: 'activetime' },
{ data: 'status' }
{ name: 'rank', data: 'rank', className: "rankCol" },
{ name: 'network', data: 'network', className: "networkCol" },
{ name: 'ip_address', data: 'ip_address', className: "ipAddressCol" },
{ name: 'addr', data: 'addr', className: "addressCol" },
{ name: 'version', data: 'version', className: "versionCol" },
{ name: 'lastseen', data: 'lastseen', className: "lastSeenCol" },
{ name: 'lastpaid', data: 'lastpaid', className: "lastPaidCol" },
{ name: 'last_paid_block', data: 'last_paid_block', className: "lastPaidBlockCol" },
{ name: 'activetime', data: 'activetime', className: "activeTimeCol" },
{ name: 'status', data: 'status', className: "statusCol" }
],
rowCallback: function(row, data, index) {
$("td:eq(2)", row).addClass("breakWord");
$("td.addressCol", row).addClass("breakWord");
if (useNewDashFormat)
$("td.ipAddressCol", row).addClass("breakWord");
switch (data['status'].toUpperCase()) {
case 'ENABLED':
$("td:eq(7)", row).addClass('bg-success');
$("td.statusCol", row).addClass('bg-success');
break;
case 'REMOVE':
$("td:eq(7)", row).addClass('bg-danger');
$("td.statusCol", row).addClass('bg-danger');
break;
case 'EXPIRED':
$("td:eq(7)", row).addClass('bg-warning');
$("td.statusCol", row).addClass('bg-warning');
break;
default:
$("td:eq(7)", row).addClass('bg-info');
$("td.statusCol", row).addClass('bg-info');
break;
}
},
@@ -105,6 +114,18 @@ block content
fixDataTableColumns();
fixFooterHeightAndPosition();
enableTooltips();
},
fnInitComplete: function(settings, json) {
setTimeout(function () {
// Hide/show columns based on which Dash masternode format is used
ctable.api().column('rank:name').visible(!useNewDashFormat, false);
ctable.api().column('network:name').visible(!useNewDashFormat, false);
ctable.api().column('version:name').visible(!useNewDashFormat, false);
ctable.api().column('lastseen:name').visible(!useNewDashFormat, false);
ctable.api().column('activetime:name').visible(!useNewDashFormat, false);
ctable.api().column('ip_address:name').visible(useNewDashFormat, false);
ctable.api().column('last_paid_block:name').visible(useNewDashFormat);
}, 0);
}
});
@@ -161,10 +182,12 @@ block content
tr
th.text-center Pay rank
th.text-center Protocol
th.text-center Address
th.text-center IP address
th.text-center Wallet address
th.text-center Protocol
th.text-center Last seen
th.text-center Last paid
th.text-center Last paid block
th.text-center Active since
th.text-center Status
tbody.text-center