From 7be7c3f8e67d7a3938b33b4fb66fa2ac3fda96ca Mon Sep 17 00:00:00 2001 From: Josh Harvey Date: Mon, 28 Mar 2016 00:52:15 +0200 Subject: [PATCH] kraken plugin WIP --- lib/plugins.js | 20 ++++++++++++----- lib/plugins/kraken.js | 51 +++++++++++++++++++++++++++++++++++++++++++ package.json | 12 ++++++---- 3 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 lib/plugins/kraken.js diff --git a/lib/plugins.js b/lib/plugins.js index 104e14cf..128abb5a 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -63,8 +63,12 @@ function loadPlugin (name, config) { try { plugin = require('lamassu-' + name) } catch (_) { - throw new Error(name + ' module is not installed. ' + - 'Try running \'npm install --save lamassu-' + name + '\' first') + try { + require('plugins/' + name) + } catch (_) { + throw new Error(name + ' module is not installed. ' + + 'Try running \'npm install --save lamassu-' + name + '\' first') + } } // each plugin MUST implement those @@ -116,8 +120,7 @@ function loadOrConfigPlugin (pluginHandle, pluginType, cryptoCoin, currency, if (!currentName) pluginHandle = null else { // some plugins may be disabled - var pluginConfig = cachedConfig.exchanges.plugins.settings[currentName] || - {} + var pluginConfig = cachedConfig.exchanges.plugins.settings[currentName] || {} if (currency) pluginConfig.currency = currency @@ -448,7 +451,14 @@ function pollRate (cryptoCoin, cb) { logger.debug('[%s] polling for rates (%s)', cryptoCoin, tickerPlugin.NAME) var tickerPlugin = tickerPlugins[cryptoCoin] - tickerPlugin.ticker(deviceCurrency, function (err, resRates) { + var currencies = deviceCurrency + if (typeof currencies === 'string') currencies = [currencies] + + var tickerF = cryptoCoin === 'BTC' + ? async.apply(tickerPlugin.ticker, currencies) + : async.apply(tickerPlugin.ticker, currencies, cryptoCoin) + + tickerF(function (err, resRates) { if (err) { logger.error(err) return cb && cb(err) diff --git a/lib/plugins/kraken.js b/lib/plugins/kraken.js new file mode 100644 index 00000000..29b61d8f --- /dev/null +++ b/lib/plugins/kraken.js @@ -0,0 +1,51 @@ +require('es6-promise').polyfill() +var axios = require('axios') +var _ = require('lodash') +var BigNumber = require('bignumber.js') +BigNumber.config({DECIMAL_PLACES: 30}) + +exports.NAME = 'Kraken' +exports.SUPPORTED_MODULES = ['ticker'] + +// var pluginConfig = {} + +// https://bitpay.com/api/rates + +exports.config = function config (localConfig) { +// pluginConfig = localConfig +} + +function findCurrency (fxRates, currency) { + return new BigNumber(_.find(fxRates, function (r) { return r.code === currency }).rate) +} + +exports.ticker = function ticker (currencies, cryptoCoin, callback) { + return axios.get('https://bitpay.com/api/rates') + .then(function (response) { + var fxRates = response.data + + return axios.get('https://api.kraken.com/0/public/Ticker?pair=ETHUSD') + .then(function (response2) { + var usdRate = findCurrency(fxRates, 'USD') + var rates = response2.data.result.XETHZUSD + var res = {} + var cryptoCoinFactor = new BigNumber(10).pow(cryptoCoin.unitScale) + + currencies.forEach(function (currency) { + var fxRate = findCurrency(fxRates, currency).div(usdRate) + res[currency] = { + ask: fxRate.times(rates.a[0]).div(cryptoCoinFactor), + bid: fxRate.times(rates.b[0]).div(cryptoCoinFactor) + } + }) + + callback(null, res) + }) + }) + .catch(callback) +} + +exports.ticker(['USD', 'ILS', 'EUR'], {unitScale: 18}, function (err, res) { + if (err) return console.log(err.stack) + console.log(JSON.stringify(res, null, 2)) +}) diff --git a/package.json b/package.json index 3fc9f4f5..b25ad8c9 100644 --- a/package.json +++ b/package.json @@ -10,23 +10,27 @@ }, "dependencies": { "async": "~0.2.9", + "axios": "^0.9.1", + "bignumber.js": "^2.3.0", + "bluebird": "^3.3.4", "bunyan": "~0.22.3", + "es6-promise": "^3.1.2", "express": "~3.4.7", "inquirer": "^0.8.0", "joi": "^5.1.0", "lamassu-bitcoinaverage": "~1.0.0", "lamassu-bitcoind": "^1.1.0", + "lamassu-bitgo": "^0.1.3", "lamassu-bitpay": "~1.0.0", "lamassu-bitstamp": "^1.0.2", "lamassu-blockchain": "^1.1.3", "lamassu-blockcypher": "~0.1.0", + "lamassu-coinapult": "^0.4.5", + "lamassu-coinbase": "^1.0.4", "lamassu-coindesk": "~1.0.0", + "lamassu-coinfloor": "^0.1.2", "lamassu-config": "~0.4.0", "lamassu-identitymind": "^1.0.1", - "lamassu-coinbase": "^1.0.4", - "lamassu-coinapult": "^0.4.5", - "lamassu-coinfloor": "^0.1.2", - "lamassu-bitgo": "^0.1.3", "lamassu-snapcard": "^0.1.7", "lodash": "^2.4.1", "minimist": "0.0.8",