mirror of https://github.com/lukechilds/Agama.git
pbca26
7 years ago
3 changed files with 116 additions and 2 deletions
@ -0,0 +1,115 @@ |
|||
const request = require('request'); |
|||
const Promise = require('bluebird'); |
|||
|
|||
let btcFeeBlocks = []; |
|||
|
|||
for (let i = 0; i < 25; i++) { |
|||
btcFeeBlocks.push(i); |
|||
} |
|||
|
|||
const checkTimestamp = (dateToCheck) => { |
|||
const currentEpochTime = new Date(Date.now()) / 1000; |
|||
const secondsElapsed = Number(currentEpochTime) - Number(dateToCheck); |
|||
|
|||
return Math.floor(secondsElapsed); |
|||
} |
|||
|
|||
const getRandomIntInclusive = (min, max) => { |
|||
min = Math.ceil(min); |
|||
max = Math.floor(max); |
|||
|
|||
return Math.floor(Math.random() * (max - min + 1)) + min; // the maximum is inclusive and the minimum is inclusive
|
|||
} |
|||
|
|||
let btcFees = { |
|||
recommended: {}, |
|||
all: {}, |
|||
electrum: {}, |
|||
lastUpdated: null, |
|||
}; |
|||
|
|||
const BTC_FEES_MIN_ELAPSED_TIME = 120; |
|||
|
|||
module.exports = (shepherd) => { |
|||
shepherd.get('/electrum/btcfees', (req, res, next) => { |
|||
if (shepherd.checkToken(req.query.token)) { |
|||
if (checkTimestamp(btcFees.lastUpdated) > BTC_FEES_MIN_ELAPSED_TIME) { |
|||
const _randomServer = shepherd.electrumServers.btc.serverList[getRandomIntInclusive(0, shepherd.electrumServers.btc.serverList.length - 1)].split(':'); |
|||
const ecl = new shepherd.electrumJSCore(_randomServer[1], _randomServer[0], 'tcp'); |
|||
let _btcFeeEstimates = []; |
|||
|
|||
console.log(`btc fees server ${_randomServer.join(':')}`); |
|||
|
|||
ecl.connect(); |
|||
Promise.all(btcFeeBlocks.map((coin, index) => { |
|||
return new Promise((resolve, reject) => { |
|||
ecl.blockchainEstimatefee(index + 1) |
|||
.then((json) => { |
|||
resolve(true); |
|||
|
|||
if (json > 0) { |
|||
_btcFeeEstimates.push(Math.floor((json / 1024) * 100000000)); |
|||
} |
|||
}); |
|||
}); |
|||
})) |
|||
.then(result => { |
|||
ecl.close(); |
|||
|
|||
if (result && |
|||
result.length) { |
|||
btcFees.electrum = _btcFeeEstimates; |
|||
} else { |
|||
btcFees.electrum = 'error'; |
|||
} |
|||
|
|||
let options = { |
|||
url: `https://bitcoinfees.earn.com/api/v1/fees/recommended`, |
|||
method: 'GET', |
|||
}; |
|||
|
|||
// send back body on both success and error
|
|||
// this bit replicates iguana core's behaviour
|
|||
request(options, (error, response, body) => { |
|||
if (response && |
|||
response.statusCode && |
|||
response.statusCode === 200) { |
|||
try { |
|||
const _parsedBody = JSON.parse(body); |
|||
btcFees.lastUpdated = Math.floor(Date.now() / 1000); |
|||
btcFees.recommended = _parsedBody; |
|||
} catch (e) { |
|||
shepherd.log('unable to retrieve BTC fees / recommended', true); |
|||
} |
|||
} else { |
|||
shepherd.log('unable to retrieve BTC fees / recommended', true); |
|||
} |
|||
|
|||
res.end(JSON.stringify({ |
|||
msg: 'success', |
|||
result: btcFees, |
|||
})); |
|||
}); |
|||
}); |
|||
} else { |
|||
console.log(`btcfees, use cache`); |
|||
|
|||
const successObj = { |
|||
msg: 'success', |
|||
result: btcFees, |
|||
}; |
|||
|
|||
res.end(JSON.stringify(successObj)); |
|||
} |
|||
} else { |
|||
const errorObj = { |
|||
msg: 'error', |
|||
result: 'unauthorized access', |
|||
}; |
|||
|
|||
res.end(JSON.stringify(errorObj)); |
|||
} |
|||
}); |
|||
|
|||
return shepherd; |
|||
}; |
Loading…
Reference in new issue