|
|
|
var config = require("./../config.js");
|
|
|
|
var coins = require("../coins.js");
|
|
|
|
var utils = require("../utils.js");
|
|
|
|
|
|
|
|
var coinConfig = coins[config.coin];
|
|
|
|
|
|
|
|
const ElectrumClient = require('electrum-client');
|
|
|
|
|
|
|
|
var electrumClients = [];
|
|
|
|
|
|
|
|
function connectToServers() {
|
|
|
|
for (var i = 0; i < config.electrumXServers.length; i++) {
|
|
|
|
connectToServer(config.electrumXServers[i].host, config.electrumXServers[i].port);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function connectToServer(host, port) {
|
|
|
|
console.log("Connecting to ElectrumX Server: " + host + ":" + port);
|
|
|
|
|
|
|
|
var electrumClient = new ElectrumClient(port, host, 'tls');
|
|
|
|
electrumClient.connect().then(function() {
|
|
|
|
electrumClient.server_version("btc-rpc-explorer-1.1", "1.2").then(function(res) {
|
|
|
|
console.log("Connected to ElectrumX Server: " + host + ":" + port + ", versions: " + res);
|
|
|
|
|
|
|
|
electrumClients.push(electrumClient);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function runOnServer(electrumClient, f) {
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
f(electrumClient).then(function(result) {
|
|
|
|
resolve({result:result, server:electrumClient.host});
|
|
|
|
|
|
|
|
}).catch(function(err) {
|
|
|
|
console.log("Error dif0e21qdh: " + JSON.stringify(err) + ", host=" + electrumClient.host + ", port=" + electrumClient.port);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function runOnAllServers(f) {
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
var promises = [];
|
|
|
|
|
|
|
|
for (var i = 0; i < electrumClients.length; i++) {
|
|
|
|
promises.push(runOnServer(electrumClients[i], f));
|
|
|
|
}
|
|
|
|
|
|
|
|
Promise.all(promises).then(function(results) {
|
|
|
|
resolve(results);
|
|
|
|
|
|
|
|
}).catch(function(err) {
|
|
|
|
reject(err);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function getAddressTxids(addrScripthash) {
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
runOnAllServers(function(electrumClient) {
|
|
|
|
return electrumClient.blockchainScripthash_getHistory(addrScripthash);
|
|
|
|
|
|
|
|
}).then(function(results) {
|
|
|
|
if (addrScripthash == coinConfig.genesisCoinbaseOutputAddressScripthash) {
|
|
|
|
for (var i = 0; i < results.length; i++) {
|
|
|
|
results[i].result.unshift({tx_hash:coinConfig.genesisCoinbaseTransactionId, height:0});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var first = results[0];
|
|
|
|
var done = false;
|
|
|
|
|
|
|
|
for (var i = 1; i < results.length; i++) {
|
|
|
|
if (results[i].length != first.length) {
|
|
|
|
resolve({conflictedResults:results});
|
|
|
|
|
|
|
|
done = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!done) {
|
|
|
|
resolve(results[0]);
|
|
|
|
}
|
|
|
|
}).catch(function(err) {
|
|
|
|
reject(err);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function getAddressBalance(addrScripthash) {
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
|
|
runOnAllServers(function(electrumClient) {
|
|
|
|
return electrumClient.blockchainScripthash_getBalance(addrScripthash);
|
|
|
|
|
|
|
|
}).then(function(results) {
|
|
|
|
if (addrScripthash == coinConfig.genesisCoinbaseOutputAddressScripthash) {
|
|
|
|
for (var i = 0; i < results.length; i++) {
|
|
|
|
var coinbaseBlockReward = coinConfig.blockRewardFunction(0);
|
|
|
|
|
|
|
|
results[i].result.confirmed += (coinbaseBlockReward * coinConfig.baseCurrencyUnit.multiplier);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var first = results[0];
|
|
|
|
var done = false;
|
|
|
|
|
|
|
|
for (var i = 1; i < results.length; i++) {
|
|
|
|
if (results[i].confirmed != first.confirmed) {
|
|
|
|
resolve({conflictedResults:results});
|
|
|
|
|
|
|
|
done = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!done) {
|
|
|
|
resolve(results[0]);
|
|
|
|
}
|
|
|
|
}).catch(function(err) {
|
|
|
|
reject(err);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
connectToServers: connectToServers,
|
|
|
|
getAddressTxids: getAddressTxids,
|
|
|
|
getAddressBalance: getAddressBalance
|
|
|
|
};
|