diff --git a/bin/cert-gen.sh b/bin/cert-gen.sh index 2be643ae..b64c042f 100755 --- a/bin/cert-gen.sh +++ b/bin/cert-gen.sh @@ -13,6 +13,8 @@ LAMASSU_CA_PATH=$PWD/Lamassu_CA.pem MIGRATE_STATE_PATH=$CONFIG_DIR/.migrate POSTGRES_PASS=postgres123 OFAC_DATA_DIR=$CONFIG_DIR/ofac +IDPHOTOCARD_DIR=$CONFIG_DIR/idphotocard +FRONTCAMERA_DIR=$CONFIG_DIR/frontcamera mkdir -p $CERT_DIR mkdir -p $CONFIG_DIR >> $LOG_FILE 2>&1 @@ -109,7 +111,9 @@ cat < $CONFIG_DIR/lamassu.json "name": "cons_advanced", "url": "https://www.treasury.gov/ofac/downloads/sanctions/1.0/cons_advanced.xml" } - ] + ], + "idPhotoCardDir": "$IDPHOTOCARD_DIR", + "frontCameraDir": "$FRONTCAMERA_DIR" } EOF diff --git a/bin/hkdf b/bin/hkdf index eb700684..2e3cdb14 100755 --- a/bin/hkdf +++ b/bin/hkdf @@ -13,5 +13,5 @@ if (process.argv.length !== 4) { process.exit(3) } -const masterSeed = new Buffer(masterSeedHex, 'hex') -console.log(hkdf(masterSeed, 32, {salt: 'lamassu-server-salt', info: label}).toString('hex')) +const masterSeed = Buffer.from(masterSeedHex, 'hex') +console.log(hkdf(masterSeed, 32, { salt: 'lamassu-server-salt', info: label }).toString('hex')) diff --git a/bin/lamassu-coinatmradar b/bin/lamassu-coinatmradar index 1f2836fe..5912b71a 100644 --- a/bin/lamassu-coinatmradar +++ b/bin/lamassu-coinatmradar @@ -1,7 +1,5 @@ #!/usr/bin/env bash -SEED="$(cat ~/seeds/seed.txt)" - echo echo "Here is the 'External ID' of your paired machine(s), for use under the 'ATM / Teller details' of your CoinATMRadar listing:" echo @@ -9,5 +7,5 @@ su - postgres -c "psql \"lamassu\" -Atc \"select regexp_replace(device_id, '$', echo echo "If speaking with CoinATMRadar directly, it may be helpful to let them know your 'Operator ID':" echo -$(npm root -g)/lamassu-server/bin/hkdf operator-id "$SEED" | cut -c -32 +$(npm root -g)/lamassu-server/bin/lamassu-operator echo diff --git a/bin/lamassu-operator b/bin/lamassu-operator index b2792cdd..104a1c5e 100644 --- a/bin/lamassu-operator +++ b/bin/lamassu-operator @@ -1,9 +1,12 @@ -#!/usr/bin/env bash +#!/usr/bin/env node -SEED="$(cat ~/seeds/seed.txt)" +const fs = require('fs') +const hkdf = require('futoin-hkdf') -echo -echo "Your Operator ID for use with CoinATMRadar is:" -echo -/usr/bin/hkdf operator-id "$SEED" | cut -c -32 -echo +const options = require('../lib/options') +const mnemonicHelpers = require('../lib/mnemonic-helpers') + +const mnemonic = fs.readFileSync(options.mnemonicPath, 'utf8').trim() +const masterSeed = mnemonicHelpers.toEntropyBuffer(mnemonic) + +console.log(hkdf(masterSeed, 16, { salt: 'lamassu-server-salt', info: 'operator-id' }).toString('hex')) diff --git a/lamassu-admin-elm/src/NavBar.elm b/lamassu-admin-elm/src/NavBar.elm index 29e7b6d9..a0233995 100644 --- a/lamassu-admin-elm/src/NavBar.elm +++ b/lamassu-admin-elm/src/NavBar.elm @@ -262,7 +262,6 @@ view route invalidGroups = , ( "itBit", AccountRoute "itbit", True ) , ( "Kraken", AccountRoute "kraken", True ) , ( "Mailgun", AccountRoute "mailgun", True ) - , ( "QuadrigaCX", AccountRoute "quadrigacx", True ) , ( "Strike", AccountRoute "strike", True ) , ( "Twilio", AccountRoute "twilio", True ) ] diff --git a/lib/admin/config.js b/lib/admin/config.js index 45127b8a..9aa47292 100644 --- a/lib/admin/config.js +++ b/lib/admin/config.js @@ -178,8 +178,8 @@ function fetchData () { {code: 'bitpay', display: 'Bitpay', class: 'ticker', cryptos: ['BTC', 'BCH']}, {code: 'kraken', display: 'Kraken', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'DASH', 'ZEC', 'BCH']}, {code: 'bitstamp', display: 'Bitstamp', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']}, - {code: 'coinbase', display: 'Coinbase', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']}, - {code: 'itbit', display: 'itBit', class: 'ticker', cryptos: ['BTC']}, + {code: 'coinbase', display: 'Coinbase', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH', 'ZEC', 'DASH']}, + {code: 'itbit', display: 'itBit', class: 'ticker', cryptos: ['BTC', 'ETH']}, {code: 'mock-ticker', display: 'Mock (Caution!)', class: 'ticker', cryptos: ALL_CRYPTOS}, {code: 'bitcoind', display: 'bitcoind', class: 'wallet', cryptos: ['BTC']}, {code: 'no-layer2', display: 'No Layer 2', class: 'layer2', cryptos: ALL_CRYPTOS}, @@ -191,7 +191,7 @@ function fetchData () { {code: 'bitcoincashd', display: 'bitcoincashd', class: 'wallet', cryptos: ['BCH']}, {code: 'bitgo', display: 'BitGo', class: 'wallet', cryptos: ['BTC', 'ZEC', 'LTC', 'BCH', 'DASH']}, {code: 'bitstamp', display: 'Bitstamp', class: 'exchange', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']}, - {code: 'itbit', display: 'itBit', class: 'exchange', cryptos: ['BTC']}, + {code: 'itbit', display: 'itBit', class: 'exchange', cryptos: ['BTC', 'ETH']}, {code: 'kraken', display: 'Kraken', class: 'exchange', cryptos: ['BTC', 'ETH', 'LTC', 'DASH', 'ZEC', 'BCH']}, {code: 'mock-wallet', display: 'Mock (Caution!)', class: 'wallet', cryptos: ALL_CRYPTOS}, {code: 'no-exchange', display: 'No exchange', class: 'exchange', cryptos: ALL_CRYPTOS}, diff --git a/lib/blacklist.js b/lib/blacklist.js index 08d2705e..e66ac3ff 100644 --- a/lib/blacklist.js +++ b/lib/blacklist.js @@ -2,7 +2,7 @@ const db = require('./db') function blocked (address, cryptoCode) { const sql = `select * from blacklist where address = $1 and crypto_code = $2` - return db.oneOrNone(sql, [ + return db.any(sql, [ address, cryptoCode ]) diff --git a/lib/blockchain/bitcoincash.js b/lib/blockchain/bitcoincash.js index 24772e82..49c1547a 100644 --- a/lib/blockchain/bitcoincash.js +++ b/lib/blockchain/bitcoincash.js @@ -21,7 +21,7 @@ function buildConfig () { rpcpassword=${common.randomPass()} dbcache=500 server=1 -connections=40 +maxconnections=40 keypool=10000 prune=4000 daemon=0 diff --git a/lib/blockchain/common.js b/lib/blockchain/common.js index 23deedf9..6162ec90 100644 --- a/lib/blockchain/common.js +++ b/lib/blockchain/common.js @@ -21,19 +21,19 @@ module.exports = { const BINARIES = { BTC: { - url: 'https://bitcoin.org/bin/bitcoin-core-0.18.0/bitcoin-0.18.0-x86_64-linux-gnu.tar.gz', - dir: 'bitcoin-0.18.0/bin' + url: 'https://bitcoin.org/bin/bitcoin-core-0.18.1/bitcoin-0.18.1-x86_64-linux-gnu.tar.gz', + dir: 'bitcoin-0.18.1/bin' }, ETH: { - url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.1-b7b2f60f.tar.gz', - dir: 'geth-linux-amd64-1.9.1-b7b2f60f' + url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.7-a718daa6.tar.gz', + dir: 'geth-linux-amd64-1.9.7-a718daa6' }, ZEC: { - url: 'https://z.cash/downloads/zcash-2.0.6-linux64.tar.gz', - dir: 'zcash-2.0.6/bin' + url: 'https://z.cash/downloads/zcash-2.1.0-1-linux64-debian-jessie.tar.gz', + dir: 'zcash-2.1.0-1/bin' }, DASH: { - url: 'https://github.com/dashpay/dash/releases/download/v0.14.0.2/dashcore-0.14.0.2-x86_64-linux-gnu.tar', + url: 'https://github.com/dashpay/dash/releases/download/v0.14.0.3/dashcore-0.14.0.3-x86_64-linux-gnu.tar.gz', dir: 'dashcore-0.14.0/bin' }, LTC: { @@ -41,8 +41,8 @@ const BINARIES = { dir: 'litecoin-0.17.1/bin' }, BCH: { - url: 'https://download.bitcoinabc.org/0.19.10/linux/bitcoin-abc-0.19.10-x86_64-linux-gnu.tar.gz', - dir: 'bitcoin-abc-0.19.10/bin', + url: 'https://download.bitcoinabc.org/0.20.5/linux/bitcoin-abc-0.20.5-x86_64-linux-gnu.tar.gz', + dir: 'bitcoin-abc-0.20.5/bin', files: [['bitcoind', 'bitcoincashd'], ['bitcoin-cli', 'bitcoincash-cli']] } } diff --git a/lib/cash-in/cash-in-tx.js b/lib/cash-in/cash-in-tx.js index 5147bba6..0ef93717 100644 --- a/lib/cash-in/cash-in-tx.js +++ b/lib/cash-in/cash-in-tx.js @@ -24,13 +24,13 @@ function post (machineTx, pi) { let blacklisted = false let addressReuse = false - return checkForBlacklisted(updatedTx) - .then(blacklistItem => { - if (blacklistItem && blacklistItem.created_by_operator) { - blacklisted = true - } + return Promise.all([settingsLoader.loadLatest(), checkForBlacklisted(updatedTx)]) + .then(([{ config }, blacklistItems]) => { + const rejectAddressReuseActive = configManager.unscoped(config).rejectAddressReuseActive - if (blacklistItem && !blacklistItem.created_by_operator) { + if (_.some(it => it.created_by_operator === true)(blacklistItems)) { + blacklisted = true + } else if (_.some(it => it.created_by_operator === false)(blacklistItems) && rejectAddressReuseActive) { addressReuse = true } diff --git a/lib/config-validate.js b/lib/config-validate.js index 547e2f6f..f4f7a471 100644 --- a/lib/config-validate.js +++ b/lib/config-validate.js @@ -5,6 +5,8 @@ const configManager = require('./config-manager') const logger = require('./logger') const schema = require('../lamassu-schema.json') +const REMOVED_FIELDS = ['crossRefVerificationActive', 'crossRefVerificationThreshold'] + function allScopes (cryptoScopes, machineScopes) { const scopes = [] cryptoScopes.forEach(c => { @@ -128,6 +130,8 @@ function ensureConstraints (config) { .then(() => { config.every(fieldInstance => { const fieldCode = fieldInstance.fieldLocator.code + if (_.includes(fieldCode, REMOVED_FIELDS)) return + const field = pickField(fieldCode) if (!field) { logger.warn('No such field: %s, %j', fieldCode, fieldInstance.fieldLocator.fieldScope) diff --git a/lib/plugins.js b/lib/plugins.js index 16c19da3..7f0cb6ae 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -347,7 +347,7 @@ function plugins (settings, deviceId) { if (!transactionNotificationsEnabled()) return Promise.resolve() const isCashOut = tx.direction === 'cashOut' - const zeroConf = isZeroConf(tx) + const zeroConf = isCashOut && isZeroConf(tx) // 0-conf cash-out should only send notification on redemption if (zeroConf && isCashOut && !rec.isRedemption && !rec.error) return Promise.resolve() diff --git a/lib/plugins/common/quadrigacx.js b/lib/plugins/common/quadrigacx.js deleted file mode 100644 index 81c5527a..00000000 --- a/lib/plugins/common/quadrigacx.js +++ /dev/null @@ -1,91 +0,0 @@ -const axios = require('axios') -const crypto = require('crypto') -const _ = require('lodash/fp') - -const API_ENDPOINT = 'https://api.quadrigacx.com/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') - .toLowerCase() - - const signedData = _.merge(data, { - key: config.key, - signature, - nonce - }) - - return request(path, 'POST', signedData) -} - -function buildMarket (fiatCode, cryptoCode) { - if (!_.includes(cryptoCode, ['BTC', 'ETH', 'LTC', 'BCH'])) { - throw new Error(`Unsupported crypto: ${cryptoCode}`) - } - - if (!_.includes(fiatCode, ['USD', 'CAD'])) { - throw new Error(`Unsupported fiat: ${fiatCode}`) - } - - let market = `${cryptoCode.toLowerCase()}_${fiatCode.toLowerCase()}` - - if (fiatCode === 'USD' && cryptoCode !== 'BTC') { - throw new Error(`Unsupported market: ${market}`) - } - - return market -} - -function request (path, method, data) { - const options = { - method, - data, - url: API_ENDPOINT + path, - headers: { - 'User-Agent': 'Mozilla/4.0 (compatible; Lamassu client)', - 'Content-Type': 'application/json; charset=utf-8' - } - } - - return axios(options) - .then(r => { - if (r.data.error) throw new Error(r.data.error.message) - return r.data - }) -} - -module.exports = { - buildMarket, - authRequest, - request -} diff --git a/lib/plugins/exchange/quadrigacx/quadrigacx.js b/lib/plugins/exchange/quadrigacx/quadrigacx.js deleted file mode 100644 index 8ee62b3b..00000000 --- a/lib/plugins/exchange/quadrigacx/quadrigacx.js +++ /dev/null @@ -1,28 +0,0 @@ -const common = require('../../common/quadrigacx') -const coinUtils = require('../../../coin-utils') - -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 trade (type, account, cryptoAtoms, fiatCode, cryptoCode) { - return Promise.resolve() - .then(() => { - const market = common.buildMarket(fiatCode, cryptoCode) - const options = { - book: market, - amount: coinUtils.toUnit(cryptoAtoms, cryptoCode).toFixed(8) - } - - return common.authRequest(account, '/' + type, options) - }) -} - -module.exports = { - buy, - sell -} diff --git a/lib/plugins/ticker/bitpay/bitpay.js b/lib/plugins/ticker/bitpay/bitpay.js index 80d2c67b..099ed3be 100644 --- a/lib/plugins/ticker/bitpay/bitpay.js +++ b/lib/plugins/ticker/bitpay/bitpay.js @@ -2,9 +2,9 @@ const axios = require('axios') const BN = require('../../../bn') function ticker (account, fiatCode, cryptoCode) { - return axios.get('https://bitpay.com/api/rates/' + cryptoCode + '/' + fiatCode) + return axios.get('https://bitpay.com/rates/' + cryptoCode + '/' + fiatCode) .then(r => { - const data = r.data + const data = r.data.data const price = BN(data.rate.toString()) return { rates: { diff --git a/lib/plugins/ticker/bitstamp/bitstamp.js b/lib/plugins/ticker/bitstamp/bitstamp.js index dbb81e5e..1d5ac416 100644 --- a/lib/plugins/ticker/bitstamp/bitstamp.js +++ b/lib/plugins/ticker/bitstamp/bitstamp.js @@ -18,9 +18,9 @@ exports.ticker = function ticker (account, fiatCode, cryptoCode) { return getCurrencyRates(fiatCode, cryptoCode) } - return axios.get('https://bitpay.com/api/rates') + return axios.get('https://bitpay.com/rates') .then(response => { - const fxRates = response.data + const fxRates = response.data.data const usdRate = findCurrency(fxRates, 'USD') const fxRate = findCurrency(fxRates, fiatCode).div(usdRate) diff --git a/lib/plugins/ticker/coinbase/coinbase.js b/lib/plugins/ticker/coinbase/coinbase.js index afd4e107..772dfcf9 100644 --- a/lib/plugins/ticker/coinbase/coinbase.js +++ b/lib/plugins/ticker/coinbase/coinbase.js @@ -28,7 +28,7 @@ function getSellPrice (obj) { function ticker (account, fiatCode, cryptoCode) { return Promise.resolve() .then(() => { - if (!_.includes(cryptoCode, ['BTC', 'ETH', 'LTC', 'BCH'])) { + if (!_.includes(cryptoCode, ['BTC', 'ETH', 'LTC', 'BCH', 'ZEC', 'DASH'])) { throw new Error('Unsupported crypto: ' + cryptoCode) } }) diff --git a/lib/plugins/ticker/quadrigacx/quadrigacx.js b/lib/plugins/ticker/quadrigacx/quadrigacx.js deleted file mode 100644 index 375e635e..00000000 --- a/lib/plugins/ticker/quadrigacx/quadrigacx.js +++ /dev/null @@ -1,49 +0,0 @@ -const axios = require('axios') -const _ = require('lodash/fp') - -const BN = require('../../../bn') -const common = require('../../common/quadrigacx') - -exports.NAME = 'QuadrigaCX' -exports.SUPPORTED_MODULES = ['ticker'] - -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.toString()) -} - -exports.ticker = function ticker (account, fiatCode, cryptoCode) { - if (fiatCode === 'USD' && cryptoCode === 'BTC' || fiatCode === 'CAD') { - return getCurrencyRates(fiatCode, cryptoCode) - } - - return axios.get('https://bitpay.com/api/rates') - .then(response => { - const fxRates = response.data - const cadRate = findCurrency(fxRates, 'CAD') - const fxRate = findCurrency(fxRates, fiatCode).div(cadRate) - - return getCurrencyRates('CAD', cryptoCode) - .then(res => ({ - rates: { - ask: res.rates.ask.times(fxRate), - bid: res.rates.bid.times(fxRate) - } - })) - }) -} - -function getCurrencyRates (fiatCode, cryptoCode) { - return Promise.resolve() - .then(() => { - const market = common.buildMarket(fiatCode, cryptoCode) - return common.request(`/ticker?book=${market}`, 'GET') - }) - .then(r => ({ - rates: { - ask: BN(r.ask), - bid: BN(r.bid) - } - })) -} diff --git a/lib/plugins/wallet/geth/base.js b/lib/plugins/wallet/geth/base.js index b219ea9e..381bf90d 100644 --- a/lib/plugins/wallet/geth/base.js +++ b/lib/plugins/wallet/geth/base.js @@ -54,7 +54,7 @@ function sendCoins (account, toAddress, cryptoAtoms, cryptoCode) { .then(tx => { if (!tx) return { txid } - const fee = BN(tx.gas).multipliedBy(BN(tx.gasPrice)).round() + const fee = BN(tx.gas).mul(BN(tx.gasPrice)).round() return { txid, fee } }) diff --git a/lib/poller.js b/lib/poller.js index 1e13f28c..22b15b27 100644 --- a/lib/poller.js +++ b/lib/poller.js @@ -62,7 +62,7 @@ function updateCoinAtmRadar () { const config = settings().config return pi().getRawRates() - .then(rates => coinAtmRadar.update({ rates, config })) + .then(rates => coinAtmRadar.update({ rates, config }, settings())) } function start (__settings) { diff --git a/lib/routes.js b/lib/routes.js index 9f0b4a74..9564eb15 100644 --- a/lib/routes.js +++ b/lib/routes.js @@ -26,10 +26,16 @@ const argv = require('minimist')(process.argv.slice(2)) const CLOCK_SKEW = 60 * 1000 const REQUEST_TTL = 3 * 60 * 1000 +const THROTTLE_LOGS_QUERY = 30 * 1000 +const THROTTLE_CLOCK_SKEW = 60 * 1000 +const SETTINGS_CACHE_REFRESH = 60 * 60 * 1000 const pids = {} const reboots = {} const restartServicesMap = {} +const canGetLastSeenMap = {} +const canLogClockSkewMap = {} +const settingsCache = {} const devMode = argv.dev || options.http @@ -167,13 +173,6 @@ function stateChange (req, res, next) { .catch(next) } -function deviceEvent (req, res, next) { - const pi = plugins(req.settings, req.deviceId) - pi.logEvent(req.body) - .then(() => respond(req, res)) - .catch(next) -} - function verifyUser (req, res, next) { const pi = plugins(req.settings, req.deviceId) pi.verifyUser(req.body) @@ -245,9 +244,19 @@ function updateCustomer (req, res, next) { } function getLastSeen (req, res, next) { - return logs.getLastSeen(req.deviceId) - .then(r => res.json(r)) - .catch(next) + const deviceId = req.deviceId + const timestamp = Date.now() + const shouldTrigger = !canGetLastSeenMap[deviceId] || + timestamp - canGetLastSeenMap[deviceId] >= THROTTLE_LOGS_QUERY + + if (shouldTrigger) { + canGetLastSeenMap[deviceId] = timestamp + return logs.getLastSeen(deviceId) + .then(r => res.json(r)) + .catch(next) + } + + return res.status(408).json({}) } function updateLogs (req, res, next) { @@ -310,9 +319,15 @@ function httpError (msg, code) { function filterOldRequests (req, res, next) { const deviceTime = req.deviceTime - const delta = Date.now() - Date.parse(deviceTime) + const deviceId = req.deviceId + const timestamp = Date.now() + const delta = timestamp - Date.parse(deviceTime) - if (delta > CLOCK_SKEW) { + const shouldTrigger = !canLogClockSkewMap[deviceId] || + timestamp - canLogClockSkewMap[deviceId] >= THROTTLE_CLOCK_SKEW + + if (delta > CLOCK_SKEW && shouldTrigger) { + canLogClockSkewMap[deviceId] = timestamp logger.error('Clock skew with lamassu-machine[%s] too high [%ss], adjust lamassu-machine clock', req.deviceName, (delta / 1000).toFixed(2)) } @@ -337,8 +352,7 @@ function authorize (req, res, next) { .catch(next) } -const skip = (req, res) => _.includes(req.path, ['/poll', '/state', '/logs']) && - res.statusCode === 200 +const skip = (req, res) => _.includes(req.path, ['/poll', '/state', '/logs']) && _.includes(res.statusCode, [200, 408]) const configRequiredRoutes = [ '/poll', @@ -367,7 +381,6 @@ app.use(filterOldRequests) app.get('/poll', poll) app.post('/state', stateChange) -app.post('/event', deviceEvent) app.post('/verify_user', verifyUser) app.post('/verify_transaction', verifyTx) @@ -416,6 +429,7 @@ localApp.post('/restartServices', (req, res) => { }) localApp.post('/dbChange', (req, res, next) => { + settingsCache.cache = null return settingsLoader.loadLatest() .then(poller.reload) .then(() => logger.info('Config reloaded')) @@ -452,9 +466,23 @@ function populateSettings (req, res, next) { oldVersionId = versionId } - if (!versionId) { + // Clear cache every hour + if (Date.now() - settingsCache.timestamp > SETTINGS_CACHE_REFRESH) { + settingsCache.cache = null + } + + if (!versionId && settingsCache.cache) { + req.settings = settingsCache.cache + return next() + } + + if (!versionId && !settingsCache.cache) { return settingsLoader.loadLatest() - .then(settings => { req.settings = settings }) + .then(settings => { + settingsCache.cache = settings + settingsCache.timestamp = Date.now() + req.settings = settings + }) .then(() => next()) .catch(next) } diff --git a/package-lock.json b/package-lock.json index 2a502dab..d219dfee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lamassu-server", - "version": "7.3.2", + "version": "7.5.0-beta.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -76,14 +76,14 @@ "integrity": "sha1-lksiHLlV4csPBEdnqWaCgCOjhLs=" }, "@types/lodash": { - "version": "4.14.118", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.118.tgz", - "integrity": "sha512-iiJbKLZbhSa6FYRip/9ZDX6HXhayXLDGY2Fqws9cOkEQ6XeKfaxB0sC541mowZJueYyMnVUmmG+al5/4fCDrgw==" + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" }, "@types/node": { - "version": "10.12.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.9.tgz", - "integrity": "sha512-eajkMXG812/w3w4a1OcBlaTwsFPO5F7fJ/amy+tieQxEMWBlbV1JGSjkFM+zkHNf81Cad+dfIRA+IBkvmvdAeA==" + "version": "12.12.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz", + "integrity": "sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA==" }, "@types/ws": { "version": "3.2.1", @@ -132,9 +132,9 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" }, "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "requires": { "es6-promisify": "^5.0.0" } @@ -388,9 +388,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "asynckit": { "version": "0.4.0", @@ -1252,9 +1252,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" } } }, @@ -1289,9 +1289,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" } } }, @@ -1372,58 +1372,63 @@ } }, "bitgo": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/bitgo/-/bitgo-4.40.2.tgz", - "integrity": "sha512-rQY92xdUaI1yKGyBmlAk6/uoLUj4H13Jla0g+q8Hmw30rniX1QUF7Kfwe7KsmIb/JnVse3Kt5omqg6PYQQIl2A==", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/bitgo/-/bitgo-4.47.0.tgz", + "integrity": "sha512-reh8M5UMMRLnUzWo0qY+SyDQmM+LNXnVjwb4S78r2lukdszmSHX+JWl2T7t5hyelJyFXF/5ySAxj6SYpHTiChQ==", "requires": { - "argparse": "~1.0.10", + "argparse": "1.0.10", "assert": "0.4.9", - "big.js": "~3.1.3", + "big.js": "3.1.3", "bigi": "1.4.0", - "bignumber.js": "~4.0.2", - "bitcoinjs-message": "~2.0.0", - "bitgo-utxo-lib": "^1.2.1", - "bluebird": "~3.5.0", - "body-parser": "~1.18.2", + "bignumber.js": "8.0.1", + "bitcoinjs-message": "2.0.0", + "bitgo-utxo-lib": "1.3.0", + "bluebird": "3.5.3", + "body-parser": "1.18.3", "bs58": "2.0.1", "bs58check": "1.0.4", "cashaddress": "1.1.0", - "create-hmac": "~1.1.4", - "debug": "~3.1.0", - "ecurve": "~1.0.2", + "create-hmac": "1.1.7", + "debug": "3.1.0", + "ecurve": "1.0.6", "eol": "0.5.0", - "ethereumjs-abi": "~0.6.2", - "ethereumjs-tx": "^1.3.4", - "ethereumjs-util": "~4.4.1", - "express": "~4.16.2", + "ethereumjs-abi": "0.6.5", + "ethereumjs-tx": "1.3.7", + "ethereumjs-util": "4.4.1", + "express": "4.16.4", "http-proxy": "1.11.1", - "lodash": "~4.17.10", + "lodash": "4.17.11", "minimist": "0.2.0", - "moment": "~2.20.1", - "morgan": "1.9.0", - "prova-lib": "0.2.9", - "ripple-lib": "~0.22.0", + "moment": "2.20.1", + "morgan": "1.9.1", + "prova-lib": "0.2.10", + "ripple-lib": "0.22.0", "sanitize-html": "1.13.0", - "secp256k1": "3.2.5", + "secp256k1": "3.6.1", "secrets.js-grempe": "1.1.0", - "stellar-sdk": "~0.11.0", - "superagent": "~3.8.3", - "superagent-proxy": "~1.0.0" + "stellar-sdk": "0.11.0", + "superagent": "3.8.3", + "superagent-proxy": "1.0.3" }, "dependencies": { "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "bignumber.js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.4.tgz", - "integrity": "sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg==" + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-8.0.1.tgz", + "integrity": "sha512-zAySveTJXkgLYCBi0b14xzfnOs+f3G6x36I8w2a1+PFQpWk/dp0mI0F+ZZK2bu+3ELewDcSyP+Cfq++NcHX7sg==" + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" }, "body-parser": { "version": "1.18.3", @@ -1462,6 +1467,19 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -1584,7 +1602,7 @@ }, "finalhandler": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", @@ -1618,7 +1636,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -1635,17 +1653,22 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", "requires": { - "mime-db": "~1.37.0" + "mime-db": "1.42.0" } }, "minimist": { @@ -1659,13 +1682,13 @@ "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" }, "morgan": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", - "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", "requires": { "basic-auth": "~2.0.0", "debug": "2.6.9", - "depd": "~1.1.1", + "depd": "~1.1.2", "on-finished": "~2.3.0", "on-headers": "~1.0.1" }, @@ -1680,10 +1703,15 @@ } } }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "qs": { "version": "6.5.2", @@ -1701,6 +1729,22 @@ "unpipe": "1.0.0" } }, + "secp256k1": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.6.1.tgz", + "integrity": "sha512-utLpWv4P4agEw7hakR73wlWX0NBmC5t/vkJ0TAfTyvETAUzo0tm6aFKPYetVYRaVubxMeWm5Ekv9ETwOgcDCqw==", + "optional": true, + "requires": { + "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", + "safe-buffer": "^5.1.0" + } + }, "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", @@ -1723,12 +1767,12 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "utils-merge": { @@ -1744,9 +1788,9 @@ } }, "bitgo-utxo-lib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bitgo-utxo-lib/-/bitgo-utxo-lib-1.2.1.tgz", - "integrity": "sha512-8qwcU4HZEGAInXYntkCiZwfeFFQ6cwWOVb8+VwEMnoQb+TCNIRh1BFxfJ79ZHrzSGZ+L951HqdzKW5XhFb9E6Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bitgo-utxo-lib/-/bitgo-utxo-lib-1.3.0.tgz", + "integrity": "sha512-jry6Y97g2jr1XlY1Ou5WkWUg1rQbyioLYp9AgyK4OwZ7t2ETRyTB1rcJV9kYOlTnTjC6k+Sef+IKcZLM/u9zjA==", "requires": { "bech32": "0.0.3", "bigi": "^1.4.0", @@ -1762,11 +1806,26 @@ "pushdata-bitcoin": "^1.0.1", "randombytes": "^2.0.1", "safe-buffer": "^5.0.1", + "secp256k1": "^3.5.2", "typeforce": "^1.11.3", "varuint-bitcoin": "^1.0.4", "wif": "^2.0.1" }, "dependencies": { + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -1786,9 +1845,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" } } }, @@ -1799,6 +1858,70 @@ "requires": { "ms": "2.0.0" } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "optional": true, + "requires": { + "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" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "optional": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "optional": true + } + } } } }, @@ -1841,7 +1964,8 @@ "bluebird": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true }, "bn.js": { "version": "4.11.7", @@ -2938,7 +3062,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -3043,25 +3166,30 @@ } }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" } } }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "domhandler": { "version": "2.4.2", @@ -3309,7 +3437,6 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, "requires": { "es-to-primitive": "^1.1.1", "function-bind": "^1.1.1", @@ -3322,7 +3449,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -4546,9 +4672,9 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -4556,9 +4682,9 @@ }, "dependencies": { "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } @@ -5079,8 +5205,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -5695,7 +5820,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -5748,8 +5872,7 @@ "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, "has-to-string-tag-x": { "version": "1.2.0", @@ -5913,34 +6036,39 @@ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "htmlparser2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", - "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "requires": { - "domelementtype": "^1.3.0", + "domelementtype": "^1.3.1", "domhandler": "^2.3.0", "domutils": "^1.5.1", "entities": "^1.1.1", "inherits": "^2.0.1", - "readable-stream": "^3.0.6" + "readable-stream": "^3.1.1" }, "dependencies": { "readable-stream": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz", - "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } } } @@ -6012,9 +6140,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -6246,9 +6374,9 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, "irregular-plurals": { "version": "1.2.0", @@ -6256,6 +6384,11 @@ "integrity": "sha1-OPKZg0uowAwwvpxVThNyaXUv86w=", "dev": true }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6288,8 +6421,7 @@ "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" }, "is-ci": { "version": "1.0.10", @@ -6303,8 +6435,7 @@ "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-dotfile": { "version": "1.0.3", @@ -6361,6 +6492,11 @@ "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", "dev": true }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -6458,7 +6594,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, "requires": { "has": "^1.0.1" } @@ -6483,7 +6618,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, "requires": { "has-symbols": "^1.0.0" } @@ -6658,15 +6792,21 @@ "dev": true }, "js-xdr": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/js-xdr/-/js-xdr-1.0.5.tgz", - "integrity": "sha512-v0jffMa8bko3uFcGYt1lHrtpd1adhH6qk41RfLPsNPj77/K8fi7LOi4+lUUY3MBEIFnJgaGHrbc6sxdTwHImxQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/js-xdr/-/js-xdr-1.1.2.tgz", + "integrity": "sha512-ipiz1CnsyjLsba+QQd5jezGXddNKGa4oO9EODy0kWr3G3R8MNslIxkhQFpyRfY3yoY7YplhRVfC3cmXb4AobZQ==", "requires": { + "core-js": "^2.6.3", "cursor": "^0.1.5", "lodash": "^4.17.5", "long": "^2.2.3" }, "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" + }, "long": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", @@ -7061,9 +7201,9 @@ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -7276,6 +7416,34 @@ "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", "dev": true }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "optional": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "optional": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -7703,8 +7871,18 @@ "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } }, "object.omit": { "version": "2.0.1", @@ -7902,9 +8080,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -8520,9 +8698,9 @@ } }, "prova-lib": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/prova-lib/-/prova-lib-0.2.9.tgz", - "integrity": "sha512-YaulnI8L3LozBjwy64afOYmQdz2SzMiZgGvhHSU1BA7TIH8VlHZVN5/PrZ4roKS9tOPT7rl5A0C4RB63BlnVow==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/prova-lib/-/prova-lib-0.2.10.tgz", + "integrity": "sha512-L1K1BiBteuTL4Q/gyMROmPI4BJVG2KsmEkhmQEOKQw5SA3D54UC3iG6u+DSZKW7nvjsTPSbpzDzaCOmSgtTGuA==", "requires": { "bigi": "~1.4.2", "bitcoin-ops": "~1.3.0", @@ -8530,7 +8708,7 @@ "bs58check": "~2.0.1", "ecurve": "~1.0.5", "lodash": "~4.17.4", - "secp256k1": "~3.3.0", + "secp256k1": "~3.5.0", "typeforce": "~1.10.6", "varuint-bitcoin": "~1.0.4" }, @@ -8563,9 +8741,9 @@ } }, "secp256k1": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.1.tgz", - "integrity": "sha512-lygjgfjzjBHblEDDkppUF5KK1EeVk6P/Dv2MsJZpYIR3vW5TKFRexOFkf0hHy9J5YxEpjQZ6x98Y3XQpMQO/vA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.5.2.tgz", + "integrity": "sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ==", "optional": true, "requires": { "bindings": "^1.2.1", @@ -8575,7 +8753,6 @@ "drbg.js": "^1.0.1", "elliptic": "^6.2.3", "nan": "^2.2.1", - "prebuild-install": "^2.0.0", "safe-buffer": "^5.1.0" } }, @@ -8595,12 +8772,12 @@ } }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.0" }, "dependencies": { "forwarded": { @@ -8612,7 +8789,7 @@ }, "proxy-agent": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz", "integrity": "sha512-CNKuhC1jVtm8KJYFTS2ZRO71VCBx3QSA92So/e6NrY6GoJonkx3Irnk4047EsCcswczwqAekRj3s8qLRGahSKg==", "requires": { "agent-base": "^4.2.0", @@ -8634,9 +8811,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -8683,9 +8860,9 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, "randomatic": { "version": "1.1.7", @@ -9455,14 +9632,52 @@ } }, "ripple-hashes": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ripple-hashes/-/ripple-hashes-0.3.1.tgz", - "integrity": "sha1-8vRvH/BeZIdQCpmDkBkRTNJIJBE=", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/ripple-hashes/-/ripple-hashes-0.3.4.tgz", + "integrity": "sha512-u2kgg9Yu9D44HWnC9R2lNg+amVLllJkMQmXZEEM2DAMFXigr4+ph1O8LLxLv+k0fbdjAjos4aUyWwcw6cxzYMw==", "requires": { "bignumber.js": "^4.1.0", "create-hash": "^1.1.2", - "ripple-address-codec": "^2.0.1", - "ripple-binary-codec": "^0.1.0" + "ripple-address-codec": "^3.0.4", + "ripple-binary-codec": "^0.2.4" + }, + "dependencies": { + "base-x": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", + "integrity": "sha512-UYOadoSIkEI/VrRGSG6qp93rp2WdokiAiNYDfGW5qURAY8GiAQkvMbwNNSDYiVJopqv4gCna7xqf4rrNGp+5AA==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "ripple-address-codec": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-3.0.4.tgz", + "integrity": "sha512-GFk1BgavW+9oy5Z1Cp6YAGMfB51QdbeuhOo0Zir+s+S40F5vHtVZYu6zZE1eOAX92A5kygPuBRX4APH2v8Yhmg==", + "requires": { + "base-x": "3.0.4", + "create-hash": "^1.1.2" + } + }, + "ripple-binary-codec": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-0.2.4.tgz", + "integrity": "sha512-lfT9bybaVqA8IJmGFnSWaISCXmwvNY/P5HHKm6zQ1yTIXJpC+hDIeQqm/eD/2HLv82y2IvqGYd0GhEQ41lpNpQ==", + "requires": { + "babel-runtime": "^6.6.1", + "bn.js": "^4.11.3", + "create-hash": "^1.1.2", + "decimal.js": "^5.0.8", + "inherits": "^2.0.1", + "lodash": "^4.17.15", + "ripple-address-codec": "^3.0.4" + } + } } }, "ripple-keypairs": { @@ -9738,7 +9953,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { "depd": "~1.1.2", @@ -10191,9 +10406,9 @@ }, "dependencies": { "tweetnacl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.0.tgz", - "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.1.tgz", + "integrity": "sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==" } } }, @@ -10213,12 +10428,12 @@ }, "dependencies": { "axios": { - "version": "0.18.0", - "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", - "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", "requires": { - "follow-redirects": "^1.3.0", - "is-buffer": "^1.1.5" + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" } }, "debug": { @@ -10236,6 +10451,11 @@ "requires": { "debug": "=3.1.0" } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" } } }, @@ -10347,23 +10567,23 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -10387,7 +10607,7 @@ }, "superagent-proxy": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/superagent-proxy/-/superagent-proxy-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-1.0.3.tgz", "integrity": "sha512-79Ujg1lRL2ICfuHUdX+H2MjIw73kB7bXsIkxLwHURz3j0XUmEEEoJ+u/wq+mKwna21Uejsm2cGR3OESA00TIjA==", "requires": { "debug": "^3.1.0", @@ -10403,9 +10623,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -10732,9 +10952,9 @@ "dev": true }, "toml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", - "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==" + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==" }, "topo": { "version": "1.1.0", @@ -10853,9 +11073,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typeforce": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.16.0.tgz", - "integrity": "sha512-V60F7OHPH7vPlgIU73vYyeebKxWjQqCTlge+MvKlVn09PIhCOi/ZotowYdgREHB5S1dyHOr906ui6NheYXjlVQ==" + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", + "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, "uid-number": { "version": "0.0.6", @@ -10960,11 +11180,11 @@ "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" }, "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "requires": { - "querystringify": "^2.0.0", + "querystringify": "^2.1.1", "requires-port": "^1.0.0" }, "dependencies": { @@ -10994,11 +11214,22 @@ "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" }, "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", + "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "object.entries": "^1.1.0", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } } }, "util-deprecate": { @@ -11033,9 +11264,9 @@ } }, "varuint-bitcoin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.0.tgz", - "integrity": "sha512-jCEPG+COU/1Rp84neKTyDJQr478/hAfVp5xxYn09QEH0yBjbmPeMfuuQIrp+BUD83hybtYZKhr5elV3bvdV1bA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/varuint-bitcoin/-/varuint-bitcoin-1.1.2.tgz", + "integrity": "sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==", "requires": { "safe-buffer": "^5.1.1" } diff --git a/package.json b/package.json index c69d00ef..3be42ea4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lamassu-server", "description": "bitcoin atm client server protocol module", "keywords": [], - "version": "7.3.2", + "version": "7.5.0-beta.0", "license": "Unlicense", "author": "Lamassu (https://lamassu.is)", "dependencies": { diff --git a/schemas/quadrigacx.json b/schemas/quadrigacx.json deleted file mode 100644 index f6cb4481..00000000 --- a/schemas/quadrigacx.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "code": "quadrigacx", - "display": "QuadrigaCX", - "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/test/unit/filter-config-accounts.js b/test/unit/filter-config-accounts.js index 9c8fb731..d2d46ed4 100644 --- a/test/unit/filter-config-accounts.js +++ b/test/unit/filter-config-accounts.js @@ -8,7 +8,7 @@ const data = { accounts: [ {code: 'mock-ticker', display: 'Mock ticker', class: 'ticker', cryptos: ALL_CRYPTOS}, {code: 'bitcoind', display: 'bitcoind', class: 'wallet', cryptos: ['BTC']}, - {code: 'quadrigacx', display: 'QuadrigaCX', class: 'exchange', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']}, + {code: 'kraken', display: 'Kraken', class: 'exchange', cryptos: ['BTC', 'ZEC', 'ETH', 'LTC', 'BCH', 'DASH']}, {code: 'mock-wallet', display: 'Mock (Caution!)', class: 'wallet', cryptos: ALL_CRYPTOS} ] }