Luke Childs
5 years ago
6 changed files with 163 additions and 168 deletions
@ -1,4 +1,35 @@ |
|||
const sendJson = require('../send-json'); |
|||
const getCoinData = require('.'); |
|||
const fetch = require('isomorphic-fetch'); |
|||
|
|||
exports.handler = () => sendJson(getCoinData); |
|||
const getData = async endpoint => fetch( |
|||
`https://whattomine.com/${endpoint}.json` |
|||
).then(res => res.json()); |
|||
|
|||
const getCoinData = async () => { |
|||
const [gpu, asic] = await Promise.all([ |
|||
getData('coins'), |
|||
getData('asic') |
|||
]); |
|||
|
|||
const coins = Object.entries({...gpu.coins, ...asic.coins}) |
|||
.filter(([_, coin]) => coin.tag !== 'NICEHASH') |
|||
.map(([name, coin]) => { |
|||
return { |
|||
symbol: String(coin.tag), |
|||
name: String(name), |
|||
marketCap: parseFloat(coin.market_cap.replace(/[$,]/g, ''), 10), |
|||
price: parseFloat(coin.exchange_rate), |
|||
priceCurrency: String(coin.tag === 'BTC' ? 'USD' : coin.exchange_rate_curr), |
|||
algorithm: String(coin.algorithm), |
|||
hashrate: parseFloat(coin.nethash, 10), |
|||
blockTimeInSeconds: parseFloat(coin.block_time, 10), |
|||
blockReward: parseFloat(coin.block_reward, 10) |
|||
}; |
|||
}) |
|||
.sort((a, b) => b.marketCap - a.marketCap); |
|||
|
|||
return coins; |
|||
}; |
|||
|
|||
module.exports = getCoinData; |
|||
module.exports.handler = () => sendJson(getCoinData); |
|||
|
@ -1,33 +0,0 @@ |
|||
const fetch = require('isomorphic-fetch'); |
|||
|
|||
const getData = async endpoint => fetch( |
|||
`https://whattomine.com/${endpoint}.json` |
|||
).then(res => res.json()); |
|||
|
|||
const getCoinData = async () => { |
|||
const [gpu, asic] = await Promise.all([ |
|||
getData('coins'), |
|||
getData('asic') |
|||
]); |
|||
|
|||
const coins = Object.entries({...gpu.coins, ...asic.coins}) |
|||
.filter(([_, coin]) => coin.tag !== 'NICEHASH') |
|||
.map(([name, coin]) => { |
|||
return { |
|||
symbol: String(coin.tag), |
|||
name: String(name), |
|||
marketCap: parseFloat(coin.market_cap.replace(/[$,]/g, ''), 10), |
|||
price: parseFloat(coin.exchange_rate), |
|||
priceCurrency: String(coin.tag === 'BTC' ? 'USD' : coin.exchange_rate_curr), |
|||
algorithm: String(coin.algorithm), |
|||
hashrate: parseFloat(coin.nethash, 10), |
|||
blockTimeInSeconds: parseFloat(coin.block_time, 10), |
|||
blockReward: parseFloat(coin.block_reward, 10) |
|||
}; |
|||
}) |
|||
.sort((a, b) => b.marketCap - a.marketCap); |
|||
|
|||
return coins; |
|||
}; |
|||
|
|||
module.exports = getCoinData; |
@ -1,4 +1,76 @@ |
|||
const sendJson = require('../send-json'); |
|||
const getData = require('.'); |
|||
|
|||
exports.handler = () => sendJson(getData); |
|||
const getNiceHashData = require('../nicehash/nicehash'); |
|||
const getCoinData = require('../coins/coins'); |
|||
|
|||
const SECONDS = 1; |
|||
const MINUTES = SECONDS * 60; |
|||
const HOURS = MINUTES * 60; |
|||
|
|||
const getData = async () => { |
|||
const [nicehashAlgorithms, coins] = await Promise.all([ |
|||
getNiceHashData(), |
|||
getCoinData() |
|||
]); |
|||
|
|||
const getNiceHashForCoin = coin => { |
|||
const names = { |
|||
'SHA-256': 'sha256asicboost', |
|||
'Ethash': 'daggerhashimoto', |
|||
}; |
|||
|
|||
const coinAlgorithm = names[coin.algorithm] || coin.algorithm; |
|||
return nicehashAlgorithms.find(algorithm => algorithm.name.toLowerCase() === coinAlgorithm.toLowerCase()); |
|||
}; |
|||
|
|||
// Calculate reference bitcoin values
|
|||
const bitcoin = coins.find(coin => coin.symbol === 'BTC'); |
|||
if (!bitcoin) { |
|||
// Handle this
|
|||
} |
|||
const bitcoinHashrateCostPerSecond = (bitcoin.hashrate * getNiceHashForCoin(bitcoin).pricePerHashPerSecond); |
|||
|
|||
const data = coins |
|||
.filter(coin => { |
|||
const nicehash = getNiceHashForCoin(coin); |
|||
if(!nicehash) { |
|||
// See if we can fix some of these
|
|||
console.log(coin.symbol, coin.name, coin.algorithm); |
|||
} |
|||
|
|||
return nicehash; |
|||
}) |
|||
.map(coin => { |
|||
const nicehash = getNiceHashForCoin(coin); |
|||
|
|||
// Calculate 51% attack values
|
|||
const hashrateCostPerSecond = (coin.hashrate * nicehash.pricePerHashPerSecond); |
|||
const attackHourlyCost = (HOURS * hashrateCostPerSecond); |
|||
const nicehasheable = (nicehash.hashrate / coin.hashrate * 100); |
|||
|
|||
// Calculate confirmation values
|
|||
const multiplier = (bitcoinHashrateCostPerSecond / hashrateCostPerSecond); |
|||
const workTime = (bitcoin.blockTimeInSeconds * multiplier); |
|||
const confirmations = Math.ceil(workTime / coin.blockTimeInSeconds); |
|||
const estimatedTimeForConfs = (coin.blockTimeInSeconds * confirmations); |
|||
|
|||
return { |
|||
...coin, |
|||
attackCost: { |
|||
hashrateCostPerSecond, |
|||
attackHourlyCost, |
|||
nicehasheable, |
|||
}, |
|||
bitcoinConfEquivalent: { |
|||
multiplier, |
|||
confirmations, |
|||
estimatedTimeForConfs, |
|||
}, |
|||
}; |
|||
}) |
|||
|
|||
return data; |
|||
}; |
|||
|
|||
module.exports = getData; |
|||
module.exports.handler = () => sendJson(getData); |
|||
|
@ -1,73 +0,0 @@ |
|||
const getNiceHashData = require('../nicehash'); |
|||
const getCoinData = require('../coins'); |
|||
|
|||
const SECONDS = 1; |
|||
const MINUTES = SECONDS * 60; |
|||
const HOURS = MINUTES * 60; |
|||
|
|||
const getData = async () => { |
|||
const [nicehashAlgorithms, coins] = await Promise.all([ |
|||
getNiceHashData(), |
|||
getCoinData() |
|||
]); |
|||
|
|||
const getNiceHashForCoin = coin => { |
|||
const names = { |
|||
'SHA-256': 'sha256asicboost', |
|||
'Ethash': 'daggerhashimoto', |
|||
}; |
|||
|
|||
const coinAlgorithm = names[coin.algorithm] || coin.algorithm; |
|||
return nicehashAlgorithms.find(algorithm => algorithm.name.toLowerCase() === coinAlgorithm.toLowerCase()); |
|||
}; |
|||
|
|||
// Calculate reference bitcoin values
|
|||
const bitcoin = coins.find(coin => coin.symbol === 'BTC'); |
|||
if (!bitcoin) { |
|||
// Handle this
|
|||
} |
|||
const bitcoinHashrateCostPerSecond = (bitcoin.hashrate * getNiceHashForCoin(bitcoin).pricePerHashPerSecond); |
|||
|
|||
const data = coins |
|||
.filter(coin => { |
|||
const nicehash = getNiceHashForCoin(coin); |
|||
if(!nicehash) { |
|||
// See if we can fix some of these
|
|||
console.log(coin.symbol, coin.name, coin.algorithm); |
|||
} |
|||
|
|||
return nicehash; |
|||
}) |
|||
.map(coin => { |
|||
const nicehash = getNiceHashForCoin(coin); |
|||
|
|||
// Calculate 51% attack values
|
|||
const hashrateCostPerSecond = (coin.hashrate * nicehash.pricePerHashPerSecond); |
|||
const attackHourlyCost = (HOURS * hashrateCostPerSecond); |
|||
const nicehasheable = (nicehash.hashrate / coin.hashrate * 100); |
|||
|
|||
// Calculate confirmation values
|
|||
const multiplier = (bitcoinHashrateCostPerSecond / hashrateCostPerSecond); |
|||
const workTime = (bitcoin.blockTimeInSeconds * multiplier); |
|||
const confirmations = Math.ceil(workTime / coin.blockTimeInSeconds); |
|||
const estimatedTimeForConfs = (coin.blockTimeInSeconds * confirmations); |
|||
|
|||
return { |
|||
...coin, |
|||
attackCost: { |
|||
hashrateCostPerSecond, |
|||
attackHourlyCost, |
|||
nicehasheable, |
|||
}, |
|||
bitcoinConfEquivalent: { |
|||
multiplier, |
|||
confirmations, |
|||
estimatedTimeForConfs, |
|||
}, |
|||
}; |
|||
}) |
|||
|
|||
return data; |
|||
}; |
|||
|
|||
module.exports = getData; |
@ -1,56 +0,0 @@ |
|||
const fetch = require('isomorphic-fetch'); |
|||
|
|||
const SECONDS = 1; |
|||
const MINUTES = SECONDS * 60; |
|||
const HOURS = MINUTES * 60; |
|||
const DAYS = HOURS * 24; |
|||
|
|||
const getData = async endpoint => fetch( |
|||
'https://api2.nicehash.com/main/api/v2/' + endpoint |
|||
).then(res => res.json()); |
|||
|
|||
const convertToUnit = (value, unit) => { |
|||
const unitExponent = [ |
|||
{units: ['H', 'G', 'SOL'], exponent: 0}, |
|||
{units: ['KH', 'KG', 'KSOL'], exponent: 1}, |
|||
{units: ['MSOL', 'MH'], exponent: 2}, |
|||
{units: ['GH'], exponent: 3}, |
|||
{units: ['TH'], exponent: 4}, |
|||
{units: ['PH'], exponent: 5} |
|||
]; |
|||
const {exponent} = unitExponent.find(value => value.units.includes(unit.toUpperCase())); |
|||
|
|||
return value / (1000 ** exponent); |
|||
}; |
|||
|
|||
const getNiceHashData = async () => { |
|||
const [algorithmData, currentValues] = await Promise.all([ |
|||
getData('mining/algorithms'), |
|||
getData('public/stats/global/current') |
|||
]); |
|||
|
|||
const algorithms = algorithmData.miningAlgorithms |
|||
.map(value => { |
|||
const algorithm = { |
|||
id: value.order, |
|||
name: value.title |
|||
}; |
|||
|
|||
const {marketFactor} = value; |
|||
const {displayMarketFactor} = value; |
|||
|
|||
const values = currentValues.algos.find(algo => algo.a === algorithm.id); |
|||
const pricePerHashPerDay = values.p / 100000000; |
|||
algorithm.pricePerHashPerSecond = pricePerHashPerDay / DAYS; |
|||
algorithm.hashrate = values.s; |
|||
|
|||
algorithm.priceReadable = (pricePerHashPerDay * marketFactor).toFixed(4) + ` BTC/${displayMarketFactor}/day`; |
|||
algorithm.hashrateReadable = convertToUnit(algorithm.hashrate, displayMarketFactor).toFixed(4) + ` ${displayMarketFactor}/s`; |
|||
|
|||
return algorithm; |
|||
}); |
|||
|
|||
return algorithms; |
|||
}; |
|||
|
|||
module.exports = getNiceHashData; |
@ -1,4 +1,58 @@ |
|||
const sendJson = require('../send-json'); |
|||
const getNiceHashData = require('.'); |
|||
const fetch = require('isomorphic-fetch'); |
|||
|
|||
exports.handler = () => sendJson(getNiceHashData); |
|||
const SECONDS = 1; |
|||
const MINUTES = SECONDS * 60; |
|||
const HOURS = MINUTES * 60; |
|||
const DAYS = HOURS * 24; |
|||
|
|||
const getData = async endpoint => fetch( |
|||
'https://api2.nicehash.com/main/api/v2/' + endpoint |
|||
).then(res => res.json()); |
|||
|
|||
const convertToUnit = (value, unit) => { |
|||
const unitExponent = [ |
|||
{units: ['H', 'G', 'SOL'], exponent: 0}, |
|||
{units: ['KH', 'KG', 'KSOL'], exponent: 1}, |
|||
{units: ['MSOL', 'MH'], exponent: 2}, |
|||
{units: ['GH'], exponent: 3}, |
|||
{units: ['TH'], exponent: 4}, |
|||
{units: ['PH'], exponent: 5} |
|||
]; |
|||
const {exponent} = unitExponent.find(value => value.units.includes(unit.toUpperCase())); |
|||
|
|||
return value / (1000 ** exponent); |
|||
}; |
|||
|
|||
const getNiceHashData = async () => { |
|||
const [algorithmData, currentValues] = await Promise.all([ |
|||
getData('mining/algorithms'), |
|||
getData('public/stats/global/current') |
|||
]); |
|||
|
|||
const algorithms = algorithmData.miningAlgorithms |
|||
.map(value => { |
|||
const algorithm = { |
|||
id: value.order, |
|||
name: value.title |
|||
}; |
|||
|
|||
const {marketFactor} = value; |
|||
const {displayMarketFactor} = value; |
|||
|
|||
const values = currentValues.algos.find(algo => algo.a === algorithm.id); |
|||
const pricePerHashPerDay = values.p / 100000000; |
|||
algorithm.pricePerHashPerSecond = pricePerHashPerDay / DAYS; |
|||
algorithm.hashrate = values.s; |
|||
|
|||
algorithm.priceReadable = (pricePerHashPerDay * marketFactor).toFixed(4) + ` BTC/${displayMarketFactor}/day`; |
|||
algorithm.hashrateReadable = convertToUnit(algorithm.hashrate, displayMarketFactor).toFixed(4) + ` ${displayMarketFactor}/s`; |
|||
|
|||
return algorithm; |
|||
}); |
|||
|
|||
return algorithms; |
|||
}; |
|||
|
|||
module.exports = getNiceHashData; |
|||
module.exports.handler = () => sendJson(getNiceHashData); |
|||
|
Loading…
Reference in new issue