diff --git a/lib/email.js b/lib/email.js index afa2353f..0809e150 100644 --- a/lib/email.js +++ b/lib/email.js @@ -1,13 +1,12 @@ const configManager = require('./config-manager') +const ph = require('./plugin-helper') function sendMessage (settings, rec) { return Promise.resolve() .then(() => { const pluginCode = configManager.unscoped(settings.config).email - - if (!pluginCode) throw new Error('No email plugin defined') + const plugin = ph.load(ph.EMAIL, pluginCode) const account = settings.accounts[pluginCode] - const plugin = require('lamassu-' + pluginCode) return plugin.sendMessage(account, rec) }) diff --git a/lib/exchange.js b/lib/exchange.js index e1cdae93..02cc5b3d 100644 --- a/lib/exchange.js +++ b/lib/exchange.js @@ -1,11 +1,5 @@ const configManager = require('./config-manager') - -function noExchangeError (cryptoCode) { - const err = new Error('No exchange plugin defined for: ' + cryptoCode) - err.name = 'NoExchangeError' - - return err -} +const ph = require('./plugin-helper') function lookupExchange (settings, cryptoCode) { return configManager.cryptoScoped(cryptoCode, settings.config).exchange @@ -15,9 +9,8 @@ function fetchExchange (settings, cryptoCode) { return Promise.resolve() .then(() => { const plugin = lookupExchange(settings, cryptoCode) - if (!plugin) throw noExchangeError(cryptoCode) + const exchange = ph.load(ph.EXCHANGE, plugin) const account = settings.accounts[plugin] - const exchange = require('lamassu-' + plugin) return {exchange, account} }) diff --git a/lib/plugin-helper.js b/lib/plugin-helper.js new file mode 100644 index 00000000..81ae46c1 --- /dev/null +++ b/lib/plugin-helper.js @@ -0,0 +1,23 @@ +const _ = require('lodash/fp') + +module.exports = { + load, + TICKER: 'ticker', + EXCHANGE: 'exchange', + WALLET: 'wallet', + SMS: 'sms', + EMAIL: 'email' +} + +function load (type, pluginCode) { + const me = module.exports + if (!_.includes(type, [me.TICKER, me.EXCHANGE, me.WALLET, me.SMS, me.EMAIL])) { + throw new Error(`Unallowed plugin type: ${type}`) + } + + if (pluginCode.search(/[a-z0-9\-]/) === -1) { + throw new Error(`Unallowed plugin name: ${pluginCode}`) + } + + return require(`./plugins/${type}/${pluginCode}/${pluginCode}`) +} diff --git a/lib/plugins.js b/lib/plugins.js index 32376b5d..405a8560 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -366,7 +366,6 @@ function plugins (settings, deviceId) { return executeTradeForType(tradeEntry) .catch(err => { tradesQueues[market].push(tradeEntry) - if (err.name === 'NoExchangeError') return logger.debug(err.message) if (err.name === 'orderTooSmall') return logger.debug(err.message) logger.error(err) }) diff --git a/lib/plugins/common/bitstamp.js b/lib/plugins/common/bitstamp.js new file mode 100644 index 00000000..d2f945c2 --- /dev/null +++ b/lib/plugins/common/bitstamp.js @@ -0,0 +1,81 @@ +'use strict' + +const querystring = require('querystring') +const axios = require('axios') +const crypto = require('crypto') +const _ = require('lodash') + +const API_ENDPOINT = 'https://www.bitstamp.net/api/v2' + +let counter = -1 +let lastTimestamp = Date.now() + +function pad (num) { + const asString = num.toString(10) + if (num < 10) return '00' + asString + if (num < 100) return '0' + asString + return asString +} + +function generateNonce () { + const timestamp = Date.now() + if (timestamp !== lastTimestamp) counter = -1 + lastTimestamp = timestamp + counter = (counter + 1) % 1000 + return timestamp.toString(10) + pad(counter) +} + +function authRequest (config, path, data) { + if (!config.key || !config.secret || !config.clientId) { + const err = new Error('Must provide key, secret and client ID') + return Promise.reject(err) + } + + data = data || {} + + const nonce = generateNonce() + const msg = [nonce, config.clientId, config.key].join('') + + const signature = crypto + .createHmac('sha256', Buffer.from(config.secret)) + .update(msg) + .digest('hex') + .toUpperCase() + + _.merge(data, { + key: config.key, + signature: signature, + nonce: nonce + }) + + return request(path, 'POST', data) +} + +function buildMarket (fiatCode, cryptoCode) { + if (cryptoCode !== 'BTC') throw new Error('Unsupported crypto: ' + cryptoCode) + if (fiatCode === 'USD') return 'btcusd' + if (fiatCode === 'EUR') return 'btceur' + throw new Error('Unsupported fiat: ' + fiatCode) +} + +function request (path, method, data) { + const options = { + method: method, + url: API_ENDPOINT + path + '/', + headers: { + 'User-Agent': 'Mozilla/4.0 (compatible; Lamassu client)', + 'Content-Type': 'application/x-www-form-urlencoded' + } + } + + if (data) options.data = querystring.stringify(data) + + return axios(options) + .then(r => r.data) +} + +module.exports = { + authRequest, + request, + buildMarket +} diff --git a/lib/plugins/common/kraken.js b/lib/plugins/common/kraken.js new file mode 100644 index 00000000..fbf34fb8 --- /dev/null +++ b/lib/plugins/common/kraken.js @@ -0,0 +1,17 @@ +var BigNumber = require('bignumber.js') + +var TEN = new BigNumber(10) + +var UNIT_SCALES = { + BTC: 8, + ETH: 18 +} + +function unitScale (cryptoCoin) { + return UNIT_SCALES[cryptoCoin] +} + +exports.toUnit = function toUnit (cryptoAtoms, cryptoCoin) { + var scale = TEN.pow(unitScale(cryptoCoin)) + return cryptoAtoms.div(scale) +} diff --git a/lib/plugins/email/mailjet/mailjet.js b/lib/plugins/email/mailjet/mailjet.js new file mode 100644 index 00000000..b1a9451c --- /dev/null +++ b/lib/plugins/email/mailjet/mailjet.js @@ -0,0 +1,23 @@ +const Mailjet = require('node-mailjet') + +const NAME = 'Mailjet' + +function sendMessage (account, rec) { + const mailjet = Mailjet.connect(account.apiKey, account.apiSecret) + const sendEmail = mailjet.post('send') + + const emailData = { + FromEmail: account.fromEmail, + FromName: 'Lamassu Server', + Subject: rec.email.subject, + 'Text-part': rec.email.body, + Recipients: [{'Email': account.toEmail}] + } + + return sendEmail.request(emailData) +} + +module.exports = { + NAME, + sendMessage +} diff --git a/lib/plugins/email/mailjet/schema.json b/lib/plugins/email/mailjet/schema.json new file mode 100644 index 00000000..c02e09e2 --- /dev/null +++ b/lib/plugins/email/mailjet/schema.json @@ -0,0 +1,34 @@ +{ + "code": "mailjet", + "display": "Mailjet", + "fields": [ + { + "code": "apiKey", + "display": "API key", + "fieldType": "string", + "required": true, + "value": "" + }, + { + "code": "apiSecret", + "display": "API secret", + "fieldType": "password", + "required": true, + "value": "" + }, + { + "code": "fromEmail", + "display": "From email", + "fieldType": "string", + "required": true, + "value": "" + }, + { + "code": "toEmail", + "display": "To email", + "fieldType": "string", + "required": true, + "value": "" + } + ] +} diff --git a/lib/plugins/exchange/bitstamp/bitstamp.js b/lib/plugins/exchange/bitstamp/bitstamp.js new file mode 100644 index 00000000..eef6102f --- /dev/null +++ b/lib/plugins/exchange/bitstamp/bitstamp.js @@ -0,0 +1,44 @@ +const common = require('../common/bitstamp') + +const SATOSHI_SHIFT = 8 + +function buy (account, cryptoAtoms, fiatCode, cryptoCode) { + return trade('buy', account, cryptoAtoms, fiatCode, cryptoCode) +} + +function sell (account, cryptoAtoms, fiatCode, cryptoCode) { + return trade('sell', account, cryptoAtoms, fiatCode, cryptoCode) +} + +function handleErrors (data) { + if (!data.reason || !data.reason.__all__) return data + + const err = new Error(data.reason.__all__[0]) + + if (data.reason.__all__[0].indexOf('Minimum order size is') === 0) { + err.name = 'orderTooSmall' + } + + throw err +} + +function trade (type, account, cryptoAtoms, fiatCode, cryptoCode) { + try { + const market = common.buildMarket(fiatCode, cryptoCode) + const options = {amount: cryptoAtoms.shift(-SATOSHI_SHIFT).toFixed(8)} + + return common.authRequest(account, '/' + type + '/market/' + market, options) + .catch(e => { + if (e.response) handleErrors(e.response.data) + throw e + }) + .then(handleErrors) + } catch (e) { + return Promise.reject(e) + } +} + +module.exports = { + buy, + sell +} diff --git a/lib/plugins/exchange/bitstamp/schema.json b/lib/plugins/exchange/bitstamp/schema.json new file mode 100644 index 00000000..6cd43a81 --- /dev/null +++ b/lib/plugins/exchange/bitstamp/schema.json @@ -0,0 +1,27 @@ +{ + "code": "bitstamp", + "display": "Bitstamp", + "fields": [ + { + "code": "clientId", + "display": "Client ID", + "fieldType": "string", + "required": true, + "value": "" + }, + { + "code": "key", + "display": "API key", + "fieldType": "string", + "required": true, + "value": "" + }, + { + "code": "secret", + "display": "API secret", + "fieldType": "password", + "required": true, + "value": "" + } + ] +} diff --git a/lib/plugins/exchange/kraken/kraken.js b/lib/plugins/exchange/kraken/kraken.js new file mode 100644 index 00000000..d939a4bc --- /dev/null +++ b/lib/plugins/exchange/kraken/kraken.js @@ -0,0 +1,54 @@ +const Kraken = require('kraken-api') +const coinmath = require('../common/kraken') + +var PAIRS = { + BTC: { + USD: 'XXBTZUSD', + EUR: 'XXBTZEUR' + }, + ETH: { + USD: 'XETHZUSD', + EUR: 'XETHZEUR' + } +} + +module.exports = {buy, sell} + +function buy (account, cryptoAtoms, fiatCode, cryptoCode) { + return trade(account, 'buy', cryptoAtoms, fiatCode, cryptoCode) +} + +function sell (account, cryptoAtoms, fiatCode, cryptoCode) { + return trade(account, 'sell', cryptoAtoms, fiatCode, cryptoCode) +} + +function trade (account, type, cryptoAtoms, fiatCode, cryptoCode) { + const kraken = new Kraken(account.key, account.secret) + const amount = coinmath.toUnit(cryptoAtoms, cryptoCode) + + if (amount.lte('0.01')) { + const err = new Error('Order size too small') + err.name = 'orderTooSmall' + return Promise.reject(err) + } + + const amountStr = amount.toFixed(6) + const pair = PAIRS[cryptoCode][fiatCode] + + var orderInfo = { + pair: pair, + type: type, + ordertype: 'market', + volume: amountStr, + expiretm: '+60' + } + + kraken.api('AddOrder', orderInfo, function (error, response) { + if (error) { + // TODO: handle: EOrder:Order minimum not met (volume too low) + return Promise.reject(error) + } else { + return Promise.resolve() + } + }) +} diff --git a/lib/plugins/exchange/mock-exchange/mock-exchange.js b/lib/plugins/exchange/mock-exchange/mock-exchange.js new file mode 100644 index 00000000..42c3e9a2 --- /dev/null +++ b/lib/plugins/exchange/mock-exchange/mock-exchange.js @@ -0,0 +1,14 @@ +module.exports = { + buy, + sell +} + +function buy (account, cryptoAtoms, fiatCode, cryptoCode) { + console.log('[mock] buying %s %s for %s', cryptoAtoms.toString(), cryptoCode, fiatCode) + return Promise.resolve() +} + +function sell (account, cryptoAtoms, fiatCode, cryptoCode) { + console.log('[mock] selling %s %s for %s', cryptoAtoms.toString(), cryptoCode, fiatCode) + return Promise.resolve() +} diff --git a/lib/plugins/sms/mock-sms/mock-sms.js b/lib/plugins/sms/mock-sms/mock-sms.js new file mode 100644 index 00000000..d571582f --- /dev/null +++ b/lib/plugins/sms/mock-sms/mock-sms.js @@ -0,0 +1,6 @@ +exports.NAME = 'MockSMS' + +exports.sendMessage = function sendMessage (account, rec) { + console.log('Sending SMS: %j', rec) + return Promise.resolve() +} diff --git a/lib/plugins/sms/twilio/schema.json b/lib/plugins/sms/twilio/schema.json new file mode 100644 index 00000000..20a6e57e --- /dev/null +++ b/lib/plugins/sms/twilio/schema.json @@ -0,0 +1,34 @@ +{ + "code": "twilio", + "display": "Twilio", + "fields": [ + { + "code": "accountSid", + "display": "Account SID", + "fieldType": "string", + "required": true, + "value": "" + }, + { + "code": "authToken", + "display": "Auth token", + "fieldType": "password", + "required": true, + "value": "" + }, + { + "code": "fromNumber", + "display": "From number", + "fieldType": "string", + "required": true, + "value": "" + }, + { + "code": "toNumber", + "display": "To number", + "fieldType": "string", + "required": true, + "value": "" + } + ] +} diff --git a/lib/plugins/sms/twilio/twilio.js b/lib/plugins/sms/twilio/twilio.js new file mode 100644 index 00000000..d9ba2b14 --- /dev/null +++ b/lib/plugins/sms/twilio/twilio.js @@ -0,0 +1,33 @@ +const Client = require('twilio') +const _ = require('lodash/fp') + +const NAME = 'Twilio' + +const BAD_NUMBER_CODES = [21201, 21202, 21211, 21214, 21216, 21217, 21219, 21408, + 21610, 21612, 21614, 21608] + +function sendMessage (account, rec) { + const client = Client(account.accountSid, account.authToken) + const body = rec.sms.body + const _toNumber = rec.sms.toNumber || account.toNumber + + return client.sendMessage({ + body: body, + to: _toNumber, + from: account.fromNumber + }) + .catch(err => { + if (_.includes(err.code, BAD_NUMBER_CODES)) { + const badNumberError = new Error(err.message) + badNumberError.name = 'BadNumberError' + throw badNumberError + } + + throw new Error(err.message) + }) +} + +module.exports = { + NAME, + sendMessage +} diff --git a/lib/plugins/ticker/bitpay/bitpay.js b/lib/plugins/ticker/bitpay/bitpay.js new file mode 100644 index 00000000..8bb49126 --- /dev/null +++ b/lib/plugins/ticker/bitpay/bitpay.js @@ -0,0 +1,25 @@ +const axios = require('axios') +const BN = require('../../../bn') + +function ticker (account, fiatCode, cryptoCode) { + if (cryptoCode !== 'BTC') { + return Promise.reject('Unsupported crypto: ' + cryptoCode) + } + + return axios.get('https://bitpay.com/api/rates/' + fiatCode) + .then(r => { + const data = r.data + const price = BN(data.rate) + return { + rates: { + ask: price, + bid: price + } + } + }) +} + +module.exports = { + ticker, + name: 'BitPay' +} diff --git a/lib/plugins/ticker/bitstamp/bitstamp.js b/lib/plugins/ticker/bitstamp/bitstamp.js new file mode 100644 index 00000000..2fd408db --- /dev/null +++ b/lib/plugins/ticker/bitstamp/bitstamp.js @@ -0,0 +1,26 @@ +const BN = require('../../../bn') +const common = require('../common/bitstamp') + +function ticker (account, fiatCode, cryptoCode) { + return Promise.resolve() + .then(() => { + if (cryptoCode !== 'BTC') { + throw new Error('Unsupported crypto: ' + cryptoCode) + } + }) + .then(() => { + const market = common.buildMarket(fiatCode, cryptoCode) + return common.request('/ticker/' + market, 'GET') + }) + .then(r => ({ + rates: { + ask: BN(r.ask), + bid: BN(r.bid) + } + })) +} + +module.exports = { + ticker +} + diff --git a/lib/plugins/ticker/kraken/kraken.js b/lib/plugins/ticker/kraken/kraken.js new file mode 100644 index 00000000..05600059 --- /dev/null +++ b/lib/plugins/ticker/kraken/kraken.js @@ -0,0 +1,60 @@ +const axios = require('axios') +const _ = require('lodash/fp') + +const BN = require('../../../bn') + +exports.NAME = 'Kraken' +exports.SUPPORTED_MODULES = ['ticker'] + +const PAIRS = { + BTC: { + USD: 'XXBTZUSD', + EUR: 'XXBTZEUR' + }, + ETH: { + USD: 'XETHZUSD', + EUR: 'XETHZEUR' + } +} + +function findCurrency (fxRates, fiatCode) { + const rates = _.find(_.matchesProperty('code', fiatCode), fxRates) + if (!rates || !rates.rate) throw new Error(`Unsupported currency: ${fiatCode}`) + return BN(rates.rate) +} + +exports.ticker = function ticker (account, fiatCode, cryptoCode) { + if (fiatCode === 'USD' || fiatCode === 'EUR') { + return getCurrencyRates(fiatCode, cryptoCode) + } + + return axios.get('https://bitpay.com/api/rates') + .then(response => { + const fxRates = response.data + const usdRate = findCurrency(fxRates, 'USD') + const fxRate = findCurrency(fxRates, fiatCode).div(usdRate) + + return getCurrencyRates('USD', cryptoCode) + .then(res => ({ + rates: { + ask: res.rates.ask.times(fxRate), + bid: res.rates.bid.times(fxRate) + } + })) + }) +} + +function getCurrencyRates (fiatCode, cryptoCode) { + const pair = PAIRS[cryptoCode][fiatCode] + + return axios.get('https://api.kraken.com/0/public/Ticker?pair=' + pair) + .then(function (response) { + const rates = response.data.result[pair] + return { + rates: { + ask: BN(rates.a[0]), + bid: BN(rates.b[0]) + } + } + }) +} diff --git a/lib/plugins/wallet/bitcoind/bitcoind.js b/lib/plugins/wallet/bitcoind/bitcoind.js new file mode 100644 index 00000000..cda8814b --- /dev/null +++ b/lib/plugins/wallet/bitcoind/bitcoind.js @@ -0,0 +1,146 @@ +const path = require('path') +const os = require('os') +const RpcClient = require('bitcoind-rpc') +const fs = require('fs') +const pify = require('pify') + +const BN = require('../../../bn') + +const NAME = 'Bitcoind' + +const SATOSHI_SHIFT = 8 + +const configPath = path.resolve(os.homedir(), '.bitcoin', 'bitcoin.conf') +const pluginConfig = { + account: '', + bitcoindConfigurationPath: configPath +} + +function initRpc () { + const bitcoindConf = parseConf(pluginConfig.bitcoindConfigurationPath) + + const rpcConfig = { + protocol: 'http', + user: bitcoindConf.rpcuser, + pass: bitcoindConf.rpcpassword + } + + return new RpcClient(rpcConfig) +} + +function richError (msg, name) { + const err = new Error(msg) + err.name = name + return err +} + +/* + * initialize RpcClient + */ +function parseConf (confPath) { + const conf = fs.readFileSync(confPath) + const lines = conf.toString().split('\n') + + const res = {} + for (let i = 0; i < lines.length; i++) { + const keyVal = lines[i].split('=') + + // skip when value is empty + if (!keyVal[1]) continue + + res[keyVal[0]] = keyVal[1] + } + + return res +} + +function checkCryptoCode (cryptoCode) { + if (cryptoCode !== 'BTC') throw new Error('Unsupported crypto: ' + cryptoCode) +} + +// We want a balance that includes all spends (0 conf) but only deposits that +// have at least 1 confirmation. getbalance does this for us automatically. +function balance (account, cryptoCode) { + return new Promise((resolve, reject) => { + checkCryptoCode(cryptoCode) + const rpc = initRpc() + rpc.getBalance(pluginConfig.account, 1, (err, result) => { + if (err) return reject(err) + + if (result.error) { + return reject(richError(result.error, 'bitcoindError')) + } + + resolve(BN(result.result).shift(SATOSHI_SHIFT).round()) + }) + }) +} + +function sendCoins (account, address, cryptoAtoms, cryptoCode) { + const rpc = initRpc() + const confirmations = 1 + const bitcoins = cryptoAtoms.shift(-SATOSHI_SHIFT).toFixed(8) + + return new Promise((resolve, reject) => { + checkCryptoCode(cryptoCode) + rpc.sendFrom(pluginConfig.account, address, bitcoins, confirmations, (err, result) => { + if (err) { + if (err.code === -6) { + return reject(richError('Insufficient funds', 'InsufficientFunds')) + } + + if (err instanceof Error) { + return reject(err) + } + + return reject(richError(err.message, 'bitcoindError')) + } + + resolve(result.result) + }) + }) +} + +function newAddress (account, cryptoCode, info) { + return new Promise((resolve, reject) => { + checkCryptoCode(cryptoCode) + const rpc = initRpc() + rpc.getNewAddress((err, result) => { + if (err) return reject(err) + resolve(result.result) + }) + }) +} + +function addressBalance (address, confs) { + const rpc = initRpc() + return pify(rpc.getReceivedByAddress.bind(rpc))(address, confs) + .then(r => BN(r.result).shift(SATOSHI_SHIFT).round()) +} + +const confirmedBalance = address => addressBalance(address, 1) +const pendingBalance = address => addressBalance(address, 0) + +function getStatus (account, toAddress, requested, cryptoCode) { + return Promise.resolve() + .then(() => checkCryptoCode(cryptoCode)) + .then(() => confirmedBalance(toAddress)) + .then(confirmed => { + if (confirmed.gte(requested)) return {status: 'confirmed'} + + return pendingBalance(toAddress) + .then(pending => { + if (pending.gte(requested)) return {status: 'authorized'} + if (pending.gt(0)) return {status: 'insufficientFunds'} + return {status: 'notSeen'} + }) + }) +} + +module.exports = { + NAME, + balance, + sendCoins, + newAddress, + getStatus +} diff --git a/lib/plugins/wallet/bitgo/bitgo.js b/lib/plugins/wallet/bitgo/bitgo.js new file mode 100644 index 00000000..59d9e854 --- /dev/null +++ b/lib/plugins/wallet/bitgo/bitgo.js @@ -0,0 +1,91 @@ +const BitGo = require('bitgo') +const BN = require('../../../bn') + +const pjson = require('../../../package.json') +const userAgent = 'Lamassu-Server/' + pjson.version + +const NAME = 'BitGo' + +function buildBitgo (account) { + return new BitGo.BitGo({accessToken: account.token, env: 'prod', userAgent: userAgent}) +} + +function getWallet (account) { + const bitgo = buildBitgo(account) + return bitgo.wallets().get({ id: account.walletId }) +} + +function checkCryptoCode (cryptoCode) { + if (cryptoCode !== 'BTC') { + return Promise.reject(new Error('Unsupported crypto: ' + cryptoCode)) + } + + return Promise.resolve() +} + +function sendCoins (account, address, cryptoAtoms, cryptoCode) { + return checkCryptoCode(cryptoCode) + .then(() => getWallet(account)) + .then(wallet => { + const params = { + address: address, + amount: cryptoAtoms.toNumber(), + walletPassphrase: account.walletPassphrase + } + return wallet.sendCoins(params) + }) + .then(result => { + return result.hash + }) + .catch(err => { + if (err.message === 'Insufficient funds') { + err.name = 'InsufficientFunds' + } + throw err + }) +} + +function balance (account, cryptoCode) { + return checkCryptoCode(cryptoCode) + .then(() => getWallet(account)) + .then(wallet => BN(wallet.wallet.spendableConfirmedBalance)) +} + +function newAddress (account, cryptoCode, info) { + return checkCryptoCode(cryptoCode) + .then(() => getWallet(account)) + .then(wallet => { + return wallet.createAddress() + .then(result => { + const address = result.address + + // If a label was provided, set the label + if (info.label) { + return wallet.setLabel({ address: address, label: info.label }) + .then(() => address) + } + + return address + }) + }) +} + +function getStatus (account, toAddress, requested, cryptoCode) { + const bitgo = buildBitgo(account) + return checkCryptoCode(cryptoCode) + .then(() => bitgo.blockchain().getAddress({address: toAddress})) + .then(rec => { + if (rec.balance === 0) return {status: 'notSeen'} + if (requested.gt(rec.balance)) return {status: 'insufficientFunds'} + if (requested.gt(rec.confirmedBalance)) return {status: 'authorized'} + return {status: 'confirmed'} + }) +} + +module.exports = { + NAME, + balance, + sendCoins, + newAddress, + getStatus +} diff --git a/lib/plugins/wallet/bitgo/schema.json b/lib/plugins/wallet/bitgo/schema.json new file mode 100644 index 00000000..494f38d2 --- /dev/null +++ b/lib/plugins/wallet/bitgo/schema.json @@ -0,0 +1,30 @@ +{ + "code": "bitgo", + "display": "BitGo", + "fields": [ + { + "code": "token", + "display": "API token", + "fieldType": "string", + "secret": true, + "required": true, + "value": "" + }, + { + "code": "walletId", + "display": "Wallet ID", + "fieldType": "string", + "secret": false, + "required": true, + "value": "" + }, + { + "code": "walletPassphrase", + "display": "Wallet passphrase", + "fieldType": "string", + "secret": true, + "required": true, + "value": "" + } + ] +} diff --git a/lib/plugins/wallet/mock-wallet/mock-wallet.js b/lib/plugins/wallet/mock-wallet/mock-wallet.js new file mode 100644 index 00000000..3ffce98d --- /dev/null +++ b/lib/plugins/wallet/mock-wallet/mock-wallet.js @@ -0,0 +1,53 @@ +const BN = require('../../../bn') + +const NAME = 'FakeWallet' + +const SECONDS = 1000 +const UNSEEN_TIME = 6 * SECONDS +const PUBLISH_TIME = 12 * SECONDS +const AUTHORIZE_TIME = 60 * SECONDS + +let t0 + +function balance (account, cryptoCode) { + return Promise.resolve() + .then(() => { + if (cryptoCode === 'BTC') return BN(1e8 * 10) + if (cryptoCode === 'ETH') return BN(1e18 * 10) + throw new Error('Unsupported crypto: ' + cryptoCode) + }) +} + +function sendCoins (account, toAddress, cryptoAtoms, cryptoCode) { + return new Promise(resolve => { + setTimeout(() => { + console.log('[%s] DEBUG: Mock wallet sending %s cryptoAtoms to %s', + cryptoCode, cryptoAtoms.toString(), toAddress) + resolve('') + }, 2000) + }) +} + +function newAddress () { + t0 = Date.now() + return Promise.resolve('') +} + +function getStatus (account, toAddress, cryptoAtoms, cryptoCode) { + const elapsed = Date.now() - t0 + + if (elapsed < UNSEEN_TIME) return Promise.resolve({status: 'notSeen'}) + if (elapsed < PUBLISH_TIME) return Promise.resolve({status: 'published'}) + if (elapsed < AUTHORIZE_TIME) return Promise.resolve({status: 'authorized'}) + + console.log('[%s] DEBUG: Mock wallet has confirmed transaction', cryptoCode) + return Promise.resolve({status: 'confirmed'}) +} + +module.exports = { + NAME, + balance, + sendCoins, + newAddress, + getStatus +} diff --git a/lib/sms.js b/lib/sms.js index 189282bc..f340a162 100644 --- a/lib/sms.js +++ b/lib/sms.js @@ -1,13 +1,12 @@ const configManager = require('./config-manager') +const ph = require('./plugin-helper') function sendMessage (settings, rec) { return Promise.resolve() .then(() => { const pluginCode = configManager.unscoped(settings.config).sms - - if (!pluginCode) throw new Error('No sms plugin defined') + const plugin = ph.load(ph.SMS, pluginCode) const account = settings.accounts[pluginCode] - const plugin = require('lamassu-' + pluginCode) return plugin.sendMessage(account, rec) }) diff --git a/lib/ticker.js b/lib/ticker.js index 16754f2f..50d79e3d 100644 --- a/lib/ticker.js +++ b/lib/ticker.js @@ -1,5 +1,6 @@ const mem = require('mem') const configManager = require('./config-manager') +const ph = require('./plugin-helper') const FETCH_INTERVAL = 10000 function getRates (settings, fiatCode, cryptoCode) { @@ -8,10 +9,8 @@ function getRates (settings, fiatCode, cryptoCode) { const config = settings.config const plugin = configManager.cryptoScoped(cryptoCode, config).ticker - if (!plugin) throw new Error('No ticker plugin defined') - const account = settings.accounts[plugin] - const ticker = require('lamassu-' + plugin) + const ticker = ph.load(ph.TICKER, plugin) return ticker.ticker(account, fiatCode, cryptoCode) .then(r => ({ diff --git a/lib/wallet.js b/lib/wallet.js index 9c1c8767..b500db7f 100644 --- a/lib/wallet.js +++ b/lib/wallet.js @@ -6,6 +6,7 @@ const configManager = require('./config-manager') const pify = require('pify') const fs = pify(require('fs')) const options = require('./options') +const ph = require('./plugin-helper') const FETCH_INTERVAL = 5000 const INSUFFICIENT_FUNDS_CODE = 570 @@ -29,8 +30,8 @@ function fetchWallet (settings, cryptoCode) { .then(hex => { const masterSeed = Buffer.from(hex.trim(), 'hex') const plugin = configManager.cryptoScoped(cryptoCode, settings.config).wallet + const wallet = ph.load(ph.WALLET, plugin) const account = settings.accounts[plugin] - const wallet = require('lamassu-' + plugin) return {wallet, account: _.set('seed', computeSeed(masterSeed), account)} }) diff --git a/package.json b/package.json index eddd33d6..fe2c2917 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,11 @@ "license": "Unlicense", "author": "Lamassu (https://lamassu.is)", "dependencies": { + "axios": "^0.16.1", + "base-x": "^3.0.0", "bignumber.js": "^4.0.1", "bip39": "^2.3.0", + "bitcoind-rpc": "^0.7.0", "body-parser": "^1.15.1", "cookie-parser": "^1.4.3", "express": "^4.13.4", @@ -15,16 +18,6 @@ "express-rate-limit": "^2.6.0", "got": "^6.6.3", "helmet": "^3.1.0", - "lamassu-bitcoind": "lamassu/lamassu-bitcoind#alpha", - "lamassu-bitgo": "lamassu/lamassu-bitgo#alpha", - "lamassu-bitpay": "lamassu/lamassu-bitpay#alpha", - "lamassu-bitstamp": "lamassu/lamassu-bitstamp#alpha", - "lamassu-kraken": "^1.1.1", - "lamassu-mailjet": "lamassu/lamassu-mailjet", - "lamassu-mock-id-verify": "lamassu/lamassu-mock-id-verify", - "lamassu-mock-sms": "lamassu/lamassu-mock-sms", - "lamassu-mock-wallet": "lamassu/lamassu-mock-wallet", - "lamassu-twilio": "lamassu/lamassu-twilio", "lodash": "^4.17.2", "mem": "^1.1.0", "migrate": "^0.2.2", @@ -32,6 +25,7 @@ "moment": "^2.17.0", "morgan": "^1.7.0", "node-hkdf-sync": "^1.0.0", + "node-mailjet": "^3.0.6", "numeral": "^2.0.3", "pg": "^6.1.2", "pg-native": "latest", diff --git a/yarn.lock b/yarn.lock index 9824ce12..a62bae27 100644 --- a/yarn.lock +++ b/yarn.lock @@ -130,13 +130,6 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.0 || ^1.1.13" -argparse@^0.1.16: - version "0.1.16" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" - dependencies: - underscore "~1.7.0" - underscore.string "~2.4.0" - argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" @@ -203,12 +196,6 @@ assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assert@0.4.9: - version "0.4.9" - resolved "https://registry.yarnpkg.com/assert/-/assert-0.4.9.tgz#45faff1a58f718508118873dead940c8b51db939" - dependencies: - util ">= 0.4.9" - ast-traverse@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" @@ -229,7 +216,7 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^1.4.0, async@^1.5.2: +async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -346,13 +333,7 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -axios@^0.15.2: - version "0.15.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.15.3.tgz#2c9d638b2e191a08ea1d6cc988eadd6ba5bdc053" - dependencies: - follow-redirects "1.0.0" - -axios@^0.16.0: +axios@^0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.1.tgz#c0b6d26600842384b8f509e57111f0d2df8223ca" dependencies: @@ -656,9 +637,9 @@ balanced-match@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" -base-x@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac" +base-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.0.tgz#77b56f0311070b780b3c8a5f534beac47e506702" base64-arraybuffer@0.1.5: version "0.1.5" @@ -668,14 +649,6 @@ base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" -base64url@2.0.0, base64url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" - -basic-auth@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" - basic-auth@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" @@ -692,18 +665,6 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" -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.4.0, bigi@^1.1.0, bigi@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.0.tgz#90ac1aeac0a531216463bdb58f42c1e05c8407ac" - -bignumber.js@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-3.1.2.tgz#f3bdb99ad5268a15fc1f0bed2fb018e2693fe236" - bignumber.js@^4.0.0, bignumber.js@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.0.1.tgz#1ffd30d349366e078bd6f7dc97907e6da9a71888" @@ -712,7 +673,7 @@ binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" -bindings@1.2.1, bindings@^1.2.1: +bindings@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" @@ -725,67 +686,10 @@ bip39@^2.3.0: randombytes "^2.0.1" unorm "^1.3.3" -bip66@^1.1.0, bip66@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.4.tgz#8a59f8ae16eccb94681c3c2a7b224774605aadfb" - bitcoind-rpc@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/bitcoind-rpc/-/bitcoind-rpc-0.7.0.tgz#dbf6249267ee328be48de57787042980092c8bf2" -bitcoinjs-lib@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/bitcoinjs-lib/-/bitcoinjs-lib-2.1.4.tgz#d4fc235b065aa19c48e11d9136eeab07b38c1534" - dependencies: - bigi "^1.4.0" - bip66 "^1.1.0" - bs58check "^1.0.5" - buffer-equals "^1.0.3" - buffer-reverse "^1.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.3" - ecurve "^1.0.0" - randombytes "^2.0.1" - typeforce "^1.5.5" - wif "^1.1.0" - -bitgo@^2.0.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/bitgo/-/bitgo-2.2.4.tgz#7a9c21457ee9ab01b987d1d1eacad1b4b7c34302" - 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" - bs58 "2.0.1" - bs58check "1.0.4" - create-hmac "^1.1.4" - ecurve "^1.0.2" - eol "0.5.0" - express "^4.11.1" - http-proxy "1.11.1" - lodash "4.13.1" - minimist "0.2.0" - moment "^2.11.2" - morgan "1.5.3" - q "1.1.2" - sanitize-html "1.13.0" - superagent "^1.4.0" - superagent-proxy "^1.0.0" - underscore.string "2.4.0" - optionalDependencies: - ethereumjs-abi "^0.6.2" - ethereumjs-util "^4.4.1" - secp256k1 "3.2.5" - -bl@^1.0.0, bl@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" - dependencies: - readable-stream "~2.0.5" - blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" @@ -800,11 +704,7 @@ bluebird@^3.0.0, bluebird@^3.3.5: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" -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" - -body-parser@^1.10.2, body-parser@^1.15.1: +body-parser@^1.15.1: version "1.17.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47" dependencies: @@ -856,65 +756,10 @@ breakable@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browserify-aes@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" - dependencies: - buffer-xor "^1.0.2" - cipher-base "^1.0.0" - create-hash "^1.1.0" - 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" - -bs58@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-3.1.0.tgz#d4c26388bf4804cac714141b1945aa47e5eb248e" - dependencies: - base-x "^1.1.0" - -bs58check@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-1.0.4.tgz#94180ab90821fe250496151f60d0eb3d9f321198" - dependencies: - bs58 "^2.0.1" - -bs58check@^1.0.5, bs58check@^1.0.6: - version "1.3.4" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-1.3.4.tgz#c52540073749117714fa042c3047eb8f9151cbf8" - dependencies: - bs58 "^3.1.0" - create-hash "^1.1.0" - buf-compare@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - -buffer-equals@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/buffer-equals/-/buffer-equals-1.0.4.tgz#0353b54fd07fd9564170671ae6f66b9cf10d27f5" - -buffer-reverse@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" - buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -923,10 +768,6 @@ buffer-writer@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" -buffer-xor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -987,10 +828,6 @@ capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1035,15 +872,11 @@ chokidar@^1.4.2: optionalDependencies: fsevents "^1.0.0" -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - ci-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" -cipher-base@^1.0.0, cipher-base@^1.0.1: +cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" dependencies: @@ -1134,7 +967,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@^2.5.0, commander@^2.9.0: +commander@^2.5.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: @@ -1170,7 +1003,7 @@ component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" -component-emitter@1.2.1, component-emitter@^1.2.0, component-emitter@~1.2.0: +component-emitter@1.2.1, component-emitter@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -1243,7 +1076,7 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" -cookiejar@2.0.6, cookiejar@^2.0.6: +cookiejar@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.0.6.tgz#0abf356ad00d1c5a219d88d44518046dd026acfe" @@ -1268,7 +1101,7 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" -create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: +create-hash@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad" dependencies: @@ -1277,7 +1110,7 @@ create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: ripemd160 "^1.0.0" sha.js "^2.3.6" -create-hmac@^1.1.2, create-hmac@^1.1.3, create-hmac@^1.1.4: +create-hmac@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170" dependencies: @@ -1347,13 +1180,13 @@ dateformat@^1.0.12: get-stdin "^4.0.1" meow "^3.3.0" -debug@2, debug@2.6.3, debug@^2.1.1, debug@^2.2.0, debug@^2.4.5: +debug@2, debug@2.6.3, debug@^2.1.1: version "2.6.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" dependencies: ms "0.7.2" -debug@2.2.0, debug@~2.2.0: +debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1365,7 +1198,7 @@ debug@2.3.3: dependencies: ms "0.7.2" -debug@2.6.1: +debug@2.6.1, debug@^2.2.0, debug@^2.4.5: version "2.6.1" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" dependencies: @@ -1432,14 +1265,6 @@ depd@1.1.0, depd@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" -depd@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.0.1.tgz#80aec64c9d6d97e65cc2a9caa93c0aa6abf73aaa" - -deprecate@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/deprecate/-/deprecate-0.1.0.tgz#c49058612dc6c8e5145eafe4839b8c2c7d041c14" - destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -1469,34 +1294,6 @@ dns-prefetch-control@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" -dom-serializer@0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" - -domelementtype@1, domelementtype@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - -domhandler@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" - dependencies: - domelementtype "1" - -domutils@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - dependencies: - dom-serializer "0" - domelementtype "1" - 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" @@ -1507,14 +1304,6 @@ dot-prop@^4.1.0: dependencies: is-obj "^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: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -1525,39 +1314,10 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" -ecdsa-sig-formatter@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" - dependencies: - base64url "^2.0.0" - safe-buffer "^5.0.1" - -ecurve@^1.0.0, ecurve@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ecurve/-/ecurve-1.0.5.tgz#d148e8fe50a674f983bb5bae09da0ea23e10535e" - dependencies: - bigi "^1.1.0" - -ee-first@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.0.tgz#6a0d7c6221e490feefd92ec3f441c9ce8cd097f4" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -elliptic@^6.2.3: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - empower-core@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.1.tgz#6c187f502fcef7554d57933396aac655483772b1" @@ -1569,12 +1329,6 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" - dependencies: - once "^1.4.0" - engine.io-client@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab" @@ -1614,14 +1368,6 @@ engine.io@1.8.3: engine.io-parser "1.3.2" ws "1.1.2" -entities@^1.1.1, entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" - -eol@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/eol/-/eol-0.5.0.tgz#7544ee1c9cefcac6041286abac1e7f5e5b36f10c" - equal-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" @@ -1698,33 +1444,6 @@ etag@~1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" -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" - -evp_bytestokey@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" - dependencies: - create-hash "^1.1.1" - execa@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" @@ -1760,10 +1479,6 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expand-template@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.0.3.tgz#6c303323177a62b1b22c070279f7861287b69b1a" - express-limiter@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/express-limiter/-/express-limiter-1.6.0.tgz#142753588f785b731551603d214415bc79da697a" @@ -1774,7 +1489,7 @@ express-rate-limit@^2.6.0: dependencies: defaults "^1.0.3" -express@^4.11.1, express@^4.13.4: +express@^4.13.4: version "4.15.2" resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35" dependencies: @@ -1807,7 +1522,7 @@ express@^4.11.1, express@^4.13.4: utils-merge "1.0.0" vary "~1.1.0" -extend@3, extend@3.0.0, extend@^3.0.0, extend@~3.0.0: +extend@3, extend@^3.0.0, extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" @@ -1902,12 +1617,6 @@ fn-name@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" -follow-redirects@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.0.0.tgz#8e34298cbd2e176f254effec75a1c78cc849fd37" - dependencies: - debug "^2.2.0" - follow-redirects@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.3.tgz#01abaeca85e3609837d9fcda3167a7e42fdaca21" @@ -1928,15 +1637,7 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@1.0.0-rc3: - version "1.0.0-rc3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc3.tgz#d35bc62e7fbc2937ae78f948aaa0d38d90607577" - dependencies: - async "^1.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.3" - -form-data@1.0.0-rc4, form-data@~1.0.0-rc4: +form-data@1.0.0-rc4: version "1.0.0-rc4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc4.tgz#05ac6bc22227b43e4461f488161554699d4f8b5e" dependencies: @@ -1952,7 +1653,7 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -formidable@^1.0.17, formidable@~1.0.14: +formidable@^1.0.17: version "1.0.17" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" @@ -2016,16 +1717,6 @@ gauge@~2.7.1: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - generic-pool@2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.2.tgz#886bc5bf0beb7db96e81bcbba078818de5a62683" @@ -2070,10 +1761,6 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -2150,15 +1837,6 @@ har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" @@ -2202,12 +1880,6 @@ has-yarn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7" -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" - dependencies: - inherits "^2.0.1" - hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -2248,14 +1920,6 @@ hide-powered-by@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b" -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" @@ -2281,17 +1945,6 @@ hsts@2.0.0: dependencies: core-util-is "1.0.2" -htmlparser2@^3.9.0: - version "3.9.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" - dependencies: - domelementtype "^1.3.0" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^2.0.2" - http-errors@~1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" @@ -2309,13 +1962,6 @@ http-proxy-agent@1: debug "2" extend "3" -http-proxy@1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.11.1.tgz#71df55757e802d58ea810df2244019dda05ae85d" - dependencies: - eventemitter3 "1.x.x" - requires-port "0.x.x" - http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2391,10 +2037,6 @@ inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" @@ -2495,15 +2137,6 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" -is-my-json-valid@^2.12.4: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -2540,10 +2173,6 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -2661,10 +2290,6 @@ 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" - js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" @@ -2720,17 +2345,6 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - -jsonwebtoken@5.4.x: - version "5.4.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-5.4.1.tgz#2055c639195ffe56314fa6a51df02468186a9695" - dependencies: - jws "^3.0.0" - ms "^0.7.1" - jsprim@^1.2.2: version "1.4.0" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" @@ -2740,118 +2354,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" -jwa@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" - dependencies: - base64url "2.0.0" - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.9" - safe-buffer "^5.0.1" - -jws@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" - dependencies: - base64url "^2.0.0" - jwa "^1.1.4" - safe-buffer "^5.0.1" - -keccakjs@^0.2.0: - 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.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" dependencies: is-buffer "^1.0.2" -kraken-api@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/kraken-api/-/kraken-api-0.1.7.tgz#b752435e6917ba71d9e734a5fed3fa5961622de8" - dependencies: - querystring ">=0.2.0" - request ">=2.27.0" - -lamassu-bitcoind@lamassu/lamassu-bitcoind#alpha: - version "1.1.1" - resolved "https://codeload.github.com/lamassu/lamassu-bitcoind/tar.gz/6790f844641b72893ea586cabf0d04dcd027b179" - dependencies: - bignumber.js "^3.0.1" - bitcoind-rpc "^0.7.0" - pify "^2.3.0" - -lamassu-bitgo@lamassu/lamassu-bitgo#alpha: - version "0.2.2" - resolved "https://codeload.github.com/lamassu/lamassu-bitgo/tar.gz/703f1dd7336c3ed3adf9286442736e7a3a1bc4ab" - dependencies: - bignumber.js "^3.0.1" - bitgo "^2.0.4" - lodash "^4.17.2" - -lamassu-bitpay@lamassu/lamassu-bitpay#alpha: - version "2.0.0" - resolved "https://codeload.github.com/lamassu/lamassu-bitpay/tar.gz/72b6b624e33578289cf164ded29908152df4bbeb" - dependencies: - axios "^0.15.2" - bignumber.js "^3.0.1" - -lamassu-bitstamp@lamassu/lamassu-bitstamp#alpha: - version "1.0.5" - resolved "https://codeload.github.com/lamassu/lamassu-bitstamp/tar.gz/29ad2f651c16d86365680931d4e8f9143c494cd4" - dependencies: - axios "^0.15.2" - bignumber.js "^3.0.1" - lodash "^4.17.2" - -lamassu-config@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/lamassu-config/-/lamassu-config-0.4.4.tgz#013923537c4cc132e6704da6854cc2cdb9945ca8" - dependencies: - lodash "^2.4.1" - pg "^4.5.5" - -lamassu-kraken@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/lamassu-kraken/-/lamassu-kraken-1.1.1.tgz#8f11775efb021196b2f0f306c03b4403d9ec07e7" - dependencies: - axios "^0.16.0" - bignumber.js "^4.0.0" - kraken-api "^0.1.7" - lamassu-config "^0.4.4" - lodash "^4.8.1" - -lamassu-mailjet@lamassu/lamassu-mailjet: - version "1.0.1" - resolved "https://codeload.github.com/lamassu/lamassu-mailjet/tar.gz/79b3fcca2052de06f8f19a6d46b96a5c79e2a65a" - dependencies: - node-mailjet "^3.0.6" - -lamassu-mock-id-verify@lamassu/lamassu-mock-id-verify: - version "1.0.1" - resolved "https://codeload.github.com/lamassu/lamassu-mock-id-verify/tar.gz/f2b6b785f1d36a8d3e059e06722e7e7d9208d72e" - -lamassu-mock-sms@lamassu/lamassu-mock-sms: - version "1.0.1" - resolved "https://codeload.github.com/lamassu/lamassu-mock-sms/tar.gz/206fa1edb8fe2635d2fba8b8e81b9029c9dd9141" - -lamassu-mock-wallet@lamassu/lamassu-mock-wallet: - version "1.1.0" - resolved "https://codeload.github.com/lamassu/lamassu-mock-wallet/tar.gz/bd43d9a57594ed4567f31b59994d3bcb622d952f" - dependencies: - bignumber.js "^3.0.1" - -lamassu-twilio@lamassu/lamassu-twilio: - version "1.1.4" - resolved "https://codeload.github.com/lamassu/lamassu-twilio/tar.gz/b56fe387da448f2ee4549a9bd3173e4cfe8a28b3" - dependencies: - ramda "^0.21.0" - twilio "^2.11.1" - last-line-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/last-line-stream/-/last-line-stream-1.0.0.tgz#d1b64d69f86ff24af2d04883a2ceee14520a5600" @@ -2958,15 +2466,7 @@ lodash.reduce@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" -lodash@4.13.1: - version "4.13.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.13.1.tgz#83e4b10913f48496d4d16fec4a560af2ee744b68" - -lodash@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" - -lodash@^4.17.2, lodash@^4.2.0, lodash@^4.8.1: +lodash@^4.17.2, lodash@^4.2.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3061,7 +2561,7 @@ merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" -methods@^1.1.1, methods@~1.1.1, methods@~1.1.2: +methods@^1.1.1, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -3093,7 +2593,7 @@ mime-db@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" -mime-types@^2.1.10, mime-types@^2.1.12, mime-types@^2.1.3, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: +mime-types@^2.1.10, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: version "2.1.15" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" dependencies: @@ -3107,14 +2607,6 @@ mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" @@ -3125,10 +2617,6 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -3139,19 +2627,10 @@ minimist@^1.1.3, minimist@^1.2.0: dependencies: minimist "0.0.8" -moment@^2.11.2, moment@^2.17.0: +moment@^2.17.0: version "2.18.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" -morgan@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.5.3.tgz#8adb4e72f9e5c5436e5d93f42910835f79da9fdf" - dependencies: - basic-auth "~1.0.1" - debug "~2.2.0" - depd "~1.0.1" - on-finished "~2.2.1" - morgan@^1.7.0: version "1.8.1" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.1.tgz#f93023d3887bd27b78dfd6023cea7892ee27a4b1" @@ -3179,7 +2658,7 @@ multimatch@^2.1.0: arrify "^1.0.0" minimatch "^3.0.0" -nan@^2.0.5, nan@^2.2.1, nan@^2.3.0: +nan@^2.3.0: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" @@ -3199,10 +2678,6 @@ nocache@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980" -node-abi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.0.0.tgz#443bfd151b599231028ae425e592e76cd31cb537" - node-hkdf-sync@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-hkdf-sync/-/node-hkdf-sync-1.0.0.tgz#657d798641c003f91037b68a3595e05be736d99a" @@ -3233,14 +2708,6 @@ node-pre-gyp@^0.6.29: tar "^2.2.1" tar-pack "^3.4.0" -node-uuid@~1.4.7: - version "1.4.8" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" - -noop-logger@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -3275,7 +2742,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.1, npmlog@^4.0.2: +npmlog@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" dependencies: @@ -3318,12 +2785,6 @@ observable-to-promise@^0.5.0: is-observable "^0.2.0" symbol-observable "^1.0.4" -on-finished@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.2.1.tgz#5c85c1cc36299f78029653f667f27b6b99ebc029" - dependencies: - ee-first "1.1.0" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -3334,7 +2795,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -3367,7 +2828,7 @@ options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -3597,18 +3058,6 @@ pg@5.1: pgpass "0.0.6" semver "4.3.2" -pg@^4.5.5: - version "4.5.6" - resolved "https://registry.yarnpkg.com/pg/-/pg-4.5.6.tgz#a1de4878afa5cb208a25815f5ff89d2e0ebf52f8" - dependencies: - buffer-writer "1.0.1" - generic-pool "2.4.2" - packet-reader "0.2.0" - pg-connection-string "0.1.3" - pg-types "1.*" - pgpass "0.0.3" - semver "^4.1.0" - pg@^6.1.2: version "6.1.5" resolved "https://registry.yarnpkg.com/pg/-/pg-6.1.5.tgz#204fa40c1252ab7220d7cf6992886b20d77862b8" @@ -3621,12 +3070,6 @@ pg@^6.1.2: pgpass "1.x" semver "4.3.2" -pgpass@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-0.0.3.tgz#12e67e343b3189c2f31206ebc9cc0befffcf9140" - dependencies: - split "~0.3" - pgpass@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-0.0.6.tgz#f6276200d01739da1eea63138bdca35ff4bd7280" @@ -3690,25 +3133,6 @@ plur@^2.0.0: dependencies: irregular-plurals "^1.0.0" -prebuild-install@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.1.2.tgz#d9ae0ca85330e03962d93292f95a8b44c2ebf505" - dependencies: - expand-template "^1.0.2" - github-from-package "0.0.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - node-abi "^2.0.0" - noop-logger "^0.1.1" - npmlog "^4.0.1" - os-homedir "^1.0.1" - pump "^1.0.1" - rc "^1.1.6" - simple-get "^1.4.2" - tar-fs "^1.13.0" - tunnel-agent "^0.4.3" - xtend "4.0.1" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3773,29 +3197,14 @@ pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -pump@^1.0.0, pump@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@0.9.7: - version "0.9.7" - resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75" - -q@1.1.2, q@^1.1.2: +q@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/q/-/q-1.1.2.tgz#6357e291206701d99f197ab84e57e8ad196f2a89" -qs@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" - qs@6.4.0, qs@^6.1.0, qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -3804,18 +3213,6 @@ qs@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" -qs@~6.2.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" - -querystring@>=0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -ramda@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" - ramda@^0.22.1: version "0.22.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.22.1.tgz#031da0c3df417c5b33c96234757eb37033f36a0e" @@ -3882,15 +3279,6 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@1.0.27-1: - version "1.0.27-1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.27-1.tgz#6b67983c20357cefd07f0165001a16d710d91078" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@1.0.31: version "1.0.31" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.31.tgz#8f2502e0bc9e3b0da1b94520aabb4e2603ecafae" @@ -3909,7 +3297,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@2, readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.4, readable-stream@^2.1.5: +readable-stream@2, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.4, readable-stream@^2.1.5: version "2.2.9" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" dependencies: @@ -3921,17 +3309,6 @@ readable-stream@2, readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", string_decoder "~1.0.0" util-deprecate "~1.0.1" -readable-stream@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -3966,10 +3343,6 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -reduce-component@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/reduce-component/-/reduce-component-1.0.1.tgz#e0c93542c574521bea13df0f9488ed82ab77c5da" - referrer-policy@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.1.0.tgz#35774eb735bf50fb6c078e83334b472350207d79" @@ -4005,10 +3378,6 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" -regexp-quote@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/regexp-quote/-/regexp-quote-0.0.0.tgz#1e0f4650c862dcbfed54fd42b148e9bb1721fcf2" - regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -4063,33 +3432,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2.74.x: - version "2.74.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - bl "~1.1.2" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~1.0.0-rc4" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - node-uuid "~1.4.7" - oauth-sign "~0.8.1" - qs "~6.2.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - -request@>=2.27.0, request@^2.81.0: +request@^2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -4120,10 +3463,6 @@ require-precompiled@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" -requires-port@0.x.x: - version "0.0.1" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d" - resolve-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-1.0.0.tgz#4eaeea41ed040d1702457df64a42b2b07d246f9f" @@ -4157,46 +3496,17 @@ 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" -sanitize-html@1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.13.0.tgz#4ee17cbec516bfe32f2ce6686a569d7e6b4f3631" - dependencies: - htmlparser2 "^3.9.0" - regexp-quote "0.0.0" - xtend "^4.0.0" - -scmp@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/scmp/-/scmp-0.0.3.tgz#3648df2d7294641e7f78673ffc29681d9bad9073" - -secp256k1@3.2.5, secp256k1@^3.0.1: - version "3.2.5" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.2.5.tgz#0dde5b27e5021665f6dffca7b2c3e010c6c13c93" - 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" - prebuild-install "^2.0.0" - semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@4.3.2, semver@^4.1.0: +"semver@2 || 3 || 4 || 5", semver@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" @@ -4253,12 +3563,6 @@ 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, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -4267,14 +3571,6 @@ simple-fmt@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" -simple-get@^1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb" - dependencies: - once "^1.3.1" - unzip-response "^1.0.0" - xtend "^4.0.0" - simple-is@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" @@ -4406,12 +3702,6 @@ split@^1.0.0: dependencies: through "2" -split@~0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -4472,10 +3762,6 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^3.0.0" -string.prototype.startswith@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.startswith/-/string.prototype.startswith-0.2.0.tgz#da68982e353a4e9ac4a43b450a2045d1c445ae7b" - string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -4538,29 +3824,13 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -superagent-proxy@^1.0.0, superagent-proxy@^1.0.1: +superagent-proxy@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-1.0.2.tgz#92d3660578f618ed43a82cf8cac799fe2938ba2d" dependencies: debug "2" proxy-agent "2" -superagent@^1.4.0: - version "1.8.5" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-1.8.5.tgz#1c0ddc3af30e80eb84ebc05cb2122da8fe940b55" - dependencies: - component-emitter "~1.2.0" - cookiejar "2.0.6" - debug "2" - extend "3.0.0" - form-data "1.0.0-rc3" - formidable "~1.0.14" - methods "~1.1.1" - mime "1.3.4" - qs "2.3.3" - readable-stream "1.0.27-1" - reduce-component "1.0.1" - superagent@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/superagent/-/superagent-2.3.0.tgz#703529a0714e57e123959ddefbce193b2e50d115" @@ -4594,15 +3864,6 @@ symbol-observable@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" -tar-fs@^1.13.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.15.2.tgz#761f5b32932c7b39461a60d537faea0d8084830c" - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - tar-pack@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" @@ -4616,15 +3877,6 @@ tar-pack@^3.4.0: tar "^2.2.1" uid-number "^0.0.6" -tar-stream@^1.1.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -4697,10 +3949,6 @@ tryor@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" -tunnel-agent@^0.4.3, tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -4711,18 +3959,6 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" -twilio@^2.11.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/twilio/-/twilio-2.11.1.tgz#451099467313c56b3767994df2d19062f10ef8c4" - dependencies: - deprecate "^0.1.0" - jsonwebtoken "5.4.x" - q "0.9.7" - request "2.74.x" - scmp "0.0.3" - string.prototype.startswith "^0.2.0" - underscore "1.x" - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -4736,12 +3972,6 @@ type-is@~1.6.14: media-typer "0.3.0" mime-types "~2.1.15" -typeforce@^1.5.5: - version "1.10.6" - resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.10.6.tgz#71bdca35b4e635b61245371b57c008cedfbec4db" - dependencies: - inherits "^2.0.1" - uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -4754,14 +3984,6 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" -underscore.string@2.4.0, underscore.string@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.4.0.tgz#8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b" - -underscore@1.x, underscore@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" - unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -4784,10 +4006,6 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -unzip-response@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" - unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" @@ -4815,12 +4033,6 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -"util@>= 0.4.9": - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - utils-merge@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" @@ -4870,12 +4082,6 @@ widest-line@^1.0.0: dependencies: string-width "^1.0.1" -wif@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/wif/-/wif-1.2.1.tgz#aa81a57dc1fec86b484fbe74f4ab5f65fb51e043" - dependencies: - bs58check "^1.0.6" - window-size@^0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" @@ -4955,7 +4161,7 @@ xregexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" -xtend@4.0.1, xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"