diff --git a/lib/app.js b/lib/app.js index 88d3d17a..fcaf91a9 100644 --- a/lib/app.js +++ b/lib/app.js @@ -7,7 +7,7 @@ const loop = require('reoccur') const routes = require('./routes') const plugins = require('./plugins') const logger = require('./logger') -var argv = require('minimist')(process.argv.slice(2)) +const argv = require('minimist')(process.argv.slice(2)) const settingsLoader = require('./settings-loader') const options = require('./options') @@ -32,11 +32,8 @@ function runOnce () { const app = express() const localApp = express() - const seedPath = options.seedPath || './seeds/seed.txt' - plugins.init(seedPath) - return settingsLoader.load() - .then(settings => { + .then(() => { plugins.startPolling() plugins.startCheckingNotification() diff --git a/lib/email.js b/lib/email.js index 6afbe2c7..3674eaec 100644 --- a/lib/email.js +++ b/lib/email.js @@ -4,15 +4,15 @@ const settingsLoader = require('./settings-loader') function sendMessage (rec) { return Promise.resolve() .then(() => { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const pluginCode = configManager.unscoped(settings.config).extraServices.email if (!pluginCode) throw new Error('No email plugin defined') - const account = settings.accounts.plugin - const plugin = require('lamassu-' + plugin) + const account = settings.accounts[pluginCode] + const plugin = require('lamassu-' + pluginCode) return plugin.sendMessage(account, rec) }) } -module.exports({sendMessage}) +module.exports = {sendMessage} diff --git a/lib/exchange.js b/lib/exchange.js index 410465b8..2c678119 100644 --- a/lib/exchange.js +++ b/lib/exchange.js @@ -1,13 +1,20 @@ const configManager = require('./config-manager') const settingsLoader = require('./settings-loader') +function noExchangeError (cryptoCode) { + const err = new Error('No exchange plugin defined for: ' + cryptoCode) + err.name = 'NoExchangeError' + + return err +} + function fetchExchange (cryptoCode) { return Promise.resolve() .then(() => { - const settings = settingsLoader.settings - const plugin = configManager.cryptoScoped(cryptoCode, settings.config).cryptoServices.wallet - if (!plugin) throw new Error('No exchange plugin defined for: ' + cryptoCode) - const account = settings.accounts.plugin + const settings = settingsLoader.settings() + const plugin = configManager.cryptoScoped(cryptoCode, settings.config).cryptoServices.exchange + if (!plugin) throw noExchangeError(cryptoCode) + const account = settings.accounts[plugin] const exchange = require('lamassu-' + plugin) return {exchange, account} @@ -24,14 +31,7 @@ function sell (cryptoAtoms, fiatCode, cryptoCode) { .then(r => r.exchange.sell(r.account, cryptoAtoms, fiatCode, cryptoCode)) } -function active (cryptoCode) { - return fetchExchange(cryptoCode) - .then(() => true) - .catch(() => false) -} - module.exports = { buy, - sell, - active + sell } diff --git a/lib/logger.js b/lib/logger.js index bb2940d4..b90b7634 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -7,7 +7,7 @@ var logLevel = typeof process.env.LAMASSU_ENV === 'string' const logger = new winston.Logger({ level: logLevel, transports: [ - new (winston.transports.Console)({colorize: true}) + new (winston.transports.Console)({timestamp: true, colorize: true}) ] }) diff --git a/lib/notifier.js b/lib/notifier.js index 8e1f75fe..c23a9c32 100644 --- a/lib/notifier.js +++ b/lib/notifier.js @@ -4,7 +4,7 @@ const prettyMs = require('pretty-ms') const numeral = require('numeral') const configManager = require('./config-manager') -const settingsLoader = require('./settingsLoader') +const settingsLoader = require('./settings-loader') const db = require('./postgresql_interface') const STALE_STATE = 2 * 60 * 1000 @@ -27,7 +27,7 @@ function sameState (a, b) { } function checkBalance (rec) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.unscoped(settings.config) const lowBalanceThreshold = config.notifications.lowBalanceThreshold return lowBalanceThreshold && rec.fiatBalance < lowBalanceThreshold diff --git a/lib/plugins.js b/lib/plugins.js index ec2e6f05..777aa351 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -1,37 +1,35 @@ const uuid = require('uuid') const R = require('ramda') const BigNumber = require('bignumber.js') - -// Needed for BigNumber for now -global.crypto = require('crypto') -BigNumber.config({CRYPTO: true}) +const argv = require('minimist')(process.argv.slice(2)) +const crypto = require('crypto') const db = require('./postgresql_interface') const logger = require('./logger') const notifier = require('./notifier') const T = require('./time') const configManager = require('./config-manager') -const settingsLoader = require('./settingsLoader') +const settingsLoader = require('./settings-loader') const ticker = require('./ticker') const wallet = require('./wallet') const exchange = require('./exchange') const sms = require('./sms') const email = require('./email') -const CHECK_NOTIFICATION_INTERVAL = T.minute +const CHECK_NOTIFICATION_INTERVAL = 30 * T.seconds const ALERT_SEND_INTERVAL = T.hour const INCOMING_TX_INTERVAL = 30 * T.seconds const LIVE_INCOMING_TX_INTERVAL = 5 * T.seconds const STALE_INCOMING_TX_AGE = T.week const STALE_LIVE_INCOMING_TX_AGE = 10 * T.minutes -const UNNOTIFIED_INTERVAL = T.minute +const UNNOTIFIED_INTERVAL = 10 * T.seconds const MAX_NOTIFY_AGE = 2 * T.days const MIN_NOTIFY_AGE = 5 * T.minutes const TRANSACTION_EXPIRATION = 2 * T.days const SWEEP_LIVE_HD_INTERVAL = T.minute const SWEEP_OLD_HD_INTERVAL = 2 * T.minutes -const TRADE_INTERVAL = T.minute -const TRADE_TTL = 5 * T.minutes +const TRADE_INTERVAL = 10 * T.seconds +const TRADE_TTL = 2 * T.minutes const STALE_TICKER = 3 * 60 * 1000 const STALE_BALANCE = 3 * 60 * 1000 @@ -46,7 +44,7 @@ let alertFingerprint = null let lastAlertTime = null function buildRates (deviceId, tickers) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.machineScoped(deviceId, settings.config) const cryptoCodes = config.currencies.cryptoCurrencies @@ -69,7 +67,7 @@ function buildRates (deviceId, tickers) { } function buildBalances (deviceId, balanceRecs) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.machineScoped(deviceId, settings.config) const cryptoCodes = config.currencies.cryptoCurrencies @@ -103,7 +101,7 @@ function buildCartridges (cartridges, virtualCartridges, rec) { } function pollQueries (deviceTime, deviceId, deviceRec) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.machineScoped(deviceId, settings.config) const fiatCode = config.currencies.fiatCurrency const cryptoCodes = config.currencies.cryptoCurrencies @@ -157,13 +155,11 @@ function trade (deviceId, rawTrade) { const cryptoAtoms = rawTrade.cryptoAtoms return db.recordBill(deviceId, rawTrade) - .then(() => exchange.active(cryptoCode)) - .then(active => { - if (!active) return - + .then(() => { const market = [fiatCode, cryptoCode].join('') logger.debug('[%s] Pushing trade: %d', market, cryptoAtoms) + if (!tradesQueues[market]) tradesQueues[market] = [] tradesQueues[market].push({ fiatCode, cryptoAtoms, @@ -173,7 +169,7 @@ function trade (deviceId, rawTrade) { }) } -function stateChange (deviceId, deviceTime, rec, cb) { +function stateChange (deviceId, deviceTime, rec) { const event = { id: rec.uuid, deviceId: deviceId, @@ -225,7 +221,7 @@ function cashOut (deviceId, tx) { } function dispenseAck (deviceId, tx) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.machineScoped(deviceId, settings.config) const cartridges = [ config.currencies.topCashOutDenomination, config.currencies.bottomCashOutDenomination ] @@ -234,12 +230,12 @@ function dispenseAck (deviceId, tx) { } function fiatBalance (fiatCode, cryptoCode, deviceId) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.scoped(cryptoCode, deviceId, settings.config) - return Promise.all([ticker.ticker(cryptoCode), wallet.balance(cryptoCode)]) + return Promise.all([ticker.getRates(fiatCode, cryptoCode), wallet.balance(cryptoCode)]) .then(([rates, balanceRec]) => { - const rawRate = rates[cryptoCode].rates.ask + const rawRate = rates.rates.ask const commission = (new BigNumber(config.commissions.cashInCommission).div(100)).plus(1) const balance = balanceRec.balance @@ -324,37 +320,43 @@ function startPolling () { /* * Trader functions */ -function buy (trade) { - return exchange.buy(trade.cryptoAtoms, trade.fiatCode, trade.cryptoCode) -} function consolidateTrades (cryptoCode, fiatCode) { const market = [fiatCode, cryptoCode].join('') - if (tradesQueues[market].length === 0) return null + const marketTradesQueues = tradesQueues[market] + if (!marketTradesQueues || marketTradesQueues.length === 0) return null - logger.debug('[%s] tradesQueues size: %d', market, tradesQueues[market].length) - logger.debug('[%s] tradesQueues head: %j', market, tradesQueues[market][0]) + logger.debug('[%s] tradesQueues size: %d', market, marketTradesQueues.length) + logger.debug('[%s] tradesQueues head: %j', market, marketTradesQueues[0]) - const t0 = Date.now() + const t1 = Date.now() - const filtered = tradesQueues[market] - .filter(trade => t0 - trade.timestamp < TRADE_TTL) + const filtered = marketTradesQueues + .filter(trade => { + console.log('DEBUG33: %j, %s, %s, %s', trade, t1, trade.timestamp, TRADE_TTL) + return t1 - trade.timestamp < TRADE_TTL + }) - const filteredCount = tradesQueues[market].length - filtered.length + const filteredCount = marketTradesQueues.length - filtered.length if (filteredCount > 0) { tradesQueues[market] = filtered logger.debug('[%s] expired %d trades', market, filteredCount) } + if (filtered.length === 0) return null + const cryptoAtoms = filtered .reduce((prev, current) => prev.plus(current.cryptoAtoms), new BigNumber(0)) + const timestamp = filtered.map(r => r.timestamp).reduce((acc, r) => Math.max(acc, r), 0) + const consolidatedTrade = { fiatCode, cryptoAtoms, - cryptoCode + cryptoCode, + timestamp } tradesQueues[market] = [] @@ -364,8 +366,9 @@ function consolidateTrades (cryptoCode, fiatCode) { } function executeTrades () { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = settings.config + return db.devices() .then(devices => { const deviceIds = devices.map(device => device.device_id) @@ -397,18 +400,18 @@ function executeTradesForMarket (settings, fiatCode, cryptoCode) { } logger.debug('[%s] making a trade: %d', market, trade.cryptoAtoms.toString()) - return buy(trade) + + return exchange.buy(trade.cryptoAtoms, trade.fiatCode, trade.cryptoCode) + .then(() => logger.debug('[%s] Successful trade.', market)) .catch(err => { tradesQueues[market].push(trade) + if (err.name === 'NoExchangeError') return logger.debug(err.message) logger.error(err) }) - .then(() => { - logger.debug('[%s] Successful trade.', market) - }) } function sendMessage (rec) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const notifications = configManager.unscoped(settings.config).notifications let promises = [] @@ -471,7 +474,7 @@ function checkNotification () { } function checkDeviceBalances (deviceId) { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.machineScoped(deviceId, settings.config) const cryptoCodes = config.currencies.cryptoCurrencies const fiatCode = config.currencies.fiatCurrency @@ -498,7 +501,7 @@ function checkBalances () { .then(arr => { const toMarket = r => r.fiatBalance + r.cryptoCode const min = R.minBy(r => r.fiatBalance) - return R.reduceBy(min, Infinity, toMarket, R.flatten(arr)) + return R.values(R.reduceBy(min, Infinity, toMarket, R.flatten(arr))) }) }) } @@ -509,23 +512,24 @@ function startCheckingNotification (config) { setInterval(checkNotification, CHECK_NOTIFICATION_INTERVAL) } +function randomCode () { + return new BigNumber(crypto.randomBytes(3).toString('hex'), 16).shift(-6).toFixed(6).slice(-6) +} + function getPhoneCode (phone) { - return sms.code() - .then(pluginCode => { - const code = pluginCode === 'mock-sms' - ? '123' - : BigNumber.random().toFixed(6).slice(2) + const code = argv.mockSms + ? '123' + : randomCode() - const rec = { - sms: { - toNumber: phone, - body: 'Your cryptomat code: ' + code - } + const rec = { + sms: { + toNumber: phone, + body: 'Your cryptomat code: ' + code } + } - return sms.sendMessage(rec) - .then(() => code) - }) + return sms.sendMessage(rec) + .then(() => code) } function fetchPhoneTx (phone) { diff --git a/lib/postgresql_interface.js b/lib/postgresql_interface.js index 252dac33..e6803a9a 100644 --- a/lib/postgresql_interface.js +++ b/lib/postgresql_interface.js @@ -351,7 +351,7 @@ exports.updateTxStatus = function updateTxStatus (tx, status) { }) } -exports.updateRedeem = function updateRedeem (txId) { +exports.registerRedeem = function registerRedeem (txId) { const sql = 'UPDATE cash_out_txs SET redeem=$1 WHERE id=$2' const values = [true, txId] diff --git a/lib/routes.js b/lib/routes.js index 87052f00..be801dad 100644 --- a/lib/routes.js +++ b/lib/routes.js @@ -9,7 +9,7 @@ const configManager = require('./config-manager') const db = require('./db') const dbm = require('./postgresql_interface') const pairing = require('./pairing') -const settingsLoader = require('./settings') +const settingsLoader = require('./settings-loader') let plugins @@ -27,12 +27,12 @@ function poll (req, res, next) { const deviceId = req.deviceId const deviceTime = req.deviceTime const pid = req.query.pid - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = configManager.machineScoped(deviceId, settings.config) pids[deviceId] = {pid, ts: Date.now()} - plugins.pollQueries(settings, deviceTime, deviceId, req.query) + plugins.pollQueries(deviceTime, deviceId, req.query) .then(results => { const cartridges = results.cartridges @@ -40,7 +40,7 @@ function poll (req, res, next) { const langs = config.languages.machineLanguages const locale = { - fiatCode: config.currencies.fiatCode, + fiatCode: config.currencies.fiatCurrency, localeInfo: { primaryLocale: langs[0], primaryLocales: langs @@ -248,7 +248,10 @@ function updateCachedAction (req, body, status) { } function errorHandler (err, req, res, next) { - const statusCode = err.code || 500 + const statusCode = err.name === 'HttpError' + ? err.code || 500 + : 500 + const json = {error: err.message} logger.error(err) @@ -301,9 +304,9 @@ function authorize (req, res, next) { return next() } - throw new Error('Unauthorized') + throw httpError('Unauthorized', 403) }) - .catch(e => res.status(403).end()) + .catch(next) } function init (opts) { diff --git a/lib/settings-loader.js b/lib/settings-loader.js index 72162e67..a407df18 100644 --- a/lib/settings-loader.js +++ b/lib/settings-loader.js @@ -2,7 +2,7 @@ const R = require('ramda') const db = require('./db') -let settings +let settingsCache function load () { return Promise.all([ @@ -10,15 +10,15 @@ function load () { loadAccounts() ]) .then(function ([data, accounts]) { - settings = { + settingsCache = { config: data.data, accounts: accounts } - return settings + return settingsCache }) .catch(err => { - settings = undefined + settingsCache = undefined throw err }) } @@ -34,6 +34,10 @@ function loadAccounts () { }) } +function settings () { + return settingsCache +} + module.exports = { settings, load diff --git a/lib/sms.js b/lib/sms.js index 0c91b822..87de165c 100644 --- a/lib/sms.js +++ b/lib/sms.js @@ -4,15 +4,15 @@ const settingsLoader = require('./settings-loader') function sendMessage (rec) { return Promise.resolve() .then(() => { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const pluginCode = configManager.unscoped(settings.config).extraServices.sms if (!pluginCode) throw new Error('No sms plugin defined') - const account = settings.accounts.plugin - const plugin = require('lamassu-' + plugin) + const account = settings.accounts[pluginCode] + const plugin = require('lamassu-' + pluginCode) return plugin.sendMessage(account, rec) }) } -module.exports({sendMessage}) +module.exports = {sendMessage} diff --git a/lib/ticker.js b/lib/ticker.js index e417a894..993b9cc3 100644 --- a/lib/ticker.js +++ b/lib/ticker.js @@ -6,10 +6,10 @@ const FETCH_INTERVAL = 10000 function getRates (fiatCode, cryptoCode) { return Promise.resolve() .then(() => { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const config = settings.config const plugin = configManager.cryptoScoped(cryptoCode, config).cryptoServices.ticker - const account = settings.accounts.plugin + const account = settings.accounts[plugin] const ticker = require('lamassu-' + plugin) return ticker.ticker(account, fiatCode, cryptoCode) diff --git a/lib/wallet.js b/lib/wallet.js index 0bfe2d18..ac831b9c 100644 --- a/lib/wallet.js +++ b/lib/wallet.js @@ -7,9 +7,9 @@ const FETCH_INTERVAL = 5000 function fetchWallet (cryptoCode) { return Promise.resolve() .then(() => { - const settings = settingsLoader.settings + const settings = settingsLoader.settings() const plugin = configManager.cryptoScoped(cryptoCode, settings.config).cryptoServices.wallet - const account = settings.accounts.plugin + const account = settings.accounts[plugin] const wallet = require('lamassu-' + plugin) return {wallet, account} @@ -38,9 +38,9 @@ function newAddress (cryptoCode, info) { .then(r => r.wallet.newAddress(r.account, cryptoCode, info)) } -function getStatus (toAdress, cryptoAtoms, cryptoCode) { +function getStatus (toAddress, cryptoAtoms, cryptoCode) { return fetchWallet(cryptoCode) - .then(r => r.wallet.getStatus(r.account, toAdress, cryptoAtoms, cryptoCode)) + .then(r => r.wallet.getStatus(r.account, toAddress, cryptoAtoms, cryptoCode)) } module.exports = { diff --git a/package.json b/package.json index 14f9e73c..8044d4a7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "node-hkdf-sync": "^1.0.0", "numeral": "^1.5.3", "pg": "^6.1.0", - "pg-promise": "^5.3.5", + "pg-promise": "^5.4.4", "pify": "^2.3.0", "pretty-ms": "^2.1.0", "ramda": "^0.22.1", diff --git a/yarn.lock b/yarn.lock index cc4ffe12..23c542b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -158,6 +158,10 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +big.js@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + bigi@^1.1.0, bigi@^1.4.0: version "1.4.2" resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" @@ -178,7 +182,7 @@ bindings@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" -bip66@^1.1.0: +bip66@^1.1.0, bip66@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.4.tgz#8a59f8ae16eccb94681c3c2a7b224774605aadfb" @@ -202,12 +206,13 @@ bitcoinjs-lib@2.1.4: typeforce "^1.5.5" wif "^1.1.0" -bitgo@^1.5.4: - version "1.8.0" - resolved "https://registry.yarnpkg.com/bitgo/-/bitgo-1.8.0.tgz#f7180fe377139dd062b0829e0290250ce22d51fd" +bitgo@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/bitgo/-/bitgo-2.0.4.tgz#83757c8cbb8481b5011c50b1eea4769d52ebabf6" dependencies: argparse "^0.1.16" assert "0.4.9" + big.js "^3.1.3" bigi "1.4.0" bitcoinjs-lib "2.1.4" body-parser "^1.10.2" @@ -215,9 +220,12 @@ bitgo@^1.5.4: bs58check "1.0.4" create-hmac "^1.1.4" ecurve "^1.0.2" + ethereumjs-abi "^0.6.2" + ethereumjs-util "^4.4.1" express "^4.11.1" http-proxy "1.11.1" - lodash "3.7.0" + keccakjs "^0.2.1" + lodash "4.13.1" minimist "0.2.0" moment "^2.11.2" morgan "1.5.3" @@ -238,7 +246,7 @@ bluebird@*, bluebird@^3.3.5: version "3.4.6" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" -bn.js@^4.10.0, bn.js@^4.4.0: +bn.js@^4.10.0, bn.js@^4.11.3, bn.js@^4.4.0, bn.js@^4.8.0: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" @@ -288,6 +296,12 @@ browserify-aes@^1.0.6: evp_bytestokey "^1.0.0" inherits "^2.0.1" +browserify-sha3@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.1.tgz#3ff34a3006ef15c0fb3567e541b91a2340123d11" + dependencies: + js-sha3 "^0.3.1" + bs58@^2.0.1, bs58@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d" @@ -619,7 +633,7 @@ dont-sniff-mimetype@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz#5932890dc9f4e2f19e5eb02a20026e5e5efc8f58" -drbg.js@^1.0.0: +drbg.js@^1.0.0, drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" dependencies: @@ -715,6 +729,23 @@ etag@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" +ethereumjs-abi@^0.6.2: + version "0.6.4" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.4.tgz#9ba1bb056492d00c27279f6eccd4d58275912c1a" + dependencies: + bn.js "^4.10.0" + ethereumjs-util "^4.3.0" + +ethereumjs-util@^4.3.0, ethereumjs-util@^4.4.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6" + dependencies: + bn.js "^4.8.0" + create-hash "^1.1.2" + keccakjs "^0.2.0" + rlp "^2.0.0" + secp256k1 "^3.0.1" + eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" @@ -1154,6 +1185,10 @@ jodid25519@^1.0.0: dependencies: jsbn "~0.1.0" +js-sha3@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.3.1.tgz#86122802142f0828502a0d1dee1d95e253bb0243" + jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" @@ -1234,6 +1269,13 @@ jws@^3.0.0: jwa "^1.1.4" safe-buffer "^5.0.1" +keccakjs@^0.2.0, keccakjs@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.1.tgz#1d633af907ef305bbf9f2fa616d56c44561dfa4d" + dependencies: + browserify-sha3 "^0.0.1" + sha3 "^1.1.0" + kind-of@^3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" @@ -1354,9 +1396,9 @@ lodash@^4.14.0, lodash@^4.17.2: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" -lodash@3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" +lodash@4.13.1: + version "4.13.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.13.1.tgz#83e4b10913f48496d4d16fec4a560af2ee744b68" longest@^1.0.1: version "1.0.1" @@ -1497,11 +1539,7 @@ ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" -mute-stream@~0.0.4: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" - -nan@^2.2.0: +nan@^2.0.5, nan@^2.2.0, nan@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" @@ -1687,9 +1725,9 @@ pg-pool@1.*: generic-pool "2.4.2" object-assign "4.1.0" -pg-promise@^5.3.5: - version "5.4.3" - resolved "https://registry.yarnpkg.com/pg-promise/-/pg-promise-5.4.3.tgz#4b5a91dccdcb8dafd0699a660c2ad80af59e17b9" +pg-promise: + version "5.4.4" + resolved "https://registry.yarnpkg.com/pg-promise/-/pg-promise-5.4.4.tgz#9c8ba780734981cb83d11aeda9fc70a3d66449b5" dependencies: manakin "0.4" pg "5.1" @@ -1824,12 +1862,6 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -promptly@~0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/promptly/-/promptly-0.2.1.tgz#6444e7ca4dbd9899e7eeb5ec3922827ebdc22b3b" - dependencies: - read "~1.0.4" - proxy-addr@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" @@ -1925,12 +1957,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read@~1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - dependencies: - mute-stream "~0.0.4" - readable-stream@^2.0.5, readable-stream@2: version "2.2.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" @@ -2104,6 +2130,10 @@ ripemd160@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" +rlp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.0.0.tgz#9db384ff4b89a8f61563d92395d8625b18f3afb0" + safe-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" @@ -2112,6 +2142,18 @@ scmp@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/scmp/-/scmp-0.0.3.tgz#3648df2d7294641e7f78673ffc29681d9bad9073" +secp256k1@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.2.2.tgz#2103620789ca2c9b79650cdf8cfc9c542be36597" + dependencies: + bindings "^1.2.1" + bip66 "^1.1.3" + bn.js "^4.11.3" + create-hash "^1.1.2" + drbg.js "^1.0.1" + elliptic "^6.2.3" + nan "^2.2.1" + secp256k1@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.0.1.tgz#1e9205135a4ed3503150dd00e7a4eb219f2900b3" @@ -2175,6 +2217,12 @@ sha.js@^2.3.6: dependencies: inherits "^2.0.1" +sha3@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.0.tgz#6989f1b70a498705876a373e2c62ace96aa9399a" + dependencies: + nan "^2.0.5" + signal-exit@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81"