From eb1fa895b2c3d02ea031e99120bdb9c205328ce7 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 24 Jan 2018 13:02:15 +0530 Subject: [PATCH 001/242] contract_interact: Pricer.js initial code --- config/core_abis.js | 24 +++ config/core_addresses.js | 92 +++++++++ config/core_bins.js | 23 +++ config/core_constants.js | 36 ++++ helpers/custom_console_logger.js | 73 +++++++ lib/contract_interact/helper.js | 322 +++++++++++++++++++++++++++++++ lib/contract_interact/pricer.js | 191 ++++++++++++++++++ lib/web3/events/decoder.js | 112 +++++++++++ lib/web3/events/formatter.js | 53 +++++ lib/web3/events/processor.js | 163 ++++++++++++++++ lib/web3/events/queue_manager.js | 195 +++++++++++++++++++ lib/web3/providers/rpc.js | 8 + lib/web3/providers/ws.js | 8 + set_env_vars.sh | 11 ++ 14 files changed, 1311 insertions(+) create mode 100644 config/core_abis.js create mode 100644 config/core_addresses.js create mode 100644 config/core_bins.js create mode 100644 config/core_constants.js create mode 100644 helpers/custom_console_logger.js create mode 100644 lib/contract_interact/helper.js create mode 100644 lib/contract_interact/pricer.js create mode 100644 lib/web3/events/decoder.js create mode 100644 lib/web3/events/formatter.js create mode 100644 lib/web3/events/processor.js create mode 100644 lib/web3/events/queue_manager.js create mode 100644 lib/web3/providers/rpc.js create mode 100644 lib/web3/providers/ws.js create mode 100644 set_env_vars.sh diff --git a/config/core_abis.js b/config/core_abis.js new file mode 100644 index 0000000..2a9aeb5 --- /dev/null +++ b/config/core_abis.js @@ -0,0 +1,24 @@ +"use strict"; + +/* + * Load all contract abi files + * + */ + +const fs = require('fs') + , path = require('path') +; + +function parseFile(filePath, options) { + filePath = path.join(__dirname, '/' + filePath); + const fileContent = fs.readFileSync(filePath, options || "utf8"); + return JSON.parse(fileContent); +} + +const rootPrefix = ".."; + +const coreAbis = { + pricer: parseFile(rootPrefix + '/contracts/abi/Pricer.abi', "utf8") +}; + +module.exports = coreAbis; diff --git a/config/core_addresses.js b/config/core_addresses.js new file mode 100644 index 0000000..77d8ca5 --- /dev/null +++ b/config/core_addresses.js @@ -0,0 +1,92 @@ +"use strict"; + +/** + * List of all addresses and there respective abi, bin, passphrase + * required for platform. + * + * And helper methods to access this information using human readable + * names. + * + */ + +const rootPrefix = ".." + , coreAbis = require(rootPrefix + '/config/core_abis') + , coreBins = require(rootPrefix + '/config/core_bins'); + +const allAddresses = { + users: { + deployer: { + address: process.env.OST_DEPLOYER_ADDR, + passphrase: process.env.OST_DEPLOYER_PASSPHRASE + }, + ops: { + address: process.env.OST_OPS_ADDR, + passphrase: process.env.OST_OPS_PASSPHRASE + } + }, + + contracts: { + pricer: { + address: process.env.OST_PRICER_CONTRACT_ADDR, + abi: coreAbis.pricer, + bin: coreBins.pricer + }, + } +}; + +// generate a contract address to name map for reverse lookup +const addrToContractNameMap = {}; +for (var contractName in allAddresses.contracts) { + var addr = allAddresses.contracts[contractName].address; + + if ( Array.isArray(addr) ) { + for (var i = 0; i < addr.length; i++) { + addrToContractNameMap[addr[i].toLowerCase()] = contractName; + } + } else if ( addr !== null && typeof addr !== "undefined") { + addrToContractNameMap[addr.toLowerCase()] = contractName; + } +} + +// helper methods to access difference addresses and their respective details +const coreAddresses = { + getAddressForUser: function(userName) { + return allAddresses.users[userName].address; + }, + + getPassphraseForUser: function(userName) { + return allAddresses.users[userName].passphrase; + }, + + getAddressForContract: function(contractName) { + var contractAddress = allAddresses.contracts[contractName].address; + if (Array.isArray(contractAddress)) { + throw "Please pass valid contractName to get contract address for: "+contractName; + } + return contractAddress; + }, + + // This must return array of addresses. + getAddressesForContract: function(contractName) { + var contractAddresses = allAddresses.contracts[contractName].address; + if (!contractAddresses || !Array.isArray(contractAddresses) || contractAddresses.length===0) { + throw "Please pass valid contractName to get contract address for: "+contractName; + } + return contractAddresses; + }, + + getContractNameFor: function(contractAddr) { + return addrToContractNameMap[(contractAddr || '').toLowerCase()]; + }, + + getAbiForContract: function(contractName) { + return allAddresses.contracts[contractName].abi; + }, + + getBinForContract: function(contractName) { + return allAddresses.contracts[contractName].bin; + } +}; + +module.exports = coreAddresses; + diff --git a/config/core_bins.js b/config/core_bins.js new file mode 100644 index 0000000..67435fa --- /dev/null +++ b/config/core_bins.js @@ -0,0 +1,23 @@ +"use strict"; + +/* + * Load all contract bin files + * + */ + +const fs = require('fs') + , path = require('path') +; + +function readFile(filePath, options) { + filePath = path.join(__dirname, '/' + filePath); + return fs.readFileSync(filePath, options || "utf8"); +} + +const rootPrefix = ".."; + +const coreBins = { + pricer: readFile(rootPrefix + '/contracts/bin/Pricer.bin', 'utf8') +}; + +module.exports = coreBins; diff --git a/config/core_constants.js b/config/core_constants.js new file mode 100644 index 0000000..32ea4bd --- /dev/null +++ b/config/core_constants.js @@ -0,0 +1,36 @@ +"use strict"; + +const path = require('path') + , rootPrefix = ".." +; + +/* + * Constants file: Load constants from environment variables + * + */ + +function define(name, value) { + Object.defineProperty(exports, name, { + value: value, + enumerable: true + }); +} + +// Gas price +define("OST_GAS_PRICE", process.env.OST_GAS_PRICE); + +// Zero gas constant to deploy +define("OST_GAS_PRICE_FOR_DEPLOYMENT", '0x0'); + +// ST' UUID +define('OST_ST_PRIME_UUID', process.env.OST_ST_PRIME_UUID); + +// Geth +define('OST_GETH_RPC_PROVIDER', process.env.OST_GETH_RPC_PROVIDER); +define('OST_GETH_WS_PROVIDER', process.env.OST_GETH_WS_PROVIDER); + +// Chain ID +define('OST_CHAIN_ID', process.env.OST_CHAIN_ID); + +// Gas limit +define('OST_GAS_LIMIT', 9000000); diff --git a/helpers/custom_console_logger.js b/helpers/custom_console_logger.js new file mode 100644 index 0000000..02824ef --- /dev/null +++ b/helpers/custom_console_logger.js @@ -0,0 +1,73 @@ +"use strict"; + +/* + * Custom Console log methods. Apply different colors for different log levels/severity. + * + */ +// +// const CONSOLE_RESET = "\x1b[0m"; +// const ERR_PRE = "\x1b[31m"; //Error. (RED) +// const INFO_PRE = "\x1b[33m "; //Info (YELLOW) +// const WIN_PRE = "\x1b[32m"; //Success (GREEN) +// const WARN_PRE = "\x1b[43m"; +// const STEP_PRE = "\n\x1b[34m"; //Step Description (BLUE) + + +const CONSOLE_RESET = ""; +const ERR_PRE = ""; +const INFO_PRE = ""; +const WIN_PRE = ""; +const WARN_PRE = ""; +const STEP_PRE = ""; + + +module.exports = { + "STEP_PRE": STEP_PRE + , "WARN_PRE": WARN_PRE + , "WIN_PRE": WIN_PRE + , "INFO_PRE": INFO_PRE + , "ERR_PRE": ERR_PRE + , "CONSOLE_RESET": CONSOLE_RESET + + , step: function () { + var args = [this.STEP_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + //Method to Log Information + , info: function () { + var args = [this.INFO_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + //Method to Log Error. + , error: function () { + var args = [this.ERR_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + , warn: function () { + var args = [this.WARN_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + //Method to Log Success/Win. + , win: function () { + var args = [this.WIN_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + , log: function () { + console.log.apply(console, arguments); + } +}; \ No newline at end of file diff --git a/lib/contract_interact/helper.js b/lib/contract_interact/helper.js new file mode 100644 index 0000000..6ccddbb --- /dev/null +++ b/lib/contract_interact/helper.js @@ -0,0 +1,322 @@ +"use strict"; + +/** + * This is utility class for contract interacts

+ * + * Ref: {@link module:ContractHelper} + * + * @module lib/contract_helper/helper + */ + +const rootPrefix = '../..' + , assert = require("assert") + , coreAddresses = require(rootPrefix+'/config/core_addresses') + , web3EventsDecoder = require(rootPrefix+'/lib/web3/events/decoder') + ; + +/** + * Deploy Helper class to perform deploy + * + * @exports lib/contract_helper/helper + */ +const helper = { + + /** + * Call methods (execute methods which DO NOT modify state of contracts) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [options] - optional params + * @param {Object} [transactionOutputs] - optional transactionOutputs + * + * @return {Promise} + * + */ + call: function (web3RpcProvider, currContractAddr, encodeABI, options, transactionOutputs) { + var params = { + to: currContractAddr, + data: encodeABI + }; + if (options) { + Object.assign(params,options) + } + return web3RpcProvider.eth.call(params) + .then(function(response){ + console.log(response); + if ( transactionOutputs ) { + return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); + } else { + return response; + } + }); + }, + + /** + * get outputs of a given transaction + * + * @param {Object} transactionObject - transactionObject is returned from call method. + * + * @return {Object} + * + */ + getTransactionOutputs: function ( transactionObject ) { + return transactionObject._method.outputs; + }, + + /** + * Send methods (execute methods which modify state of a contracts) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [options] - optional params + * @param {Object} [transactionOutputs] - optional transactionOutputs + * + * @return {Promise} + * + */ + send: function (web3RpcProvider, currContractAddr, encodeABI, options, transactionOutputs) { + var params = { + to: currContractAddr, + data: encodeABI + }; + if (options) { + Object.assign(params, options) + } + + return web3RpcProvider.eth.sendTransaction(params) + .then(function(response){ + if ( transactionOutputs ) { + return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); + } else { + return response; + } + }); + + }, + + /** + * @ignore + */ + sendTxAsync: function (web3RpcProvider, currContractAddr, encodeABI, senderName, txOptions) { + const senderAddr = coreAddresses.getAddressForUser(senderName) + ,senderPassphrase = coreAddresses.getPassphraseForUser(senderName) + ; + + return helper.sendTxAsyncFromAddr(web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions); + }, + + /** + * @ignore + */ + sendTxAsyncFromAddr: function (web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions) { + const txParams = { + from: senderAddr, + to: currContractAddr, + data: encodeABI + }; + Object.assign(txParams, txOptions); + + console.log("sendTxAsyncFromAddr :: Unlock Account", senderAddr); + return web3RpcProvider.eth.personal.unlockAccount( senderAddr, senderPassphrase) + .then( _ => { + var isPromiseSettled = false; + console.log("sendTxAsyncFromAddr :: Unlocked" ,senderAddr ); + return new Promise(async function (onResolve, onReject) { + try { + web3RpcProvider.eth.sendTransaction(txParams ,function (error, result) { + //THIS CALLBACK IS IMPORTANT -> on('error') Does not explain the reason. + + console.log("sendTransaction :: callback :: error", error); + console.log("sendTransaction :: callback :: result", result); + if ( error ) { + console.log("sendTxAsyncFromAddr :: sendTransaction :: error :: \n\t", error ); + !isPromiseSettled && onReject( error ); + } + }) + .on('transactionHash', txHash => { + console.log("sendTxAsyncFromAddr :: sendTransaction :: transactionHash :: txHash ", txHash); + isPromiseSettled = true; + onResolve( txHash ); + }); + } catch( ex ) { + console.log("sendTxAsyncFromAddr :: sendTransaction :: Exception :: \n\t", JSON.stringify( ex ) ); + onReject( ex ); + } + }); + }) + .catch( reason => { + + console.log("sendTxAsyncFromAddr :: catch :: \n\t", reason, "\n\t", JSON.stringify( reason ) ); + return Promise.reject( reason ); + }); + }, + + /** + * Safe Send a transaction (this internally waits for transaction to be mined) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {String} senderName - name of transaction's sender + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [txOptions] - optional txOptions + * @param {Object} [addressToNameMap] - optional addressToNameMap + * + * @return {Promise} + * + */ + safeSend: function (web3RpcProvider, currContractAddr, encodeABI, senderName, txOptions, addressToNameMap) { + return helper.sendTxAsync(web3RpcProvider, currContractAddr, encodeABI, senderName, txOptions) + .then(function(transactionHash) { + return helper.getTxReceipt(web3RpcProvider, transactionHash, addressToNameMap) + .then(function(txReceipt) { + if (txReceipt.gasUsed == txOptions.gasPrice) { + console.error("safeSend used complete gas gasPrice : " + txOptions.gasPrice); + } + return Promise.resolve(txReceipt); + }); + } + ); + }, + + /** + * Safe Send a transaction (this internally waits for transaction to be mined) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {String} senderAddr - address of transaction's sender senderAddr + * @param {String} senderPassphrase - passphrase of + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [txOptions] - optional txOptions + * @param {Object} [addressToNameMap] - optional addressToNameMap + * + * @return {Promise} + * + */ + safeSendFromAddr: function (web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions, addressToNameMap) { + return helper.sendTxAsyncFromAddr(web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions).then( + function(transactionHash){ + console.log("--> addressToNameMap" , addressToNameMap); + return helper.getTxReceipt(web3RpcProvider, transactionHash, addressToNameMap); + } + ); + }, + + /** + * @ignore + */ + getTxReceipt: function(web3RpcProvider, transactionHash, addressToNameMap) { + return new Promise (function(onResolve, onReject) { + + var tryReceipt = function() { + setTimeout( function(){ + web3RpcProvider.eth.getTransactionReceipt(transactionHash).then(handleResponse); + }, + 5000 + ); + }; + + var handleResponse = function (response) { + if (response) { + console.log("----> addressToNameMap" , addressToNameMap); + //clearInterval(txSetInterval); + const web3EventsDecoderResult = web3EventsDecoder.perform(response, addressToNameMap); + onResolve(web3EventsDecoderResult); + } else { + console.log('Waiting for ' + transactionHash + ' to be mined'); + tryReceipt(); + } + }; + + tryReceipt(); + + }); + }, + + /** + * Decode result and typecast it to an Address + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} result - current contract address + * + * @return {Promise} + * + */ + toAddress: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.eth.abi.decodeParameter('address', result)); + }); + }, + + /** + * Decode result and typecast it to a String + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} result - current contract address + * + * @return {Promise} + * + */ + toString: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.eth.abi.decodeParameter('bytes32', result)); + }); + }, + + /** + * Decode result and typecast it to a Number + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} result - current contract address + * + * @return {Promise} + * + */ + toNumber: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.utils.hexToNumber(result)); + }); + }, + + /** + * @ignore + */ + decodeUint256: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.eth.abi.decodeParameter('uint256', result)); + }); + }, + + /** + * @ignore + */ + assertAddress: function ( address ) { + assert.ok(/^0x[0-9a-fA-F]{40}$/.test(address), `Invalid blockchain address: ${address}`); + }, + /** + * @ignore + */ + isAddressValid: function ( address ) { + if ( typeof address !== "string" ) { + return false; + } + return /^0x[0-9a-fA-F]{40}$/.test(address); + }, + + /** + * Stub method to generate managed key passphrase + * + * @return {String} + * + */ + generateManagedKeyPassphrase: function (...arg) { + //STUB METHOD. + //We will have some algorithm here to generate the passphrase based on passed arguments. + //args will be inputs from various sources like foundation/member company/the enduser. + return process.env.OST_MANAGED_KEY_PASSPHRASE; + } + +}; + +module.exports = helper; \ No newline at end of file diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js new file mode 100644 index 0000000..cc6928b --- /dev/null +++ b/lib/contract_interact/pricer.js @@ -0,0 +1,191 @@ +"use strict"; + +/** + * + * This is a utility file which would be used for executing all methods on Pricer contract.

+ * + * @module lib/contract_interact/pricer + * + */ +const rootPrefix = '../..' + , web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc') + , helper = require(rootPrefix + '/lib/contract_interact/helper') + , contractName = 'pricer' + , coreAddresses = require(rootPrefix + '/config/core_addresses') + , contractAbi = coreAddresses.getAbiForContract(contractName) + , currContractAddr = coreAddresses.getAddressForContract(contractName) + , currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr) + , coreConstants = require(rootPrefix + '/config/core_constants') + , GAS_PRICE = coreConstants.OST_GAS_PRICE + , GAS_LIMIT = coreConstants.OST_GAS_LIMIT + , logger = require(rootPrefix + '/helpers/custom_console_logger') +; + +/** + * @constructor + * + * + */ +const Pricer = module.exports = function () { + this.contractAddress = currContractAddr; + currContract.setProvider(web3RpcProvider.currentProvider); +}; + +Pricer.prototype = { + /** + * Get branded token address of pricer + * + * @return {Promise} + * + */ + brandedToken: async function () { + const transactionObject = currContract.methods.brandedToken(); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + /** + * Get acceptable margin for the given currency + * + * @return {Promise} + * + */ + acceptedMargins: async function (currency) { + const transactionObject = currContract.methods.acceptedMargins(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + /** + * Get address of price oracle for the given currency + * + * @return {Promise} + * + */ + priceOracles: async function (currency) { + const transactionObject = currContract.methods.priceOracles(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + + /** + * Updates the price oracle address for a given currency + * + * @return {Promise} + * + */ + setPriceOracle: async function (senderAddress, senderPassphrase, currency, address) { + const transactionObject = currContract.methods.setPriceOracle(currency,address); + const encodedABI = transactionObject.encodeABI(); + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + }, + + /** + * Remove the price oracle address for a given currency + * + * @return {Promise} + * + */ + unsetPriceOracle: async function (senderAddress, senderPassphrase, currency) { + const transactionObject = currContract.methods.unsetPriceOracle(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + }, + + /** + * Updates the acceptable margin range for a given currency + * + * @return {Promise} + * + */ + setAcceptedMargin: async function (senderAddress, senderPassphrase, currency, acceptedMargin) { + const transactionObject = currContract.methods.setAcceptedMargin(currency, acceptedMargin); + const encodedABI = transactionObject.encodeABI(); + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + }, + + + /** + * Pay + * + * @return {Promise} + * + */ + Pricer.prototype.setAcceptedMargin = async function ( + senderAddress, + senderPassphrase, + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, + intendedPricePoint) { + + const transactionObject = currContract.methods.pay( + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, + intendedPricePoint); + + const encodedABI = transactionObject.encodeABI(); + + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + } + + + /** + * Get current price point and token decimal for the price oracle for the give currency + * + * @return {Promise} + * + */ + getPricePoint: async function (currency) { + const transactionObject = currContract.methods.getPricePoint(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + } +}; + diff --git a/lib/web3/events/decoder.js b/lib/web3/events/decoder.js new file mode 100644 index 0000000..65233d2 --- /dev/null +++ b/lib/web3/events/decoder.js @@ -0,0 +1,112 @@ +"use strict"; + +/** + * Decode logs from a transaction receipt + * + * @module lib/web3/events/formatter + * + */ + +const rootPrefix = '../../..' + , coreAddresses = require(rootPrefix+'/config/core_addresses') + , responseHelper = require(rootPrefix+'/lib/formatter/response') + ; + +const web3EventsDecoder = function () {}; + +/** + * Ivent Decoder. + * + * @namespace web3EventsDecoder + * + */ +web3EventsDecoder.prototype = { + + /** + * performer + * + * @param {Object} txReceipt + * @param {Hash} addressToNameMap - Map of the address(key) to name(value) + * + * @returns {result} object of {@link resulthelpwe\\er} + * + * @methodOf web3EventsDecoder + * + */ + perform: function(txReceipt, addressToNameMap) { + console.log("------> addressToNameMap" , addressToNameMap); + const oThis = this; + + var decodedEvents = []; + + // Transaction receipt not found + if (!txReceipt) { + return responseHelper.error('tx_receipt_not_found', 'Transaction receipt was not found.'); + } + + // Block not yet mined + if (!txReceipt.blockNumber) { + return responseHelper.error('l_w_ld_1', 'Transaction not yet mined. Please try after some time.'); + } + + var toAddr = txReceipt.to; + var contractName = oThis.getContractNameFor(toAddr, addressToNameMap); + + + // if the address is a known address + if (contractName && txReceipt.logs.length > 0) { + + var abiDecoder = require('abi-decoder') + , relevantLogs = []; + + for (var i = 0; i < txReceipt.logs.length; i++) { + + var currContract = oThis.getContractNameFor(txReceipt.logs[i].address, addressToNameMap); + + console.debug('**** contract address: ' + txReceipt.logs[i].address + ' at log index(' + i + ') in TxHash: ' + txReceipt.transactionHash + ''); + + if (!currContract) { + console.error('**** No contract found for contract address: ' + txReceipt.logs[i].address + ' at log index(' + i + ') in TxHash: ' + txReceipt.transactionHash + ''); + continue; + } + + const currContractABI = coreAddresses.getAbiForContract(currContract); + + // ABI not found + if (!currContractABI) { + return responseHelper.error('l_w_ld_2', 'ABI not found for contract '+ currContract); + } + + relevantLogs.push(txReceipt.logs[i]); + abiDecoder.addABI(currContractABI); + } + + if(relevantLogs.length > 0) { + decodedEvents = abiDecoder.decodeLogs(relevantLogs); + } + + } + + return responseHelper.successWithData({ + rawTransactionReceipt: txReceipt, + formattedTransactionReceipt: { + transactionHash: txReceipt.transactionHash, + blockHash: txReceipt.blockHash, + blockNumber: txReceipt.blockNumber, + eventsData: decodedEvents, + toAddress: toAddr, + contractAddress: txReceipt.contractAddress || '' + } + }); + } + , getContractNameFor: function ( address, addressToNameMap ) { + const lcAddress = String( address ).toLowerCase(); + if ( !addressToNameMap || !( addressToNameMap[ address ] || addressToNameMap[ lcAddress ] ) ) { + return coreAddresses.getContractNameFor( address ); + } + return addressToNameMap[ address ] || addressToNameMap[ lcAddress ]; + } + +}; + +module.exports = new web3EventsDecoder(); \ No newline at end of file diff --git a/lib/web3/events/formatter.js b/lib/web3/events/formatter.js new file mode 100644 index 0000000..8b0048f --- /dev/null +++ b/lib/web3/events/formatter.js @@ -0,0 +1,53 @@ +"use strict"; + +/** + * Format decoded event into Hash with all the events received into it. + * + * @module lib/web3/events/formatter + * + */ + +const web3EventsFormatter = module.exports = function () {}; + +/** + * Ivent Formatter. + * + * @namespace web3EventsFormatter + * + */ +web3EventsFormatter.prototype = { + + /** + * performer + * + * @param formattedTransactionReceipt + * @returns {Promise.<{}>} + * + * @methodOf web3EventsFormatter + * + */ + perform: function(formattedTransactionReceipt) { + var eventsData = formattedTransactionReceipt.eventsData + , formattedEvents = {}; + + for (var i = 0; i < eventsData.length; i++) { + var currEvent = eventsData[i] + , currEventName = currEvent.name + , currEventAddr = currEvent.address + , currEventParams = currEvent.events; + + formattedEvents[currEventName] = {address: currEventAddr}; + + for (var j = 0; j < currEventParams.length; j++) { + var p = currEventParams[j]; + formattedEvents[currEventName][p.name] = p.value; + } + + } + + return Promise.resolve(formattedEvents); + } + +}; + +module.exports = new web3EventsFormatter(); \ No newline at end of file diff --git a/lib/web3/events/processor.js b/lib/web3/events/processor.js new file mode 100644 index 0000000..cbe2e75 --- /dev/null +++ b/lib/web3/events/processor.js @@ -0,0 +1,163 @@ +"use strict"; + +/** + * This script reads the queue set in {@link module:lib/web3/events/queue_manager} + *
It schedules the task at given interval and dequeue. + * + * @module lib/web3/events/processor + * + */ + +const rootPrefix = '../../..' + , logger = require(rootPrefix+'/helpers/custom_console_logger') + ; + +const EventProcessor = module.exports = function (eventObj, processor) { + this.setEventData( eventObj ); + + //IMPORTANT:: processor should always return a promise. + this.processor = processor; +}; + +/** + * Ivent Processor. + * @namespace EventProcessor + */ +EventProcessor.prototype = { + + /** + * @constructor + */ + constructor: EventProcessor, + + setEventData: function(eventObj){ + this.eventObj = eventObj; + }, + + /** + * processor initialize + */ + processor: null, + + /** + * we should process the event after 90 seconds. This corresponds to 6 blocks safe delay. + */ + eventProcessingDelay: 90000, + + /** + * timer initialize + */ + timer: -1, + + /** + * isScheduled initialize to false + */ + isScheduled: false, + + /** + * eventObj initialize + */ + eventObj: null, + + /** + * onProcessCallback initialize + */ + onProcessCallback: null, + + /** + * Setting callback function on process the task {@link member:onProcessCallback} + * + * @param {function} callback + */ + setOnProcessCallback: function ( callback ) { + this.onProcessCallback = callback; + }, + + /** + * Check if the eventObj is valid. + * + * @return {boolean} + * + */ + isValid: function () { + //Note: Always log the reason is calling an event invalid. + + if( !this.eventObj ) { + logger.warn("Event Invalid :: eventObj is null "); + return false; + } else if ( this.eventObj.removed ) { + logger.warn("Event Invalid :: removed", this.getEventDescription() ); + return false; + } + + return true; + }, + + /** + * Schedule Processing from the queue. + * + * @return {boolean} + * + */ + scheduleProcessing: function() { + var oThis = this; + if ( oThis.isScheduled || !oThis.isValid()) { + logger.warn("EventProcessor :: scheduleProcessing :: Processing is already scheduled or not valid.", oThis.getEventDescription() ); + return false; + } + oThis.isScheduled = true; + oThis.timer = setTimeout(function () { + + logger.info("EventProcessor :: processRequest :: Processing Started.", oThis.getEventDescription() ); + + oThis.processor(oThis.eventObj) + .then(function(res){ + console.log('success', JSON.stringify(res)); + oThis.triggerProcessCallback( true ); + }) + .catch( function(error){ + console.log('error', JSON.stringify(error)); + oThis.triggerProcessCallback( false ); + }); + }, oThis.eventProcessingDelay); + + return true; + }, + + /** + * Cancel Processing. + * + */ + cancelProcessing: function () { + var oThis = this; + if ( !oThis.isScheduled ) { + logger.warn("EventProcessor :: cancelProcessing :: Processing is NOT scheduled.", oThis.getEventDescription() ); + return; + } + clearTimeout( oThis.timer ); + oThis.isScheduled = false; + oThis.timer = -1; + }, + + /** + * Processor callback called in {@link scheduleProcessing} + * + */ + triggerProcessCallback: function ( success ) { + var oThis = this; + oThis.isScheduled = false; + if(oThis.onProcessCallback){ + oThis.onProcessCallback( oThis.eventObj, success); + } + oThis.eventObj = null; + oThis.onProcessCallback = null; + }, + + /** + * Get Event Description. + */ + getEventDescription: function () { + return "IntentHandler EventId: " + this.eventObj.id + " transactionHash: " + this.eventObj.transactionHash; + } + +}; diff --git a/lib/web3/events/queue_manager.js b/lib/web3/events/queue_manager.js new file mode 100644 index 0000000..aadfceb --- /dev/null +++ b/lib/web3/events/queue_manager.js @@ -0,0 +1,195 @@ +"use strict"; + +/** + * This script accepts the tasks from the intercomm process, + * Put them into a queue and run the processor passed from intercomm with the delay of 6 blocks. + * + * @module lib/web3/events/queue_manager + * + */ + +const rootPrefix = '../../..' + , logger = require(rootPrefix+'/helpers/custom_console_logger') + , eventProcessorKlass = require(rootPrefix+'/lib/web3/events/processor'); + +const EventQueueManager = module.exports = function () {}; + +/** + * Ivent Queue Manager for InterComm. + * @namespace EventQueueManager + */ +EventQueueManager.prototype = { + + /** + * Starts the process of the script with initializing processor + * @constructor + * @memberOf EventQueueManager + */ + constructor: EventQueueManager, + + /** + * Queue Handler initialization + */ + handlerQueue: {}, + + /** + * Processor initialization + */ + processor: null, + + /** + * Setting Processor passed from caller like {@link module:services/inter_comm/stake_and_mint} + * + * @param {function} processor - Process to be executed on event catch. + * + */ + setProcessor: function (processor) { + this.processor = processor; + }, + + /** + * Add Edit object in the {@link handlerQueue} + * + * @param {Object} eventObj - Event object. + * + */ + addEditEventInQueue: function ( eventObj ) { + var oThis = this; + const eventId = eventObj.id; + + if ( oThis.handlerQueue[ eventId ] ) { + //We have received this event before. It may have been changed/removed. + if ( eventObj.removed ) { + oThis.removeIntent( eventObj ); + } else { + oThis.updateIntent( eventObj ); + } + } + else if ( eventObj.removed ) { + return false; + } else { + //This is a new event. Lets queue it. + oThis.queueIntent( eventObj ); + } + + }, + + /** + * Verify and add object of {@link module:lib/web3/events/processor} in the {@link handlerQueue} + * + * @param {Object} eventObj - Event object. + * + */ + queueIntent: function ( eventObj ) { + var oThis = this; + + const eventId = eventObj.id; + + logger.info("Queuing", eventId); + + //Sanity Check + if ( oThis.handlerQueue[eventId] ) { + logger.error(eventId, " has already been queued"); + return; + } + + //Create intent handler + const _handler = new eventProcessorKlass( eventObj, oThis.processor ); + + //Set the onProcessCallback + _handler.setOnProcessCallback(function ( eventObj, success ) { + if ( eventId ) { + logger.info(eventId, "has been processed successfully."); + } else { + logger.error(eventId, "has been processed successfully."); + } + oThis.dequeueIntent( eventObj ) + }); + + var isScheduled = _handler.scheduleProcessing(); + + if(!isScheduled){return;} + + //Just for the sake of it. + oThis.handlerQueue[ eventId ] = _handler; + }, + + /** + * - If the event is updated, cancel the processing using cancelProcessing method in {@link module:lib/web3/events/processor}. + *
- Update the event data in object of processor + *
- And schedule it for processing using scheduleProcessing method in {@link module:lib/web3/events/processor}. + * + * @param {Object} eventObj - Event object. + * + */ + updateIntent: function ( eventObj ) { + var oThis = this; + + const eventId = eventObj.id; + const _handler = oThis.handlerQueue[ eventId ]; + + if ( !_handler ) { + logger.info("updateIntent :: _handler is null"); + return; + } + + //Cancel Scheduled Processing. + _handler.cancelProcessing(); + + //Update Event Data. + _handler.setEventData( eventObj ); + + var isScheduled = _handler.scheduleProcessing(); + + if(!isScheduled){return;} + + //Just for the sake of it. + oThis.handlerQueue[ eventId ] = _handler; + }, + + /** + * - If the event is removed, cancel the processing using cancelProcessing method in {@link module:lib/web3/events/processor}. + *
- And dequeue the event from the queue by using {@link dequeueIntent} + * + * @param {Object} eventObj - Event object. + * + */ + removeIntent: function ( eventObj ) { + var oThis = this; + + const eventId = eventObj.id; + const _handler = oThis.handlerQueue[ eventId ]; + + logger.warn(eventId, "has been removed"); + + if ( !_handler ) { + return; + } + + //Cancel Scheduled Processing. + _handler.cancelProcessing(); + + //Dequeue it. + oThis.dequeueIntent( eventObj ); + + }, + + /** + * dequeue the event from the queue + * + * @param {Object} eventObj - Event object. + * + */ + dequeueIntent: function ( eventObj ) { + var oThis = this; + const eventId = eventObj.id; + + if ( !oThis.handlerQueue[ eventId ] ) { + return; + } + + oThis.handlerQueue[ eventId ] = null; + + } + +}; \ No newline at end of file diff --git a/lib/web3/providers/rpc.js b/lib/web3/providers/rpc.js new file mode 100644 index 0000000..159425e --- /dev/null +++ b/lib/web3/providers/rpc.js @@ -0,0 +1,8 @@ +"use strict"; + +const coreConstants = require('../../../config/core_constants'); + +const Web3 = require('web3') + , web3UtilityRpcProvider = new Web3(coreConstants.OST_GETH_RPC_PROVIDER); + +module.exports = web3UtilityRpcProvider; diff --git a/lib/web3/providers/ws.js b/lib/web3/providers/ws.js new file mode 100644 index 0000000..e03d6a2 --- /dev/null +++ b/lib/web3/providers/ws.js @@ -0,0 +1,8 @@ +"use strict"; + +const coreConstants = require('../../../config/core_constants'); + +const Web3 = require('web3') + , web3UtilityWsProvider = new Web3(coreConstants.OST_GETH_WS_PROVIDER); + +module.exports = web3UtilityWsProvider; diff --git a/set_env_vars.sh b/set_env_vars.sh new file mode 100644 index 0000000..dab0e62 --- /dev/null +++ b/set_env_vars.sh @@ -0,0 +1,11 @@ + +export OST_GAS_PRICE='0x12A05F200' +export OST_GETH_RPC_PROVIDER='http://localhost:9546' +export OST_GETH_WS_PROVIDER='ws://localhost:19546' +export OST_DEPLOYER_ADDR='' +export OST_DEPLOYER_PASSPHRASE='testtest' +export OST_OPS_ADDR='' +export OST_OPS_PASSPHRASE='testtest' +export OST_PRICER_CONTRACT_ADDR='' +export OST_ST_PRIME_UUID='' +export OST_CHAIN_ID=2000 \ No newline at end of file From 217084eddddca8cd0c2835ccda206b800f40564d Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 25 Jan 2018 14:07:30 +0530 Subject: [PATCH 002/242] Interaction layer: deploy code --- .eslintrc.js | 280 ++++++++++++++++++++++++++++++++ lib/contract_interact/pricer.js | 72 ++++---- package-lock.json | 201 ++++++++++++++++++++++- package.json | 12 +- tools/deploy/helper.js | 177 ++++++++++++++++++++ tools/deploy/pricer.js | 98 +++++++++++ 6 files changed, 800 insertions(+), 40 deletions(-) create mode 100644 .eslintrc.js create mode 100644 tools/deploy/helper.js create mode 100644 tools/deploy/pricer.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..8e23708 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,280 @@ +module.exports = { + "env": { + "es6": true, + "node": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 2017 + }, + "rules": { + "accessor-pairs": "error", + "array-bracket-newline": "error", + "array-bracket-spacing": "error", + "array-callback-return": "error", + "array-element-newline": "off", + "arrow-body-style": "off", + "arrow-parens": [ + "error", + "as-needed" + ], + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-scoped-var": "error", + "block-spacing": [ + "error", + "always" + ], + "callback-return": "error", + "camelcase": "error", + "capitalized-comments": "off", + "class-methods-use-this": "error", + "comma-dangle": "error", + "comma-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "comma-style": "error", + "complexity": "error", + "computed-property-spacing": [ + "error", + "never" + ], + "consistent-return": "error", + "consistent-this": "error", + "curly": "error", + "default-case": "error", + "dot-location": "off", + "dot-notation": [ + "error", + { + "allowKeywords": true + } + ], + "eol-last": "error", + "eqeqeq": "error", + "for-direction": "error", + "func-call-spacing": "error", + "func-name-matching": "error", + "func-names": [ + "error", + "never" + ], + "func-style": [ + "error", + "declaration" + ], + "function-paren-newline": "off", + "generator-star-spacing": "error", + "getter-return": "error", + "global-require": "error", + "guard-for-in": "off", + "handle-callback-err": "error", + "id-blacklist": "error", + "id-length": "off", + "id-match": "error", + "indent": [2,2], + "indent-legacy": "off", + "init-declarations": "error", + "jsx-quotes": "error", + "key-spacing": "error", + "keyword-spacing": "error", + "line-comment-position": "error", + "linebreak-style": [ + "error", + "unix" + ], + "lines-around-comment": "error", + "lines-around-directive": "error", + "max-depth": "error", + "max-len": "off", + "max-lines": "error", + "max-nested-callbacks": "error", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": "off", + "new-parens": "off", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "error", + "no-alert": "error", + "no-array-constructor": "error", + "no-await-in-loop": "error", + "no-bitwise": [ + "error", + { + "int32Hint": true + } + ], + "no-buffer-constructor": "error", + "no-caller": "error", + "no-catch-shadow": "error", + "no-confusing-arrow": "off", + "no-console": "warn", + "no-continue": "error", + "no-div-regex": "error", + "no-duplicate-imports": "error", + "no-else-return": "off", + "no-empty-function": "error", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-extra-parens": "error", + "no-floating-decimal": "error", + "no-implicit-coercion": "error", + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-inline-comments": "error", + "no-invalid-this": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "error", + "no-loop-func": "error", + "no-magic-numbers": "off", + "no-mixed-operators": "error", + "no-mixed-requires": "error", + "no-multi-assign": "off", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": "error", + "no-native-reassign": "error", + "no-negated-condition": "error", + "no-negated-in-lhs": "error", + "no-nested-ternary": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-param-reassign": "error", + "no-path-concat": "error", + "no-plusplus": "error", + "no-process-env": "off", + "no-process-exit": "warn", + "no-proto": "error", + "no-prototype-builtins": "error", + "no-restricted-globals": "error", + "no-restricted-imports": "error", + "no-restricted-modules": "error", + "no-restricted-properties": "error", + "no-restricted-syntax": "error", + "no-return-assign": "off", + "no-return-await": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "error", + "no-shadow-restricted-names": "error", + "no-spaced-func": "error", + "no-sync": "warn", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-ternary": "off", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-undef":"error", + "no-undefined": "off", + "no-underscore-dangle": "off", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "error", + "no-unreachable": "warn", + "no-unused-expressions": "error", + "no-unused-vars": [ + "error", + { "vars": "all", "args": "none"} + ], + "no-use-before-define": "error", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "off", + "no-void": "error", + "no-warning-comments": "warn", + "no-whitespace-before-property": "error", + "no-with": "error", + "nonblock-statement-body-position": "error", + "object-curly-newline": "error", + "object-curly-spacing": "off", + "object-property-newline": [ + "error", + { + "allowMultiplePropertiesPerLine": true + } + ], + "object-shorthand": "off", + "one-var": "off", + "one-var-declaration-per-line": "error", + "operator-assignment": "error", + "operator-linebreak": "error", + "padded-blocks": "off", + "padding-line-between-statements": "error", + "prefer-arrow-callback": "off", + "prefer-const": "error", + "prefer-destructuring": "off", + "prefer-numeric-literals": "error", + "prefer-promise-reject-errors": "error", + "prefer-reflect": "off", + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "off", + "quote-props": "off", + "quotes": "off", + "radix": "error", + "require-await": "error", + "require-jsdoc": "off", + "rest-spread-spacing": "error", + "semi": ["error", "always"], + "semi-spacing": "error", + "semi-style": [ + "error", + "last" + ], + "sort-imports": "error", + "sort-keys": "off", + "sort-vars": "error", + "space-before-blocks": "error", + "space-before-function-paren": "off", + "space-in-parens": "off", + "space-infix-ops": "off", + "space-unary-ops": "error", + "spaced-comment": "off", + "strict": "error", + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": [ + "error", + "never" + ], + "template-tag-spacing": "error", + "unicode-bom": [ + "error", + "never" + ], + "valid-jsdoc": "off", + "wrap-iife": "error", + "wrap-regex": "error", + "yield-star-spacing": "error", + "yoda": [ + "error", + "never" + ] + } +}; diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index cc6928b..152759f 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -1,4 +1,4 @@ -"use strict"; +//"use strict"; /** * @@ -7,38 +7,38 @@ * @module lib/contract_interact/pricer * */ -const rootPrefix = '../..' - , web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc') - , helper = require(rootPrefix + '/lib/contract_interact/helper') - , contractName = 'pricer' - , coreAddresses = require(rootPrefix + '/config/core_addresses') - , contractAbi = coreAddresses.getAbiForContract(contractName) - , currContractAddr = coreAddresses.getAddressForContract(contractName) - , currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr) - , coreConstants = require(rootPrefix + '/config/core_constants') - , GAS_PRICE = coreConstants.OST_GAS_PRICE - , GAS_LIMIT = coreConstants.OST_GAS_LIMIT - , logger = require(rootPrefix + '/helpers/custom_console_logger') -; +const rootPrefix = '../..'; +const helper = require(rootPrefix + '/lib/contract_interact/helper'); +const coreAddresses = require(rootPrefix + '/config/core_addresses'); +const web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc'); +const coreConstants = require(rootPrefix + '/config/core_constants'); +const contractName = 'pricer'; +const contractAbi = coreAddresses.getAbiForContract(contractName); +const currContractAddr = coreAddresses.getAddressForContract(contractName); +const currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr); +const GAS_PRICE = coreConstants.OST_GAS_PRICE; +const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; +//const logger = require(rootPrefix + '/helpers/custom_console_logger') + /** * @constructor * - * */ -const Pricer = module.exports = function () { +const Pricer = module.exports = function () { this.contractAddress = currContractAddr; currContract.setProvider(web3RpcProvider.currentProvider); }; Pricer.prototype = { + /** * Get branded token address of pricer * * @return {Promise} * */ - brandedToken: async function () { + brandedToken: async function () { const transactionObject = currContract.methods.brandedToken(); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); @@ -82,11 +82,11 @@ Pricer.prototype = { * */ setPriceOracle: async function (senderAddress, senderPassphrase, currency, address) { - const transactionObject = currContract.methods.setPriceOracle(currency,address); + const transactionObject = currContract.methods.setPriceOracle(currency, address); const encodedABI = transactionObject.encodeABI(); const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, @@ -106,7 +106,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, @@ -126,7 +126,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, @@ -142,36 +142,36 @@ Pricer.prototype = { * @return {Promise} * */ - Pricer.prototype.setAcceptedMargin = async function ( - senderAddress, + pay: async function ( + senderAddress, senderPassphrase, - beneficiaryAddress, - transferAmount, - commissionBeneficiaryAddress, - commissionAmount, - currency, + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, intendedPricePoint) { const transactionObject = currContract.methods.pay( - beneficiaryAddress, - transferAmount, - commissionBeneficiaryAddress, - commissionAmount, - currency, + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, intendedPricePoint); const encodedABI = transactionObject.encodeABI(); - + const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, { gasPrice: GAS_PRICE, gas: GAS_LIMIT } ); return Promise.resolve(transactionReceipt); - } + }, /** diff --git a/package-lock.json b/package-lock.json index 500c731..f8ed658 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "openst-payments", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1020,6 +1020,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", @@ -1192,6 +1198,16 @@ "randombytes": "2.0.6" } }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, "domain-browser": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", @@ -1337,6 +1353,147 @@ "estraverse": "4.2.0" } }, + "eslint-config-google": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", + "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", + "dev": true + }, + "eslint-config-standard": { + "version": "11.0.0-beta.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz", + "integrity": "sha512-f+vs5HAHQo7NRZ3hVe+UVdT5DbebMNaFTWFp95orJ0LUdYPoWdM8xw/bMeO/IZMvHOPmIteGKGc2QOhSXd5nRg==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "requires": { + "ignore": "3.3.7", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", + "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, "esrecurse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", @@ -2669,6 +2826,12 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "ganache-cli": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", @@ -2990,6 +3153,15 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -3077,6 +3249,12 @@ "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", "dev": true }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -3445,6 +3623,12 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, "lodash.create": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", @@ -3904,6 +4088,12 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -4252,6 +4442,15 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", diff --git a/package.json b/package.json index f9c1cb1..4978ddf 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,16 @@ "web3": "^0.20.2" }, "devDependencies": { - "truffle": "^4.0.1", - "ganache-cli": "^6.0.3", "abi-decoder": "^1.0.9", - "ethereumjs-testrpc": "^6.0.3" + "eslint-config-google": "^0.9.1", + "eslint-config-standard": "^11.0.0-beta.0", + "eslint-plugin-import": "^2.8.0", + "eslint-plugin-node": "^5.2.1", + "eslint-plugin-promise": "^3.6.0", + "eslint-plugin-standard": "^3.0.1", + "ethereumjs-testrpc": "^6.0.3", + "ganache-cli": "^6.0.3", + "truffle": "^4.0.1" }, "author": "OpenST Foundation Ltd.", "license": "LGPL-3.0" diff --git a/tools/deploy/helper.js b/tools/deploy/helper.js new file mode 100644 index 0000000..8ba1dc6 --- /dev/null +++ b/tools/deploy/helper.js @@ -0,0 +1,177 @@ +"use strict"; + +/** + * This is utility class for deploying contract

+ * + * Ref: {@link module:tools/deploy/DeployHelper} + * + * @module tools/deploy/helper + */ + +const rootPrefix = '../..' + , coreConstants = require(rootPrefix + '/config/core_constants') + , gasPrice = coreConstants.OST_VALUE_GAS_PRICE + , gasLimit = coreConstants.OST_VALUE_GAS_LIMIT // this is taken by default if no value is passed from outside + , coreAddresses = require(rootPrefix + '/config/core_addresses') + , logger = require(rootPrefix + '/helpers/custom_console_logger') + , web3EventsFormatter = require(rootPrefix + '/lib/web3/events/formatter'); + +const _private = { + + /** + * Wait for Transaction to be included in block + * + * @param {Web3} web3Provider - It could be value chain or utility chain provider + * @param {String} transactionHash - Hash for which receipt is required. + * + * @return {Promise} + */ + getReceipt: function (web3Provider, transactionHash) { + return new Promise(function (onResolve, onReject) { + + var txSetInterval = null; + + var handleResponse = function (response) { + if (response) { + clearInterval(txSetInterval); + onResolve(response); + } else { + console.log('Waiting for ' + transactionHash + ' to be included in block.'); + } + }; + + txSetInterval = setInterval( + function () { + web3Provider.eth.getTransactionReceipt(transactionHash).then(handleResponse); + }, + 5000 + ); + + }); + } + +}; + +/** + * Deploy Helper class to perform deploy + * + * @exports tools/deploy/DeployHelper + */ +const deployHelper = { + + /** + * Method deploys contract + * + * @param {String} contractName - Contract Name to be deployed + * @param {Web3} web3Provider - Web3 Provider object + * @param {String} contractAbi - Contract Abi to be deployed + * @param {String} contractBin - Contract Bin file to be deployed + * @param {String} deployerName - Deployer name + * @param {Object} [customOptions] - Custom options for value/utility chain + * @param {Object} [constructorArgs] - Arguments to be passed while deploying contract + * + * @async + * @method perform + * @return {Promise} + * + */ + perform: async function (contractName, + web3Provider, + contractAbi, + contractBin, + deployerName, + customOptions, + constructorArgs) { + + const deployerAddr = coreAddresses.getAddressForUser(deployerName) + , deployerAddrPassphrase = coreAddresses.getPassphraseForUser(deployerName); + + var options = { + from: deployerAddr, + gas: gasLimit, + data: (web3Provider.utils.isHexStrict(contractBin) ? "" : "0x") + contractBin, + gasPrice: gasPrice + }; + + Object.assign(options, customOptions); + + if (constructorArgs) { + options.arguments = constructorArgs; + } + + var contract = new web3Provider.eth.Contract( + contractAbi, + null, // since addr is not known yet + options + ); + + // this is needed since the contract object + contract.setProvider(web3Provider.currentProvider); + + const deploy = function () { + return new Promise(function (onResolve, onReject) { + contract.deploy(options).send() + .on('transactionHash', onResolve) + .on('error', onReject); + }); + }; + + console.log("Unlocking address: " + deployerAddr); + console.log("Unlocking!!!"); + await web3Provider.eth.personal.unlockAccount(deployerAddr, deployerAddrPassphrase); + + console.log("Deploying contract " + contractName); + + var deployFailedReason = null; + const transactionReceipt = await deploy().then( + function (transactionHash) { + return _private.getReceipt(web3Provider, transactionHash); + } + ).catch(reason => { + deployFailedReason = reason; + console.log( deployFailedReason ); + return null; + }); + + if ( deployFailedReason ) { + return Promise.reject( deployFailedReason ); + } + + console.log("deploy transactionReceipt ::", transactionReceipt); + + const contractAddress = transactionReceipt.contractAddress; + + const code = await web3Provider.eth.getCode(contractAddress); + + if (code.length <= 2) { + return Promise.reject("Contract deployment failed. Invalid code length for contract: " + contractName); + } + + // Print summary + console.log("Contract Address: " + contractAddress); + console.log("Gas used: " + transactionReceipt.gasUsed); + + return Promise.resolve({ + receipt: transactionReceipt, + contractAddress: contractAddress + }); + }, + + assertEvent: async function (formattedTransactionReceipt, eventName) { + var formattedEvents = await web3EventsFormatter.perform(formattedTransactionReceipt); + var eventData = formattedEvents[eventName]; + if (eventData === undefined || eventData == '') { + logger.error("Event: " + eventName + " is not found"); + logger.info(" eventData "); + logger.info(eventData); + process.exit(0); + } else { + logger.win(" event: " + eventName + " is present in Reciept."); + } + ; + } + + +}; + +module.exports = deployHelper; diff --git a/tools/deploy/pricer.js b/tools/deploy/pricer.js new file mode 100644 index 0000000..01031c8 --- /dev/null +++ b/tools/deploy/pricer.js @@ -0,0 +1,98 @@ +/** + * This is script for deploying Pricer contract on any chain.

+ * + * Prerequisite: + *
    + *
  1. Deployer Address
  2. + *
+ * + * These are the following steps:
+ *
    + *
  1. Deploy Pricer contract
  2. + *
+ * + * + * @module tools/deploy/pricer + */ + +const readline = require('readline'); +const rootPrefix = '../..'; +const web3Provider = require(rootPrefix + '/lib/web3/providers/rpc'); +const deployHelper = require(rootPrefix + '/tools/deploy/helper'); +const coreConstants = require(rootPrefix + '/config/core_constants'); +const coreAddresses = require(rootPrefix + '/config/core_addresses'); +const prompts = readline.createInterface(process.stdin, process.stdout); +const logger = require(rootPrefix + '/helpers/custom_console_logger'); +//const PriceOracle = require(rootPrefix + "/lib/contract_interact/price_oracle"); + +const deploymentOptions = { + gasPrice: coreConstants.OST_GAS_PRICE, + gas: coreConstants.OST_GAS_LIMIT +}; + +// Different addresses used for deployment +const deployerName = "deployer"; +const deployerAddress = coreAddresses.getAddressForUser(deployerName); + +/** + * It is the main performer method of this deployment script + * + * @param {Array} arguments + * + * @return {} + */ +async function performer(argv) { + + const brandedTokenAddress = argv[2].trim(); + const travisCIEnabledValue = argv[3].trim(); + + const isTravisCIEnabled = travisCIEnabledValue === 'travis'; + + logger.info("Deployer Address: " + deployerAddress); + logger.info("Branded Token Address: " + brandedTokenAddress); + logger.info("Travis CI enabled Status: " + isTravisCIEnabled); + + if (isTravisCIEnabled === false ) { + await new Promise( + function (onResolve, onReject) { + prompts.question("Please verify all above details. Do you want to proceed? [Y/N]", function (intent) { + if (intent === 'Y') { + logger.info('Great! Proceeding deployment.'); + prompts.close(); + onResolve(); + } else { + logger.error('Exiting deployment scripts. Change the enviroment variables and re-run.'); + process.exit(1); + } + }); + } + ); + } else { + prompts.close(); + } + + const contractName = 'pricer'; + const contractAbi = coreAddresses.getAbiForContract(contractName); + const contractBin = coreAddresses.getBinForContract(contractName); + + + var constructorArgs = [brandedTokenAddress]; + + logger.info("Deploying contract: "+contractName); + + var contractDeployTxReceipt = await deployHelper.perform( + contractName, + web3Provider, + contractAbi, + contractBin, + deployerName, + deploymentOptions, + constructorArgs + ); + + logger.info(contractDeployTxReceipt); + logger.win(contractName+ " Deployed "); + +} + +performer(process.argv); From 5315d1ecb5a556a2c667cb50d56887611674de9b Mon Sep 17 00:00:00 2001 From: Benjamin Bollen Date: Sun, 28 Jan 2018 21:59:18 +0100 Subject: [PATCH 003/242] contracts: proposal for Workers.sol to manage active workers --- contracts/Workers.sol | 93 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 contracts/Workers.sol diff --git a/contracts/Workers.sol b/contracts/Workers.sol new file mode 100644 index 0000000..89ef3dd --- /dev/null +++ b/contracts/Workers.sol @@ -0,0 +1,93 @@ +pragma solidity ^0.4.17; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: Workers +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./OpsManaged.sol"; +import "./SafeMath.sol"; + +/// A set of authorised workers +contract Workers is OpsManaged { + using SafeMath for uint256; + + /* + * Storage + */ + /// workers are active up unto the deactivation height + mapping(address => uint256 /* deactivation height */) public workers; + + /* + * Public functions + */ + function Workers() + public + OpsManaged() + { + } + + function setWorker( + address _worker, + uint256 _deactivationHeight) + external + onlyOps + returns (uint256 /* remaining activation length */) + { + require(_deactivationHeight >= block.number); + + workers[_worker] = _deactivationHeight; + + return (_deactivationHeight - block.number); + } + + function removeWorker( + address _worker) + external + onlyOps + returns (bool existed) + { + existed = (workers[_worker] > 0); + + delete workers[_worker]; + + return existed; + } + + // clean up or collectively revoke all workers + function remove() + external + onlyAdminOrOps + { + selfdestruct(msg.sender); + } + + /* + * Public view functions + */ + function isWorker( + address _worker) + external + view + returns (bool /* is active worker */) + { + return (workers[_worker] >= block.number); + } + +} \ No newline at end of file From 93c19335920360680a08808bfcaed61bc9af13ea Mon Sep 17 00:00:00 2001 From: Benjamin Bollen Date: Sun, 28 Jan 2018 23:20:01 +0100 Subject: [PATCH 004/242] contracts: (incomplete) proposal for Airdrop --- contracts/Airdrop.sol | 122 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 contracts/Airdrop.sol diff --git a/contracts/Airdrop.sol b/contracts/Airdrop.sol new file mode 100644 index 0000000..7297355 --- /dev/null +++ b/contracts/Airdrop.sol @@ -0,0 +1,122 @@ +pragma solidity ^0.4.17; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: Airdrop +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + + +// look to replace with interface +import "./Workers.sol"; + + +contract Airdrop is Pricer { + // SafeMath for uint256 is declared in Pricer.sol + + /* + * Storage + */ + Workers public workers; + address public airdropBudget; + + /* + * Public functions + */ + function Airdrop( + address _brandedToken, + Workers _workers, + address _airdropBudget) + public + Pricer(_brandedToken) + OpsManaged() + { + require(_workers != address(0)); + require(_airdropBudget != address(0)); + + workers = _workers; + airdropBudget = _airdropBudget; + } + + /// airPay matches the behaviour of pricer:pay + /// but allows spending from + function airPay( + /// input parameters for pricer:pay + address _beneficiary, + uint256 _transferAmount, + address _commissionBeneficiary, + uint256 _commissionAmount, + bytes3 _currency, + uint256 _intendedPricePoint, + /// additional input parameters for airdrop + address _user, + uint256 _airdropAmount) + public + returns (uint256 totalPaid, uint256 airdropUsed) + { + require(workers.isWorker(msg.sender)); + + /* + * lift from pricer:pay + * further clean up + */ + require(_beneficiary != address(0)); + require(_transferAmount != 0); + + if (_commissionAmount > 0) { + require(_commissionBeneficiary != address(0)); + } + + uint256 tokenAmount = _transferAmount; + uint256 commissionTokenAmount = _commissionAmount; + uint256 pricePoint = _intendedPricePoint; + if (_currency != 0) { + uint8 tokenDecimals = 0; + (pricePoint, tokenDecimals) = getPricePoint(_currency); + require(pricePoint > 0); + require(isPricePointInRange(_intendedPricePoint, pricePoint, pricerAcceptedMargins[_currency])); + (tokenAmount, commissionTokenAmount) = getBTAmountFromCurrencyValue(pricePoint, + tokenDecimals, _transferAmount, _commissionAmount); + } + /* + * end of pricer:pay + */ + + totalPaid = tokenAmount + commissionTokenAmount; + airdropUsed = _airdropAmount; + if (totalPaid < _airdropAmount) { + airdropUsed = _airdropAmount - totalPaid; + } + // prefund the user from the airdrop budget + require (EIP20Interface(pricerBrandedToken).transferFrom(airdropBudget, _user, airdropUsed)) + + /* + * lift from pricer:pay + */ + require(EIP20Interface(pricerBrandedToken).transferFrom(_user, _beneficiary, tokenAmount)); + if (_commissionBeneficiary != address(0)) { + require(EIP20Interface(pricerBrandedToken).transferFrom(_user, + _commissionBeneficiary, commissionTokenAmount)); + } + + //Trigger Event for PaymentComplete + Payment(_beneficiary, _transferAmount, _commissionBeneficiary, + _commissionAmount, _currency, _intendedPricePoint, pricePoint); + return (totalPaid, airdropUsed); + } +} \ No newline at end of file From 4b9d49f65656e3187bbf455610d12b91009494a0 Mon Sep 17 00:00:00 2001 From: Benjamin Bollen Date: Sun, 28 Jan 2018 23:20:55 +0100 Subject: [PATCH 005/242] contracts: change return value to total paid for pay() --- contracts/Pricer.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/Pricer.sol b/contracts/Pricer.sol index f0e67fd..c077e72 100644 --- a/contracts/Pricer.sol +++ b/contracts/Pricer.sol @@ -174,7 +174,7 @@ contract Pricer is OpsManaged, PricerInterface { /// @param _commissionAmount commissionAmount /// @param _currency currency /// @param _intendedPricePoint _intendedPricePoint - /// @return bool isSuccess + /// @return uint256 total paid function pay( address _beneficiary, uint256 _transferAmount, @@ -183,7 +183,7 @@ contract Pricer is OpsManaged, PricerInterface { bytes3 _currency, uint256 _intendedPricePoint) public - returns (bool /* success */) + returns (uint256 /* total paid */) { require(_beneficiary != address(0)); require(_transferAmount != 0); @@ -213,7 +213,7 @@ contract Pricer is OpsManaged, PricerInterface { //Trigger Event for PaymentComplete Payment(_beneficiary, _transferAmount, _commissionBeneficiary, _commissionAmount, _currency, _intendedPricePoint, pricePoint); - return true; + return (tokenAmount + commissionTokenAmount); } /// @dev Takes _currency; From 892fb460483c371902f93ac68179c35e960cd201 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 24 Jan 2018 13:02:15 +0530 Subject: [PATCH 006/242] contract_interact: Pricer.js initial code --- config/core_abis.js | 24 +++ config/core_addresses.js | 92 +++++++++ config/core_bins.js | 23 +++ config/core_constants.js | 36 ++++ helpers/custom_console_logger.js | 73 +++++++ lib/contract_interact/helper.js | 322 +++++++++++++++++++++++++++++++ lib/contract_interact/pricer.js | 191 ++++++++++++++++++ lib/web3/events/decoder.js | 112 +++++++++++ lib/web3/events/formatter.js | 53 +++++ lib/web3/events/processor.js | 163 ++++++++++++++++ lib/web3/events/queue_manager.js | 195 +++++++++++++++++++ lib/web3/providers/rpc.js | 8 + lib/web3/providers/ws.js | 8 + set_env_vars.sh | 11 ++ 14 files changed, 1311 insertions(+) create mode 100644 config/core_abis.js create mode 100644 config/core_addresses.js create mode 100644 config/core_bins.js create mode 100644 config/core_constants.js create mode 100644 helpers/custom_console_logger.js create mode 100644 lib/contract_interact/helper.js create mode 100644 lib/contract_interact/pricer.js create mode 100644 lib/web3/events/decoder.js create mode 100644 lib/web3/events/formatter.js create mode 100644 lib/web3/events/processor.js create mode 100644 lib/web3/events/queue_manager.js create mode 100644 lib/web3/providers/rpc.js create mode 100644 lib/web3/providers/ws.js create mode 100644 set_env_vars.sh diff --git a/config/core_abis.js b/config/core_abis.js new file mode 100644 index 0000000..2a9aeb5 --- /dev/null +++ b/config/core_abis.js @@ -0,0 +1,24 @@ +"use strict"; + +/* + * Load all contract abi files + * + */ + +const fs = require('fs') + , path = require('path') +; + +function parseFile(filePath, options) { + filePath = path.join(__dirname, '/' + filePath); + const fileContent = fs.readFileSync(filePath, options || "utf8"); + return JSON.parse(fileContent); +} + +const rootPrefix = ".."; + +const coreAbis = { + pricer: parseFile(rootPrefix + '/contracts/abi/Pricer.abi', "utf8") +}; + +module.exports = coreAbis; diff --git a/config/core_addresses.js b/config/core_addresses.js new file mode 100644 index 0000000..77d8ca5 --- /dev/null +++ b/config/core_addresses.js @@ -0,0 +1,92 @@ +"use strict"; + +/** + * List of all addresses and there respective abi, bin, passphrase + * required for platform. + * + * And helper methods to access this information using human readable + * names. + * + */ + +const rootPrefix = ".." + , coreAbis = require(rootPrefix + '/config/core_abis') + , coreBins = require(rootPrefix + '/config/core_bins'); + +const allAddresses = { + users: { + deployer: { + address: process.env.OST_DEPLOYER_ADDR, + passphrase: process.env.OST_DEPLOYER_PASSPHRASE + }, + ops: { + address: process.env.OST_OPS_ADDR, + passphrase: process.env.OST_OPS_PASSPHRASE + } + }, + + contracts: { + pricer: { + address: process.env.OST_PRICER_CONTRACT_ADDR, + abi: coreAbis.pricer, + bin: coreBins.pricer + }, + } +}; + +// generate a contract address to name map for reverse lookup +const addrToContractNameMap = {}; +for (var contractName in allAddresses.contracts) { + var addr = allAddresses.contracts[contractName].address; + + if ( Array.isArray(addr) ) { + for (var i = 0; i < addr.length; i++) { + addrToContractNameMap[addr[i].toLowerCase()] = contractName; + } + } else if ( addr !== null && typeof addr !== "undefined") { + addrToContractNameMap[addr.toLowerCase()] = contractName; + } +} + +// helper methods to access difference addresses and their respective details +const coreAddresses = { + getAddressForUser: function(userName) { + return allAddresses.users[userName].address; + }, + + getPassphraseForUser: function(userName) { + return allAddresses.users[userName].passphrase; + }, + + getAddressForContract: function(contractName) { + var contractAddress = allAddresses.contracts[contractName].address; + if (Array.isArray(contractAddress)) { + throw "Please pass valid contractName to get contract address for: "+contractName; + } + return contractAddress; + }, + + // This must return array of addresses. + getAddressesForContract: function(contractName) { + var contractAddresses = allAddresses.contracts[contractName].address; + if (!contractAddresses || !Array.isArray(contractAddresses) || contractAddresses.length===0) { + throw "Please pass valid contractName to get contract address for: "+contractName; + } + return contractAddresses; + }, + + getContractNameFor: function(contractAddr) { + return addrToContractNameMap[(contractAddr || '').toLowerCase()]; + }, + + getAbiForContract: function(contractName) { + return allAddresses.contracts[contractName].abi; + }, + + getBinForContract: function(contractName) { + return allAddresses.contracts[contractName].bin; + } +}; + +module.exports = coreAddresses; + diff --git a/config/core_bins.js b/config/core_bins.js new file mode 100644 index 0000000..67435fa --- /dev/null +++ b/config/core_bins.js @@ -0,0 +1,23 @@ +"use strict"; + +/* + * Load all contract bin files + * + */ + +const fs = require('fs') + , path = require('path') +; + +function readFile(filePath, options) { + filePath = path.join(__dirname, '/' + filePath); + return fs.readFileSync(filePath, options || "utf8"); +} + +const rootPrefix = ".."; + +const coreBins = { + pricer: readFile(rootPrefix + '/contracts/bin/Pricer.bin', 'utf8') +}; + +module.exports = coreBins; diff --git a/config/core_constants.js b/config/core_constants.js new file mode 100644 index 0000000..32ea4bd --- /dev/null +++ b/config/core_constants.js @@ -0,0 +1,36 @@ +"use strict"; + +const path = require('path') + , rootPrefix = ".." +; + +/* + * Constants file: Load constants from environment variables + * + */ + +function define(name, value) { + Object.defineProperty(exports, name, { + value: value, + enumerable: true + }); +} + +// Gas price +define("OST_GAS_PRICE", process.env.OST_GAS_PRICE); + +// Zero gas constant to deploy +define("OST_GAS_PRICE_FOR_DEPLOYMENT", '0x0'); + +// ST' UUID +define('OST_ST_PRIME_UUID', process.env.OST_ST_PRIME_UUID); + +// Geth +define('OST_GETH_RPC_PROVIDER', process.env.OST_GETH_RPC_PROVIDER); +define('OST_GETH_WS_PROVIDER', process.env.OST_GETH_WS_PROVIDER); + +// Chain ID +define('OST_CHAIN_ID', process.env.OST_CHAIN_ID); + +// Gas limit +define('OST_GAS_LIMIT', 9000000); diff --git a/helpers/custom_console_logger.js b/helpers/custom_console_logger.js new file mode 100644 index 0000000..02824ef --- /dev/null +++ b/helpers/custom_console_logger.js @@ -0,0 +1,73 @@ +"use strict"; + +/* + * Custom Console log methods. Apply different colors for different log levels/severity. + * + */ +// +// const CONSOLE_RESET = "\x1b[0m"; +// const ERR_PRE = "\x1b[31m"; //Error. (RED) +// const INFO_PRE = "\x1b[33m "; //Info (YELLOW) +// const WIN_PRE = "\x1b[32m"; //Success (GREEN) +// const WARN_PRE = "\x1b[43m"; +// const STEP_PRE = "\n\x1b[34m"; //Step Description (BLUE) + + +const CONSOLE_RESET = ""; +const ERR_PRE = ""; +const INFO_PRE = ""; +const WIN_PRE = ""; +const WARN_PRE = ""; +const STEP_PRE = ""; + + +module.exports = { + "STEP_PRE": STEP_PRE + , "WARN_PRE": WARN_PRE + , "WIN_PRE": WIN_PRE + , "INFO_PRE": INFO_PRE + , "ERR_PRE": ERR_PRE + , "CONSOLE_RESET": CONSOLE_RESET + + , step: function () { + var args = [this.STEP_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + //Method to Log Information + , info: function () { + var args = [this.INFO_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + //Method to Log Error. + , error: function () { + var args = [this.ERR_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + , warn: function () { + var args = [this.WARN_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + //Method to Log Success/Win. + , win: function () { + var args = [this.WIN_PRE]; + args = args.concat(Array.prototype.slice.call(arguments)); + args.push(this.CONSOLE_RESET); + console.log.apply(console, args); + } + + , log: function () { + console.log.apply(console, arguments); + } +}; \ No newline at end of file diff --git a/lib/contract_interact/helper.js b/lib/contract_interact/helper.js new file mode 100644 index 0000000..6ccddbb --- /dev/null +++ b/lib/contract_interact/helper.js @@ -0,0 +1,322 @@ +"use strict"; + +/** + * This is utility class for contract interacts

+ * + * Ref: {@link module:ContractHelper} + * + * @module lib/contract_helper/helper + */ + +const rootPrefix = '../..' + , assert = require("assert") + , coreAddresses = require(rootPrefix+'/config/core_addresses') + , web3EventsDecoder = require(rootPrefix+'/lib/web3/events/decoder') + ; + +/** + * Deploy Helper class to perform deploy + * + * @exports lib/contract_helper/helper + */ +const helper = { + + /** + * Call methods (execute methods which DO NOT modify state of contracts) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [options] - optional params + * @param {Object} [transactionOutputs] - optional transactionOutputs + * + * @return {Promise} + * + */ + call: function (web3RpcProvider, currContractAddr, encodeABI, options, transactionOutputs) { + var params = { + to: currContractAddr, + data: encodeABI + }; + if (options) { + Object.assign(params,options) + } + return web3RpcProvider.eth.call(params) + .then(function(response){ + console.log(response); + if ( transactionOutputs ) { + return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); + } else { + return response; + } + }); + }, + + /** + * get outputs of a given transaction + * + * @param {Object} transactionObject - transactionObject is returned from call method. + * + * @return {Object} + * + */ + getTransactionOutputs: function ( transactionObject ) { + return transactionObject._method.outputs; + }, + + /** + * Send methods (execute methods which modify state of a contracts) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [options] - optional params + * @param {Object} [transactionOutputs] - optional transactionOutputs + * + * @return {Promise} + * + */ + send: function (web3RpcProvider, currContractAddr, encodeABI, options, transactionOutputs) { + var params = { + to: currContractAddr, + data: encodeABI + }; + if (options) { + Object.assign(params, options) + } + + return web3RpcProvider.eth.sendTransaction(params) + .then(function(response){ + if ( transactionOutputs ) { + return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); + } else { + return response; + } + }); + + }, + + /** + * @ignore + */ + sendTxAsync: function (web3RpcProvider, currContractAddr, encodeABI, senderName, txOptions) { + const senderAddr = coreAddresses.getAddressForUser(senderName) + ,senderPassphrase = coreAddresses.getPassphraseForUser(senderName) + ; + + return helper.sendTxAsyncFromAddr(web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions); + }, + + /** + * @ignore + */ + sendTxAsyncFromAddr: function (web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions) { + const txParams = { + from: senderAddr, + to: currContractAddr, + data: encodeABI + }; + Object.assign(txParams, txOptions); + + console.log("sendTxAsyncFromAddr :: Unlock Account", senderAddr); + return web3RpcProvider.eth.personal.unlockAccount( senderAddr, senderPassphrase) + .then( _ => { + var isPromiseSettled = false; + console.log("sendTxAsyncFromAddr :: Unlocked" ,senderAddr ); + return new Promise(async function (onResolve, onReject) { + try { + web3RpcProvider.eth.sendTransaction(txParams ,function (error, result) { + //THIS CALLBACK IS IMPORTANT -> on('error') Does not explain the reason. + + console.log("sendTransaction :: callback :: error", error); + console.log("sendTransaction :: callback :: result", result); + if ( error ) { + console.log("sendTxAsyncFromAddr :: sendTransaction :: error :: \n\t", error ); + !isPromiseSettled && onReject( error ); + } + }) + .on('transactionHash', txHash => { + console.log("sendTxAsyncFromAddr :: sendTransaction :: transactionHash :: txHash ", txHash); + isPromiseSettled = true; + onResolve( txHash ); + }); + } catch( ex ) { + console.log("sendTxAsyncFromAddr :: sendTransaction :: Exception :: \n\t", JSON.stringify( ex ) ); + onReject( ex ); + } + }); + }) + .catch( reason => { + + console.log("sendTxAsyncFromAddr :: catch :: \n\t", reason, "\n\t", JSON.stringify( reason ) ); + return Promise.reject( reason ); + }); + }, + + /** + * Safe Send a transaction (this internally waits for transaction to be mined) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {String} senderName - name of transaction's sender + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [txOptions] - optional txOptions + * @param {Object} [addressToNameMap] - optional addressToNameMap + * + * @return {Promise} + * + */ + safeSend: function (web3RpcProvider, currContractAddr, encodeABI, senderName, txOptions, addressToNameMap) { + return helper.sendTxAsync(web3RpcProvider, currContractAddr, encodeABI, senderName, txOptions) + .then(function(transactionHash) { + return helper.getTxReceipt(web3RpcProvider, transactionHash, addressToNameMap) + .then(function(txReceipt) { + if (txReceipt.gasUsed == txOptions.gasPrice) { + console.error("safeSend used complete gas gasPrice : " + txOptions.gasPrice); + } + return Promise.resolve(txReceipt); + }); + } + ); + }, + + /** + * Safe Send a transaction (this internally waits for transaction to be mined) + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} currContractAddr - current contract address + * @param {String} senderAddr - address of transaction's sender senderAddr + * @param {String} senderPassphrase - passphrase of + * @param {Object} encodeABI - encoded method ABI data + * @param {Object} [txOptions] - optional txOptions + * @param {Object} [addressToNameMap] - optional addressToNameMap + * + * @return {Promise} + * + */ + safeSendFromAddr: function (web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions, addressToNameMap) { + return helper.sendTxAsyncFromAddr(web3RpcProvider, currContractAddr, encodeABI, senderAddr, senderPassphrase, txOptions).then( + function(transactionHash){ + console.log("--> addressToNameMap" , addressToNameMap); + return helper.getTxReceipt(web3RpcProvider, transactionHash, addressToNameMap); + } + ); + }, + + /** + * @ignore + */ + getTxReceipt: function(web3RpcProvider, transactionHash, addressToNameMap) { + return new Promise (function(onResolve, onReject) { + + var tryReceipt = function() { + setTimeout( function(){ + web3RpcProvider.eth.getTransactionReceipt(transactionHash).then(handleResponse); + }, + 5000 + ); + }; + + var handleResponse = function (response) { + if (response) { + console.log("----> addressToNameMap" , addressToNameMap); + //clearInterval(txSetInterval); + const web3EventsDecoderResult = web3EventsDecoder.perform(response, addressToNameMap); + onResolve(web3EventsDecoderResult); + } else { + console.log('Waiting for ' + transactionHash + ' to be mined'); + tryReceipt(); + } + }; + + tryReceipt(); + + }); + }, + + /** + * Decode result and typecast it to an Address + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} result - current contract address + * + * @return {Promise} + * + */ + toAddress: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.eth.abi.decodeParameter('address', result)); + }); + }, + + /** + * Decode result and typecast it to a String + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} result - current contract address + * + * @return {Promise} + * + */ + toString: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.eth.abi.decodeParameter('bytes32', result)); + }); + }, + + /** + * Decode result and typecast it to a Number + * + * @param {Web3} web3RpcProvider - It could be value chain or utility chain provider + * @param {String} result - current contract address + * + * @return {Promise} + * + */ + toNumber: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.utils.hexToNumber(result)); + }); + }, + + /** + * @ignore + */ + decodeUint256: function (web3RpcProvider, result) { + return new Promise(function(onResolve, onReject){ + onResolve(web3RpcProvider.eth.abi.decodeParameter('uint256', result)); + }); + }, + + /** + * @ignore + */ + assertAddress: function ( address ) { + assert.ok(/^0x[0-9a-fA-F]{40}$/.test(address), `Invalid blockchain address: ${address}`); + }, + /** + * @ignore + */ + isAddressValid: function ( address ) { + if ( typeof address !== "string" ) { + return false; + } + return /^0x[0-9a-fA-F]{40}$/.test(address); + }, + + /** + * Stub method to generate managed key passphrase + * + * @return {String} + * + */ + generateManagedKeyPassphrase: function (...arg) { + //STUB METHOD. + //We will have some algorithm here to generate the passphrase based on passed arguments. + //args will be inputs from various sources like foundation/member company/the enduser. + return process.env.OST_MANAGED_KEY_PASSPHRASE; + } + +}; + +module.exports = helper; \ No newline at end of file diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js new file mode 100644 index 0000000..cc6928b --- /dev/null +++ b/lib/contract_interact/pricer.js @@ -0,0 +1,191 @@ +"use strict"; + +/** + * + * This is a utility file which would be used for executing all methods on Pricer contract.

+ * + * @module lib/contract_interact/pricer + * + */ +const rootPrefix = '../..' + , web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc') + , helper = require(rootPrefix + '/lib/contract_interact/helper') + , contractName = 'pricer' + , coreAddresses = require(rootPrefix + '/config/core_addresses') + , contractAbi = coreAddresses.getAbiForContract(contractName) + , currContractAddr = coreAddresses.getAddressForContract(contractName) + , currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr) + , coreConstants = require(rootPrefix + '/config/core_constants') + , GAS_PRICE = coreConstants.OST_GAS_PRICE + , GAS_LIMIT = coreConstants.OST_GAS_LIMIT + , logger = require(rootPrefix + '/helpers/custom_console_logger') +; + +/** + * @constructor + * + * + */ +const Pricer = module.exports = function () { + this.contractAddress = currContractAddr; + currContract.setProvider(web3RpcProvider.currentProvider); +}; + +Pricer.prototype = { + /** + * Get branded token address of pricer + * + * @return {Promise} + * + */ + brandedToken: async function () { + const transactionObject = currContract.methods.brandedToken(); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + /** + * Get acceptable margin for the given currency + * + * @return {Promise} + * + */ + acceptedMargins: async function (currency) { + const transactionObject = currContract.methods.acceptedMargins(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + /** + * Get address of price oracle for the given currency + * + * @return {Promise} + * + */ + priceOracles: async function (currency) { + const transactionObject = currContract.methods.priceOracles(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + + /** + * Updates the price oracle address for a given currency + * + * @return {Promise} + * + */ + setPriceOracle: async function (senderAddress, senderPassphrase, currency, address) { + const transactionObject = currContract.methods.setPriceOracle(currency,address); + const encodedABI = transactionObject.encodeABI(); + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + }, + + /** + * Remove the price oracle address for a given currency + * + * @return {Promise} + * + */ + unsetPriceOracle: async function (senderAddress, senderPassphrase, currency) { + const transactionObject = currContract.methods.unsetPriceOracle(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + }, + + /** + * Updates the acceptable margin range for a given currency + * + * @return {Promise} + * + */ + setAcceptedMargin: async function (senderAddress, senderPassphrase, currency, acceptedMargin) { + const transactionObject = currContract.methods.setAcceptedMargin(currency, acceptedMargin); + const encodedABI = transactionObject.encodeABI(); + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + }, + + + /** + * Pay + * + * @return {Promise} + * + */ + Pricer.prototype.setAcceptedMargin = async function ( + senderAddress, + senderPassphrase, + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, + intendedPricePoint) { + + const transactionObject = currContract.methods.pay( + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, + intendedPricePoint); + + const encodedABI = transactionObject.encodeABI(); + + const transactionReceipt = await helper.safeSendFromAddr( + web3RpcProvider, + contractAddr, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + ); + return Promise.resolve(transactionReceipt); + } + + + /** + * Get current price point and token decimal for the price oracle for the give currency + * + * @return {Promise} + * + */ + getPricePoint: async function (currency) { + const transactionObject = currContract.methods.getPricePoint(currency); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + } +}; + diff --git a/lib/web3/events/decoder.js b/lib/web3/events/decoder.js new file mode 100644 index 0000000..65233d2 --- /dev/null +++ b/lib/web3/events/decoder.js @@ -0,0 +1,112 @@ +"use strict"; + +/** + * Decode logs from a transaction receipt + * + * @module lib/web3/events/formatter + * + */ + +const rootPrefix = '../../..' + , coreAddresses = require(rootPrefix+'/config/core_addresses') + , responseHelper = require(rootPrefix+'/lib/formatter/response') + ; + +const web3EventsDecoder = function () {}; + +/** + * Ivent Decoder. + * + * @namespace web3EventsDecoder + * + */ +web3EventsDecoder.prototype = { + + /** + * performer + * + * @param {Object} txReceipt + * @param {Hash} addressToNameMap - Map of the address(key) to name(value) + * + * @returns {result} object of {@link resulthelpwe\\er} + * + * @methodOf web3EventsDecoder + * + */ + perform: function(txReceipt, addressToNameMap) { + console.log("------> addressToNameMap" , addressToNameMap); + const oThis = this; + + var decodedEvents = []; + + // Transaction receipt not found + if (!txReceipt) { + return responseHelper.error('tx_receipt_not_found', 'Transaction receipt was not found.'); + } + + // Block not yet mined + if (!txReceipt.blockNumber) { + return responseHelper.error('l_w_ld_1', 'Transaction not yet mined. Please try after some time.'); + } + + var toAddr = txReceipt.to; + var contractName = oThis.getContractNameFor(toAddr, addressToNameMap); + + + // if the address is a known address + if (contractName && txReceipt.logs.length > 0) { + + var abiDecoder = require('abi-decoder') + , relevantLogs = []; + + for (var i = 0; i < txReceipt.logs.length; i++) { + + var currContract = oThis.getContractNameFor(txReceipt.logs[i].address, addressToNameMap); + + console.debug('**** contract address: ' + txReceipt.logs[i].address + ' at log index(' + i + ') in TxHash: ' + txReceipt.transactionHash + ''); + + if (!currContract) { + console.error('**** No contract found for contract address: ' + txReceipt.logs[i].address + ' at log index(' + i + ') in TxHash: ' + txReceipt.transactionHash + ''); + continue; + } + + const currContractABI = coreAddresses.getAbiForContract(currContract); + + // ABI not found + if (!currContractABI) { + return responseHelper.error('l_w_ld_2', 'ABI not found for contract '+ currContract); + } + + relevantLogs.push(txReceipt.logs[i]); + abiDecoder.addABI(currContractABI); + } + + if(relevantLogs.length > 0) { + decodedEvents = abiDecoder.decodeLogs(relevantLogs); + } + + } + + return responseHelper.successWithData({ + rawTransactionReceipt: txReceipt, + formattedTransactionReceipt: { + transactionHash: txReceipt.transactionHash, + blockHash: txReceipt.blockHash, + blockNumber: txReceipt.blockNumber, + eventsData: decodedEvents, + toAddress: toAddr, + contractAddress: txReceipt.contractAddress || '' + } + }); + } + , getContractNameFor: function ( address, addressToNameMap ) { + const lcAddress = String( address ).toLowerCase(); + if ( !addressToNameMap || !( addressToNameMap[ address ] || addressToNameMap[ lcAddress ] ) ) { + return coreAddresses.getContractNameFor( address ); + } + return addressToNameMap[ address ] || addressToNameMap[ lcAddress ]; + } + +}; + +module.exports = new web3EventsDecoder(); \ No newline at end of file diff --git a/lib/web3/events/formatter.js b/lib/web3/events/formatter.js new file mode 100644 index 0000000..8b0048f --- /dev/null +++ b/lib/web3/events/formatter.js @@ -0,0 +1,53 @@ +"use strict"; + +/** + * Format decoded event into Hash with all the events received into it. + * + * @module lib/web3/events/formatter + * + */ + +const web3EventsFormatter = module.exports = function () {}; + +/** + * Ivent Formatter. + * + * @namespace web3EventsFormatter + * + */ +web3EventsFormatter.prototype = { + + /** + * performer + * + * @param formattedTransactionReceipt + * @returns {Promise.<{}>} + * + * @methodOf web3EventsFormatter + * + */ + perform: function(formattedTransactionReceipt) { + var eventsData = formattedTransactionReceipt.eventsData + , formattedEvents = {}; + + for (var i = 0; i < eventsData.length; i++) { + var currEvent = eventsData[i] + , currEventName = currEvent.name + , currEventAddr = currEvent.address + , currEventParams = currEvent.events; + + formattedEvents[currEventName] = {address: currEventAddr}; + + for (var j = 0; j < currEventParams.length; j++) { + var p = currEventParams[j]; + formattedEvents[currEventName][p.name] = p.value; + } + + } + + return Promise.resolve(formattedEvents); + } + +}; + +module.exports = new web3EventsFormatter(); \ No newline at end of file diff --git a/lib/web3/events/processor.js b/lib/web3/events/processor.js new file mode 100644 index 0000000..cbe2e75 --- /dev/null +++ b/lib/web3/events/processor.js @@ -0,0 +1,163 @@ +"use strict"; + +/** + * This script reads the queue set in {@link module:lib/web3/events/queue_manager} + *
It schedules the task at given interval and dequeue. + * + * @module lib/web3/events/processor + * + */ + +const rootPrefix = '../../..' + , logger = require(rootPrefix+'/helpers/custom_console_logger') + ; + +const EventProcessor = module.exports = function (eventObj, processor) { + this.setEventData( eventObj ); + + //IMPORTANT:: processor should always return a promise. + this.processor = processor; +}; + +/** + * Ivent Processor. + * @namespace EventProcessor + */ +EventProcessor.prototype = { + + /** + * @constructor + */ + constructor: EventProcessor, + + setEventData: function(eventObj){ + this.eventObj = eventObj; + }, + + /** + * processor initialize + */ + processor: null, + + /** + * we should process the event after 90 seconds. This corresponds to 6 blocks safe delay. + */ + eventProcessingDelay: 90000, + + /** + * timer initialize + */ + timer: -1, + + /** + * isScheduled initialize to false + */ + isScheduled: false, + + /** + * eventObj initialize + */ + eventObj: null, + + /** + * onProcessCallback initialize + */ + onProcessCallback: null, + + /** + * Setting callback function on process the task {@link member:onProcessCallback} + * + * @param {function} callback + */ + setOnProcessCallback: function ( callback ) { + this.onProcessCallback = callback; + }, + + /** + * Check if the eventObj is valid. + * + * @return {boolean} + * + */ + isValid: function () { + //Note: Always log the reason is calling an event invalid. + + if( !this.eventObj ) { + logger.warn("Event Invalid :: eventObj is null "); + return false; + } else if ( this.eventObj.removed ) { + logger.warn("Event Invalid :: removed", this.getEventDescription() ); + return false; + } + + return true; + }, + + /** + * Schedule Processing from the queue. + * + * @return {boolean} + * + */ + scheduleProcessing: function() { + var oThis = this; + if ( oThis.isScheduled || !oThis.isValid()) { + logger.warn("EventProcessor :: scheduleProcessing :: Processing is already scheduled or not valid.", oThis.getEventDescription() ); + return false; + } + oThis.isScheduled = true; + oThis.timer = setTimeout(function () { + + logger.info("EventProcessor :: processRequest :: Processing Started.", oThis.getEventDescription() ); + + oThis.processor(oThis.eventObj) + .then(function(res){ + console.log('success', JSON.stringify(res)); + oThis.triggerProcessCallback( true ); + }) + .catch( function(error){ + console.log('error', JSON.stringify(error)); + oThis.triggerProcessCallback( false ); + }); + }, oThis.eventProcessingDelay); + + return true; + }, + + /** + * Cancel Processing. + * + */ + cancelProcessing: function () { + var oThis = this; + if ( !oThis.isScheduled ) { + logger.warn("EventProcessor :: cancelProcessing :: Processing is NOT scheduled.", oThis.getEventDescription() ); + return; + } + clearTimeout( oThis.timer ); + oThis.isScheduled = false; + oThis.timer = -1; + }, + + /** + * Processor callback called in {@link scheduleProcessing} + * + */ + triggerProcessCallback: function ( success ) { + var oThis = this; + oThis.isScheduled = false; + if(oThis.onProcessCallback){ + oThis.onProcessCallback( oThis.eventObj, success); + } + oThis.eventObj = null; + oThis.onProcessCallback = null; + }, + + /** + * Get Event Description. + */ + getEventDescription: function () { + return "IntentHandler EventId: " + this.eventObj.id + " transactionHash: " + this.eventObj.transactionHash; + } + +}; diff --git a/lib/web3/events/queue_manager.js b/lib/web3/events/queue_manager.js new file mode 100644 index 0000000..aadfceb --- /dev/null +++ b/lib/web3/events/queue_manager.js @@ -0,0 +1,195 @@ +"use strict"; + +/** + * This script accepts the tasks from the intercomm process, + * Put them into a queue and run the processor passed from intercomm with the delay of 6 blocks. + * + * @module lib/web3/events/queue_manager + * + */ + +const rootPrefix = '../../..' + , logger = require(rootPrefix+'/helpers/custom_console_logger') + , eventProcessorKlass = require(rootPrefix+'/lib/web3/events/processor'); + +const EventQueueManager = module.exports = function () {}; + +/** + * Ivent Queue Manager for InterComm. + * @namespace EventQueueManager + */ +EventQueueManager.prototype = { + + /** + * Starts the process of the script with initializing processor + * @constructor + * @memberOf EventQueueManager + */ + constructor: EventQueueManager, + + /** + * Queue Handler initialization + */ + handlerQueue: {}, + + /** + * Processor initialization + */ + processor: null, + + /** + * Setting Processor passed from caller like {@link module:services/inter_comm/stake_and_mint} + * + * @param {function} processor - Process to be executed on event catch. + * + */ + setProcessor: function (processor) { + this.processor = processor; + }, + + /** + * Add Edit object in the {@link handlerQueue} + * + * @param {Object} eventObj - Event object. + * + */ + addEditEventInQueue: function ( eventObj ) { + var oThis = this; + const eventId = eventObj.id; + + if ( oThis.handlerQueue[ eventId ] ) { + //We have received this event before. It may have been changed/removed. + if ( eventObj.removed ) { + oThis.removeIntent( eventObj ); + } else { + oThis.updateIntent( eventObj ); + } + } + else if ( eventObj.removed ) { + return false; + } else { + //This is a new event. Lets queue it. + oThis.queueIntent( eventObj ); + } + + }, + + /** + * Verify and add object of {@link module:lib/web3/events/processor} in the {@link handlerQueue} + * + * @param {Object} eventObj - Event object. + * + */ + queueIntent: function ( eventObj ) { + var oThis = this; + + const eventId = eventObj.id; + + logger.info("Queuing", eventId); + + //Sanity Check + if ( oThis.handlerQueue[eventId] ) { + logger.error(eventId, " has already been queued"); + return; + } + + //Create intent handler + const _handler = new eventProcessorKlass( eventObj, oThis.processor ); + + //Set the onProcessCallback + _handler.setOnProcessCallback(function ( eventObj, success ) { + if ( eventId ) { + logger.info(eventId, "has been processed successfully."); + } else { + logger.error(eventId, "has been processed successfully."); + } + oThis.dequeueIntent( eventObj ) + }); + + var isScheduled = _handler.scheduleProcessing(); + + if(!isScheduled){return;} + + //Just for the sake of it. + oThis.handlerQueue[ eventId ] = _handler; + }, + + /** + * - If the event is updated, cancel the processing using cancelProcessing method in {@link module:lib/web3/events/processor}. + *
- Update the event data in object of processor + *
- And schedule it for processing using scheduleProcessing method in {@link module:lib/web3/events/processor}. + * + * @param {Object} eventObj - Event object. + * + */ + updateIntent: function ( eventObj ) { + var oThis = this; + + const eventId = eventObj.id; + const _handler = oThis.handlerQueue[ eventId ]; + + if ( !_handler ) { + logger.info("updateIntent :: _handler is null"); + return; + } + + //Cancel Scheduled Processing. + _handler.cancelProcessing(); + + //Update Event Data. + _handler.setEventData( eventObj ); + + var isScheduled = _handler.scheduleProcessing(); + + if(!isScheduled){return;} + + //Just for the sake of it. + oThis.handlerQueue[ eventId ] = _handler; + }, + + /** + * - If the event is removed, cancel the processing using cancelProcessing method in {@link module:lib/web3/events/processor}. + *
- And dequeue the event from the queue by using {@link dequeueIntent} + * + * @param {Object} eventObj - Event object. + * + */ + removeIntent: function ( eventObj ) { + var oThis = this; + + const eventId = eventObj.id; + const _handler = oThis.handlerQueue[ eventId ]; + + logger.warn(eventId, "has been removed"); + + if ( !_handler ) { + return; + } + + //Cancel Scheduled Processing. + _handler.cancelProcessing(); + + //Dequeue it. + oThis.dequeueIntent( eventObj ); + + }, + + /** + * dequeue the event from the queue + * + * @param {Object} eventObj - Event object. + * + */ + dequeueIntent: function ( eventObj ) { + var oThis = this; + const eventId = eventObj.id; + + if ( !oThis.handlerQueue[ eventId ] ) { + return; + } + + oThis.handlerQueue[ eventId ] = null; + + } + +}; \ No newline at end of file diff --git a/lib/web3/providers/rpc.js b/lib/web3/providers/rpc.js new file mode 100644 index 0000000..159425e --- /dev/null +++ b/lib/web3/providers/rpc.js @@ -0,0 +1,8 @@ +"use strict"; + +const coreConstants = require('../../../config/core_constants'); + +const Web3 = require('web3') + , web3UtilityRpcProvider = new Web3(coreConstants.OST_GETH_RPC_PROVIDER); + +module.exports = web3UtilityRpcProvider; diff --git a/lib/web3/providers/ws.js b/lib/web3/providers/ws.js new file mode 100644 index 0000000..e03d6a2 --- /dev/null +++ b/lib/web3/providers/ws.js @@ -0,0 +1,8 @@ +"use strict"; + +const coreConstants = require('../../../config/core_constants'); + +const Web3 = require('web3') + , web3UtilityWsProvider = new Web3(coreConstants.OST_GETH_WS_PROVIDER); + +module.exports = web3UtilityWsProvider; diff --git a/set_env_vars.sh b/set_env_vars.sh new file mode 100644 index 0000000..dab0e62 --- /dev/null +++ b/set_env_vars.sh @@ -0,0 +1,11 @@ + +export OST_GAS_PRICE='0x12A05F200' +export OST_GETH_RPC_PROVIDER='http://localhost:9546' +export OST_GETH_WS_PROVIDER='ws://localhost:19546' +export OST_DEPLOYER_ADDR='' +export OST_DEPLOYER_PASSPHRASE='testtest' +export OST_OPS_ADDR='' +export OST_OPS_PASSPHRASE='testtest' +export OST_PRICER_CONTRACT_ADDR='' +export OST_ST_PRIME_UUID='' +export OST_CHAIN_ID=2000 \ No newline at end of file From 1d5206af9c411f403edd3336bc0529e60060e3cd Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 25 Jan 2018 14:07:30 +0530 Subject: [PATCH 007/242] Interaction layer: deploy code --- .eslintrc.js | 280 ++++++++++++++++++++++++++++++++ lib/contract_interact/pricer.js | 72 ++++---- package-lock.json | 201 ++++++++++++++++++++++- package.json | 12 +- tools/deploy/helper.js | 177 ++++++++++++++++++++ tools/deploy/pricer.js | 98 +++++++++++ 6 files changed, 800 insertions(+), 40 deletions(-) create mode 100644 .eslintrc.js create mode 100644 tools/deploy/helper.js create mode 100644 tools/deploy/pricer.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..8e23708 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,280 @@ +module.exports = { + "env": { + "es6": true, + "node": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 2017 + }, + "rules": { + "accessor-pairs": "error", + "array-bracket-newline": "error", + "array-bracket-spacing": "error", + "array-callback-return": "error", + "array-element-newline": "off", + "arrow-body-style": "off", + "arrow-parens": [ + "error", + "as-needed" + ], + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-scoped-var": "error", + "block-spacing": [ + "error", + "always" + ], + "callback-return": "error", + "camelcase": "error", + "capitalized-comments": "off", + "class-methods-use-this": "error", + "comma-dangle": "error", + "comma-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "comma-style": "error", + "complexity": "error", + "computed-property-spacing": [ + "error", + "never" + ], + "consistent-return": "error", + "consistent-this": "error", + "curly": "error", + "default-case": "error", + "dot-location": "off", + "dot-notation": [ + "error", + { + "allowKeywords": true + } + ], + "eol-last": "error", + "eqeqeq": "error", + "for-direction": "error", + "func-call-spacing": "error", + "func-name-matching": "error", + "func-names": [ + "error", + "never" + ], + "func-style": [ + "error", + "declaration" + ], + "function-paren-newline": "off", + "generator-star-spacing": "error", + "getter-return": "error", + "global-require": "error", + "guard-for-in": "off", + "handle-callback-err": "error", + "id-blacklist": "error", + "id-length": "off", + "id-match": "error", + "indent": [2,2], + "indent-legacy": "off", + "init-declarations": "error", + "jsx-quotes": "error", + "key-spacing": "error", + "keyword-spacing": "error", + "line-comment-position": "error", + "linebreak-style": [ + "error", + "unix" + ], + "lines-around-comment": "error", + "lines-around-directive": "error", + "max-depth": "error", + "max-len": "off", + "max-lines": "error", + "max-nested-callbacks": "error", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": "off", + "new-parens": "off", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "error", + "no-alert": "error", + "no-array-constructor": "error", + "no-await-in-loop": "error", + "no-bitwise": [ + "error", + { + "int32Hint": true + } + ], + "no-buffer-constructor": "error", + "no-caller": "error", + "no-catch-shadow": "error", + "no-confusing-arrow": "off", + "no-console": "warn", + "no-continue": "error", + "no-div-regex": "error", + "no-duplicate-imports": "error", + "no-else-return": "off", + "no-empty-function": "error", + "no-eq-null": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-label": "error", + "no-extra-parens": "error", + "no-floating-decimal": "error", + "no-implicit-coercion": "error", + "no-implicit-globals": "error", + "no-implied-eval": "error", + "no-inline-comments": "error", + "no-invalid-this": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": "error", + "no-lone-blocks": "error", + "no-lonely-if": "error", + "no-loop-func": "error", + "no-magic-numbers": "off", + "no-mixed-operators": "error", + "no-mixed-requires": "error", + "no-multi-assign": "off", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": "error", + "no-native-reassign": "error", + "no-negated-condition": "error", + "no-negated-in-lhs": "error", + "no-nested-ternary": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-param-reassign": "error", + "no-path-concat": "error", + "no-plusplus": "error", + "no-process-env": "off", + "no-process-exit": "warn", + "no-proto": "error", + "no-prototype-builtins": "error", + "no-restricted-globals": "error", + "no-restricted-imports": "error", + "no-restricted-modules": "error", + "no-restricted-properties": "error", + "no-restricted-syntax": "error", + "no-return-assign": "off", + "no-return-await": "error", + "no-script-url": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow": "error", + "no-shadow-restricted-names": "error", + "no-spaced-func": "error", + "no-sync": "warn", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-ternary": "off", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-undef":"error", + "no-undefined": "off", + "no-underscore-dangle": "off", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": "error", + "no-unreachable": "warn", + "no-unused-expressions": "error", + "no-unused-vars": [ + "error", + { "vars": "all", "args": "none"} + ], + "no-use-before-define": "error", + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-var": "off", + "no-void": "error", + "no-warning-comments": "warn", + "no-whitespace-before-property": "error", + "no-with": "error", + "nonblock-statement-body-position": "error", + "object-curly-newline": "error", + "object-curly-spacing": "off", + "object-property-newline": [ + "error", + { + "allowMultiplePropertiesPerLine": true + } + ], + "object-shorthand": "off", + "one-var": "off", + "one-var-declaration-per-line": "error", + "operator-assignment": "error", + "operator-linebreak": "error", + "padded-blocks": "off", + "padding-line-between-statements": "error", + "prefer-arrow-callback": "off", + "prefer-const": "error", + "prefer-destructuring": "off", + "prefer-numeric-literals": "error", + "prefer-promise-reject-errors": "error", + "prefer-reflect": "off", + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "off", + "quote-props": "off", + "quotes": "off", + "radix": "error", + "require-await": "error", + "require-jsdoc": "off", + "rest-spread-spacing": "error", + "semi": ["error", "always"], + "semi-spacing": "error", + "semi-style": [ + "error", + "last" + ], + "sort-imports": "error", + "sort-keys": "off", + "sort-vars": "error", + "space-before-blocks": "error", + "space-before-function-paren": "off", + "space-in-parens": "off", + "space-infix-ops": "off", + "space-unary-ops": "error", + "spaced-comment": "off", + "strict": "error", + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": [ + "error", + "never" + ], + "template-tag-spacing": "error", + "unicode-bom": [ + "error", + "never" + ], + "valid-jsdoc": "off", + "wrap-iife": "error", + "wrap-regex": "error", + "yield-star-spacing": "error", + "yoda": [ + "error", + "never" + ] + } +}; diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index cc6928b..152759f 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -1,4 +1,4 @@ -"use strict"; +//"use strict"; /** * @@ -7,38 +7,38 @@ * @module lib/contract_interact/pricer * */ -const rootPrefix = '../..' - , web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc') - , helper = require(rootPrefix + '/lib/contract_interact/helper') - , contractName = 'pricer' - , coreAddresses = require(rootPrefix + '/config/core_addresses') - , contractAbi = coreAddresses.getAbiForContract(contractName) - , currContractAddr = coreAddresses.getAddressForContract(contractName) - , currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr) - , coreConstants = require(rootPrefix + '/config/core_constants') - , GAS_PRICE = coreConstants.OST_GAS_PRICE - , GAS_LIMIT = coreConstants.OST_GAS_LIMIT - , logger = require(rootPrefix + '/helpers/custom_console_logger') -; +const rootPrefix = '../..'; +const helper = require(rootPrefix + '/lib/contract_interact/helper'); +const coreAddresses = require(rootPrefix + '/config/core_addresses'); +const web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc'); +const coreConstants = require(rootPrefix + '/config/core_constants'); +const contractName = 'pricer'; +const contractAbi = coreAddresses.getAbiForContract(contractName); +const currContractAddr = coreAddresses.getAddressForContract(contractName); +const currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr); +const GAS_PRICE = coreConstants.OST_GAS_PRICE; +const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; +//const logger = require(rootPrefix + '/helpers/custom_console_logger') + /** * @constructor * - * */ -const Pricer = module.exports = function () { +const Pricer = module.exports = function () { this.contractAddress = currContractAddr; currContract.setProvider(web3RpcProvider.currentProvider); }; Pricer.prototype = { + /** * Get branded token address of pricer * * @return {Promise} * */ - brandedToken: async function () { + brandedToken: async function () { const transactionObject = currContract.methods.brandedToken(); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); @@ -82,11 +82,11 @@ Pricer.prototype = { * */ setPriceOracle: async function (senderAddress, senderPassphrase, currency, address) { - const transactionObject = currContract.methods.setPriceOracle(currency,address); + const transactionObject = currContract.methods.setPriceOracle(currency, address); const encodedABI = transactionObject.encodeABI(); const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, @@ -106,7 +106,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, @@ -126,7 +126,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, @@ -142,36 +142,36 @@ Pricer.prototype = { * @return {Promise} * */ - Pricer.prototype.setAcceptedMargin = async function ( - senderAddress, + pay: async function ( + senderAddress, senderPassphrase, - beneficiaryAddress, - transferAmount, - commissionBeneficiaryAddress, - commissionAmount, - currency, + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, intendedPricePoint) { const transactionObject = currContract.methods.pay( - beneficiaryAddress, - transferAmount, - commissionBeneficiaryAddress, - commissionAmount, - currency, + beneficiaryAddress, + transferAmount, + commissionBeneficiaryAddress, + commissionAmount, + currency, intendedPricePoint); const encodedABI = transactionObject.encodeABI(); - + const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - contractAddr, + this.contractAddr, encodedABI, senderAddress, senderPassphrase, { gasPrice: GAS_PRICE, gas: GAS_LIMIT } ); return Promise.resolve(transactionReceipt); - } + }, /** diff --git a/package-lock.json b/package-lock.json index 500c731..f8ed658 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "openst-payments", - "version": "0.9.1", + "version": "0.9.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1020,6 +1020,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", @@ -1192,6 +1198,16 @@ "randombytes": "2.0.6" } }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, "domain-browser": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", @@ -1337,6 +1353,147 @@ "estraverse": "4.2.0" } }, + "eslint-config-google": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", + "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", + "dev": true + }, + "eslint-config-standard": { + "version": "11.0.0-beta.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz", + "integrity": "sha512-f+vs5HAHQo7NRZ3hVe+UVdT5DbebMNaFTWFp95orJ0LUdYPoWdM8xw/bMeO/IZMvHOPmIteGKGc2QOhSXd5nRg==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "requires": { + "ignore": "3.3.7", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", + "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, "esrecurse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", @@ -2669,6 +2826,12 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "ganache-cli": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", @@ -2990,6 +3153,15 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -3077,6 +3249,12 @@ "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", "dev": true }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -3445,6 +3623,12 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, "lodash.create": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", @@ -3904,6 +4088,12 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -4252,6 +4442,15 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", diff --git a/package.json b/package.json index f9c1cb1..4978ddf 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,16 @@ "web3": "^0.20.2" }, "devDependencies": { - "truffle": "^4.0.1", - "ganache-cli": "^6.0.3", "abi-decoder": "^1.0.9", - "ethereumjs-testrpc": "^6.0.3" + "eslint-config-google": "^0.9.1", + "eslint-config-standard": "^11.0.0-beta.0", + "eslint-plugin-import": "^2.8.0", + "eslint-plugin-node": "^5.2.1", + "eslint-plugin-promise": "^3.6.0", + "eslint-plugin-standard": "^3.0.1", + "ethereumjs-testrpc": "^6.0.3", + "ganache-cli": "^6.0.3", + "truffle": "^4.0.1" }, "author": "OpenST Foundation Ltd.", "license": "LGPL-3.0" diff --git a/tools/deploy/helper.js b/tools/deploy/helper.js new file mode 100644 index 0000000..8ba1dc6 --- /dev/null +++ b/tools/deploy/helper.js @@ -0,0 +1,177 @@ +"use strict"; + +/** + * This is utility class for deploying contract

+ * + * Ref: {@link module:tools/deploy/DeployHelper} + * + * @module tools/deploy/helper + */ + +const rootPrefix = '../..' + , coreConstants = require(rootPrefix + '/config/core_constants') + , gasPrice = coreConstants.OST_VALUE_GAS_PRICE + , gasLimit = coreConstants.OST_VALUE_GAS_LIMIT // this is taken by default if no value is passed from outside + , coreAddresses = require(rootPrefix + '/config/core_addresses') + , logger = require(rootPrefix + '/helpers/custom_console_logger') + , web3EventsFormatter = require(rootPrefix + '/lib/web3/events/formatter'); + +const _private = { + + /** + * Wait for Transaction to be included in block + * + * @param {Web3} web3Provider - It could be value chain or utility chain provider + * @param {String} transactionHash - Hash for which receipt is required. + * + * @return {Promise} + */ + getReceipt: function (web3Provider, transactionHash) { + return new Promise(function (onResolve, onReject) { + + var txSetInterval = null; + + var handleResponse = function (response) { + if (response) { + clearInterval(txSetInterval); + onResolve(response); + } else { + console.log('Waiting for ' + transactionHash + ' to be included in block.'); + } + }; + + txSetInterval = setInterval( + function () { + web3Provider.eth.getTransactionReceipt(transactionHash).then(handleResponse); + }, + 5000 + ); + + }); + } + +}; + +/** + * Deploy Helper class to perform deploy + * + * @exports tools/deploy/DeployHelper + */ +const deployHelper = { + + /** + * Method deploys contract + * + * @param {String} contractName - Contract Name to be deployed + * @param {Web3} web3Provider - Web3 Provider object + * @param {String} contractAbi - Contract Abi to be deployed + * @param {String} contractBin - Contract Bin file to be deployed + * @param {String} deployerName - Deployer name + * @param {Object} [customOptions] - Custom options for value/utility chain + * @param {Object} [constructorArgs] - Arguments to be passed while deploying contract + * + * @async + * @method perform + * @return {Promise} + * + */ + perform: async function (contractName, + web3Provider, + contractAbi, + contractBin, + deployerName, + customOptions, + constructorArgs) { + + const deployerAddr = coreAddresses.getAddressForUser(deployerName) + , deployerAddrPassphrase = coreAddresses.getPassphraseForUser(deployerName); + + var options = { + from: deployerAddr, + gas: gasLimit, + data: (web3Provider.utils.isHexStrict(contractBin) ? "" : "0x") + contractBin, + gasPrice: gasPrice + }; + + Object.assign(options, customOptions); + + if (constructorArgs) { + options.arguments = constructorArgs; + } + + var contract = new web3Provider.eth.Contract( + contractAbi, + null, // since addr is not known yet + options + ); + + // this is needed since the contract object + contract.setProvider(web3Provider.currentProvider); + + const deploy = function () { + return new Promise(function (onResolve, onReject) { + contract.deploy(options).send() + .on('transactionHash', onResolve) + .on('error', onReject); + }); + }; + + console.log("Unlocking address: " + deployerAddr); + console.log("Unlocking!!!"); + await web3Provider.eth.personal.unlockAccount(deployerAddr, deployerAddrPassphrase); + + console.log("Deploying contract " + contractName); + + var deployFailedReason = null; + const transactionReceipt = await deploy().then( + function (transactionHash) { + return _private.getReceipt(web3Provider, transactionHash); + } + ).catch(reason => { + deployFailedReason = reason; + console.log( deployFailedReason ); + return null; + }); + + if ( deployFailedReason ) { + return Promise.reject( deployFailedReason ); + } + + console.log("deploy transactionReceipt ::", transactionReceipt); + + const contractAddress = transactionReceipt.contractAddress; + + const code = await web3Provider.eth.getCode(contractAddress); + + if (code.length <= 2) { + return Promise.reject("Contract deployment failed. Invalid code length for contract: " + contractName); + } + + // Print summary + console.log("Contract Address: " + contractAddress); + console.log("Gas used: " + transactionReceipt.gasUsed); + + return Promise.resolve({ + receipt: transactionReceipt, + contractAddress: contractAddress + }); + }, + + assertEvent: async function (formattedTransactionReceipt, eventName) { + var formattedEvents = await web3EventsFormatter.perform(formattedTransactionReceipt); + var eventData = formattedEvents[eventName]; + if (eventData === undefined || eventData == '') { + logger.error("Event: " + eventName + " is not found"); + logger.info(" eventData "); + logger.info(eventData); + process.exit(0); + } else { + logger.win(" event: " + eventName + " is present in Reciept."); + } + ; + } + + +}; + +module.exports = deployHelper; diff --git a/tools/deploy/pricer.js b/tools/deploy/pricer.js new file mode 100644 index 0000000..01031c8 --- /dev/null +++ b/tools/deploy/pricer.js @@ -0,0 +1,98 @@ +/** + * This is script for deploying Pricer contract on any chain.

+ * + * Prerequisite: + *
    + *
  1. Deployer Address
  2. + *
+ * + * These are the following steps:
+ *
    + *
  1. Deploy Pricer contract
  2. + *
+ * + * + * @module tools/deploy/pricer + */ + +const readline = require('readline'); +const rootPrefix = '../..'; +const web3Provider = require(rootPrefix + '/lib/web3/providers/rpc'); +const deployHelper = require(rootPrefix + '/tools/deploy/helper'); +const coreConstants = require(rootPrefix + '/config/core_constants'); +const coreAddresses = require(rootPrefix + '/config/core_addresses'); +const prompts = readline.createInterface(process.stdin, process.stdout); +const logger = require(rootPrefix + '/helpers/custom_console_logger'); +//const PriceOracle = require(rootPrefix + "/lib/contract_interact/price_oracle"); + +const deploymentOptions = { + gasPrice: coreConstants.OST_GAS_PRICE, + gas: coreConstants.OST_GAS_LIMIT +}; + +// Different addresses used for deployment +const deployerName = "deployer"; +const deployerAddress = coreAddresses.getAddressForUser(deployerName); + +/** + * It is the main performer method of this deployment script + * + * @param {Array} arguments + * + * @return {} + */ +async function performer(argv) { + + const brandedTokenAddress = argv[2].trim(); + const travisCIEnabledValue = argv[3].trim(); + + const isTravisCIEnabled = travisCIEnabledValue === 'travis'; + + logger.info("Deployer Address: " + deployerAddress); + logger.info("Branded Token Address: " + brandedTokenAddress); + logger.info("Travis CI enabled Status: " + isTravisCIEnabled); + + if (isTravisCIEnabled === false ) { + await new Promise( + function (onResolve, onReject) { + prompts.question("Please verify all above details. Do you want to proceed? [Y/N]", function (intent) { + if (intent === 'Y') { + logger.info('Great! Proceeding deployment.'); + prompts.close(); + onResolve(); + } else { + logger.error('Exiting deployment scripts. Change the enviroment variables and re-run.'); + process.exit(1); + } + }); + } + ); + } else { + prompts.close(); + } + + const contractName = 'pricer'; + const contractAbi = coreAddresses.getAbiForContract(contractName); + const contractBin = coreAddresses.getBinForContract(contractName); + + + var constructorArgs = [brandedTokenAddress]; + + logger.info("Deploying contract: "+contractName); + + var contractDeployTxReceipt = await deployHelper.perform( + contractName, + web3Provider, + contractAbi, + contractBin, + deployerName, + deploymentOptions, + constructorArgs + ); + + logger.info(contractDeployTxReceipt); + logger.win(contractName+ " Deployed "); + +} + +performer(process.argv); From c05bec2a8fd90af16c328c84847dfa69d6103453 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 30 Jan 2018 15:13:40 +0530 Subject: [PATCH 008/242] Start chain and deployment scripts --- .eslintrc.js | 2 +- config/core_abis.js | 12 +- config/core_addresses.js | 12 +- config/core_bins.js | 12 +- config/core_constants.js | 10 +- lib/web3/providers/rpc.js | 5 +- lib/web3/providers/ws.js | 4 +- package-lock.json | 2054 ++++++++++++++++++++++++++++++-- package.json | 5 +- set_env_vars.sh | 11 - test/_init_addresses.js | 71 ++ test/deploy_all.sh | 9 + test/init_chain.sh | 9 + test/init_keys.sh | 35 + test/poa-genesis.json | 17 + test/populate_env_vars.js | 57 + test/run_chain.sh | 7 + test/set_env_vars.sh | 11 + test/start_test_chain.sh | 4 + tools/deploy/EIP20TokenMock.js | 133 +++ tools/deploy/helper.js | 27 +- tools/deploy/pricer.js | 8 +- 22 files changed, 2338 insertions(+), 177 deletions(-) delete mode 100644 set_env_vars.sh create mode 100644 test/_init_addresses.js create mode 100644 test/deploy_all.sh create mode 100755 test/init_chain.sh create mode 100755 test/init_keys.sh create mode 100644 test/poa-genesis.json create mode 100644 test/populate_env_vars.js create mode 100755 test/run_chain.sh create mode 100644 test/set_env_vars.sh create mode 100644 test/start_test_chain.sh create mode 100644 tools/deploy/EIP20TokenMock.js diff --git a/.eslintrc.js b/.eslintrc.js index 8e23708..0a5c51c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -256,7 +256,7 @@ module.exports = { "space-infix-ops": "off", "space-unary-ops": "error", "spaced-comment": "off", - "strict": "error", + "strict": "warn", "switch-colon-spacing": "error", "symbol-description": "error", "template-curly-spacing": [ diff --git a/config/core_abis.js b/config/core_abis.js index 2a9aeb5..d467726 100644 --- a/config/core_abis.js +++ b/config/core_abis.js @@ -5,20 +5,20 @@ * */ -const fs = require('fs') - , path = require('path') -; +const fs = require('fs'), + path = require('path'); function parseFile(filePath, options) { - filePath = path.join(__dirname, '/' + filePath); - const fileContent = fs.readFileSync(filePath, options || "utf8"); + const absFilePath = path.join(__dirname, '/' + filePath); + const fileContent = fs.readFileSync(absFilePath, options || "utf8"); return JSON.parse(fileContent); } const rootPrefix = ".."; const coreAbis = { - pricer: parseFile(rootPrefix + '/contracts/abi/Pricer.abi', "utf8") + pricer: parseFile(rootPrefix + '/contracts/abi/Pricer.abi', "utf8"), + eip20tokenmock: parseFile(rootPrefix + '/contracts/abi/EIP20TokenMock.abi', "utf8") }; module.exports = coreAbis; diff --git a/config/core_addresses.js b/config/core_addresses.js index 77d8ca5..f11b582 100644 --- a/config/core_addresses.js +++ b/config/core_addresses.js @@ -16,12 +16,12 @@ const rootPrefix = ".." const allAddresses = { users: { deployer: { - address: process.env.OST_DEPLOYER_ADDR, - passphrase: process.env.OST_DEPLOYER_PASSPHRASE + address: process.env.OST_PRICER_DEPLOYER_ADDR, + passphrase: process.env.OST_PRICER_DEPLOYER_PASSPHRASE }, ops: { - address: process.env.OST_OPS_ADDR, - passphrase: process.env.OST_OPS_PASSPHRASE + address: process.env.OST_PRICER_OPS_ADDR, + passphrase: process.env.OST_PRICER_OPS_PASSPHRASE } }, @@ -31,6 +31,10 @@ const allAddresses = { abi: coreAbis.pricer, bin: coreBins.pricer }, + eip20tokenmock: { + abi: coreAbis.eip20tokenmock, + bin: coreBins.eip20tokenmock + } } }; diff --git a/config/core_bins.js b/config/core_bins.js index 67435fa..ff1e695 100644 --- a/config/core_bins.js +++ b/config/core_bins.js @@ -5,19 +5,19 @@ * */ -const fs = require('fs') - , path = require('path') -; +const fs = require('fs'), + path = require('path'); function readFile(filePath, options) { - filePath = path.join(__dirname, '/' + filePath); - return fs.readFileSync(filePath, options || "utf8"); + const absFilePath = path.join(__dirname, '/' + filePath); + return fs.readFileSync(absFilePath, options || "utf8"); } const rootPrefix = ".."; const coreBins = { - pricer: readFile(rootPrefix + '/contracts/bin/Pricer.bin', 'utf8') + pricer: readFile(rootPrefix + '/contracts/bin/Pricer.bin', 'utf8'), + eip20tokenmock: readFile(rootPrefix + '/contracts/bin/EIP20TokenMock.bin', 'utf8') }; module.exports = coreBins; diff --git a/config/core_constants.js b/config/core_constants.js index 32ea4bd..f6f5beb 100644 --- a/config/core_constants.js +++ b/config/core_constants.js @@ -17,20 +17,20 @@ function define(name, value) { } // Gas price -define("OST_GAS_PRICE", process.env.OST_GAS_PRICE); +define("OST_PRICER_GAS_PRICE", process.env.OST_PRICER_GAS_PRICE); // Zero gas constant to deploy define("OST_GAS_PRICE_FOR_DEPLOYMENT", '0x0'); // ST' UUID -define('OST_ST_PRIME_UUID', process.env.OST_ST_PRIME_UUID); +define('OST_PRICER_ST_PRIME_UUID', process.env.OST_PRICER_ST_PRIME_UUID); // Geth -define('OST_GETH_RPC_PROVIDER', process.env.OST_GETH_RPC_PROVIDER); -define('OST_GETH_WS_PROVIDER', process.env.OST_GETH_WS_PROVIDER); +define('OST_PRICER_GETH_RPC_PROVIDER', process.env.OST_PRICER_GETH_RPC_PROVIDER); +define('OST_PRICER_GETH_WS_PROVIDER', process.env.OST_PRICER_GETH_WS_PROVIDER); // Chain ID -define('OST_CHAIN_ID', process.env.OST_CHAIN_ID); +define('OST_PRICER_CHAIN_ID', process.env.OST_PRICER_CHAIN_ID); // Gas limit define('OST_GAS_LIMIT', 9000000); diff --git a/lib/web3/providers/rpc.js b/lib/web3/providers/rpc.js index 159425e..995e25b 100644 --- a/lib/web3/providers/rpc.js +++ b/lib/web3/providers/rpc.js @@ -3,6 +3,7 @@ const coreConstants = require('../../../config/core_constants'); const Web3 = require('web3') - , web3UtilityRpcProvider = new Web3(coreConstants.OST_GETH_RPC_PROVIDER); + , provider = new Web3.providers.HttpProvider(coreConstants.OST_PRICER_GETH_RPC_PROVIDER) + , web3RpcProvider = new Web3(provider); -module.exports = web3UtilityRpcProvider; +module.exports = web3RpcProvider; diff --git a/lib/web3/providers/ws.js b/lib/web3/providers/ws.js index e03d6a2..a95fbc1 100644 --- a/lib/web3/providers/ws.js +++ b/lib/web3/providers/ws.js @@ -3,6 +3,6 @@ const coreConstants = require('../../../config/core_constants'); const Web3 = require('web3') - , web3UtilityWsProvider = new Web3(coreConstants.OST_GETH_WS_PROVIDER); + , web3WsProvider = new Web3(coreConstants.OST_PRICER_GETH_WS_PROVIDER); -module.exports = web3UtilityWsProvider; +module.exports = web3WsProvider; diff --git a/package-lock.json b/package-lock.json index f8ed658..6424c6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,6 +39,15 @@ } } }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, "acorn": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", @@ -101,6 +110,11 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", @@ -126,17 +140,26 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, "asn1.js": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", - "dev": true, "requires": { "bn.js": "4.11.8", "inherits": "2.0.1", @@ -151,6 +174,11 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -172,6 +200,26 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "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==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -725,14 +773,21 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } }, "big.js": { "version": "3.2.0", @@ -756,17 +811,61 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.1" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -786,8 +885,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-stdout": { "version": "1.3.0", @@ -799,7 +897,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "dev": true, "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", @@ -813,7 +910,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, "requires": { "browserify-aes": "1.1.1", "browserify-des": "1.0.0", @@ -824,7 +920,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, "requires": { "cipher-base": "1.0.4", "des.js": "1.0.0", @@ -835,17 +930,23 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, "requires": { "bn.js": "4.11.8", "randombytes": "2.0.6" } }, + "browserify-sha3": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", + "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "requires": { + "js-sha3": "0.3.1" + } + }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", @@ -876,11 +977,23 @@ "isarray": "1.0.0" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-to-arraybuffer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.2.tgz", + "integrity": "sha1-0NgFZNwxhmoZdlFUh7OrYg23yEk=", + "requires": { + "tape": "3.6.1" + } + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-modules": { "version": "1.1.1", @@ -894,12 +1007,22 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -955,7 +1078,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "2.0.1", "safe-buffer": "5.1.1" @@ -975,8 +1097,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "code-point-at": { "version": "1.1.0", @@ -984,11 +1105,18 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, "commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, "requires": { "graceful-readlink": "1.0.1" } @@ -1002,8 +1130,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-browserify": { "version": "1.1.0", @@ -1026,12 +1153,32 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, "core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", @@ -1041,14 +1188,21 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "4.1.1", + "vary": "1.1.2" + } }, "create-ecdh": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, "requires": { "bn.js": "4.11.8", "elliptic": "6.4.0" @@ -1058,7 +1212,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, "requires": { "cipher-base": "1.0.4", "inherits": "2.0.1", @@ -1070,7 +1223,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, "requires": { "cipher-base": "1.0.4", "create-hash": "1.1.3", @@ -1091,11 +1243,28 @@ "which": "1.3.0" } }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "requires": { "browserify-cipher": "1.0.0", "browserify-sign": "4.0.4", @@ -1113,7 +1282,8 @@ "crypto-js": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true }, "d": { "version": "1.0.0", @@ -1124,6 +1294,14 @@ "es5-ext": "0.10.38" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1134,7 +1312,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -1145,6 +1322,95 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "4.1.1", + "decompress-tarbz2": "4.1.1", + "decompress-targz": "4.1.1", + "decompress-unzip": "4.0.1", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "pify": "2.3.0", + "strip-dirs": "2.1.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "5.2.0", + "is-stream": "1.1.0", + "tar-stream": "1.5.5" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "6.2.0", + "is-stream": "1.1.0", + "seek-bzip": "1.0.5", + "unbzip2-stream": "1.2.5" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "5.2.0", + "is-stream": "1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "3.9.0", + "get-stream": "2.3.1", + "pify": "2.3.0", + "yauzl": "2.9.1" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + } + } + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -1162,16 +1428,40 @@ } } }, + "deep-equal": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" + }, + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, "requires": { "inherits": "2.0.1", "minimalistic-assert": "1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -1191,7 +1481,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, "requires": { "bn.js": "4.11.8", "miller-rabin": "4.0.1", @@ -1208,17 +1497,40 @@ "isarray": "1.0.0" } }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, "domain-browser": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", "dev": true }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, "requires": { "bn.js": "4.11.8", "brorand": "1.1.0", @@ -1235,6 +1547,19 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -1335,6 +1660,11 @@ "es6-symbol": "3.1.1" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1516,6 +1846,25 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-lib": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", + "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0", + "keccakjs": "0.2.1", + "nano-json-stream-parser": "0.1.2", + "servify": "0.1.12", + "ws": "3.3.3", + "xhr-request-promise": "0.1.2" + } + }, "ethereumjs-testrpc": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", @@ -1768,6 +2117,22 @@ } } }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -1778,6 +2143,11 @@ "es5-ext": "0.10.38" } }, + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -1788,7 +2158,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "1.3.4", "safe-buffer": "5.1.1" @@ -1827,6 +2196,60 @@ "fill-range": "2.2.3" } }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -1836,17 +2259,33 @@ "is-extglob": "1.0.0" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "1.2.0" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" }, "filename-regex": { "version": "2.0.1", @@ -1867,6 +2306,27 @@ "repeat-string": "1.6.1" } }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, "find-cache-dir": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", @@ -1888,6 +2348,14 @@ "pinkie-promise": "2.0.1" } }, + "for-each": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", + "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", + "requires": { + "is-function": "1.0.1" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1903,6 +2371,31 @@ "for-in": "1.0.2" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, "fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -1916,11 +2409,32 @@ "rimraf": "2.6.2" } }, + "fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "requires": { + "any-promise": "1.3.0", + "fs-extra": "2.1.2", + "mz": "2.7.0", + "thenify-all": "1.6.0" + }, + "dependencies": { + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0" + } + } + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.1.3", @@ -2826,6 +3340,17 @@ } } }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3093,14 +3618,20 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } }, "glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -3129,23 +3660,58 @@ "is-glob": "2.0.1" } }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + } + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "graceful-fs": { - "version": "4.1.11", + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.0", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, "growl": { "version": "1.9.2", @@ -3153,6 +3719,33 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } + } + }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", @@ -3177,11 +3770,23 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "has-symbol-support-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", + "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "1.4.1" + } + }, "hash-base": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, "requires": { "inherits": "2.0.1" } @@ -3190,7 +3795,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, "requires": { "inherits": "2.0.3", "minimalistic-assert": "1.0.0" @@ -3199,11 +3803,21 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -3214,13 +3828,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { "hash.js": "1.1.3", "minimalistic-assert": "1.0.0", "minimalistic-crypto-utils": "1.0.1" } }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -3237,17 +3855,59 @@ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, "ieee754": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" }, "ignore": { "version": "3.3.7", @@ -3265,7 +3925,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -3297,6 +3956,11 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -3372,6 +4036,11 @@ "number-is-nan": "1.0.1" } }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -3381,6 +4050,16 @@ "is-extglob": "1.0.0" } }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -3390,6 +4069,16 @@ "kind-of": "3.2.2" } }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", @@ -3402,11 +4091,20 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -3417,8 +4115,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -3435,12 +4132,37 @@ "isarray": "1.0.0" } }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, + "js-sha3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", + "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -3453,11 +4175,15 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stable-stringify": { "version": "1.0.1", @@ -3468,6 +4194,11 @@ "jsonify": "0.0.0" } }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "json3": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", @@ -3484,7 +4215,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, "requires": { "graceful-fs": "4.1.11" } @@ -3495,6 +4225,26 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keccakjs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", + "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "requires": { + "browserify-sha3": "0.0.1", + "sha3": "1.2.0" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3678,6 +4428,11 @@ "js-tokens": "3.0.2" } }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", @@ -3688,11 +4443,25 @@ "yallist": "2.1.2" } }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, "requires": { "hash-base": "3.0.4", "inherits": "2.0.1" @@ -3702,7 +4471,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, "requires": { "inherits": "2.0.1", "safe-buffer": "5.1.1" @@ -3710,6 +4478,11 @@ } } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", @@ -3735,6 +4508,16 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", @@ -3760,35 +4543,62 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { "bn.js": "4.11.8", "brorand": "1.1.0" } }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "0.1.1" + } + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.8" } @@ -3796,18 +4606,24 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "0.5.1" + } + }, "mocha": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", @@ -3848,23 +4664,56 @@ } } }, + "mock-fs": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.4.2.tgz", + "integrity": "sha512-dF+yxZSojSiI8AXGoxj5qdFWpucndc54Ug+TwlpHFaV7j22MGG+OML2+FVa6xAZtjb/OFFQhOC37Jegx2GbEwA==" + }, "moment": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" }, + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mustache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "1.3.0", + "object-assign": "4.1.1", + "thenify-all": "1.6.0" + } + }, "nan": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "dev": true, - "optional": true + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "node-libs-browser": { "version": "2.1.0", @@ -3933,11 +4782,36 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" }, "object.omit": { "version": "2.0.1", @@ -3949,11 +4823,26 @@ "is-extendable": "0.1.1" } }, + "oboe": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", + "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", + "requires": { + "http-https": "1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -3991,11 +4880,15 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.2.0", @@ -4015,6 +4908,14 @@ "p-limit": "1.2.0" } }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "1.0.0" + } + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -4031,7 +4932,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, "requires": { "asn1.js": "4.9.2", "browserify-aes": "1.1.1", @@ -4052,6 +4952,15 @@ "is-glob": "2.0.1" } }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "requires": { + "for-each": "0.3.2", + "trim": "0.0.1" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -4061,6 +4970,11 @@ "error-ex": "1.3.1" } }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", @@ -4079,8 +4993,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -4094,6 +5007,11 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -4109,7 +5027,6 @@ "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "dev": true, "requires": { "create-hash": "1.1.3", "create-hmac": "1.1.6", @@ -4118,23 +5035,30 @@ "sha.js": "2.4.9" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "2.0.4" } @@ -4148,6 +5072,11 @@ "find-up": "1.1.2" } }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", @@ -4169,8 +5098,16 @@ "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } }, "prr": { "version": "1.0.1", @@ -4188,7 +5125,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", @@ -4200,8 +5136,20 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "query-string": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-2.4.2.tgz", + "integrity": "sha1-fbBmZCCAS6qSrp8miWKFWnYUPfs=", + "requires": { + "strict-uri-encode": "1.1.0" + } }, "querystring": { "version": "0.2.0", @@ -4260,7 +5208,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, "requires": { "safe-buffer": "5.1.1" } @@ -4269,12 +5216,32 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", - "dev": true, "requires": { "randombytes": "2.0.6", "safe-buffer": "5.1.1" } }, + "randomhex": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", + "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -4300,7 +5267,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -4314,8 +5280,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -4424,6 +5389,35 @@ "is-finite": "1.0.2" } }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4451,6 +5445,14 @@ "path-parse": "1.0.5" } }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "2.3.8" + } + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -4464,7 +5466,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "7.1.1" } @@ -4473,7 +5474,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, "requires": { "hash-base": "2.0.2", "inherits": "2.0.1" @@ -4482,8 +5482,50 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", + "requires": { + "nan": "2.8.0" + } + }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "requires": { + "scrypt": "6.0.3", + "scryptsy": "1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "requires": { + "pbkdf2": "3.0.14" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + } + } }, "semver": { "version": "5.5.0", @@ -4491,6 +5533,56 @@ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "1.18.2", + "cors": "2.8.4", + "express": "4.16.2", + "request": "2.83.0", + "xhr": "2.4.1" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -4506,19 +5598,30 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" }, "sha.js": { "version": "2.4.9", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", - "dev": true, "requires": { "inherits": "2.0.1", "safe-buffer": "5.1.1" } }, + "sha3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", + "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", + "requires": { + "nan": "2.8.0" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -4534,18 +5637,41 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-get": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", + "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", + "requires": { + "once": "1.4.0", + "unzip-response": "1.0.2", + "xtend": "4.0.1" + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, "solc": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", @@ -4658,6 +5784,26 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -4681,6 +5827,11 @@ "xtend": "4.0.1" } }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -4696,11 +5847,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, "requires": { "safe-buffer": "5.1.1" } }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -4719,24 +5874,185 @@ "is-utf8": "0.2.1" } }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "requires": { + "is-natural-number": "4.0.1" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "swarm-js": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", + "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", + "requires": { + "bluebird": "3.5.1", + "buffer": "5.0.8", + "decompress": "4.2.0", + "eth-lib": "0.1.27", + "fs-extra": "2.1.2", + "fs-promise": "2.0.3", + "got": "7.1.0", + "mime-types": "2.1.17", + "mkdirp-promise": "5.0.1", + "mock-fs": "4.4.2", + "setimmediate": "1.0.5", + "tar.gz": "1.0.7", + "xhr-request-promise": "0.1.2" + }, + "dependencies": { + "buffer": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", + "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8" + } + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0" + } + } + } + }, "tapable": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "tape": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/tape/-/tape-3.6.1.tgz", + "integrity": "sha1-SJPdU+KApfWMDOswwsDrs7zVHh8=", + "requires": { + "deep-equal": "0.2.2", + "defined": "0.0.0", + "glob": "3.2.11", + "inherits": "2.0.1", + "object-inspect": "0.4.0", + "resumer": "0.0.0", + "through": "2.3.8" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2.0.1", + "minimatch": "0.3.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.1" + } + }, + "tar-stream": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", + "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.1", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "tar.gz": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", + "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", + "requires": { + "bluebird": "2.11.0", + "commander": "2.9.0", + "fstream": "1.0.11", + "mout": "0.11.1", + "tar": "2.2.1" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + } + } + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "1.3.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": "3.3.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, "timers-browserify": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", @@ -4758,6 +6074,19 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -4781,12 +6110,43 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, "type-detect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", "dev": true }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray-to-buffer": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz", + "integrity": "sha1-EBezLZhP9VbroQD1AViauhrOLgQ=", + "requires": { + "is-typedarray": "1.0.0" + } + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -4830,6 +6190,52 @@ "webpack-sources": "1.1.0" } }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "requires": { + "buffer": "3.6.0", + "through": "2.3.8" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + } + } + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -4848,10 +6254,29 @@ } } }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", + "dev": true }, "util": { "version": "0.10.3", @@ -4864,8 +6289,17 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "validate-npm-package-license": { "version": "3.0.1", @@ -4877,6 +6311,21 @@ "spdx-expression-parse": "1.0.4" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -4898,19 +6347,285 @@ } }, "web3": { - "version": "0.20.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.4.tgz", - "integrity": "sha1-QA5leaZbtKPd5xpuv2UJr63DOgQ=", - "requires": { - "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" + "version": "1.0.0-beta.26", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.26.tgz", + "integrity": "sha1-u0ba9q78MT92iz3jnX9KjXvQZmM=", + "requires": { + "web3-bzz": "1.0.0-beta.29", + "web3-core": "1.0.0-beta.29", + "web3-eth": "1.0.0-beta.29", + "web3-eth-personal": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29", + "web3-shh": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-bzz": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.29.tgz", + "integrity": "sha1-xAVVzjKB9jf8X1yD3HsIy+70K3I=", + "requires": { + "got": "7.1.0", + "swarm-js": "0.1.37", + "underscore": "1.8.3" + } + }, + "web3-core": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.29.tgz", + "integrity": "sha1-G/uc3AHMPqcZDplh+PeIa7Qc/PE=", + "requires": { + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-requestmanager": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-core-helpers": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.29.tgz", + "integrity": "sha1-kUJt7MEEEmI4TA3quRvXmnCLGQI=", + "requires": { + "underscore": "1.8.3", + "web3-eth-iban": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-core-method": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.29.tgz", + "integrity": "sha1-11trk9FuK5yoxPcc3G/ubCk2HHY=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-promievent": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-core-promievent": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.29.tgz", + "integrity": "sha1-zziMs052BSiFp8K9Fec1jDm32Zg=", + "requires": { + "bluebird": "3.3.1", + "eventemitter3": "1.1.1" }, "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + "bluebird": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", + "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" + } + } + }, + "web3-core-requestmanager": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.29.tgz", + "integrity": "sha1-7s36oLtNJ8SEbEaFmJr2NVqxBzw=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "web3-providers-http": "1.0.0-beta.29", + "web3-providers-ipc": "1.0.0-beta.29", + "web3-providers-ws": "1.0.0-beta.29" + } + }, + "web3-core-subscriptions": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.29.tgz", + "integrity": "sha1-D5R1q0diCQC4gsrILsQr3NNbRKE=", + "requires": { + "eventemitter3": "1.1.1", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29" + } + }, + "web3-eth": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.29.tgz", + "integrity": "sha1-FTovYTcM50Qc4/JK5eFSC0K5PSQ=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-eth-abi": "1.0.0-beta.29", + "web3-eth-accounts": "1.0.0-beta.29", + "web3-eth-contract": "1.0.0-beta.29", + "web3-eth-iban": "1.0.0-beta.29", + "web3-eth-personal": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-eth-abi": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.29.tgz", + "integrity": "sha1-eRPArlRRAFmpjb0MubqG00IO+II=", + "requires": { + "bn.js": "4.11.6", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-accounts": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.29.tgz", + "integrity": "sha1-mG/z7X0XHam6egPByblLMb4vk+w=", + "requires": { + "bluebird": "3.3.1", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "scrypt.js": "0.2.0", + "underscore": "1.8.3", + "uuid": "2.0.1", + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + }, + "dependencies": { + "bluebird": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", + "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" + }, + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0", + "xhr-request-promise": "0.1.2" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, + "web3-eth-contract": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.29.tgz", + "integrity": "sha1-xXTGOpCEi5gvF2tBwt76tFmMSmk=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-promievent": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-eth-abi": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-eth-iban": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.29.tgz", + "integrity": "sha1-eXSsE2X2WXdsxqv1xV4ty8Jw44E=", + "requires": { + "bn.js": "4.11.8", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-eth-personal": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.29.tgz", + "integrity": "sha1-qk0e+k7hR4fzcnuxw2DxLtfIqqI=", + "requires": { + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-net": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.29.tgz", + "integrity": "sha1-8zYaw9o26FkB7hVh61K+5S2dS+4=", + "requires": { + "web3-core": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-providers-http": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.29.tgz", + "integrity": "sha1-UAFYhAnMKxj4qqwJINUuOQR+Ir0=", + "requires": { + "web3-core-helpers": "1.0.0-beta.29", + "xhr2": "0.1.4" + } + }, + "web3-providers-ipc": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.29.tgz", + "integrity": "sha1-uMLaC1ql3KoqZc/tq/VXKyJV2rk=", + "requires": { + "oboe": "2.1.3", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29" + } + }, + "web3-providers-ws": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.29.tgz", + "integrity": "sha1-LtnZsoj2IZs3+gV8XlsM/t3NAbs=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c" + } + }, + "web3-shh": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.29.tgz", + "integrity": "sha1-HnA1Utrpa/Z7Y+RoNRSxRV+aWEY=", + "requires": { + "web3-core": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29" + } + }, + "web3-utils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.29.tgz", + "integrity": "sha1-iZkl7RWyDV9wgU34o1Ji5Nb8pqk=", + "requires": { + "bn.js": "4.11.6", + "eth-lib": "0.1.27", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randomhex": "0.1.5", + "underscore": "1.8.3", + "utf8": "2.1.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + }, + "utf8": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" } } }, @@ -4972,6 +6687,15 @@ } } }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c", + "requires": { + "debug": "2.6.9", + "nan": "2.8.0", + "typedarray-to-buffer": "3.1.2", + "yaeti": "0.0.6" + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", @@ -5012,8 +6736,62 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "xhr": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz", + "integrity": "sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==", + "requires": { + "global": "4.3.2", + "is-function": "1.0.1", + "parse-headers": "2.0.1", + "xtend": "4.0.1" + } + }, + "xhr-request": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.0.1.tgz", + "integrity": "sha1-g/CKSyC+7Geowcco6BAvTJ7svdo=", + "requires": { + "buffer-to-arraybuffer": "0.0.2", + "object-assign": "3.0.0", + "query-string": "2.4.2", + "simple-get": "1.4.3", + "timed-out": "2.0.0", + "url-set-query": "1.0.0", + "xhr": "2.4.1" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "timed-out": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", + "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=" + } + } + }, + "xhr-request-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", + "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", + "requires": { + "xhr-request": "1.0.1" + } }, "xhr2": { "version": "0.1.4", @@ -5023,13 +6801,13 @@ "xmlhttprequest": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", @@ -5037,6 +6815,11 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", @@ -5099,6 +6882,15 @@ "dev": true } } + }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } } } } diff --git a/package.json b/package.json index 4978ddf..6580a93 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", "moment": "^2.19.2", - "web3": "^0.20.2" + "web3": "1.0.0-beta.26" }, "devDependencies": { "abi-decoder": "^1.0.9", @@ -19,7 +19,8 @@ "eslint-plugin-standard": "^3.0.1", "ethereumjs-testrpc": "^6.0.3", "ganache-cli": "^6.0.3", - "truffle": "^4.0.1" + "truffle": "^4.0.1", + "mustache": "2.3.0" }, "author": "OpenST Foundation Ltd.", "license": "LGPL-3.0" diff --git a/set_env_vars.sh b/set_env_vars.sh deleted file mode 100644 index dab0e62..0000000 --- a/set_env_vars.sh +++ /dev/null @@ -1,11 +0,0 @@ - -export OST_GAS_PRICE='0x12A05F200' -export OST_GETH_RPC_PROVIDER='http://localhost:9546' -export OST_GETH_WS_PROVIDER='ws://localhost:19546' -export OST_DEPLOYER_ADDR='' -export OST_DEPLOYER_PASSPHRASE='testtest' -export OST_OPS_ADDR='' -export OST_OPS_PASSPHRASE='testtest' -export OST_PRICER_CONTRACT_ADDR='' -export OST_ST_PRIME_UUID='' -export OST_CHAIN_ID=2000 \ No newline at end of file diff --git a/test/_init_addresses.js b/test/_init_addresses.js new file mode 100644 index 0000000..b5dbfc2 --- /dev/null +++ b/test/_init_addresses.js @@ -0,0 +1,71 @@ +const fs = require('fs'); +const Path = require('path'); + +const _addresses = { + "deployerAdd": null, + "opsAdd": null +}; + +const rootPrefix = ".." + , coreConstants = require( rootPrefix + '/config/core_constants' ) + , populateEnvVars = require( rootPrefix + "/test/populate_env_vars.js") + , poaGenesis = require( rootPrefix + "/test/poa-genesis.json") +; + +function main( addressFile ) { + const _path = Path.join(__dirname, addressFile ); + const fileContent = fs.readFileSync( _path, "utf8"); + fileContent.toString().split('\n').forEach(function (line, index) { + + var thisAddress = line.replace("Address: {", "0x").replace("}","").trim(); + if ( thisAddress.length < 40 ) { + return; + } + + if ( !_addresses.deployerAdd ) { + //First Address + _addresses.deployerAdd = thisAddress; + fundAddress(thisAddress); + } else if ( !_addresses.opsAdd ) { + _addresses.opsAdd = thisAddress; + fundAddress(thisAddress); + } + }); + + populateEnvVars.renderAndPopulate('address', { + ost_pricer_deployer_address: _addresses.deployerAdd, + ost_pricer_ops_address: _addresses.opsAdd + } + ); +} + +function fundAddress( address ) { + + //Update poa-genesis-value + updateGenesisAlloc( poaGenesis, address, "0x200000000000000000000000000000000000000000000000000000000000000"); + writeJsonToFile(poaGenesis, "./poa-genesis.json"); + +} +function updateGenesisAlloc( genesis, foundation, value ) { + const _alloc = genesis.alloc; + _alloc[ foundation ] = { "balance" : value }; + //Remove the place holder if it exists. + _alloc[ "" ] && (delete _alloc[ "" ] ); +} + +function writeJsonToFile( jsObject, relativeFilePath, tab_space ) { + tab_space = tab_space || 2; + var json = JSON.stringify(jsObject, null, tab_space); + + var jsonFilePath = relativeFilePath; + if ( !Path.isAbsolute( jsonFilePath ) ) { + jsonFilePath = Path.join(__dirname, '/' + relativeFilePath ); + } + + console.log("writeJsonToFile :: jsonFilePath :: ", jsonFilePath); + + fs.writeFileSync(jsonFilePath, json ); +} + + +main( process.argv[2] ); diff --git a/test/deploy_all.sh b/test/deploy_all.sh new file mode 100644 index 0000000..23df0ab --- /dev/null +++ b/test/deploy_all.sh @@ -0,0 +1,9 @@ + +source set_env_vars.sh +node ../tools/deploy/EIP20TokenMock.js 5 DKN deepeshCoin 18 + +source set_env_vars.sh +echo $OST_PRICER_BT_CONTRACT_ADDR +node ../tools/deploy/pricer.js $OST_PRICER_BT_CONTRACT_ADDR + + diff --git a/test/init_chain.sh b/test/init_chain.sh new file mode 100755 index 0000000..610c107 --- /dev/null +++ b/test/init_chain.sh @@ -0,0 +1,9 @@ +#!/bin/sh +DATADIR=./st-poa + +mkdir -p "$DATADIR" + +rm -rf "$DATADIR/geth" + +geth --datadir "$DATADIR" init poa-genesis.json + diff --git a/test/init_keys.sh b/test/init_keys.sh new file mode 100755 index 0000000..9abcab4 --- /dev/null +++ b/test/init_keys.sh @@ -0,0 +1,35 @@ +#!/bin/sh +DATADIR=./st-poa +ADDRESS_FILE=./new_addresses + +echo "Init/Re-Init chain..." +sh ./init_chain.sh +echo "" > $ADDRESS_FILE +echo "...Done Init" + + +echo "Generate new addresses..." + +source ./set_env_vars.sh + + +# Utility Chain Deployer Address +echo $OST_PRICER_DEPLOYER_PASSPHRASE > ./pw +geth --datadir "$DATADIR" account new --password ./pw >> $ADDRESS_FILE + +#Ops Address +echo $OST_PRICER_OPS_PASSPHRASE > ./pw +geth --datadir "$DATADIR" account new --password ./pw >> $ADDRESS_FILE + +echo "...New addresses generated" +cat $ADDRESS_FILE +#Invoke JS script to init addresses in various JSON files. +echo "Populate configs..." +node ./_init_addresses.js $ADDRESS_FILE +#clean-up $ADDRESS_FILE +rm $ADDRESS_FILE +echo "...configs populated" + +echo "Re-Init chain with updated config..." +sh ./init_chain.sh +echo "...Done Re-Init" \ No newline at end of file diff --git a/test/poa-genesis.json b/test/poa-genesis.json new file mode 100644 index 0000000..713f52e --- /dev/null +++ b/test/poa-genesis.json @@ -0,0 +1,17 @@ +{ + "config": { + "chainId": 2000, + "homesteadBlock": 1, + "eip150Block": 2, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 3, + "eip158Block": 3, + "byzantiumBlock": 4 + }, + "gasLimit": "0x989680", + "difficulty": "0x1", + "alloc": { + }, + "number": "0x0", + "gasUsed": "0x0" +} \ No newline at end of file diff --git a/test/populate_env_vars.js b/test/populate_env_vars.js new file mode 100644 index 0000000..3a98f43 --- /dev/null +++ b/test/populate_env_vars.js @@ -0,0 +1,57 @@ +"use strict"; + +/* + * Helper + * + * * Author: Deepesh + * * Date: 29/01/2018 + * * Reviewed by: + */ + +const mustache = require('mustache') + , fs = require('fs') + , Path = require('path') + , envVarsSourceFile = '../test/set_env_vars.sh'; + + +const addressTemplate = "export OST_PRICER_DEPLOYER_ADDR='{{ost_pricer_deployer_address}}'\n" + + "export OST_PRICER_OPS_ADDR='{{ost_pricer_ops_address}}'\n"; + +const contractPricer = "export OST_PRICER_CONTRACT_ADDR='{{ost_pricer_contract_address}}'\n"; +const contractBT = "export OST_PRICER_BT_CONTRACT_ADDR='{{ost_pricer_bt_contract_address}}'\n"; +const contractPO = "export OST_PRICER_PO_CONTRACT_ADDR='{{ost_pricer_po_contract_address}}'\n"; + +const populateEnvVars = { + + renderAndPopulate: function (type, vars) { + var renderData = ''; + try { + if (type === 'address') { + renderData = mustache.to_html(addressTemplate, vars); + } + else if (type === 'contractPricer') { + renderData = mustache.to_html(contractPricer, vars); + } else if (type === 'contractBT') { + renderData = mustache.to_html(contractBT, vars); + } else if (type === 'contractPO') { + renderData = mustache.to_html(contractPO, vars); + } else { + console.error(" Invalid Template Type To render"); + process.exit(1); + } + var existingSourceFileData = fs.readFileSync(Path.join(__dirname, '/' + envVarsSourceFile)); + var dataToWrite = existingSourceFileData.toString() + "\n\n" + renderData; + //console.log("ENV Constants to Write"); + //console.log(dataToWrite); + fs.writeFileSync(Path.join(__dirname, '/' + envVarsSourceFile), dataToWrite); + } catch(e) { + console.error("Error Reading and Populating Source File"); + console.error(e); + process.exit(1); + } + + } + +}; + +module.exports = populateEnvVars; diff --git a/test/run_chain.sh b/test/run_chain.sh new file mode 100755 index 0000000..97960fd --- /dev/null +++ b/test/run_chain.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +DATADIR=./st-poa +LOCAL_NETWORK_ID="--networkid 20171010" +touch pw + +geth --datadir "$DATADIR" $LOCAL_NETWORK_ID --port 30301 --rpcport 9546 --ws --wsport 19546 --wsorigins "*" --gasprice 0 --targetgaslimit 10000000 --etherbase 0 --unlock 0 --password pw --rpc --maxpeers 0 --mine --minerthreads 1 --rpcapi net,eth,web3,personal diff --git a/test/set_env_vars.sh b/test/set_env_vars.sh new file mode 100644 index 0000000..c294671 --- /dev/null +++ b/test/set_env_vars.sh @@ -0,0 +1,11 @@ + +export OST_PRICER_GAS_PRICE='0x12A05F200' +export OST_PRICER_GETH_RPC_PROVIDER='http://127.0.0.1:9546' +export OST_PRICER_GETH_WS_PROVIDER='ws://127.0.0.1:19546' +export OST_PRICER_DEPLOYER_ADDR='' +export OST_PRICER_DEPLOYER_PASSPHRASE='testtest' +export OST_PRICER_OPS_ADDR='' +export OST_PRICER_OPS_PASSPHRASE='testtest' +export OST_PRICER_CONTRACT_ADDR='' +export OST_PRICER_ST_PRIME_UUID='' +export OST_PRICER_CHAIN_ID=2000 diff --git a/test/start_test_chain.sh b/test/start_test_chain.sh new file mode 100644 index 0000000..ecd71ca --- /dev/null +++ b/test/start_test_chain.sh @@ -0,0 +1,4 @@ +source set_env_vars.sh +sh init_keys.sh +sh init_chain.sh +sh run_chain.sh diff --git a/tools/deploy/EIP20TokenMock.js b/tools/deploy/EIP20TokenMock.js new file mode 100644 index 0000000..794a827 --- /dev/null +++ b/tools/deploy/EIP20TokenMock.js @@ -0,0 +1,133 @@ +/** + * This is script for deploying Pricer contract on any chain.

+ * + * Prerequisite: + *
    + *
  1. Deployer Address
  2. + *
+ * + * These are the following steps:
+ *
    + *
  1. Deploy Pricer contract
  2. + *
+ * + * + * @module tools/deploy/pricer + */ + +const readline = require('readline'); +const rootPrefix = '../..'; +const web3Provider = require(rootPrefix + '/lib/web3/providers/rpc'); +const deployHelper = require(rootPrefix + '/tools/deploy/helper'); +const coreConstants = require(rootPrefix + '/config/core_constants'); +const coreAddresses = require(rootPrefix + '/config/core_addresses'); +const prompts = readline.createInterface(process.stdin, process.stdout); +const logger = require(rootPrefix + '/helpers/custom_console_logger'); +//const PriceOracle = require(rootPrefix + "/lib/contract_interact/price_oracle"); + +const deploymentOptions = { + gasPrice: coreConstants.OST_GAS_PRICE, + gas: coreConstants.OST_GAS_LIMIT +}; + +// Different addresses used for deployment +const deployerName = "deployer"; +const deployerAddress = coreAddresses.getAddressForUser(deployerName); + +/** + * It is the main performer method of this deployment script + * + * @param {Array} arguments + * + * @return {} + */ +async function performer(argv) { + + logger.info("argv[0]: " + argv[0]); + logger.info("argv[1]: " + argv[1]); + logger.info("argv[2]: " + argv[2]); + logger.info("argv[3]: " + argv[3]); + logger.info("argv[4]: " + argv[4]); + logger.info("argv[5]: " + argv[5]); + logger.info("argv[6]: " + argv[6]); + + if (argv.length < 6) { + logger.error("Invalid arguments !!!"); + process.exit(0); + } + //argv[2] => uint256 conversionRate; + //argv[3] => string symbol; + //argv[4] => string name; + //argv[5] => uint8 decimals; + //argv[6] => string travis; + const conversionRate = argv[2].trim(); + const symbol = argv[3].trim(); + const name = argv[4].trim(); + const decimals = argv[5].trim(); + var isTravisCIEnabled = false; + if (argv[6] !== undefined) { + isTravisCIEnabled = argv[6].trim() === 'travis'; + } + + logger.info("Deployer Address: " + deployerAddress); + logger.info("conversionRate: " + conversionRate); + logger.info("symbol: " + symbol); + logger.info("name: " + name); + logger.info("decimals: " + decimals); + logger.info("Travis CI enabled Status: " + isTravisCIEnabled); + + if (isTravisCIEnabled === false ) { + await new Promise( + function (onResolve, onReject) { + prompts.question("Please verify all above details. Do you want to proceed? [Y/N]", function (intent) { + if (intent === 'Y') { + logger.info('Great! Proceeding deployment.'); + prompts.close(); + onResolve(); + } else { + logger.error('Exiting deployment scripts. Change the enviroment variables and re-run.'); + process.exit(1); + } + }); + } + ); + } else { + prompts.close(); + } + + const contractName = 'eip20tokenmock'; + const contractAbi = coreAddresses.getAbiForContract(contractName); + const contractBin = coreAddresses.getBinForContract(contractName); + + + var constructorArgs = [ + conversionRate, + symbol, + name, + decimals + ]; + + //logger.info("contractName: "+contractName); + //logger.info(web3Provider); + //logger.info("contractAbi: "+contractAbi); + //logger.info("contractBin: "+contractBin); + //logger.info("deployerName: "+deployerName); + //logger.info("deploymentOptions: "+deploymentOptions); + //logger.info("constructorArgs: "+constructorArgs); + + var contractDeployTxReceipt = await deployHelper.perform( + contractName, + web3Provider, + contractAbi, + contractBin, + deployerName, + deploymentOptions, + constructorArgs + ); + + logger.info(contractDeployTxReceipt); + logger.win(contractName+ " Deployed "); + await deployHelper.updateEnvContractAddress('contractBT', {'ost_pricer_bt_contract_address': contractDeployTxReceipt.contractAddress}); +} + +performer(process.argv); diff --git a/tools/deploy/helper.js b/tools/deploy/helper.js index 8ba1dc6..b96f2ab 100644 --- a/tools/deploy/helper.js +++ b/tools/deploy/helper.js @@ -14,7 +14,8 @@ const rootPrefix = '../..' , gasLimit = coreConstants.OST_VALUE_GAS_LIMIT // this is taken by default if no value is passed from outside , coreAddresses = require(rootPrefix + '/config/core_addresses') , logger = require(rootPrefix + '/helpers/custom_console_logger') - , web3EventsFormatter = require(rootPrefix + '/lib/web3/events/formatter'); + , web3EventsFormatter = require(rootPrefix + '/lib/web3/events/formatter') + , populateEnvVars = require(rootPrefix + "/test/populate_env_vars.js"); const _private = { @@ -103,8 +104,7 @@ const deployHelper = { contractAbi, null, // since addr is not known yet options - ); - + ); // this is needed since the contract object contract.setProvider(web3Provider.currentProvider); @@ -118,6 +118,9 @@ const deployHelper = { console.log("Unlocking address: " + deployerAddr); console.log("Unlocking!!!"); + + console.log("deployerAddr: "+deployerAddr); + console.log("deployerAddrPassphrase: "+deployerAddrPassphrase); await web3Provider.eth.personal.unlockAccount(deployerAddr, deployerAddrPassphrase); console.log("Deploying contract " + contractName); @@ -168,7 +171,23 @@ const deployHelper = { } else { logger.win(" event: " + eventName + " is present in Reciept."); } - ; + }, + + updateEnvContractAddress: function (type, contractAddress) { + return new Promise( + function (onResolve, onReject) { + logger.step("Updating Source file open_st_env_vars"); + populateEnvVars.renderAndPopulate(type, contractAddress); + onResolve(); + }) + .then(function () { + logger.win("set_env_vars.sh updated."); + }) + .catch(function (reason) { + logger.error("Failed to populate set_env_vars.sh file!"); + logger.error(reason); + process.exit(1); + }); } diff --git a/tools/deploy/pricer.js b/tools/deploy/pricer.js index 01031c8..b579ce9 100644 --- a/tools/deploy/pricer.js +++ b/tools/deploy/pricer.js @@ -44,9 +44,10 @@ const deployerAddress = coreAddresses.getAddressForUser(deployerName); async function performer(argv) { const brandedTokenAddress = argv[2].trim(); - const travisCIEnabledValue = argv[3].trim(); - - const isTravisCIEnabled = travisCIEnabledValue === 'travis'; + var isTravisCIEnabled = false; + if (argv[3] !== undefined) { + isTravisCIEnabled = argv[3].trim() === 'travis'; + } logger.info("Deployer Address: " + deployerAddress); logger.info("Branded Token Address: " + brandedTokenAddress); @@ -93,6 +94,7 @@ async function performer(argv) { logger.info(contractDeployTxReceipt); logger.win(contractName+ " Deployed "); + await deployHelper.updateEnvContractAddress('contractPricer', {'ost_pricer_contract_address': contractDeployTxReceipt.contractAddress}); } performer(process.argv); From 43affae9b05e19a28934907ddca552170ad786df Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 30 Jan 2018 16:09:35 +0530 Subject: [PATCH 009/242] Scripts moved in one directory --- test/{ => lib}/populate_env_vars.js | 2 +- test/{ => scripts}/_init_addresses.js | 10 +++++----- test/{ => scripts}/deploy_all.sh | 6 ++++-- test/{ => scripts}/init_chain.sh | 0 test/{ => scripts}/init_keys.sh | 0 test/{ => scripts}/poa-genesis.json | 6 ++++++ test/{ => scripts}/run_chain.sh | 1 - test/scripts/set_env_vars.sh | 21 +++++++++++++++++++++ test/{ => scripts}/start_test_chain.sh | 0 test/set_env_vars.sh | 11 ----------- tools/deploy/helper.js | 2 +- 11 files changed, 38 insertions(+), 21 deletions(-) rename test/{ => lib}/populate_env_vars.js (96%) rename test/{ => scripts}/_init_addresses.js (85%) rename test/{ => scripts}/deploy_all.sh (68%) rename test/{ => scripts}/init_chain.sh (100%) rename test/{ => scripts}/init_keys.sh (100%) rename test/{ => scripts}/poa-genesis.json (54%) rename test/{ => scripts}/run_chain.sh (97%) create mode 100644 test/scripts/set_env_vars.sh rename test/{ => scripts}/start_test_chain.sh (100%) delete mode 100644 test/set_env_vars.sh diff --git a/test/populate_env_vars.js b/test/lib/populate_env_vars.js similarity index 96% rename from test/populate_env_vars.js rename to test/lib/populate_env_vars.js index 3a98f43..359d954 100644 --- a/test/populate_env_vars.js +++ b/test/lib/populate_env_vars.js @@ -11,7 +11,7 @@ const mustache = require('mustache') , fs = require('fs') , Path = require('path') - , envVarsSourceFile = '../test/set_env_vars.sh'; + , envVarsSourceFile = '../../test/scripts/set_env_vars.sh'; const addressTemplate = "export OST_PRICER_DEPLOYER_ADDR='{{ost_pricer_deployer_address}}'\n" + diff --git a/test/_init_addresses.js b/test/scripts/_init_addresses.js similarity index 85% rename from test/_init_addresses.js rename to test/scripts/_init_addresses.js index b5dbfc2..c068ee8 100644 --- a/test/_init_addresses.js +++ b/test/scripts/_init_addresses.js @@ -6,10 +6,10 @@ const _addresses = { "opsAdd": null }; -const rootPrefix = ".." - , coreConstants = require( rootPrefix + '/config/core_constants' ) - , populateEnvVars = require( rootPrefix + "/test/populate_env_vars.js") - , poaGenesis = require( rootPrefix + "/test/poa-genesis.json") +const rootPrefix = "../.." + , coreConstants = require( rootPrefix + '/config/core_constants' ) + , populateEnvVars = require( rootPrefix + "/test/lib/populate_env_vars.js") + , poaGenesis = require( rootPrefix + "/test/scripts/poa-genesis.json") ; function main( addressFile ) { @@ -43,7 +43,7 @@ function fundAddress( address ) { //Update poa-genesis-value updateGenesisAlloc( poaGenesis, address, "0x200000000000000000000000000000000000000000000000000000000000000"); - writeJsonToFile(poaGenesis, "./poa-genesis.json"); + //writeJsonToFile(poaGenesis, "./poa-genesis.json"); } function updateGenesisAlloc( genesis, foundation, value ) { diff --git a/test/deploy_all.sh b/test/scripts/deploy_all.sh similarity index 68% rename from test/deploy_all.sh rename to test/scripts/deploy_all.sh index 23df0ab..7a29c58 100644 --- a/test/deploy_all.sh +++ b/test/scripts/deploy_all.sh @@ -1,8 +1,10 @@ -source set_env_vars.sh +cd .. +pwd +source scripts/set_env_vars.sh node ../tools/deploy/EIP20TokenMock.js 5 DKN deepeshCoin 18 -source set_env_vars.sh +source scripts/set_env_vars.sh echo $OST_PRICER_BT_CONTRACT_ADDR node ../tools/deploy/pricer.js $OST_PRICER_BT_CONTRACT_ADDR diff --git a/test/init_chain.sh b/test/scripts/init_chain.sh similarity index 100% rename from test/init_chain.sh rename to test/scripts/init_chain.sh diff --git a/test/init_keys.sh b/test/scripts/init_keys.sh similarity index 100% rename from test/init_keys.sh rename to test/scripts/init_keys.sh diff --git a/test/poa-genesis.json b/test/scripts/poa-genesis.json similarity index 54% rename from test/poa-genesis.json rename to test/scripts/poa-genesis.json index 713f52e..c84d1a5 100644 --- a/test/poa-genesis.json +++ b/test/scripts/poa-genesis.json @@ -11,6 +11,12 @@ "gasLimit": "0x989680", "difficulty": "0x1", "alloc": { + "0xa35a3083c838e0978d9047792fd1a2d9e4be0ca8": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "0x7758bdf616917acd01db49d10263edc4c836781c": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, }, "number": "0x0", "gasUsed": "0x0" diff --git a/test/run_chain.sh b/test/scripts/run_chain.sh similarity index 97% rename from test/run_chain.sh rename to test/scripts/run_chain.sh index 97960fd..6f51282 100755 --- a/test/run_chain.sh +++ b/test/scripts/run_chain.sh @@ -2,6 +2,5 @@ DATADIR=./st-poa LOCAL_NETWORK_ID="--networkid 20171010" -touch pw geth --datadir "$DATADIR" $LOCAL_NETWORK_ID --port 30301 --rpcport 9546 --ws --wsport 19546 --wsorigins "*" --gasprice 0 --targetgaslimit 10000000 --etherbase 0 --unlock 0 --password pw --rpc --maxpeers 0 --mine --minerthreads 1 --rpcapi net,eth,web3,personal diff --git a/test/scripts/set_env_vars.sh b/test/scripts/set_env_vars.sh new file mode 100644 index 0000000..1c6d393 --- /dev/null +++ b/test/scripts/set_env_vars.sh @@ -0,0 +1,21 @@ + +export OST_PRICER_GAS_PRICE='0x12A05F200' +export OST_PRICER_GETH_RPC_PROVIDER='http://127.0.0.1:9546' +export OST_PRICER_GETH_WS_PROVIDER='ws://127.0.0.1:19546' +export OST_PRICER_DEPLOYER_ADDR='0xa35a3083c838e0978d9047792fd1a2d9e4be0ca8' +export OST_PRICER_DEPLOYER_PASSPHRASE='testtest' +export OST_PRICER_OPS_ADDR='0x7758bdf616917acd01db49d10263edc4c836781c' +export OST_PRICER_OPS_PASSPHRASE='testtest' +export OST_PRICER_CONTRACT_ADDR='' +export OST_PRICER_ST_PRIME_UUID='' +export OST_PRICER_CHAIN_ID=2000 + + +export OST_PRICER_DEPLOYER_ADDR='0xf24e0257b76c48ea3d45815a8c67256325687244' +export OST_PRICER_OPS_ADDR='0x9feb6fa2fedbca2a75f69315b80d32913762a1c2' + + +export OST_PRICER_BT_CONTRACT_ADDR='0x6cce936662813f602928486964A88Ff846341899' + + +export OST_PRICER_CONTRACT_ADDR='0x7A8e1007cF5825f6DB9a5A8b8F7f98d56224349F' diff --git a/test/start_test_chain.sh b/test/scripts/start_test_chain.sh similarity index 100% rename from test/start_test_chain.sh rename to test/scripts/start_test_chain.sh diff --git a/test/set_env_vars.sh b/test/set_env_vars.sh deleted file mode 100644 index c294671..0000000 --- a/test/set_env_vars.sh +++ /dev/null @@ -1,11 +0,0 @@ - -export OST_PRICER_GAS_PRICE='0x12A05F200' -export OST_PRICER_GETH_RPC_PROVIDER='http://127.0.0.1:9546' -export OST_PRICER_GETH_WS_PROVIDER='ws://127.0.0.1:19546' -export OST_PRICER_DEPLOYER_ADDR='' -export OST_PRICER_DEPLOYER_PASSPHRASE='testtest' -export OST_PRICER_OPS_ADDR='' -export OST_PRICER_OPS_PASSPHRASE='testtest' -export OST_PRICER_CONTRACT_ADDR='' -export OST_PRICER_ST_PRIME_UUID='' -export OST_PRICER_CHAIN_ID=2000 diff --git a/tools/deploy/helper.js b/tools/deploy/helper.js index b96f2ab..184d316 100644 --- a/tools/deploy/helper.js +++ b/tools/deploy/helper.js @@ -15,7 +15,7 @@ const rootPrefix = '../..' , coreAddresses = require(rootPrefix + '/config/core_addresses') , logger = require(rootPrefix + '/helpers/custom_console_logger') , web3EventsFormatter = require(rootPrefix + '/lib/web3/events/formatter') - , populateEnvVars = require(rootPrefix + "/test/populate_env_vars.js"); + , populateEnvVars = require(rootPrefix + "/test/lib/populate_env_vars.js"); const _private = { From 1b605cacec91aea50495cbd89aa432d2455d35d9 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 30 Jan 2018 16:41:38 +0530 Subject: [PATCH 010/242] Mocha testcase files --- test/services/pricer/pay.js | 0 test/services/pricer/set_accepted_margin.js | 0 test/services/pricer/set_price_oracle.js | 0 test/services/pricer/unset_price_oracle.js | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/services/pricer/pay.js create mode 100644 test/services/pricer/set_accepted_margin.js create mode 100644 test/services/pricer/set_price_oracle.js create mode 100644 test/services/pricer/unset_price_oracle.js diff --git a/test/services/pricer/pay.js b/test/services/pricer/pay.js new file mode 100644 index 0000000..e69de29 diff --git a/test/services/pricer/set_accepted_margin.js b/test/services/pricer/set_accepted_margin.js new file mode 100644 index 0000000..e69de29 diff --git a/test/services/pricer/set_price_oracle.js b/test/services/pricer/set_price_oracle.js new file mode 100644 index 0000000..e69de29 diff --git a/test/services/pricer/unset_price_oracle.js b/test/services/pricer/unset_price_oracle.js new file mode 100644 index 0000000..e69de29 From 8fbd58790323a7437780dcfb58f348240b989181 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 31 Jan 2018 15:24:16 +0530 Subject: [PATCH 011/242] Contract: updated deployment script --- package-lock.json | 34 +++++++++++++++++++++++++++-- package.json | 3 ++- test/scripts/deploy_all.sh | 13 +++++++++-- test/scripts/deploy_price_oracle.sh | 9 ++++++++ test/scripts/poa-genesis.json | 2 +- test/scripts/set_env_vars.sh | 10 --------- 6 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 test/scripts/deploy_price_oracle.sh diff --git a/package-lock.json b/package-lock.json index 6424c6a..4ad3188 100644 --- a/package-lock.json +++ b/package-lock.json @@ -205,6 +205,15 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, + "async-listener": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", + "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", + "requires": { + "semver": "5.5.0", + "shimmer": "1.2.0" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1163,6 +1172,15 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "0.6.9", + "emitter-listener": "1.1.1" + } + }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", @@ -1541,6 +1559,14 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "emitter-listener": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", + "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", + "requires": { + "shimmer": "1.2.0" + } + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -5530,8 +5556,7 @@ "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "send": { "version": "0.16.1", @@ -5637,6 +5662,11 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" + }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", diff --git a/package.json b/package.json index 6580a93..6322a20 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", "moment": "^2.19.2", - "web3": "1.0.0-beta.26" + "web3": "1.0.0-beta.26", + "continuation-local-storage": "^3.2.1" }, "devDependencies": { "abi-decoder": "^1.0.9", diff --git a/test/scripts/deploy_all.sh b/test/scripts/deploy_all.sh index 7a29c58..026c325 100644 --- a/test/scripts/deploy_all.sh +++ b/test/scripts/deploy_all.sh @@ -1,11 +1,20 @@ cd .. -pwd source scripts/set_env_vars.sh node ../tools/deploy/EIP20TokenMock.js 5 DKN deepeshCoin 18 source scripts/set_env_vars.sh -echo $OST_PRICER_BT_CONTRACT_ADDR node ../tools/deploy/pricer.js $OST_PRICER_BT_CONTRACT_ADDR +source scripts/set_env_vars.sh +cd scripts + +export OST_PO_GETH_RPC_PROVIDER=$OST_PRICER_GETH_RPC_PROVIDER +export OST_PO_DEPLOYER_ADDR=$OST_PRICER_DEPLOYER_ADDR +export OST_PO_DEPLOYER_PASSPHRASE=$OST_PRICER_DEPLOYER_PASSPHRASE +export OST_PO_OPS_ADDR=$OST_PRICER_OPS_ADDR +export OST_PO_OPS_PASSPHRASE=$OST_PRICER_OPS_PASSPHRASE +export OST_PO_PRICE_ORACLES='{}' + +sh deploy_price_oracle.sh diff --git a/test/scripts/deploy_price_oracle.sh b/test/scripts/deploy_price_oracle.sh new file mode 100644 index 0000000..ad4125a --- /dev/null +++ b/test/scripts/deploy_price_oracle.sh @@ -0,0 +1,9 @@ +git clone git@github.com:OpenSTFoundation/ost-price-oracle.git +cd ost-price-oracle +git checkout develop +git pull --rebase +sh contracts/compile.sh +node tools/deploy/price_oracle.js OST USD 0x12A05F200 + + + diff --git a/test/scripts/poa-genesis.json b/test/scripts/poa-genesis.json index c84d1a5..27dda70 100644 --- a/test/scripts/poa-genesis.json +++ b/test/scripts/poa-genesis.json @@ -16,7 +16,7 @@ }, "0x7758bdf616917acd01db49d10263edc4c836781c": { "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, + } }, "number": "0x0", "gasUsed": "0x0" diff --git a/test/scripts/set_env_vars.sh b/test/scripts/set_env_vars.sh index 1c6d393..2d56730 100644 --- a/test/scripts/set_env_vars.sh +++ b/test/scripts/set_env_vars.sh @@ -9,13 +9,3 @@ export OST_PRICER_OPS_PASSPHRASE='testtest' export OST_PRICER_CONTRACT_ADDR='' export OST_PRICER_ST_PRIME_UUID='' export OST_PRICER_CHAIN_ID=2000 - - -export OST_PRICER_DEPLOYER_ADDR='0xf24e0257b76c48ea3d45815a8c67256325687244' -export OST_PRICER_OPS_ADDR='0x9feb6fa2fedbca2a75f69315b80d32913762a1c2' - - -export OST_PRICER_BT_CONTRACT_ADDR='0x6cce936662813f602928486964A88Ff846341899' - - -export OST_PRICER_CONTRACT_ADDR='0x7A8e1007cF5825f6DB9a5A8b8F7f98d56224349F' From cd0d0c83f7ac1fa391bbcf33afcbdfb6097adc87 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 1 Feb 2018 18:56:42 +0530 Subject: [PATCH 012/242] Tests: initial commit --- lib/contract_interact/pricer.js | 45 +++++ package.json | 6 +- .../get_pricepoint_and_calculated_amounts.js | 46 +++++ test/services/pricer/pay.js | 183 ++++++++++++++++++ test/services/pricer/set_accepted_margin.js | 72 +++++++ test/services/pricer/set_price_oracle.js | 83 ++++++++ test/services/pricer/unset_price_oracle.js | 67 +++++++ 7 files changed, 499 insertions(+), 3 deletions(-) create mode 100644 test/services/pricer/get_pricepoint_and_calculated_amounts.js diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index 152759f..1af648c 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -74,6 +74,34 @@ Pricer.prototype = { return Promise.resolve(response[0]); }, + /** + * Get base currency of pricer + * + * @return {Promise} + * + */ + baseCurrency: async function () { + const transactionObject = currContract.methods.baseCurrency(); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + /** + * Get decimal of pricer + * + * @return {Promise} + * + */ + decimals: async function () { + const transactionObject = currContract.methods.decimals(); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + /** * Updates the price oracle address for a given currency @@ -186,6 +214,23 @@ Pricer.prototype = { const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); return Promise.resolve(response[0]); + }, + + /** + * Get current price point and calculated token amounts + * + * @return {Promise} + * + */ + getPricePointAndCalculatedAmounts: async function ( + transferAmount, + commissionAmount, + currency) { + const transactionObject = currContract.methods.getPricePointAndCalculatedAmounts(transferAmount, commissionAmount, currency); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); } }; diff --git a/package.json b/package.json index 6322a20..56a6899 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", "moment": "^2.19.2", - "web3": "1.0.0-beta.26", - "continuation-local-storage": "^3.2.1" + "web3": "1.0.0-beta.26", }, "devDependencies": { "abi-decoder": "^1.0.9", @@ -21,7 +20,8 @@ "ethereumjs-testrpc": "^6.0.3", "ganache-cli": "^6.0.3", "truffle": "^4.0.1", - "mustache": "2.3.0" + "mustache": "2.3.0", + "mocha": "^5.0.0" }, "author": "OpenST Foundation Ltd.", "license": "LGPL-3.0" diff --git a/test/services/pricer/get_pricepoint_and_calculated_amounts.js b/test/services/pricer/get_pricepoint_and_calculated_amounts.js new file mode 100644 index 0000000..a8141e7 --- /dev/null +++ b/test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -0,0 +1,46 @@ +// Load external packages +const assert = require('assert'); + +// Load cache service +const rootPrefix = "../../.." + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , deployer = "" + , deployerPassphrase = "" + , ops = "" + , opsPassphrase = "" + , account1 ="" + , accountPassphrase1 = "" + , account2 ="" + , accountPassphrase2 = "" + , account3 ="" + , accountPassphrase2 = "" + , priceOracleOstUsdAddress = "" + , priceOracleOstUsdZeroPricePointAddress = "" +; + +describe('Pay', function() { + + it('should pass the initial address checks', async function() { + assert.notEqual(deployer, ops); + assert.notEqual(deployer, user); + assert.notEqual(ops, user); + }); + + it('should fail when currency is 0', async function() { + + }); + + it('should fail when price point is 0', async function() { + + }); + + it('should pass when all parameters are valid and conversion rate is 5', async function() { + + }); + + it('should pass when all parameters are valid and conversion rate is 0.2', async function() { + + }); + + +}); \ No newline at end of file diff --git a/test/services/pricer/pay.js b/test/services/pricer/pay.js index e69de29..b470b3f 100644 --- a/test/services/pricer/pay.js +++ b/test/services/pricer/pay.js @@ -0,0 +1,183 @@ +// Load external packages +const assert = require('assert'); + +// Load cache service +const rootPrefix = "../../.." + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , deployer = "" + , deployerPassphrase = "" + , ops = "" + , opsPassphrase = "" + , account1 ="" + , accountPassphrase1 = "" + , account2 ="" + , accountPassphrase2 = "" + , account3 ="" + , accountPassphrase2 = "" + , priceOracleOstUsdAddress = "" + , priceOracleOstUsdZeroPricePointAddress = "" +; + +describe('Pay', function() { + + it('should pass the initial address checks', async function() { + assert.notEqual(deployer, ops); + assert.notEqual(deployer, user); + assert.notEqual(ops, user); + }); + + it('should fail when beneficiary address is 0', async function() { + var beneficiary = 0 + , transferAmount = 1 + , commissionBeneficiary = account3 + , commissionAmount = 1 + , currency = "USD" + , intendedPricePoint = pricer.getPricePoint(currency) + ; + var response = pricer.pay(account1, + accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint); + + assert.equal(response.isSuccess(), false); + }); + + it('should fail when beneficiary transfer amount is 0', async function() { + var beneficiary = account2 + , transferAmount = 0 + , commissionBeneficiary = account3 + , commissionAmount = 1 + , currency = "USD" + , intendedPricePoint = pricer.getPricePoint(currency) + ; + var response = pricer.pay(account1, + accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint); + + assert.equal(response.isSuccess(), false); + }); + + it('should fail when currency is not available in pricer', async function() { + var beneficiary = account2 + , transferAmount = 1 + , commissionBeneficiary = account3 + , commissionAmount = 1 + , currency = "INR" + , intendedPricePoint = pricer.getPricePoint(currency) + ; + var response = pricer.pay(account1, + accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint); + + assert.equal(response.isSuccess(), false); + }); + + it('should fail when intendedPricePoint is more than the acceptable margin of current price point', async function() { + var beneficiary = account2 + , transferAmount = 1 + , commissionBeneficiary = account3 + , commissionAmount = 1 + , currency = "USD" + , margin = "0.5"; + + var setMarginResponse = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), true); + + var intendedPricePoint = margin + pricer.getPricePoint(currency); + + var response = pricer.pay(account1, + accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint); + + assert.equal(response.isSuccess(), false); + }); + + it('should fail when intendedPricePoint is less than the acceptable margin of current price point', async function() { + var beneficiary = account2 + , transferAmount = 1 + , commissionBeneficiary = account3 + , commissionAmount = 1 + , currency = "USD" + , margin = "0.5"; + + var setMarginResponse = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), true); + + var intendedPricePoint = pricer.getPricePoint(currency) - margin; + + var response = pricer.pay(account1, + accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint); + + assert.equal(response.isSuccess(), false); + }); + + it('should fail when price point is 0 and currency is not blank', async function() { + var beneficiary = account2 + , transferAmount = 1 + , commissionBeneficiary = account3 + , commissionAmount = 1 + , currency = "USD"; + + var intendedPricePoint = pricer.getPricePoint(currency) - margin; + + var response = pricer.pay(account1, + accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint); + + assert.equal(response.isSuccess(), false); + }); + + it('should fail when price point changes beyond acceptable margins', async function() { + + }); + + it('should fail when beneficiary has insufficent balance', async function() { + + }); + + it('should fail when commision beneficiary address is 0 and commissionAmount is > 0', async function() { + + }); + + it('should pass when all parameters are valid and commision beneficiary address, commissionAmount is 0', async function() { + + }); + + it('should pass when all parameters are valid', async function() { + + }); + + it('should pass when all parameters are currency is blank', async function() { + + }); +}); \ No newline at end of file diff --git a/test/services/pricer/set_accepted_margin.js b/test/services/pricer/set_accepted_margin.js index e69de29..f03ca6a 100644 --- a/test/services/pricer/set_accepted_margin.js +++ b/test/services/pricer/set_accepted_margin.js @@ -0,0 +1,72 @@ +// Load external packages +const assert = require('assert'); + +// Load cache service +const rootPrefix = "../../.." + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , deployer = "" + , deployerPassphrase = "" + , ops = "" + , opsPassphrase = "" + , user ="" + , userPassphrase = "" + +; + +describe('Set accepted margins', function() { + it('should pass the initial address checks', async function() { + assert.notEqual(deployer, ops); + assert.notEqual(deployer, user); + assert.notEqual(ops, user); + }); + + it('should fail when sender is not ops', async function() { + var currency = "USD" + , margin = "0.5" + , response = pricer.setAcceptedMargin(deployer, deployerPassphrase, currency, margin); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when currency is blank', async function() { + var currency = "" + , margin = "0.5" + , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when pricer doesnot have price oracle of given currency', async function() { + var currency = "INR" + , margin = "0.5" + , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when pricer when margin is less than 0', async function() { + var currency = "USD" + , margin = "-0.5" + , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), false); + }); + + it('should pass when pricer when margin is 0', async function() { + var currency = "USD" + , margin = "0" + , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), true); + }); + + it('should pass when pricer when margin is 0.5', async function() { + var currency = "USD" + , margin = "0.5" + , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), true); + }); + + it('should fail when pricer when margin is more than uint64 => 9223372036854775808', async function() { + var currency = "USD" + , margin = "9223372036854775808" + , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); + assert.equal(response.isSuccess(), false); + }); + +}); diff --git a/test/services/pricer/set_price_oracle.js b/test/services/pricer/set_price_oracle.js index e69de29..f4a8b2d 100644 --- a/test/services/pricer/set_price_oracle.js +++ b/test/services/pricer/set_price_oracle.js @@ -0,0 +1,83 @@ +// Load external packages +const assert = require('assert'); + +// Load cache service +const rootPrefix = "../../.." + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , deployer = "" + , deployerPassphrase = "" + , ops = "" + , opsPassphrase = "" + , user ="" + , userPassphrase = "" + , priceOracleOstUsdAddress = "" + , priceOracleOstEurAddress = "" + , priceOracleEthUsdAddress = "" + , priceOracleOstUsdAddressDEC10 = "" + +; + +describe('Set price oracle', function() { + + it('should pass the initial address checks', async function() { + assert.notEqual(deployer, ops); + assert.notEqual(deployer, user); + assert.notEqual(ops, user); + }); + + it('should fail when sender is not ops', async function() { + var currency = "USD" + , oracleAddress = priceOracleOstUsdAddress + , response = pricer.setPriceOracle(deployer, deployerPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when currency is blank', async function() { + var currency = "" + , oracleAddress = priceOracleOstUsdAddress + , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when oracleAddress is 0', async function() { + var currency = "USD" + , oracleAddress = 0 + , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when price oracle has different quote currency', async function() { + var currency = "USD" + , oracleAddress = priceOracleOstEurAddress + , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when price oracle has different decimal', async function() { + var currency = "USD" + , oracleAddress = priceOracleOstUsdAddressDEC10 + , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should pass when OST/USD price oracle is set', async function() { + var currency = "USD" + , oracleAddress = priceOracleOstUsdAddress + , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + var addressFromPricer = pricer.priceOracles(currency); + assert.equal(addressFromPricer, oracleAddress); + }); + + it('should pass when OST/EUR price oracle is set', async function() { + var currency = "EUR" + , oracleAddress = priceOracleOstEurAddress + , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + var addressFromPricer = pricer.priceOracles(currency); + assert.equal(addressFromPricer, oracleAddress); + }); + + + +}); \ No newline at end of file diff --git a/test/services/pricer/unset_price_oracle.js b/test/services/pricer/unset_price_oracle.js index e69de29..6a9959d 100644 --- a/test/services/pricer/unset_price_oracle.js +++ b/test/services/pricer/unset_price_oracle.js @@ -0,0 +1,67 @@ +// Load external packages +const assert = require('assert'); + +// Load cache service +const rootPrefix = "../../.." + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , deployer = "" + , deployerPassphrase = "" + , ops = "" + , opsPassphrase = "" + , user ="" + , userPassphrase = "" + , priceOracleOstUsdAddress = "" + , priceOracleOstEurAddress = "" + , priceOracleEthUsdAddress = "" + , priceOracleOstUsdAddressDEC10 = "" +; + +describe('Unset price oracle', function() { + + it('should pass the initial address checks', async function() { + assert.notEqual(deployer, ops); + assert.notEqual(deployer, user); + assert.notEqual(ops, user); + }); + + it('should fail when sender is not ops', async function() { + var currency = "USD" + , oracleAddress = priceOracleOstUsdAddress + , response = pricer.unsetPriceOracle(deployer, deployerPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when sender is not ops', async function() { + var currency = "USD" + , oracleAddress = priceOracleOstUsdAddress + , response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should fail when price oracle was not set prior', async function() { + var currency = "INR" + response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + + it('should pass when price oracle was set prior', async function() { + //set + var currency = "USD" + , oracleAddress = priceOracleOstUsdAddress + , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + var addressFromPricer = pricer.priceOracles(currency); + assert.equal(addressFromPricer, oracleAddress); + + // unset + response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), true); + addressFromPricer = pricer.priceOracles(currency); + assert.equal(addressFromPricer, 0); + + // unset again + response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); + assert.equal(response.isSuccess(), false); + }); + +}); \ No newline at end of file From fe5799a95360993195112c73faf46fb4411abac4 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Fri, 2 Feb 2018 15:21:11 +0530 Subject: [PATCH 013/242] Tests: few changes --- lib/contract_interact/pricer.js | 23 ++++++-- test/services/pricer/constants.js | 25 +++++++++ .../get_pricepoint_and_calculated_amounts.js | 56 ++++++++++++------- 3 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 test/services/pricer/constants.js diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index 1af648c..f4944b7 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -14,7 +14,6 @@ const web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc'); const coreConstants = require(rootPrefix + '/config/core_constants'); const contractName = 'pricer'; const contractAbi = coreAddresses.getAbiForContract(contractName); -const currContractAddr = coreAddresses.getAddressForContract(contractName); const currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr); const GAS_PRICE = coreConstants.OST_GAS_PRICE; const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; @@ -25,8 +24,8 @@ const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; * @constructor * */ -const Pricer = module.exports = function () { - this.contractAddress = currContractAddr; +const Pricer = module.exports = function (pricerAddress) { + this.contractAddress = pricerAddress; currContract.setProvider(web3RpcProvider.currentProvider); }; @@ -229,8 +228,22 @@ Pricer.prototype = { const transactionObject = currContract.methods.getPricePointAndCalculatedAmounts(transferAmount, commissionAmount, currency); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); - const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + return helper.call( + web3RpcProvider, + this.contractAddress, + encodedABI, + {}, + transactionOutputs).then(function (response){ + return Promise.resolve(response[0], response[1], response[2]); + }); + + } + + /** + * * @return {BigNumer} 10^18 + */ + toWei: function(value){ + return web3RpcProvider.utils.toWei(value, "ether"); } }; diff --git a/test/services/pricer/constants.js b/test/services/pricer/constants.js new file mode 100644 index 0000000..01bfe72 --- /dev/null +++ b/test/services/pricer/constants.js @@ -0,0 +1,25 @@ +const constants = { + deployer: "", + deployerPassphrase: "", + ops: "", + opsPassphrase: "", + account1: "", + accountPassphrase1: "", + account2: "", + accountPassphrase2: "", + account3: "", + accountPassphrase3: "", + account4: "", + accountPassphrase4: "", + currencyUSD: "USD", + currencyEUR: "EUR", + currencyINR: "INR", + currencyBlank: "", + priceOracleOstUsdAddress: "", //conversionRate is 5 + priceOracleOstEurAddress: "", //conversionRate is 2 + priceOracleOstUsdZeroPricePointAddress: "", + pricerOstAddress: "", + pricerOstZeroPricePointAddress: "", + pricerDummyAddress: "", +} +module.exports = constants; \ No newline at end of file diff --git a/test/services/pricer/get_pricepoint_and_calculated_amounts.js b/test/services/pricer/get_pricepoint_and_calculated_amounts.js index a8141e7..0df2094 100644 --- a/test/services/pricer/get_pricepoint_and_calculated_amounts.js +++ b/test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -3,42 +3,58 @@ const assert = require('assert'); // Load cache service const rootPrefix = "../../.." + , Utils = require(rootPrefix + './test/lib/utils.js'); + , constants = require(rootPrefix + '/test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') - , deployer = "" - , deployerPassphrase = "" - , ops = "" - , opsPassphrase = "" - , account1 ="" - , accountPassphrase1 = "" - , account2 ="" - , accountPassphrase2 = "" - , account3 ="" - , accountPassphrase2 = "" - , priceOracleOstUsdAddress = "" - , priceOracleOstUsdZeroPricePointAddress = "" + , pricerOstUsd = new pricer(pricerOstAddress) + , pricerOstEur = new pricer(priceOracleOstEurAddress) + , pricerOstUsdZeroPricePoint = new pricer(pricerOstZeroPricePointAddress) ; -describe('Pay', function() { +describe('Get price point and calculated amounts', function() { it('should pass the initial address checks', async function() { - assert.notEqual(deployer, ops); - assert.notEqual(deployer, user); - assert.notEqual(ops, user); + assert.notEqual(constants.deployer, constants.ops); + assert.notEqual(constants.deployer, constants.user); + assert.notEqual(constants.ops, constants.user); }); it('should fail when currency is 0', async function() { - + await Utils.expectThrow( + pricerOstUsd.getPricePointAndCalculatedAmounts( + constants.account1, + constants.accountPassphrase1, + toWei(1), + toWei(0.5), + currencyBlank) + ); }); it('should fail when price point is 0', async function() { - + await Utils.expectThrow( + pricerOstUsdZeroPricePoint.getPricePointAndCalculatedAmounts( + constants.account1, + constants.accountPassphrase1, + toWei(1), + toWei(0.5), + constants.currencyUSD) + ); }); it('should pass when all parameters are valid and conversion rate is 5', async function() { - + const amount = toWei(1) + , commissionAmount = toWei(0.5) + ; + var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstUsd.getPricePointAndCalculatedAmounts( + constants.account1, + constants.accountPassphrase1, + amount, + commissionAmount, + constants.currencyUSD) + assert.equal(pricePoint > 0, true); }); - it('should pass when all parameters are valid and conversion rate is 0.2', async function() { + it('should pass when all parameters are valid and conversion rate is 2', async function() { }); From c96f7906525b032eecf26992170dcd4ecc8e912b Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 5 Feb 2018 13:15:11 +0530 Subject: [PATCH 014/242] Test: few updates --- .../get_pricepoint_and_calculated_amounts.js | 39 +++++++++++++------ test/services/pricer/pay.js | 39 ++++++++----------- test/services/pricer/set_accepted_margin.js | 1 - test/services/pricer/set_price_oracle.js | 1 - test/services/pricer/unset_price_oracle.js | 1 - 5 files changed, 44 insertions(+), 37 deletions(-) diff --git a/test/services/pricer/get_pricepoint_and_calculated_amounts.js b/test/services/pricer/get_pricepoint_and_calculated_amounts.js index 0df2094..b056887 100644 --- a/test/services/pricer/get_pricepoint_and_calculated_amounts.js +++ b/test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -1,7 +1,6 @@ // Load external packages const assert = require('assert'); -// Load cache service const rootPrefix = "../../.." , Utils = require(rootPrefix + './test/lib/utils.js'); , constants = require(rootPrefix + '/test/services/pricer/constants') @@ -24,8 +23,8 @@ describe('Get price point and calculated amounts', function() { pricerOstUsd.getPricePointAndCalculatedAmounts( constants.account1, constants.accountPassphrase1, - toWei(1), - toWei(0.5), + pricerOstUsd.toWei(1), + pricerOstUsd.toWei(0.5), currencyBlank) ); }); @@ -35,28 +34,46 @@ describe('Get price point and calculated amounts', function() { pricerOstUsdZeroPricePoint.getPricePointAndCalculatedAmounts( constants.account1, constants.accountPassphrase1, - toWei(1), - toWei(0.5), + pricerOstUsdZeroPricePoint.toWei(1), + pricerOstUsdZeroPricePoint.toWei(0.5), constants.currencyUSD) ); }); it('should pass when all parameters are valid and conversion rate is 5', async function() { - const amount = toWei(1) - , commissionAmount = toWei(0.5) + const amount = pricerOstUsd.toWei(1) + , commissionAmount = pricerOstUsd.toWei(0.5) ; var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstUsd.getPricePointAndCalculatedAmounts( constants.account1, constants.accountPassphrase1, amount, commissionAmount, - constants.currencyUSD) - assert.equal(pricePoint > 0, true); + constants.currencyUSD); + const poPricePoint = await pricerOstUsd.getPricePoint(constants.currencyUSD); + const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 5); + const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 5); + assert.equal(pricePoint, poPricePoint); + assert.equal(tokenAmount, calculatedTokenAmount); + assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); }); it('should pass when all parameters are valid and conversion rate is 2', async function() { - + const amount = pricerOstEur.toWei(1) + , commissionAmount = pricerOstEur.toWei(0.5) + ; + var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstEur.getPricePointAndCalculatedAmounts( + constants.account1, + constants.accountPassphrase1, + amount, + commissionAmount, + constants.currencyUSD); + const poPricePoint = await pricerOstEur.getPricePoint(constants.currencyEur); + const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 2); + const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 2); + assert.equal(pricePoint, poPricePoint); + assert.equal(tokenAmount, calculatedTokenAmount); + assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); }); - }); \ No newline at end of file diff --git a/test/services/pricer/pay.js b/test/services/pricer/pay.js index b470b3f..4ec4ec9 100644 --- a/test/services/pricer/pay.js +++ b/test/services/pricer/pay.js @@ -1,23 +1,16 @@ // Load external packages const assert = require('assert'); -// Load cache service const rootPrefix = "../../.." + , Utils = require(rootPrefix + './test/lib/utils.js'); + , constants = require(rootPrefix + '/test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') - , deployer = "" - , deployerPassphrase = "" - , ops = "" - , opsPassphrase = "" - , account1 ="" - , accountPassphrase1 = "" - , account2 ="" - , accountPassphrase2 = "" - , account3 ="" - , accountPassphrase2 = "" - , priceOracleOstUsdAddress = "" - , priceOracleOstUsdZeroPricePointAddress = "" + , pricerOstUsd = new pricer(pricerOstAddress) + , pricerOstEur = new pricer(priceOracleOstEurAddress) + , pricerOstUsdZeroPricePoint = new pricer(pricerOstZeroPricePointAddress) ; + describe('Pay', function() { it('should pass the initial address checks', async function() { @@ -28,14 +21,14 @@ describe('Pay', function() { it('should fail when beneficiary address is 0', async function() { var beneficiary = 0 - , transferAmount = 1 - , commissionBeneficiary = account3 - , commissionAmount = 1 - , currency = "USD" - , intendedPricePoint = pricer.getPricePoint(currency) + , transferAmount = pricerOstUsd.toWei(5) + , commissionBeneficiary = constants.account3 + , commissionAmount = pricerOstUsd.toWei(1) + , currency = constants.currencyUSD + , intendedPricePoint = pricerOstUsd.getPricePoint(currency) ; - var response = pricer.pay(account1, - accountPassphrase1, + var response = await pricerOstUsd.pay(constants.account1, + constants.accountPassphrase1, beneficiary, transferAmount, commissionBeneficiary, @@ -47,12 +40,12 @@ describe('Pay', function() { }); it('should fail when beneficiary transfer amount is 0', async function() { - var beneficiary = account2 - , transferAmount = 0 + var beneficiary = constants.account2 + , transferAmount = pricerOstUsd , commissionBeneficiary = account3 , commissionAmount = 1 , currency = "USD" - , intendedPricePoint = pricer.getPricePoint(currency) + , intendedPricePoint = pricerOstUsd.getPricePoint(currency) ; var response = pricer.pay(account1, accountPassphrase1, diff --git a/test/services/pricer/set_accepted_margin.js b/test/services/pricer/set_accepted_margin.js index f03ca6a..ad45857 100644 --- a/test/services/pricer/set_accepted_margin.js +++ b/test/services/pricer/set_accepted_margin.js @@ -1,7 +1,6 @@ // Load external packages const assert = require('assert'); -// Load cache service const rootPrefix = "../../.." , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , deployer = "" diff --git a/test/services/pricer/set_price_oracle.js b/test/services/pricer/set_price_oracle.js index f4a8b2d..ab942c1 100644 --- a/test/services/pricer/set_price_oracle.js +++ b/test/services/pricer/set_price_oracle.js @@ -1,7 +1,6 @@ // Load external packages const assert = require('assert'); -// Load cache service const rootPrefix = "../../.." , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , deployer = "" diff --git a/test/services/pricer/unset_price_oracle.js b/test/services/pricer/unset_price_oracle.js index 6a9959d..4d212bf 100644 --- a/test/services/pricer/unset_price_oracle.js +++ b/test/services/pricer/unset_price_oracle.js @@ -1,7 +1,6 @@ // Load external packages const assert = require('assert'); -// Load cache service const rootPrefix = "../../.." , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , deployer = "" From 7ae3f4fbe5c5d2b36e299adfc0bdbb4f53a225e7 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 6 Feb 2018 16:50:43 +0530 Subject: [PATCH 015/242] Test: Debug code --- .gitignore | 3 + config/core_abis.js | 3 +- config/core_addresses.js | 6 +- config/core_bins.js | 3 +- config/core_constants.js | 2 +- contracts/Pricer.sol | 15 +- lib/contract_interact/helper.js | 9 +- lib/contract_interact/ops_managed_contract.js | 87 +++ lib/contract_interact/owned_contract.js | 80 +++ lib/contract_interact/pricer.js | 57 +- lib/formatter/response.js | 75 ++ lib/web3/events/decoder.js | 12 +- lib/web3/events/formatter.js | 2 +- lib/web3/events/processor.js | 163 ----- lib/web3/events/queue_manager.js | 195 ----- package-lock.json | 670 +++++++++--------- package.json | 8 +- test/lib/populate_env_vars.js | 13 +- test/lib/utils.js | 137 +--- test/scripts/_init_addresses.js | 28 +- test/scripts/deploy_all.sh | 42 +- test/scripts/deploy_price_oracle.sh | 44 +- ...EST_COIN1_C5_ADDRESS='0xF1F58A5F5395ca8e2e | 10 + test/scripts/geth_checker.js | 42 ++ test/scripts/init_keys.sh | 18 +- ...genesis.json => poa-genesis-template.json} | 9 +- test/scripts/run_chain.sh | 2 +- test/scripts/set_env_vars.sh | 4 +- test/scripts/start_test_chain.sh | 8 +- test/scripts/travis_test.sh | 2 + test/services/pricer/constants.js | 42 +- .../get_pricepoint_and_calculated_amounts.js | 116 +-- test/services/pricer/pay.js | 4 +- test/services/pricer/set_accepted_margin.js | 2 + test/services/pricer/set_price_oracle.js | 86 ++- test/services/pricer/unset_price_oracle.js | 4 +- tools/deploy/EIP20TokenMock.js | 42 +- tools/deploy/helper.js | 19 +- tools/deploy/pricer.js | 81 ++- 39 files changed, 1128 insertions(+), 1017 deletions(-) create mode 100644 lib/contract_interact/ops_managed_contract.js create mode 100644 lib/contract_interact/owned_contract.js create mode 100644 lib/formatter/response.js delete mode 100644 lib/web3/events/processor.js delete mode 100644 lib/web3/events/queue_manager.js create mode 100644 test/scripts/export TEST_COIN1_C5_ADDRESS='0xF1F58A5F5395ca8e2e create mode 100644 test/scripts/geth_checker.js rename test/scripts/{poa-genesis.json => poa-genesis-template.json} (52%) create mode 100644 test/scripts/travis_test.sh diff --git a/.gitignore b/.gitignore index 834a19d..efbec54 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ contracts/abi/ # don't commit node_modules node_modules + +test/sripts/poa-genesis.json +test/sripts/env_vars.sh \ No newline at end of file diff --git a/config/core_abis.js b/config/core_abis.js index d467726..fb9dcd8 100644 --- a/config/core_abis.js +++ b/config/core_abis.js @@ -18,7 +18,8 @@ const rootPrefix = ".."; const coreAbis = { pricer: parseFile(rootPrefix + '/contracts/abi/Pricer.abi', "utf8"), - eip20tokenmock: parseFile(rootPrefix + '/contracts/abi/EIP20TokenMock.abi', "utf8") + eip20tokenmock: parseFile(rootPrefix + '/contracts/abi/EIP20TokenMock.abi', "utf8"), + opsManaged: parseFile(rootPrefix + '/contracts/abi/OpsManaged.abi', "utf8") }; module.exports = coreAbis; diff --git a/config/core_addresses.js b/config/core_addresses.js index f11b582..8dfd012 100644 --- a/config/core_addresses.js +++ b/config/core_addresses.js @@ -22,7 +22,7 @@ const allAddresses = { ops: { address: process.env.OST_PRICER_OPS_ADDR, passphrase: process.env.OST_PRICER_OPS_PASSPHRASE - } + } }, contracts: { @@ -34,6 +34,10 @@ const allAddresses = { eip20tokenmock: { abi: coreAbis.eip20tokenmock, bin: coreBins.eip20tokenmock + }, + opsManaged: { + abi: coreAbis.opsManaged, + bin: coreBins.opsManaged } } }; diff --git a/config/core_bins.js b/config/core_bins.js index ff1e695..a927c03 100644 --- a/config/core_bins.js +++ b/config/core_bins.js @@ -17,7 +17,8 @@ const rootPrefix = ".."; const coreBins = { pricer: readFile(rootPrefix + '/contracts/bin/Pricer.bin', 'utf8'), - eip20tokenmock: readFile(rootPrefix + '/contracts/bin/EIP20TokenMock.bin', 'utf8') + eip20tokenmock: readFile(rootPrefix + '/contracts/bin/EIP20TokenMock.bin', 'utf8'), + opsManaged: readFile(rootPrefix + '/contracts/bin/OpsManaged.bin', "utf8") }; module.exports = coreBins; diff --git a/config/core_constants.js b/config/core_constants.js index f6f5beb..d8e296b 100644 --- a/config/core_constants.js +++ b/config/core_constants.js @@ -33,4 +33,4 @@ define('OST_PRICER_GETH_WS_PROVIDER', process.env.OST_PRICER_GETH_WS_PROVIDER); define('OST_PRICER_CHAIN_ID', process.env.OST_PRICER_CHAIN_ID); // Gas limit -define('OST_GAS_LIMIT', 9000000); +define('OST_GAS_LIMIT', 9100000); diff --git a/contracts/Pricer.sol b/contracts/Pricer.sol index f61124e..98a182c 100644 --- a/contracts/Pricer.sol +++ b/contracts/Pricer.sol @@ -153,19 +153,18 @@ contract Pricer is OpsManaged, PricerInterface { function setPriceOracle( bytes3 _currency, address _oracleAddress) - public - onlyOps + public returns (bool /* success */) { require(_oracleAddress != address(0)); - require(_currency != ""); - require(PriceOracleInterface(_oracleAddress).baseCurrency() == pricerBaseCurrency); - require(PriceOracleInterface(_oracleAddress).quoteCurrency() == _currency); - require(PriceOracleInterface(_oracleAddress).decimals() == pricerDecimals); - pricerPriceOracles[_currency] = PriceOracleInterface(_oracleAddress); + // require(_currency != ""); + // require(PriceOracleInterface(_oracleAddress).baseCurrency() == pricerBaseCurrency); + // require(PriceOracleInterface(_oracleAddress).quoteCurrency() == _currency); + // require(PriceOracleInterface(_oracleAddress).decimals() == pricerDecimals); + // pricerPriceOracles[_currency] = PriceOracleInterface(_oracleAddress); //Trigger PriceOracleSet event - PriceOracleSet(_currency, _oracleAddress); + // PriceOracleSet(_currency, _oracleAddress); return true; } diff --git a/lib/contract_interact/helper.js b/lib/contract_interact/helper.js index 6ccddbb..3d1584b 100644 --- a/lib/contract_interact/helper.js +++ b/lib/contract_interact/helper.js @@ -39,13 +39,12 @@ const helper = { data: encodeABI }; if (options) { - Object.assign(params,options) + Object.assign(params, options); } return web3RpcProvider.eth.call(params) - .then(function(response){ - console.log(response); - if ( transactionOutputs ) { - return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); + .then(function(response) { + if (transactionOutputs ) { + return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); } else { return response; } diff --git a/lib/contract_interact/ops_managed_contract.js b/lib/contract_interact/ops_managed_contract.js new file mode 100644 index 0000000..5a79cd7 --- /dev/null +++ b/lib/contract_interact/ops_managed_contract.js @@ -0,0 +1,87 @@ +"use strict"; + +/** + * + * This is a utility file which would be used for executing all methods on OpsManaged Contract.

+ * + * @module lib/contract_interact/ops_managed_contract + * + */ + +const rootPrefix = '../..' + , helper = require('./helper') + , OwnedContract = require('./owned_contract') + , contractName = 'opsManaged' + , coreAddresses = require(rootPrefix + '/config/core_addresses') + , contractAbi = coreAddresses.getAbiForContract(contractName) + , web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc') + , currContract = new web3RpcProvider.eth.Contract(contractAbi) +; + +/** + * @constructor + * @augments OwnedContract + * + * @param {String} contractAddress - address where Contract has been deployed + * @param {String} web3RpcProvider - webRpc provider of network where currContract has been deployed + * @param {String} currContract - Contract Instance + * @param {String} defaultGasPrice - default Gas Price + * + */ +const OpsManagedContract = module.exports = function (contractAddress, defaultGasPrice) { + this.contractAddress = contractAddress; + this.web3RpcProvider = web3RpcProvider; + this.currContract = currContract; + this.defaultGasPrice = defaultGasPrice; + this.currContract.options.address = contractAddress; + this.currContract.setProvider( web3RpcProvider.currentProvider ); + OwnedContract.call(this, contractAddress, web3RpcProvider, currContract, defaultGasPrice); +}; + +OpsManagedContract.prototype = Object.create(OwnedContract.prototype); + +OpsManagedContract.prototype.constructor = OpsManagedContract; + +/** + * Get currContract's Ops Address + * + * @return {Result} + * + */ +OpsManagedContract.prototype.getOpsAddress = async function() { + const transactionObject = this.currContract.methods.opsAddress(); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs( transactionObject ); + const response = await helper.call(this.web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); +}; + +/** + * Set currContract's Ops Address + * + * @param {String} defaultGasPrice - default Gas Price + * @param {String} opsAddress - address which is to be made Ops Address of currContract + * @param {Object} customOptions - custom params for this transaction + * + * @return {Promise} + * + */ +OpsManagedContract.prototype.setOpsAddress = async function(senderName, opsAddress, customOptions) { + + const encodedABI = this.currContract.methods.setOpsAddress(opsAddress).encodeABI(); + + var options = { gasPrice: this.defaultGasPrice }; + + Object.assign(options, customOptions); + + const transactionReceipt = await helper.safeSend( + this.web3RpcProvider, + this.contractAddress, + encodedABI, + senderName, + options + ); + + return Promise.resolve(transactionReceipt); +}; + diff --git a/lib/contract_interact/owned_contract.js b/lib/contract_interact/owned_contract.js new file mode 100644 index 0000000..a5a81f6 --- /dev/null +++ b/lib/contract_interact/owned_contract.js @@ -0,0 +1,80 @@ +"use strict"; + +/** + * + * This is a utility file which would be used for executing all methods on Owned Contract.

+ * + * @module lib/contract_interact/owned_contract + * + */ + +const rootPrefix = '../..' + , helper = require('./helper') +; + +/** + * @constructor + * + * @param {String} contractAddress - address where Contract has been deployed + * @param {String} web3RpcProvider - webRpc provider of network where currContract has been deployed + * @param {String} currContract - Contract Instance + * @param {String} defaultGasPrice - default Gas Price + * + */ +const OwnedContract = module.exports = function (contractAddress, web3RpcProvider, currContract, defaultGasPrice) { + this.contractAddress = contractAddress; + this.web3RpcProvider = web3RpcProvider; + this.currContract = currContract; + this.defaultGasPrice = defaultGasPrice; + this.currContract.options.address = contractAddress; + this.currContract.setProvider( web3RpcProvider.currentProvider ); +}; + +OwnedContract.prototype = { + + /** + * Initiate Ownership of currContract + * + * @param {String} senderName - Sender of this Transaction + * @param {String} proposedOwner - address to which ownership needs to be transferred + * @param {Object} customOptions - custom params of this transaction + * + * @return {Promise} + * + */ + initiateOwnerShipTransfer: async function(senderName, proposedOwner, customOptions) { + + const encodedABI = this.currContract.methods.initiateOwnershipTransfer(proposedOwner).encodeABI(); + + var options = { gasPrice: this.defaultGasPrice }; + + Object.assign(options, customOptions); + + const transactionResponse = await helper.safeSend( + this.web3RpcProvider, + this.contractAddress, + encodedABI, + senderName, + options + ); + + return Promise.resolve(transactionResponse); + + }, + + /** + * Get address of Owner of currContract + * + * @return {Promise} + * + */ + getOwner: async function() { + + const transactionObject = this.currContract.methods.proposedOwner(); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs( transactionObject ); + const response = await helper.call(this.web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + + } +}; diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index f4944b7..8b58be7 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -14,10 +14,11 @@ const web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc'); const coreConstants = require(rootPrefix + '/config/core_constants'); const contractName = 'pricer'; const contractAbi = coreAddresses.getAbiForContract(contractName); -const currContract = new web3RpcProvider.eth.Contract(contractAbi, currContractAddr); const GAS_PRICE = coreConstants.OST_GAS_PRICE; const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; -//const logger = require(rootPrefix + '/helpers/custom_console_logger') +const currContract = new web3RpcProvider.eth.Contract(contractAbi);; +const logger = require(rootPrefix + '/helpers/custom_console_logger'); +const responseHelper = require(rootPrefix + '/lib/formatter/response'); /** @@ -26,7 +27,6 @@ const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; */ const Pricer = module.exports = function (pricerAddress) { this.contractAddress = pricerAddress; - currContract.setProvider(web3RpcProvider.currentProvider); }; Pricer.prototype = { @@ -66,7 +66,7 @@ Pricer.prototype = { * */ priceOracles: async function (currency) { - const transactionObject = currContract.methods.priceOracles(currency); + const transactionObject = currContract.methods.priceOracles(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); @@ -108,18 +108,31 @@ Pricer.prototype = { * @return {Promise} * */ - setPriceOracle: async function (senderAddress, senderPassphrase, currency, address) { - const transactionObject = currContract.methods.setPriceOracle(currency, address); + setPriceOracle: async function (senderAddress, senderPassphrase, currency, address, gasPrice) { + + currContract.options.address = this.contractAddress; + currContract.setProvider( web3RpcProvider.currentProvider ); + + console.log(this.contractAddress); + console.log(senderAddress); + console.log(senderPassphrase); + console.log(currency); + console.log(address); + console.log(gasPrice); + console.log({ gasPrice: gasPrice, gas: GAS_LIMIT }); + + const transactionObject = currContract.methods.setPriceOracle(web3RpcProvider.utils.asciiToHex(currency), address); const encodedABI = transactionObject.encodeABI(); - const transactionReceipt = await helper.safeSendFromAddr( + return helper.safeSendFromAddr( web3RpcProvider, this.contractAddr, encodedABI, senderAddress, senderPassphrase, - { gasPrice: GAS_PRICE, gas: GAS_LIMIT } - ); - return Promise.resolve(transactionReceipt); + { gasPrice: gasPrice, gas: GAS_LIMIT } + ).then(function(transactionReceipt) { + return Promise.resolve(transactionReceipt); + }); }, /** @@ -225,24 +238,28 @@ Pricer.prototype = { transferAmount, commissionAmount, currency) { - const transactionObject = currContract.methods.getPricePointAndCalculatedAmounts(transferAmount, commissionAmount, currency); + const transactionObject = currContract.methods.getPricePointAndCalculatedAmounts(transferAmount, commissionAmount, web3RpcProvider.utils.asciiToHex(currency)); + const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); return helper.call( - web3RpcProvider, - this.contractAddress, - encodedABI, - {}, - transactionOutputs).then(function (response){ - return Promise.resolve(response[0], response[1], response[2]); + web3RpcProvider, + this.contractAddress, + encodedABI, + {}, + transactionOutputs) + .then(function (response) { + return Promise.resolve(responseHelper.successWithData(response)); + }) + .catch(function(err) { + return Promise.resolve(responseHelper.error('ci_gppaca_1', 'Something went wrong !!!')); }); - - } + }, /** * * @return {BigNumer} 10^18 */ - toWei: function(value){ + toWei: function(value) { return web3RpcProvider.utils.toWei(value, "ether"); } }; diff --git a/lib/formatter/response.js b/lib/formatter/response.js new file mode 100644 index 0000000..bca50ac --- /dev/null +++ b/lib/formatter/response.js @@ -0,0 +1,75 @@ +"use strict"; + +/* + * Restful API response formatter + * + */ + +const shortId = require('shortid'); + +function Result(data, errCode, errMsg) { + this.success = (typeof errCode === "undefined"); + + this.data = data || {}; + + if (!this.success) { + this.err = { + code: errCode, + msg: errMsg + }; + } + + // Check if response has success + this.isSuccess = function () { + return this.success; + }; + + // Check if response is not success. More often not success is checked, so adding a method. + this.isFailure = function () { + return !this.isSuccess(); + }; + + // Format data to hash + this.toHash = function () { + var s = {}; + if (this.success) { + s.success = true; + s.data = this.data; + } else { + s.success = false; + if ( this.data instanceof Object && Object.keys( this.data ).length > 0 ) { + //Error with data case. + s.data = this.data; + } + s.err = this.err; + } + + return s; + }; + + // Render final error or success response + this.renderResponse = function (res, status) { + status = status || 200; + return res.status(status).json(this.toHash()); + }; +} + +const responseHelper = { + + // Generate success response object + successWithData: function (data) { + return new Result(data); + }, + + // Generate error response object + error: function(errCode, errMsg, errPrefix) { + errCode = 'ost_pricer(' + errCode + ":" + shortId.generate() + ')'; + if (errPrefix) { + errCode = errPrefix + "*" + errCode; + } + return new Result({}, errCode, errMsg); + } + +}; + +module.exports = responseHelper; \ No newline at end of file diff --git a/lib/web3/events/decoder.js b/lib/web3/events/decoder.js index 65233d2..89e7549 100644 --- a/lib/web3/events/decoder.js +++ b/lib/web3/events/decoder.js @@ -9,7 +9,6 @@ const rootPrefix = '../../..' , coreAddresses = require(rootPrefix+'/config/core_addresses') - , responseHelper = require(rootPrefix+'/lib/formatter/response') ; const web3EventsDecoder = function () {}; @@ -34,19 +33,18 @@ web3EventsDecoder.prototype = { * */ perform: function(txReceipt, addressToNameMap) { - console.log("------> addressToNameMap" , addressToNameMap); const oThis = this; var decodedEvents = []; // Transaction receipt not found if (!txReceipt) { - return responseHelper.error('tx_receipt_not_found', 'Transaction receipt was not found.'); + return 'Transaction receipt was not found.'; } // Block not yet mined if (!txReceipt.blockNumber) { - return responseHelper.error('l_w_ld_1', 'Transaction not yet mined. Please try after some time.'); + return 'Transaction not yet mined. Please try after some time.'; } var toAddr = txReceipt.to; @@ -74,7 +72,7 @@ web3EventsDecoder.prototype = { // ABI not found if (!currContractABI) { - return responseHelper.error('l_w_ld_2', 'ABI not found for contract '+ currContract); + return 'ABI not found for contract '; } relevantLogs.push(txReceipt.logs[i]); @@ -87,7 +85,7 @@ web3EventsDecoder.prototype = { } - return responseHelper.successWithData({ + return { rawTransactionReceipt: txReceipt, formattedTransactionReceipt: { transactionHash: txReceipt.transactionHash, @@ -97,7 +95,7 @@ web3EventsDecoder.prototype = { toAddress: toAddr, contractAddress: txReceipt.contractAddress || '' } - }); + }; } , getContractNameFor: function ( address, addressToNameMap ) { const lcAddress = String( address ).toLowerCase(); diff --git a/lib/web3/events/formatter.js b/lib/web3/events/formatter.js index 8b0048f..92ddc94 100644 --- a/lib/web3/events/formatter.js +++ b/lib/web3/events/formatter.js @@ -10,7 +10,7 @@ const web3EventsFormatter = module.exports = function () {}; /** - * Ivent Formatter. + * Event Formatter. * * @namespace web3EventsFormatter * diff --git a/lib/web3/events/processor.js b/lib/web3/events/processor.js deleted file mode 100644 index cbe2e75..0000000 --- a/lib/web3/events/processor.js +++ /dev/null @@ -1,163 +0,0 @@ -"use strict"; - -/** - * This script reads the queue set in {@link module:lib/web3/events/queue_manager} - *
It schedules the task at given interval and dequeue. - * - * @module lib/web3/events/processor - * - */ - -const rootPrefix = '../../..' - , logger = require(rootPrefix+'/helpers/custom_console_logger') - ; - -const EventProcessor = module.exports = function (eventObj, processor) { - this.setEventData( eventObj ); - - //IMPORTANT:: processor should always return a promise. - this.processor = processor; -}; - -/** - * Ivent Processor. - * @namespace EventProcessor - */ -EventProcessor.prototype = { - - /** - * @constructor - */ - constructor: EventProcessor, - - setEventData: function(eventObj){ - this.eventObj = eventObj; - }, - - /** - * processor initialize - */ - processor: null, - - /** - * we should process the event after 90 seconds. This corresponds to 6 blocks safe delay. - */ - eventProcessingDelay: 90000, - - /** - * timer initialize - */ - timer: -1, - - /** - * isScheduled initialize to false - */ - isScheduled: false, - - /** - * eventObj initialize - */ - eventObj: null, - - /** - * onProcessCallback initialize - */ - onProcessCallback: null, - - /** - * Setting callback function on process the task {@link member:onProcessCallback} - * - * @param {function} callback - */ - setOnProcessCallback: function ( callback ) { - this.onProcessCallback = callback; - }, - - /** - * Check if the eventObj is valid. - * - * @return {boolean} - * - */ - isValid: function () { - //Note: Always log the reason is calling an event invalid. - - if( !this.eventObj ) { - logger.warn("Event Invalid :: eventObj is null "); - return false; - } else if ( this.eventObj.removed ) { - logger.warn("Event Invalid :: removed", this.getEventDescription() ); - return false; - } - - return true; - }, - - /** - * Schedule Processing from the queue. - * - * @return {boolean} - * - */ - scheduleProcessing: function() { - var oThis = this; - if ( oThis.isScheduled || !oThis.isValid()) { - logger.warn("EventProcessor :: scheduleProcessing :: Processing is already scheduled or not valid.", oThis.getEventDescription() ); - return false; - } - oThis.isScheduled = true; - oThis.timer = setTimeout(function () { - - logger.info("EventProcessor :: processRequest :: Processing Started.", oThis.getEventDescription() ); - - oThis.processor(oThis.eventObj) - .then(function(res){ - console.log('success', JSON.stringify(res)); - oThis.triggerProcessCallback( true ); - }) - .catch( function(error){ - console.log('error', JSON.stringify(error)); - oThis.triggerProcessCallback( false ); - }); - }, oThis.eventProcessingDelay); - - return true; - }, - - /** - * Cancel Processing. - * - */ - cancelProcessing: function () { - var oThis = this; - if ( !oThis.isScheduled ) { - logger.warn("EventProcessor :: cancelProcessing :: Processing is NOT scheduled.", oThis.getEventDescription() ); - return; - } - clearTimeout( oThis.timer ); - oThis.isScheduled = false; - oThis.timer = -1; - }, - - /** - * Processor callback called in {@link scheduleProcessing} - * - */ - triggerProcessCallback: function ( success ) { - var oThis = this; - oThis.isScheduled = false; - if(oThis.onProcessCallback){ - oThis.onProcessCallback( oThis.eventObj, success); - } - oThis.eventObj = null; - oThis.onProcessCallback = null; - }, - - /** - * Get Event Description. - */ - getEventDescription: function () { - return "IntentHandler EventId: " + this.eventObj.id + " transactionHash: " + this.eventObj.transactionHash; - } - -}; diff --git a/lib/web3/events/queue_manager.js b/lib/web3/events/queue_manager.js deleted file mode 100644 index aadfceb..0000000 --- a/lib/web3/events/queue_manager.js +++ /dev/null @@ -1,195 +0,0 @@ -"use strict"; - -/** - * This script accepts the tasks from the intercomm process, - * Put them into a queue and run the processor passed from intercomm with the delay of 6 blocks. - * - * @module lib/web3/events/queue_manager - * - */ - -const rootPrefix = '../../..' - , logger = require(rootPrefix+'/helpers/custom_console_logger') - , eventProcessorKlass = require(rootPrefix+'/lib/web3/events/processor'); - -const EventQueueManager = module.exports = function () {}; - -/** - * Ivent Queue Manager for InterComm. - * @namespace EventQueueManager - */ -EventQueueManager.prototype = { - - /** - * Starts the process of the script with initializing processor - * @constructor - * @memberOf EventQueueManager - */ - constructor: EventQueueManager, - - /** - * Queue Handler initialization - */ - handlerQueue: {}, - - /** - * Processor initialization - */ - processor: null, - - /** - * Setting Processor passed from caller like {@link module:services/inter_comm/stake_and_mint} - * - * @param {function} processor - Process to be executed on event catch. - * - */ - setProcessor: function (processor) { - this.processor = processor; - }, - - /** - * Add Edit object in the {@link handlerQueue} - * - * @param {Object} eventObj - Event object. - * - */ - addEditEventInQueue: function ( eventObj ) { - var oThis = this; - const eventId = eventObj.id; - - if ( oThis.handlerQueue[ eventId ] ) { - //We have received this event before. It may have been changed/removed. - if ( eventObj.removed ) { - oThis.removeIntent( eventObj ); - } else { - oThis.updateIntent( eventObj ); - } - } - else if ( eventObj.removed ) { - return false; - } else { - //This is a new event. Lets queue it. - oThis.queueIntent( eventObj ); - } - - }, - - /** - * Verify and add object of {@link module:lib/web3/events/processor} in the {@link handlerQueue} - * - * @param {Object} eventObj - Event object. - * - */ - queueIntent: function ( eventObj ) { - var oThis = this; - - const eventId = eventObj.id; - - logger.info("Queuing", eventId); - - //Sanity Check - if ( oThis.handlerQueue[eventId] ) { - logger.error(eventId, " has already been queued"); - return; - } - - //Create intent handler - const _handler = new eventProcessorKlass( eventObj, oThis.processor ); - - //Set the onProcessCallback - _handler.setOnProcessCallback(function ( eventObj, success ) { - if ( eventId ) { - logger.info(eventId, "has been processed successfully."); - } else { - logger.error(eventId, "has been processed successfully."); - } - oThis.dequeueIntent( eventObj ) - }); - - var isScheduled = _handler.scheduleProcessing(); - - if(!isScheduled){return;} - - //Just for the sake of it. - oThis.handlerQueue[ eventId ] = _handler; - }, - - /** - * - If the event is updated, cancel the processing using cancelProcessing method in {@link module:lib/web3/events/processor}. - *
- Update the event data in object of processor - *
- And schedule it for processing using scheduleProcessing method in {@link module:lib/web3/events/processor}. - * - * @param {Object} eventObj - Event object. - * - */ - updateIntent: function ( eventObj ) { - var oThis = this; - - const eventId = eventObj.id; - const _handler = oThis.handlerQueue[ eventId ]; - - if ( !_handler ) { - logger.info("updateIntent :: _handler is null"); - return; - } - - //Cancel Scheduled Processing. - _handler.cancelProcessing(); - - //Update Event Data. - _handler.setEventData( eventObj ); - - var isScheduled = _handler.scheduleProcessing(); - - if(!isScheduled){return;} - - //Just for the sake of it. - oThis.handlerQueue[ eventId ] = _handler; - }, - - /** - * - If the event is removed, cancel the processing using cancelProcessing method in {@link module:lib/web3/events/processor}. - *
- And dequeue the event from the queue by using {@link dequeueIntent} - * - * @param {Object} eventObj - Event object. - * - */ - removeIntent: function ( eventObj ) { - var oThis = this; - - const eventId = eventObj.id; - const _handler = oThis.handlerQueue[ eventId ]; - - logger.warn(eventId, "has been removed"); - - if ( !_handler ) { - return; - } - - //Cancel Scheduled Processing. - _handler.cancelProcessing(); - - //Dequeue it. - oThis.dequeueIntent( eventObj ); - - }, - - /** - * dequeue the event from the queue - * - * @param {Object} eventObj - Event object. - * - */ - dequeueIntent: function ( eventObj ) { - var oThis = this; - const eventId = eventObj.id; - - if ( !oThis.handlerQueue[ eventId ] ) { - return; - } - - oThis.handlerQueue[ eventId ] = null; - - } - -}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4ad3188..96ef37b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,40 @@ "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", "dev": true }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, "web3": { "version": "0.18.4", "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", @@ -32,7 +66,7 @@ "requires": { "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", "crypto-js": "3.1.8", - "utf8": "2.1.2", + "utf8": "2.1.1", "xhr2": "0.1.4", "xmlhttprequest": "1.8.0" } @@ -49,9 +83,9 @@ } }, "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", "dev": true }, "acorn-dynamic-import": { @@ -72,13 +106,14 @@ } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { @@ -182,8 +217,7 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "async": { "version": "2.6.0", @@ -191,7 +225,7 @@ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "async-each": { @@ -247,7 +281,7 @@ "dev": true, "requires": { "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", + "babel-generator": "6.26.1", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", "babel-register": "6.26.0", @@ -259,7 +293,7 @@ "convert-source-map": "1.5.1", "debug": "2.6.9", "json5": "0.5.1", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", @@ -268,9 +302,9 @@ } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "6.23.0", @@ -278,7 +312,7 @@ "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "source-map": "0.5.7", "trim-right": "1.0.1" } @@ -304,7 +338,7 @@ "babel-helper-function-name": "6.24.1", "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-helper-function-name": { @@ -358,7 +392,7 @@ "requires": { "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-helper-replace-supers": { @@ -449,7 +483,7 @@ "babel-template": "6.26.0", "babel-traverse": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-plugin-transform-es2015-classes": { @@ -716,7 +750,7 @@ "babel-runtime": "6.26.0", "core-js": "2.5.3", "home-or-tmp": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "mkdirp": "0.5.1", "source-map-support": "0.4.18" } @@ -741,7 +775,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-traverse": { @@ -758,7 +792,7 @@ "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.2", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-types": { @@ -769,7 +803,7 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.4", + "lodash": "4.17.5", "to-fast-properties": "1.0.3" } }, @@ -976,14 +1010,12 @@ } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", + "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", "requires": { "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "ieee754": "1.1.8" } }, "buffer-crc32": { @@ -992,12 +1024,9 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, "buffer-to-arraybuffer": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.2.tgz", - "integrity": "sha1-0NgFZNwxhmoZdlFUh7OrYg23yEk=", - "requires": { - "tape": "3.6.1" - } + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" }, "buffer-xor": { "version": "1.0.3", @@ -1043,14 +1072,16 @@ } }, "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "requires": { "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" } }, "chalk": { @@ -1066,6 +1097,11 @@ "supports-color": "2.0.0" } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1123,9 +1159,9 @@ } }, "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "requires": { "graceful-readlink": "1.0.1" } @@ -1234,7 +1270,7 @@ "cipher-base": "1.0.4", "inherits": "2.0.1", "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "sha.js": "2.4.10" } }, "create-hmac": { @@ -1247,7 +1283,7 @@ "inherits": "2.0.1", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "sha.js": "2.4.10" } }, "cross-spawn": { @@ -1340,6 +1376,11 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, "decompress": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", @@ -1430,32 +1471,13 @@ } }, "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } + "type-detect": "4.0.8" } }, - "deep-equal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", - "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" - }, - "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1490,9 +1512,9 @@ } }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true }, "diffie-hellman": { @@ -1521,9 +1543,9 @@ "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "duplexer3": { @@ -1900,18 +1922,6 @@ "webpack": "3.10.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", @@ -2081,7 +2091,7 @@ "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.4.1", "acorn-dynamic-import": "2.0.2", "ajv": "5.5.2", "ajv-keywords": "2.1.1", @@ -2423,16 +2433,12 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", "requires": { "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "jsonfile": "2.4.0" } }, "fs-promise": { @@ -2444,17 +2450,6 @@ "fs-extra": "2.1.2", "mz": "2.7.0", "thenify-all": "1.6.0" - }, - "dependencies": { - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - } - } } }, "fs.realpath": { @@ -3392,18 +3387,6 @@ "webpack": "3.10.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", @@ -3573,7 +3556,7 @@ "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.4.1", "acorn-dynamic-import": "2.0.2", "ajv": "5.5.2", "ajv-keywords": "2.1.1", @@ -3641,6 +3624,11 @@ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -3655,9 +3643,9 @@ } }, "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -3693,13 +3681,6 @@ "requires": { "min-document": "2.19.0", "process": "0.5.2" - }, - "dependencies": { - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - } } }, "globals": { @@ -3740,9 +3721,9 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", "dev": true }, "har-schema": { @@ -3757,19 +3738,6 @@ "requires": { "ajv": "5.5.2", "har-schema": "2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - } } }, "has": { @@ -4354,9 +4322,9 @@ } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, "lodash._baseassign": { @@ -4515,7 +4483,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" } }, "memory-fs": { @@ -4593,9 +4561,9 @@ } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "mimic-response": { @@ -4651,41 +4619,51 @@ } }, "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", + "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", "dev": true, "requires": { "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", + "glob": "7.1.2", + "growl": "1.10.3", "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", "mkdirp": "0.5.1", - "supports-color": "3.1.2" + "supports-color": "4.4.0" }, "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" } }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "2.0.0" } } } @@ -4753,7 +4731,7 @@ "console-browserify": "1.1.0", "constants-browserify": "1.0.0", "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", + "domain-browser": "1.2.0", "events": "1.1.1", "https-browserify": "1.0.0", "os-browserify": "0.3.0", @@ -4765,11 +4743,30 @@ "stream-browserify": "2.0.1", "stream-http": "2.8.0", "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", + "timers-browserify": "2.0.6", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", "vm-browserify": "0.0.4" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + } } }, "normalize-package-data": { @@ -4834,11 +4831,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-inspect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", - "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" - }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", @@ -4906,6 +4898,16 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "ost-price-oracle": { + "version": "file:test/scripts/ost-price-oracle", + "requires": { + "assert": "1.4.1", + "bignumber.js": "4.1.0", + "continuation-local-storage": "3.2.1", + "moment": "2.20.1", + "web3": "1.0.0-beta.26" + } + }, "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -5049,6 +5051,11 @@ "pinkie-promise": "2.0.1" } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", @@ -5058,7 +5065,7 @@ "create-hmac": "1.1.6", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "sha.js": "2.4.10" } }, "pend": { @@ -5116,10 +5123,9 @@ "dev": true }, "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, "process-nextick-args": { "version": "1.0.7", @@ -5170,10 +5176,12 @@ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "query-string": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-2.4.2.tgz", - "integrity": "sha1-fbBmZCCAS6qSrp8miWKFWnYUPfs=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", + "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", "strict-uri-encode": "1.1.0" } }, @@ -5471,14 +5479,6 @@ "path-parse": "1.0.5" } }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "2.3.8" - } - }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -5493,7 +5493,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.1" + "glob": "7.1.2" } }, "ripemd160": { @@ -5541,16 +5541,6 @@ "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "requires": { "commander": "2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": "1.0.1" - } - } } }, "semver": { @@ -5631,9 +5621,9 @@ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" }, "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", "requires": { "inherits": "2.0.1", "safe-buffer": "5.1.1" @@ -5667,10 +5657,10 @@ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + "shortid": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", + "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" }, "signal-exit": { "version": "3.0.2", @@ -5678,14 +5668,19 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, "simple-get": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", - "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz", + "integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==", "requires": { + "decompress-response": "3.3.0", "once": "1.4.0", - "unzip-response": "1.0.2", - "xtend": "4.0.1" + "simple-concat": "1.0.0" } }, "slash": { @@ -5703,9 +5698,9 @@ } }, "solc": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", - "integrity": "sha512-Kq+O3PNF9Pfq7fB+lDYAuoqRdghLmZyfngsg0h1Hj38NKAeVHeGPOGeZasn5KqdPeCzbMFvaGyTySxzGv6aXCg==", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.19.tgz", + "integrity": "sha512-hvi/vi9rQcB73poRLoLRfQIYKwmdhrNbZlOOFCGd5v58gEsYEUr3+oHPSXhyk4CFNchWC2ojpMYrHDJNm0h4jQ==", "dev": true, "requires": { "fs-extra": "0.30.0", @@ -5732,6 +5727,19 @@ "wrap-ansi": "2.1.0" } }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -5950,26 +5958,6 @@ "setimmediate": "1.0.5", "tar.gz": "1.0.7", "xhr-request-promise": "0.1.2" - }, - "dependencies": { - "buffer": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", - "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8" - } - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - } - } } }, "tapable": { @@ -5978,45 +5966,6 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, - "tape": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-3.6.1.tgz", - "integrity": "sha1-SJPdU+KApfWMDOswwsDrs7zVHh8=", - "requires": { - "deep-equal": "0.2.2", - "defined": "0.0.0", - "glob": "3.2.11", - "inherits": "2.0.1", - "object-inspect": "0.4.0", - "resumer": "0.0.0", - "through": "2.3.8" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "requires": { - "inherits": "2.0.1", - "minimatch": "0.3.0" - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - } - } - }, "tar": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", @@ -6044,7 +5993,7 @@ "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", "requires": { "bluebird": "2.11.0", - "commander": "2.9.0", + "commander": "2.8.1", "fstream": "1.0.11", "mout": "0.11.1", "tar": "2.2.1" @@ -6084,9 +6033,9 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", "dev": true, "requires": { "setimmediate": "1.0.5" @@ -6124,14 +6073,89 @@ "dev": true }, "truffle": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.5.tgz", - "integrity": "sha512-Hyj4LFRdfgoeb1SVV17hLAlO/szCXuuWS3tq26N5BI+avcEYdZl4KhxKMVgf6O/HeEIEuDYCpfLOWplXMfjeHQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.6.tgz", + "integrity": "sha512-E4u1dZr2IGY4liulO/nGMtavx4jVLXIJp48lxFq54N+gMRGhmBQp5kf1etA3bYhHVtO9IO76qRiHMMVuId7cRg==", "dev": true, "requires": { "mocha": "3.5.3", "original-require": "1.0.1", - "solc": "0.4.18" + "solc": "0.4.19" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.1", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } } }, "tty-browserify": { @@ -6155,10 +6179,9 @@ "optional": true }, "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-is": { "version": "1.6.15", @@ -6261,11 +6284,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -6303,10 +6321,9 @@ "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" }, "util": { "version": "0.10.3", @@ -6651,11 +6668,6 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" } } }, @@ -6665,7 +6677,7 @@ "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.4.1", "acorn-dynamic-import": "2.0.2", "ajv": "4.11.8", "ajv-keywords": "1.5.1", @@ -6688,6 +6700,16 @@ "yargs": "6.6.0" }, "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -6790,29 +6812,17 @@ } }, "xhr-request": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.0.1.tgz", - "integrity": "sha1-g/CKSyC+7Geowcco6BAvTJ7svdo=", - "requires": { - "buffer-to-arraybuffer": "0.0.2", - "object-assign": "3.0.0", - "query-string": "2.4.2", - "simple-get": "1.4.3", - "timed-out": "2.0.0", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "0.0.5", + "object-assign": "4.1.1", + "query-string": "5.1.0", + "simple-get": "2.7.0", + "timed-out": "4.0.1", "url-set-query": "1.0.0", "xhr": "2.4.1" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - }, - "timed-out": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=" - } } }, "xhr-request-promise": { @@ -6820,7 +6830,7 @@ "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", "requires": { - "xhr-request": "1.0.1" + "xhr-request": "1.1.0" } }, "xhr2": { diff --git a/package.json b/package.json index 56a6899..0972a39 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,13 @@ "version": "0.9.2", "description": "", "dependencies": { - "assert": "^1.4.1", "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", + "chai": "^4.1.2", "moment": "^2.19.2", - "web3": "1.0.0-beta.26", + "ost-price-oracle": "file:test/scripts/ost-price-oracle", + "shortid": "2.2.8", + "web3": "1.0.0-beta.26" }, "devDependencies": { "abi-decoder": "^1.0.9", @@ -21,7 +23,7 @@ "ganache-cli": "^6.0.3", "truffle": "^4.0.1", "mustache": "2.3.0", - "mocha": "^5.0.0" + "mocha": "^5.0.0" }, "author": "OpenST Foundation Ltd.", "license": "LGPL-3.0" diff --git a/test/lib/populate_env_vars.js b/test/lib/populate_env_vars.js index 359d954..1e455aa 100644 --- a/test/lib/populate_env_vars.js +++ b/test/lib/populate_env_vars.js @@ -11,16 +11,25 @@ const mustache = require('mustache') , fs = require('fs') , Path = require('path') - , envVarsSourceFile = '../../test/scripts/set_env_vars.sh'; + , envVarsSourceFile = '../../test/scripts/env_vars.sh'; const addressTemplate = "export OST_PRICER_DEPLOYER_ADDR='{{ost_pricer_deployer_address}}'\n" + - "export OST_PRICER_OPS_ADDR='{{ost_pricer_ops_address}}'\n"; + "export OST_PRICER_OPS_ADDR='{{ost_pricer_ops_address}}'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT1='{{ost_pricer_test_account_1}}'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT1_PASSPHRASE='testtest'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT2='{{ost_pricer_test_account_2}}'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT2_PASSPHRASE='testtest'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT3='{{ost_pricer_test_account_3}}'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT3_PASSPHRASE='testtest'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT4='{{ost_pricer_test_account_4}}'\n" + + "export OST_PRICER_PO_TEST_ACCOUNT4_PASSPHRASE='testtest'\n"; const contractPricer = "export OST_PRICER_CONTRACT_ADDR='{{ost_pricer_contract_address}}'\n"; const contractBT = "export OST_PRICER_BT_CONTRACT_ADDR='{{ost_pricer_bt_contract_address}}'\n"; const contractPO = "export OST_PRICER_PO_CONTRACT_ADDR='{{ost_pricer_po_contract_address}}'\n"; + const populateEnvVars = { renderAndPopulate: function (type, vars) { diff --git a/test/lib/utils.js b/test/lib/utils.js index da8f169..dea7ef6 100644 --- a/test/lib/utils.js +++ b/test/lib/utils.js @@ -1,4 +1,4 @@ -// Copyright 2017 OpenST Ltd. +// Copyright 2017 OST.com Ltd. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ // ---------------------------------------------------------------------------- const Assert = require('assert'); -const SolidityEvent = require("web3/lib/web3/event.js"); const NullAddress = "0x0000000000000000000000000000000000000000"; @@ -35,7 +34,7 @@ module.exports.logResponse = (response, description) => { receipt : response.receipt, description : description, response : response - }); + }); } module.exports.logReceipt = (receipt, description) => { @@ -78,7 +77,7 @@ module.exports.clearReceipts = () => { * General event checks */ module.exports.expectNoEvents = (result) => { - Assert.equal(result.receipt.logs.length, 0, "expected empty array of logs") + Assert.equal(result.receipt.logs.length, 0, "expected empty array of logs") } /* @@ -87,29 +86,29 @@ module.exports.expectNoEvents = (result) => { /// @dev Compare to null address module.exports.isNullAddress = function (address) { - Assert.strictEqual(typeof address, 'string', `address must be of type 'string'`); - return (address == NullAddress); + Assert.strictEqual(typeof address, 'string', `address must be of type 'string'`); + return (address == NullAddress); } /// @dev Expect failure from invalid opcode or out of gas, /// but returns error instead module.exports.expectThrow = async (promise) => { - try { - await promise; - } catch (error) { - const invalidOpcode = error.message.search('invalid opcode') > -1; + try { + await promise; + } catch (error) { + const invalidOpcode = error.message.search('invalid opcode') > -1; - const outOfGas = error.message.search('out of gas') > -1; + const outOfGas = error.message.search('out of gas') > -1; - // Latest TestRPC has trouble with require - const revertInstead = error.message.search('revert') > -1; + // Latest TestRPC has trouble with require + const revertInstead = error.message.search('revert') > -1; - assert(invalidOpcode || outOfGas || revertInstead, `Expected throw, but got ${error} instead`); + Assert(invalidOpcode || outOfGas || revertInstead, `Expected throw, but got ${error} instead`); - return; - } + return; + } - assert(false, "Did not throw as expected"); + Assert(false, "Did not throw as expected"); }; /// @dev Get account balance @@ -123,7 +122,7 @@ module.exports.getBalance = function (address) { } }) }) -} +}; /// @dev Get gas price module.exports.getGasPrice = function () { @@ -136,104 +135,4 @@ module.exports.getGasPrice = function () { } }) }) -} - -/// @dev Decode logs with ABI -module.exports.decodeLogs = (abi, logs) => { - return decodeLogs(abi, logs) -} - - -function decodeLogs(abi, logs) { - var decodedLogs = null - try { - decodedLogs = decodeLogsInternal(abi, logs) - } catch(error) { - throw new 'Could not decode receipt log for transaction ' + txID + ', message: ' + error - } - - return decodedLogs -} - - -function decodeLogsInternal(abi, logs) { - - // Find events in the ABI - var abiEvents = abi.filter(json => { - return json.type === 'event' - }) - - if (abiEvents.length === 0) { - return - } - - // Build SolidityEvent objects - var solidityEvents = [] - for (i = 0; i < abiEvents.length; i++) { - solidityEvents.push(new SolidityEvent(null, abiEvents[i], null)) - } - - // Decode each log entry - var decodedLogs = [] - for (i = 0; i < logs.length; i++) { - - var event = null - for (j = 0; j < solidityEvents.length; j++) { - if (solidityEvents[j].signature() == logs[i].topics[0].replace("0x", "")) { - event = solidityEvents[j] - break - } - } - - var decodedLog = null - - if (event != null) { - decodedLog = event.decode(logs[i]) - } else { - // We could not find the right event to decode this log entry, just keep as is. - decodedLog = logs[i] - } - - // Convert bytes32 parameters to ascii - for (j = 0; j < abiEvents.length; j++) { - const abiEvent = abiEvents[j] - - if (!abiEvent.inputs) { - continue - } - - if (abiEvent.name != decodedLog.name) { - continue - } - - for (k = 0; k < abiEvent.inputs; k++) { - if (abiEvent.inputs[k].type == 'bytes32') { - decodedLog.args[abiEvent.inputs[k].name] = hexToAscii(decodedLog.args[abiEvent.inputs[k]]); - } - } - } - - decodedLogs.push(decodedLog) - } - - return decodedLogs -} - - -function hexToAscii(hexStr) { - var asciiStr = '' - - var start = (hex.substring(0, 2) === '0x') ? 2 : 0 - - for (i = start; i < hexStr.length; i += 2) { - var charCode = parseInt(hex.substr(i, 2), 16) - - if (code === 0) { - continue - } - - asciiStr += String.fromCharCode(code); - } - - return asciiStr; -} \ No newline at end of file +}; \ No newline at end of file diff --git a/test/scripts/_init_addresses.js b/test/scripts/_init_addresses.js index c068ee8..6013fe8 100644 --- a/test/scripts/_init_addresses.js +++ b/test/scripts/_init_addresses.js @@ -3,7 +3,11 @@ const Path = require('path'); const _addresses = { "deployerAdd": null, - "opsAdd": null + "opsAdd": null, + "account1": null, + "account2": null, + "account3": null, + "account4": null }; const rootPrefix = "../.." @@ -28,13 +32,29 @@ function main( addressFile ) { fundAddress(thisAddress); } else if ( !_addresses.opsAdd ) { _addresses.opsAdd = thisAddress; - fundAddress(thisAddress); + fundAddress(thisAddress); + } else if ( !_addresses.account1 ) { + _addresses.account1 = thisAddress; + fundAddress(thisAddress); + } else if ( !_addresses.account2 ) { + _addresses.account2 = thisAddress; + fundAddress(thisAddress); + } else if ( !_addresses.account3 ) { + _addresses.account3 = thisAddress; + fundAddress(thisAddress); + } else if ( !_addresses.account4 ) { + _addresses.account4 = thisAddress; + fundAddress(thisAddress); } }); populateEnvVars.renderAndPopulate('address', { ost_pricer_deployer_address: _addresses.deployerAdd, - ost_pricer_ops_address: _addresses.opsAdd + ost_pricer_ops_address: _addresses.opsAdd, + ost_pricer_test_account_1: _addresses.account1, + ost_pricer_test_account_2: _addresses.account2, + ost_pricer_test_account_3: _addresses.account3, + ost_pricer_test_account_4: _addresses.account4 } ); } @@ -43,7 +63,7 @@ function fundAddress( address ) { //Update poa-genesis-value updateGenesisAlloc( poaGenesis, address, "0x200000000000000000000000000000000000000000000000000000000000000"); - //writeJsonToFile(poaGenesis, "./poa-genesis.json"); + writeJsonToFile(poaGenesis, "./poa-genesis.json"); } function updateGenesisAlloc( genesis, foundation, value ) { diff --git a/test/scripts/deploy_all.sh b/test/scripts/deploy_all.sh index 026c325..9d6573f 100644 --- a/test/scripts/deploy_all.sh +++ b/test/scripts/deploy_all.sh @@ -1,12 +1,42 @@ cd .. -source scripts/set_env_vars.sh -node ../tools/deploy/EIP20TokenMock.js 5 DKN deepeshCoin 18 +sh ../contracts/compile.sh +source scripts/env_vars.sh -source scripts/set_env_vars.sh -node ../tools/deploy/pricer.js $OST_PRICER_BT_CONTRACT_ADDR +echo "\n********* Deploying test coin 1 *************" +node ../tools/deploy/EIP20TokenMock.js 5 TC1 TestCoin1 18 0x12A05F200 travis tc1.txt +export TEST_COIN1_C5_ADDRESS=$(cat ../tools/deploy/tc1.txt) +rm ../tools/deploy/tc1.txt +#TO_DO: Write this to scripts/env_vars.sh +echo "\n********* Done *************" -source scripts/set_env_vars.sh +echo "\n********* Deploying test coin 2 *************" +source scripts/env_vars.sh +node ../tools/deploy/EIP20TokenMock.js 2 TC2 TestCoin2 18 0x12A05F200 travis tc2.txt +export TEST_COIN2_C2_ADDRESS=$(cat ../tools/deploy/tc2.txt) +rm ../tools/deploy/tc2.txt +#TO_DO: Write this to scripts/env_vars.sh +echo "\n********* Done *************" + +echo "\n********* Deploying Pricer 1 *************" +source scripts/env_vars.sh +node ../tools/deploy/pricer.js $TEST_COIN1_C5_ADDRESS OST 0x12A05F200 travis tp1.txt +export TEST_PRICER_C5_ADDRESS=$(cat ../tools/deploy/tp1.txt) +rm ../tools/deploy/tp1.txt +#TO_DO: Write this to scripts/env_vars.sh +echo "\n********* Done *************" + +echo "\n********* Deploying Pricer 2 *************" +source scripts/env_vars.sh +node ../tools/deploy/pricer.js $TEST_COIN2_C2_ADDRESS OST 0x12A05F200 travis tp2.txt +export TEST_PRICER_C2_ADDRESS=$(cat ../tools/deploy/tp2.txt) +rm ../tools/deploy/tp2.txt +#TO_DO: Write this to scripts/env_vars.sh +echo "\n********* Done *************" + + +echo "\n********* Setting env variables *************" +source scripts/env_vars.sh cd scripts export OST_PO_GETH_RPC_PROVIDER=$OST_PRICER_GETH_RPC_PROVIDER @@ -16,5 +46,7 @@ export OST_PO_OPS_ADDR=$OST_PRICER_OPS_ADDR export OST_PO_OPS_PASSPHRASE=$OST_PRICER_OPS_PASSPHRASE export OST_PO_PRICE_ORACLES='{}' +echo "\n********* Done *************" + sh deploy_price_oracle.sh diff --git a/test/scripts/deploy_price_oracle.sh b/test/scripts/deploy_price_oracle.sh index ad4125a..817cf28 100644 --- a/test/scripts/deploy_price_oracle.sh +++ b/test/scripts/deploy_price_oracle.sh @@ -1,9 +1,47 @@ +#git clone git@github.com:OpenSTFoundation/ost-price-oracle.git +#cd ost-price-oracle +#git checkout abhay/mocha_test +#git pull --rebase +#sh contracts/compile.sh +#node tools/deploy/price_oracle.js OST USD 0x12A05F200 travis po_ost_usd.txt +#set /p PO_OST_USD_0.5=> $ADDRESS_FILE echo $OST_PRICER_OPS_PASSPHRASE > ./pw geth --datadir "$DATADIR" account new --password ./pw >> $ADDRESS_FILE +#Test account 1 +echo "testtest" > ./pw +geth --datadir "$DATADIR" account new --password ./pw >> $ADDRESS_FILE + +#Test account 2 +echo "testtest" > ./pw +geth --datadir "$DATADIR" account new --password ./pw >> $ADDRESS_FILE + +#Test account 3 +echo "testtest" > ./pw +geth --datadir "$DATADIR" account new --password ./pw >> $ADDRESS_FILE + +#Test account 4 +echo "testtest" > ./pw +geth --datadir "$DATADIR" account new --password ./pw >> $ADDRESS_FILE + echo "...New addresses generated" cat $ADDRESS_FILE #Invoke JS script to init addresses in various JSON files. diff --git a/test/scripts/poa-genesis.json b/test/scripts/poa-genesis-template.json similarity index 52% rename from test/scripts/poa-genesis.json rename to test/scripts/poa-genesis-template.json index 27dda70..609c860 100644 --- a/test/scripts/poa-genesis.json +++ b/test/scripts/poa-genesis-template.json @@ -10,14 +10,7 @@ }, "gasLimit": "0x989680", "difficulty": "0x1", - "alloc": { - "0xa35a3083c838e0978d9047792fd1a2d9e4be0ca8": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "0x7758bdf616917acd01db49d10263edc4c836781c": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - } - }, + "alloc": {}, "number": "0x0", "gasUsed": "0x0" } \ No newline at end of file diff --git a/test/scripts/run_chain.sh b/test/scripts/run_chain.sh index 6f51282..36ec321 100755 --- a/test/scripts/run_chain.sh +++ b/test/scripts/run_chain.sh @@ -3,4 +3,4 @@ DATADIR=./st-poa LOCAL_NETWORK_ID="--networkid 20171010" -geth --datadir "$DATADIR" $LOCAL_NETWORK_ID --port 30301 --rpcport 9546 --ws --wsport 19546 --wsorigins "*" --gasprice 0 --targetgaslimit 10000000 --etherbase 0 --unlock 0 --password pw --rpc --maxpeers 0 --mine --minerthreads 1 --rpcapi net,eth,web3,personal +geth --datadir "$DATADIR" $LOCAL_NETWORK_ID --port 30301 --rpcport 9546 --ws --wsport 19546 --wsorigins "*" --gasprice 0 --targetgaslimit 100000000 --etherbase 0 --unlock 0 --password pw --rpc --maxpeers 0 --mine --minerthreads 1 --rpcapi net,eth,web3,personal diff --git a/test/scripts/set_env_vars.sh b/test/scripts/set_env_vars.sh index 2d56730..c294671 100644 --- a/test/scripts/set_env_vars.sh +++ b/test/scripts/set_env_vars.sh @@ -2,9 +2,9 @@ export OST_PRICER_GAS_PRICE='0x12A05F200' export OST_PRICER_GETH_RPC_PROVIDER='http://127.0.0.1:9546' export OST_PRICER_GETH_WS_PROVIDER='ws://127.0.0.1:19546' -export OST_PRICER_DEPLOYER_ADDR='0xa35a3083c838e0978d9047792fd1a2d9e4be0ca8' +export OST_PRICER_DEPLOYER_ADDR='' export OST_PRICER_DEPLOYER_PASSPHRASE='testtest' -export OST_PRICER_OPS_ADDR='0x7758bdf616917acd01db49d10263edc4c836781c' +export OST_PRICER_OPS_ADDR='' export OST_PRICER_OPS_PASSPHRASE='testtest' export OST_PRICER_CONTRACT_ADDR='' export OST_PRICER_ST_PRIME_UUID='' diff --git a/test/scripts/start_test_chain.sh b/test/scripts/start_test_chain.sh index ecd71ca..123366e 100644 --- a/test/scripts/start_test_chain.sh +++ b/test/scripts/start_test_chain.sh @@ -1,4 +1,8 @@ -source set_env_vars.sh +cat poa-genesis-template.json>poa-genesis.json +cat set_env_vars.sh>env_vars.sh +source env_vars.sh sh init_keys.sh sh init_chain.sh -sh run_chain.sh +nohup sh run_chain.sh /dev/null 2>&1 & +node ./geth_checker.js + diff --git a/test/scripts/travis_test.sh b/test/scripts/travis_test.sh new file mode 100644 index 0000000..fca2039 --- /dev/null +++ b/test/scripts/travis_test.sh @@ -0,0 +1,2 @@ +sh start_test_chain.sh +sh deploy_all.sh \ No newline at end of file diff --git a/test/services/pricer/constants.js b/test/services/pricer/constants.js index 01bfe72..5ffe255 100644 --- a/test/services/pricer/constants.js +++ b/test/services/pricer/constants.js @@ -1,25 +1,29 @@ const constants = { - deployer: "", - deployerPassphrase: "", - ops: "", - opsPassphrase: "", - account1: "", - accountPassphrase1: "", - account2: "", - accountPassphrase2: "", - account3: "", - accountPassphrase3: "", - account4: "", - accountPassphrase4: "", + deployer: process.env.OST_PRICER_DEPLOYER_ADDR, + deployerPassphrase: process.env.OST_PRICER_DEPLOYER_PASSPHRASE, + ops: process.env.OST_PRICER_OPS_ADDR, + opsPassphrase: process.env.OST_PRICER_OPS_PASSPHRASE, + account1: process.env.OST_PRICER_PO_TEST_ACCOUNT1, + accountPassphrase1: process.env.OST_PRICER_PO_TEST_ACCOUNT1_PASSPHRASE, + account2: process.env.OST_PRICER_PO_TEST_ACCOUNT2, + accountPassphrase2: process.env.OST_PRICER_PO_TEST_ACCOUNT2_PASSPHRASE, + account3: process.env.OST_PRICER_PO_TEST_ACCOUNT3, + accountPassphrase3: process.env.OST_PRICER_PO_TEST_ACCOUNT3_PASSPHRASE, + account4: process.env.OST_PRICER_PO_TEST_ACCOUNT4, + accountPassphrase4: process.env.OST_PRICER_PO_TEST_ACCOUNT4_PASSPHRASE, currencyUSD: "USD", currencyEUR: "EUR", currencyINR: "INR", currencyBlank: "", - priceOracleOstUsdAddress: "", //conversionRate is 5 - priceOracleOstEurAddress: "", //conversionRate is 2 - priceOracleOstUsdZeroPricePointAddress: "", - pricerOstAddress: "", - pricerOstZeroPricePointAddress: "", - pricerDummyAddress: "", -} + pricerOstUsdAddress: process.env.TEST_PRICER_C5_ADDRESS, + pricerOstEurAddress: process.env.TEST_PRICER_C2_ADDRESS, + priceOracles: JSON.parse(process.env.OST_PO_PRICE_ORACLES) + /*priceOracleOstUsdAddress: process.env., //conversionRate is 5 + priceOracleOstEurAddress: process.env., //conversionRate is 2 + priceOracleOstUsdZeroPricePointAddress: process.env., + pricerOstAddress: process.env., + pricerOstZeroPricePointAddress: process.env., + pricerDummyAddress: process.env., + */ +}; module.exports = constants; \ No newline at end of file diff --git a/test/services/pricer/get_pricepoint_and_calculated_amounts.js b/test/services/pricer/get_pricepoint_and_calculated_amounts.js index b056887..a2b7b7b 100644 --- a/test/services/pricer/get_pricepoint_and_calculated_amounts.js +++ b/test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -1,79 +1,91 @@ + +/* // Load external packages -const assert = require('assert'); +const chai = require('chai') + , assert = chai.assert; const rootPrefix = "../../.." - , Utils = require(rootPrefix + './test/lib/utils.js'); , constants = require(rootPrefix + '/test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') - , pricerOstUsd = new pricer(pricerOstAddress) - , pricerOstEur = new pricer(priceOracleOstEurAddress) - , pricerOstUsdZeroPricePoint = new pricer(pricerOstZeroPricePointAddress) + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , pricerOstUsdZeroPricePoint = null;//new pricer(pricerOstZeroPricePointAddress) ; describe('Get price point and calculated amounts', function() { it('should pass the initial address checks', async function() { + assert.isDefined(constants.deployer); + assert.isDefined(constants.ops); + assert.isDefined(constants.account1); assert.notEqual(constants.deployer, constants.ops); - assert.notEqual(constants.deployer, constants.user); - assert.notEqual(constants.ops, constants.user); + assert.notEqual(constants.deployer, constants.account1); + assert.notEqual(constants.ops, constants.account1); }); it('should fail when currency is 0', async function() { - await Utils.expectThrow( - pricerOstUsd.getPricePointAndCalculatedAmounts( - constants.account1, - constants.accountPassphrase1, - pricerOstUsd.toWei(1), - pricerOstUsd.toWei(0.5), - currencyBlank) - ); + const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( + pricerOstUsd.toWei('1'), + pricerOstUsd.toWei('0.5'), + constants.currencyBlank); + assert.equal(result.success, false); }); it('should fail when price point is 0', async function() { - await Utils.expectThrow( - pricerOstUsdZeroPricePoint.getPricePointAndCalculatedAmounts( - constants.account1, - constants.accountPassphrase1, - pricerOstUsdZeroPricePoint.toWei(1), - pricerOstUsdZeroPricePoint.toWei(0.5), - constants.currencyUSD) - ); + const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( + pricerOstUsd.toWei('1'), + pricerOstUsd.toWei('0.5'), + constants.currencyEUR); + assert.equal(result.success, false); }); it('should pass when all parameters are valid and conversion rate is 5', async function() { - const amount = pricerOstUsd.toWei(1) - , commissionAmount = pricerOstUsd.toWei(0.5) + const amount = pricerOstUsd.toWei('1') + , commissionAmount = pricerOstUsd.toWei('0.5') ; - var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstUsd.getPricePointAndCalculatedAmounts( - constants.account1, - constants.accountPassphrase1, - amount, - commissionAmount, - constants.currencyUSD); - const poPricePoint = await pricerOstUsd.getPricePoint(constants.currencyUSD); - const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 5); - const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 5); - assert.equal(pricePoint, poPricePoint); - assert.equal(tokenAmount, calculatedTokenAmount); - assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); + + const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( + amount, + commissionAmount, + constants.currencyUSD); + console.log(result); + assert.equal(result.success, true); + + // var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstUsd.getPricePointAndCalculatedAmounts( + // amount, + // commissionAmount, + // constants.currencyUSD); + // const poPricePoint = await pricerOstUsd.getPricePoint(constants.currencyUSD); + // const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 5); + // const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 5); + // assert.equal(pricePoint, poPricePoint); + // assert.equal(tokenAmount, calculatedTokenAmount); + // assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); }); it('should pass when all parameters are valid and conversion rate is 2', async function() { - const amount = pricerOstEur.toWei(1) - , commissionAmount = pricerOstEur.toWei(0.5) + const amount = pricerOstEur.toWei('1') + , commissionAmount = pricerOstEur.toWei('0.5') ; - var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstEur.getPricePointAndCalculatedAmounts( - constants.account1, - constants.accountPassphrase1, - amount, - commissionAmount, - constants.currencyUSD); - const poPricePoint = await pricerOstEur.getPricePoint(constants.currencyEur); - const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 2); - const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 2); - assert.equal(pricePoint, poPricePoint); - assert.equal(tokenAmount, calculatedTokenAmount); - assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); + const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( + amount, + commissionAmount, + constants.currencyUSD); + console.log(result); + assert.equal(result.success, true); + // var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstEur.getPricePointAndCalculatedAmounts( + // constants.account1, + // constants.accountPassphrase1, + // amount, + // commissionAmount, + // constants.currencyUSD); + // const poPricePoint = await pricerOstEur.getPricePoint(constants.currencyEur); + // const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 2); + // const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 2); + // assert.equal(pricePoint, poPricePoint); + // assert.equal(tokenAmount, calculatedTokenAmount); + // assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); }); -}); \ No newline at end of file +}); +*/ diff --git a/test/services/pricer/pay.js b/test/services/pricer/pay.js index 4ec4ec9..a79abbc 100644 --- a/test/services/pricer/pay.js +++ b/test/services/pricer/pay.js @@ -1,3 +1,4 @@ +/* // Load external packages const assert = require('assert'); @@ -173,4 +174,5 @@ describe('Pay', function() { it('should pass when all parameters are currency is blank', async function() { }); -}); \ No newline at end of file +}); +*/ \ No newline at end of file diff --git a/test/services/pricer/set_accepted_margin.js b/test/services/pricer/set_accepted_margin.js index ad45857..098234c 100644 --- a/test/services/pricer/set_accepted_margin.js +++ b/test/services/pricer/set_accepted_margin.js @@ -1,3 +1,4 @@ +/* // Load external packages const assert = require('assert'); @@ -69,3 +70,4 @@ describe('Set accepted margins', function() { }); }); +*/ diff --git a/test/services/pricer/set_price_oracle.js b/test/services/pricer/set_price_oracle.js index ab942c1..1b11312 100644 --- a/test/services/pricer/set_price_oracle.js +++ b/test/services/pricer/set_price_oracle.js @@ -1,34 +1,40 @@ + // Load external packages -const assert = require('assert'); +const chai = require('chai') + , assert = chai.assert; const rootPrefix = "../../.." + , constants = require(rootPrefix + '/test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') - , deployer = "" - , deployerPassphrase = "" - , ops = "" - , opsPassphrase = "" - , user ="" - , userPassphrase = "" - , priceOracleOstUsdAddress = "" - , priceOracleOstEurAddress = "" - , priceOracleEthUsdAddress = "" - , priceOracleOstUsdAddressDEC10 = "" - + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , pricerOstUsdZeroPricePoint = null;//new pricer(pricerOstZeroPricePointAddress) ; describe('Set price oracle', function() { it('should pass the initial address checks', async function() { - assert.notEqual(deployer, ops); - assert.notEqual(deployer, user); - assert.notEqual(ops, user); + assert.isDefined(constants.deployer); + assert.isDefined(constants.ops); + assert.isDefined(constants.account1); + assert.notEqual(constants.deployer, constants.ops); + assert.notEqual(constants.deployer, constants.account1); + assert.notEqual(constants.ops, constants.account1); }); - it('should fail when sender is not ops', async function() { - var currency = "USD" - , oracleAddress = priceOracleOstUsdAddress - , response = pricer.setPriceOracle(deployer, deployerPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); +/* it('should fail when sender is not ops', function(done) { + this.timeout(100000); + pricerOstUsd.setPriceOracle( + constants.deployer, + constants.deployerPassphrase, + constants.currencyUSD, + constants.priceOracles["OST"]["USD"], + 0xBA43B7400).then(function(result){ + console.log("Here in result"); + console.log(result); + done(); + }); + }); it('should fail when currency is blank', async function() { @@ -58,16 +64,34 @@ describe('Set price oracle', function() { , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); assert.equal(response.isSuccess(), false); }); - - it('should pass when OST/USD price oracle is set', async function() { - var currency = "USD" - , oracleAddress = priceOracleOstUsdAddress - , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); - var addressFromPricer = pricer.priceOracles(currency); - assert.equal(addressFromPricer, oracleAddress); +*/ + it('should pass when OST/USD price oracle is set', async function(done) { + this.timeout(100000); + pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles["OST"]["USD"], + 0xBA43B7400).then(function(result) { + console.log("Here in result"); + console.log(result); + done(); + }); + /*.then(function() { + pricerOstUsd.decimals().then( function(poResult) { + console.log("Here in po"); + console.log(poResult); + }); + // console.log("Here in po"); + // pricerOstUsd.priceOracles(constants.currencyUSD).then( function(poResult) { + // console.log("Here in po1"); + // console.log(poResult); + // done(); + // }); + }); + */ }); - +/* it('should pass when OST/EUR price oracle is set', async function() { var currency = "EUR" , oracleAddress = priceOracleOstEurAddress @@ -76,7 +100,7 @@ describe('Set price oracle', function() { var addressFromPricer = pricer.priceOracles(currency); assert.equal(addressFromPricer, oracleAddress); }); - +*/ -}); \ No newline at end of file +}); diff --git a/test/services/pricer/unset_price_oracle.js b/test/services/pricer/unset_price_oracle.js index 4d212bf..4f69238 100644 --- a/test/services/pricer/unset_price_oracle.js +++ b/test/services/pricer/unset_price_oracle.js @@ -1,3 +1,4 @@ +/* // Load external packages const assert = require('assert'); @@ -63,4 +64,5 @@ describe('Unset price oracle', function() { assert.equal(response.isSuccess(), false); }); -}); \ No newline at end of file +}); +*/ \ No newline at end of file diff --git a/tools/deploy/EIP20TokenMock.js b/tools/deploy/EIP20TokenMock.js index 794a827..dab9c2f 100644 --- a/tools/deploy/EIP20TokenMock.js +++ b/tools/deploy/EIP20TokenMock.js @@ -23,12 +23,7 @@ const coreConstants = require(rootPrefix + '/config/core_constants'); const coreAddresses = require(rootPrefix + '/config/core_addresses'); const prompts = readline.createInterface(process.stdin, process.stdout); const logger = require(rootPrefix + '/helpers/custom_console_logger'); -//const PriceOracle = require(rootPrefix + "/lib/contract_interact/price_oracle"); -const deploymentOptions = { - gasPrice: coreConstants.OST_GAS_PRICE, - gas: coreConstants.OST_GAS_LIMIT -}; // Different addresses used for deployment const deployerName = "deployer"; @@ -41,6 +36,8 @@ const deployerAddress = coreAddresses.getAddressForUser(deployerName); * * @return {} */ + + async function performer(argv) { logger.info("argv[0]: " + argv[0]); @@ -50,8 +47,10 @@ async function performer(argv) { logger.info("argv[4]: " + argv[4]); logger.info("argv[5]: " + argv[5]); logger.info("argv[6]: " + argv[6]); + logger.info("argv[7]: " + argv[7]); + logger.info("argv[8]: " + argv[8]); - if (argv.length < 6) { + if (argv.length < 7) { logger.error("Invalid arguments !!!"); process.exit(0); } @@ -59,21 +58,30 @@ async function performer(argv) { //argv[3] => string symbol; //argv[4] => string name; //argv[5] => uint8 decimals; - //argv[6] => string travis; + //argv[6] => hex gasPrice; + //argv[7] => string travis; + //argv[8] => string File name where contract address needs to write; const conversionRate = argv[2].trim(); const symbol = argv[3].trim(); const name = argv[4].trim(); const decimals = argv[5].trim(); + const gasPrice = argv[6].trim(); var isTravisCIEnabled = false; - if (argv[6] !== undefined) { - isTravisCIEnabled = argv[6].trim() === 'travis'; + if (argv[7] !== undefined) { + isTravisCIEnabled = argv[7].trim() === 'travis'; } + const fileForContractAddress = (argv[8] !== undefined) ? argv[8].trim() : ''; + const deploymentOptions = { + gasPrice: gasPrice, + gas: coreConstants.OST_GAS_LIMIT + }; logger.info("Deployer Address: " + deployerAddress); logger.info("conversionRate: " + conversionRate); logger.info("symbol: " + symbol); logger.info("name: " + name); logger.info("decimals: " + decimals); + logger.info("gasPrice: " + gasPrice); logger.info("Travis CI enabled Status: " + isTravisCIEnabled); if (isTravisCIEnabled === false ) { @@ -107,14 +115,6 @@ async function performer(argv) { decimals ]; - //logger.info("contractName: "+contractName); - //logger.info(web3Provider); - //logger.info("contractAbi: "+contractAbi); - //logger.info("contractBin: "+contractBin); - //logger.info("deployerName: "+deployerName); - //logger.info("deploymentOptions: "+deploymentOptions); - //logger.info("constructorArgs: "+constructorArgs); - var contractDeployTxReceipt = await deployHelper.perform( contractName, web3Provider, @@ -127,7 +127,13 @@ async function performer(argv) { logger.info(contractDeployTxReceipt); logger.win(contractName+ " Deployed "); - await deployHelper.updateEnvContractAddress('contractBT', {'ost_pricer_bt_contract_address': contractDeployTxReceipt.contractAddress}); + const contractAddress = contractDeployTxReceipt.receipt.contractAddress; + // if (isTravisCIEnabled) { + // await deployHelper.updateEnvContractAddress( + // 'contractBT', {'ost_pricer_bt_contract_address': contractDeployTxReceipt.contractAddress}); + // } + deployHelper.writeContractAddressToFile(fileForContractAddress, contractAddress); } +// example: node ../tools/deploy/EIP20TokenMock.js 5 DKN deepeshCoin 18 0x12A05F200 travis bt.txt performer(process.argv); diff --git a/tools/deploy/helper.js b/tools/deploy/helper.js index 184d316..41f4e5c 100644 --- a/tools/deploy/helper.js +++ b/tools/deploy/helper.js @@ -15,7 +15,9 @@ const rootPrefix = '../..' , coreAddresses = require(rootPrefix + '/config/core_addresses') , logger = require(rootPrefix + '/helpers/custom_console_logger') , web3EventsFormatter = require(rootPrefix + '/lib/web3/events/formatter') - , populateEnvVars = require(rootPrefix + "/test/lib/populate_env_vars.js"); + , populateEnvVars = require(rootPrefix + "/test/lib/populate_env_vars.js") + , fs = require('fs') + , Path = require('path'); const _private = { @@ -188,6 +190,21 @@ const deployHelper = { logger.error(reason); process.exit(1); }); + }, + + /** + * Write contract address to file based on parameter + * + * @param {String} fileName - file name + * @param {Hex} contractAddress - contract Address + * + * @return {} + */ + writeContractAddressToFile: function(fileName, contractAddress) { + // Write contract address to file + if ( fileName !== '') { + fs.writeFileSync(Path.join(__dirname, '/' + fileName), contractAddress); + } } diff --git a/tools/deploy/pricer.js b/tools/deploy/pricer.js index b579ce9..a7e9e82 100644 --- a/tools/deploy/pricer.js +++ b/tools/deploy/pricer.js @@ -23,17 +23,39 @@ const coreConstants = require(rootPrefix + '/config/core_constants'); const coreAddresses = require(rootPrefix + '/config/core_addresses'); const prompts = readline.createInterface(process.stdin, process.stdout); const logger = require(rootPrefix + '/helpers/custom_console_logger'); -//const PriceOracle = require(rootPrefix + "/lib/contract_interact/price_oracle"); - -const deploymentOptions = { - gasPrice: coreConstants.OST_GAS_PRICE, - gas: coreConstants.OST_GAS_LIMIT -}; +const OpsManagedContract = require(rootPrefix + "/lib/contract_interact/ops_managed_contract"); // Different addresses used for deployment const deployerName = "deployer"; const deployerAddress = coreAddresses.getAddressForUser(deployerName); +const opsName = "ops"; +const opsAddress = coreAddresses.getAddressForUser(opsName); + + +/** + * Validation Method + * + * @param {Array} arguments + * + * @return {} + */ +function validate(argv) { + if (argv[2] === undefined || argv[2] === '') { + logger.error("Mandatory Param is missing! ( brandedTokenAddress)"); + process.exit(0); + } + + if (argv[3] === undefined || argv[3] === '') { + logger.error("Base currency is mandatory!"); + process.exit(0); + } + if (argv[4] === undefined || argv[4] === '') { + logger.error("Gas Price is mandatory!"); + process.exit(0); + } +} + /** * It is the main performer method of this deployment script * @@ -43,16 +65,36 @@ const deployerAddress = coreAddresses.getAddressForUser(deployerName); */ async function performer(argv) { + logger.info("argv[0]: " + argv[0]); + logger.info("argv[1]: " + argv[1]); + logger.info("argv[2]: " + argv[2]); + logger.info("argv[3]: " + argv[3]); + logger.info("argv[4]: " + argv[4]); + logger.info("argv[5]: " + argv[5]); + logger.info("argv[6]: " + argv[6]); + + validate(argv); const brandedTokenAddress = argv[2].trim(); + const baseCurrency = argv[3].trim(); + const gasPrice = argv[4].trim(); var isTravisCIEnabled = false; - if (argv[3] !== undefined) { - isTravisCIEnabled = argv[3].trim() === 'travis'; + if (argv[5] !== undefined) { + isTravisCIEnabled = argv[5].trim() === 'travis'; } + const fileForContractAddress = (argv[6] !== undefined) ? argv[6].trim() : ''; + const deploymentOptions = { + gasPrice: gasPrice, + gas: coreConstants.OST_GAS_LIMIT + }; + logger.info("Deployer Address: " + deployerAddress); + logger.info("Ops Address: " + opsAddress); logger.info("Branded Token Address: " + brandedTokenAddress); + logger.info("Base currency: " + brandedTokenAddress); + logger.info("Gas price: " + gasPrice); logger.info("Travis CI enabled Status: " + isTravisCIEnabled); - + logger.info("File to write For ContractAddress: "+fileForContractAddress); if (isTravisCIEnabled === false ) { await new Promise( function (onResolve, onReject) { @@ -77,7 +119,10 @@ async function performer(argv) { const contractBin = coreAddresses.getBinForContract(contractName); - var constructorArgs = [brandedTokenAddress]; + var constructorArgs = [ + brandedTokenAddress, + web3Provider.utils.asciiToHex(baseCurrency) + ]; logger.info("Deploying contract: "+contractName); @@ -94,7 +139,21 @@ async function performer(argv) { logger.info(contractDeployTxReceipt); logger.win(contractName+ " Deployed "); - await deployHelper.updateEnvContractAddress('contractPricer', {'ost_pricer_contract_address': contractDeployTxReceipt.contractAddress}); + const contractAddress = contractDeployTxReceipt.receipt.contractAddress; + logger.win(contractName+ " Contract Address: "+contractAddress); + + logger.info("Setting Ops Address to: " + opsAddress); + var opsManaged = new OpsManagedContract(contractAddress, gasPrice); + var result = await opsManaged.setOpsAddress(deployerName, opsAddress, deploymentOptions); + logger.info(result); + var contractOpsAddress = await opsManaged.getOpsAddress(); + logger.info("Ops Address Set to: " + contractOpsAddress); + + // if (isTravisCIEnabled) { + // await deployHelper.updateEnvContractAddress('contractPricer', {'ost_pricer_contract_address': contractDeployTxReceipt.contractAddress}); + // } + + deployHelper.writeContractAddressToFile(fileForContractAddress, contractAddress); } performer(process.argv); From 2fdcfbc3550ea9067899ba794e4a6402ea64387d Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 6 Feb 2018 20:53:03 +0530 Subject: [PATCH 016/242] Modified ignore file --- .gitignore | 9 +++++++-- .../export TEST_COIN1_C5_ADDRESS='0xF1F58A5F5395ca8e2e | 10 ---------- 2 files changed, 7 insertions(+), 12 deletions(-) delete mode 100644 test/scripts/export TEST_COIN1_C5_ADDRESS='0xF1F58A5F5395ca8e2e diff --git a/.gitignore b/.gitignore index efbec54..37483c5 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,10 @@ contracts/abi/ # don't commit node_modules node_modules -test/sripts/poa-genesis.json -test/sripts/env_vars.sh \ No newline at end of file +test/scripts/env_vars.sh +test/scripts/ost-price-oracle/ +test/scripts/poa-genesis.json +test/scripts/pw +test/scripts/st-poa/ + +package-lock.json \ No newline at end of file diff --git a/test/scripts/export TEST_COIN1_C5_ADDRESS='0xF1F58A5F5395ca8e2e b/test/scripts/export TEST_COIN1_C5_ADDRESS='0xF1F58A5F5395ca8e2e deleted file mode 100644 index d0b3be8..0000000 --- a/test/scripts/export TEST_COIN1_C5_ADDRESS='0xF1F58A5F5395ca8e2e +++ /dev/null @@ -1,10 +0,0 @@ -export TEST_COIN1_C5_ADDRESS='0x667198309ac110BCD97CC6b15BC00afF6A294fE0' - -export TEST_COIN2_C2_ADDRESS='0x062e366aeb96266D6f3EdF0Db4a53A3D9FBE947E' - -export TEST_PRICER_C5_ADDRESS='0xB38f101E5d2d72a565d5CF337CB487361B3b0470' - -export TEST_PRICER_C2_ADDRESS='0x963Fb21452C7ad4B5804d73ad9962044BE74e5AB' - - -OST_PO_PRICE_ORACLES='{"OST":{"USD":"0x35682d9741074f88c48Eab7484Af30b840EfE6B5","EUR":"0x3E461eb0AB969aea07D07590c254a9E3B3a95418","INR":"0xC0681b4fcf2f1b6D7689Ef2aAA73AE2A1bE81286"},"ETH":{"USD":"0x9E6E741d9E2D7D8469909d9A35fDa61919CF1d06"}}' \ No newline at end of file From 6ac6eadea53613854b08fda09f57459a60aacf6d Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Tue, 6 Feb 2018 20:59:10 +0530 Subject: [PATCH 017/242] Undo test debug changes --- contracts/Pricer.sol | 12 ++++++------ test/scripts/travis_test.sh | 5 ++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/contracts/Pricer.sol b/contracts/Pricer.sol index 98a182c..935b48b 100644 --- a/contracts/Pricer.sol +++ b/contracts/Pricer.sol @@ -157,14 +157,14 @@ contract Pricer is OpsManaged, PricerInterface { returns (bool /* success */) { require(_oracleAddress != address(0)); - // require(_currency != ""); - // require(PriceOracleInterface(_oracleAddress).baseCurrency() == pricerBaseCurrency); - // require(PriceOracleInterface(_oracleAddress).quoteCurrency() == _currency); - // require(PriceOracleInterface(_oracleAddress).decimals() == pricerDecimals); - // pricerPriceOracles[_currency] = PriceOracleInterface(_oracleAddress); + require(_currency != ""); + require(PriceOracleInterface(_oracleAddress).baseCurrency() == pricerBaseCurrency); + require(PriceOracleInterface(_oracleAddress).quoteCurrency() == _currency); + require(PriceOracleInterface(_oracleAddress).decimals() == pricerDecimals); + pricerPriceOracles[_currency] = PriceOracleInterface(_oracleAddress); //Trigger PriceOracleSet event - // PriceOracleSet(_currency, _oracleAddress); + PriceOracleSet(_currency, _oracleAddress); return true; } diff --git a/test/scripts/travis_test.sh b/test/scripts/travis_test.sh index fca2039..8615e64 100644 --- a/test/scripts/travis_test.sh +++ b/test/scripts/travis_test.sh @@ -1,2 +1,5 @@ +sh contracts/compile.sh +cd /test/scripts sh start_test_chain.sh -sh deploy_all.sh \ No newline at end of file +sh deploy_all.sh +./../../node_modules/mocha/bin/mocha ./../../test/services/pricer \ No newline at end of file From b6738cc805359b0ed2adfbdc4a900f2293488f92 Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Tue, 6 Feb 2018 13:22:19 +0100 Subject: [PATCH 018/242] Tests: Pricer construction, properties, and limited setPriceOracle. Relates to #12 --- contracts/ost-price-oracle/PriceOracle.sol | 175 +++++++++++++++++++++ test/Pricer.js | 89 +++++++++++ test/Pricer_utils.js | 48 ++++++ 3 files changed, 312 insertions(+) create mode 100644 contracts/ost-price-oracle/PriceOracle.sol create mode 100644 test/Pricer.js create mode 100644 test/Pricer_utils.js diff --git a/contracts/ost-price-oracle/PriceOracle.sol b/contracts/ost-price-oracle/PriceOracle.sol new file mode 100644 index 0000000..52adb27 --- /dev/null +++ b/contracts/ost-price-oracle/PriceOracle.sol @@ -0,0 +1,175 @@ +pragma solidity ^0.4.17; + +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility Chain: PriceOracle +// +// http://www.simpletoken.org/ +// +// -------------------------- + +import "../OpsManaged.sol"; +import "./PriceOracleInterface.sol"; + + +/// @title PriceOracle - Accepts and exposes a price for a certain base currency in a certain quote currency. +contract PriceOracle is OpsManaged, PriceOracleInterface { + + /* + * Constants + */ + /// Block expiry duration private constant variable + // The constant value is set in block numbers which is equivalent number of blocks estimated in hours. + uint256 private constant PRICE_VALIDITY_DURATION = 18000; // 25 hours at 5 seconds per block + + /// Use this variable in case decimal value need to be evaluated + uint8 private constant TOKEN_DECIMALS = 18; + + + /* + * Storage + */ + /// Private variable price + uint256 private price; + /// blockheight at which the price expires + uint256 private oracleExpirationHeight; + /// specifies the base currency value e.g. "OST" + bytes3 private oracleBaseCurrency; + /// specifies the quote Currency value "USD", "EUR", "ETH", "BTC" + bytes3 private oracleQuoteCurrency; + + /* + * Public functions + */ + /// @dev constructor function + /// @param _baseCurrency baseCurrency + /// @param _quoteCurrency quoteCurrency + function PriceOracle( + bytes3 _baseCurrency, + bytes3 _quoteCurrency + ) + public + OpsManaged() + { + // base Currency and quote Currency should not be same + require(_baseCurrency != _quoteCurrency); + // Initialize quote currency + oracleQuoteCurrency = _quoteCurrency; + // Initialize base currency + oracleBaseCurrency = _baseCurrency; + } + + /// @dev use this method to set price + /// @param _price price + /// @return expirationHeight + function setPrice( + uint256 _price) + external + onlyOps + returns( + uint256 /* expirationHeight */) + { + // Validate if _price is greater than 0 + require(_price > 0); + + // Assign the new value + price = _price; + + // update the expiration height + oracleExpirationHeight = block.number + PRICE_VALIDITY_DURATION; + + // Event Emitted + PriceUpdated(_price, oracleExpirationHeight); + + // Return + return (oracleExpirationHeight); + } + + /// @dev use this function to get quoteCurrency/baseCurrency value + /// @return price (Return 0 in case price expired so that call of this method can handle the error case) + function getPrice() + public + returns ( + uint256 /* price */ ) + { + // Current Block Number should be less than expiration height + // Emit an event if Price has expired + if (block.number > oracleExpirationHeight) { + // Emit invalid price event + PriceExpired(oracleExpirationHeight); + + return (0); + } + + // Return current price + return (price); + } + + /// @dev use this function to get token decimals value + /// @return TOKEN_DECIMALS + function decimals() + public + view + returns( + uint8 /* token decimals */) + { + return TOKEN_DECIMALS; + } + + /// @dev use this function to get price validity duration + /// @return price validity duration + function priceValidityDuration() + public + view + returns( + uint256 /* price validity duration */) + { + return PRICE_VALIDITY_DURATION; + } + + /// @dev block height at which the price expires + /// @return oracleExpirationHeight + function expirationHeight() + public + view + returns( + uint256 /* oracleExpirationHeight */) + { + return oracleExpirationHeight; + } + + /// @dev get baseCurrency bytes3 code + /// @return baseCurrency + function baseCurrency() + public + view + returns( + bytes3 /* oracleBaseCurrency */) + { + return oracleBaseCurrency; + } + + /// @dev returns quoteCurrency bytes3 code + /// @return quoteCurrency + function quoteCurrency() + public + view + returns( + bytes3 /* oracleQuoteCurrency */) + { + return oracleQuoteCurrency; + } +} diff --git a/test/Pricer.js b/test/Pricer.js new file mode 100644 index 0000000..7da40e0 --- /dev/null +++ b/test/Pricer.js @@ -0,0 +1,89 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Utils = require('./lib/utils.js'); +const Pricer_utils = require('./Pricer_utils.js'); +const Pricer = artifacts.require('./Pricer.sol'); +const BigNumber = require('bignumber.js'); + +/// +/// Test stories +/// +/// Construction +/// fails to deploy if baseCurrency matches quoteCurrency +/// +/// Properties +/// has decimals +/// has priceValidityDuration +/// has baseCurrency +/// has quoteCurrency + + +contract('Pricer', function(accounts) { + const baseCurrency = 'OST', + usdCurrency = 'USD', + eurCurrency = 'EUR', + TOKEN_DECIMALS = 18, + opsAddress = accounts[1]; + + var result = null; + + describe ('Construction', async () => { + it('fails to deploy if UUID is bad', async () => { + assert.ok(false); + }); + + }); + + describe('Properties', async () => { + + before(async () => { + contracts = await Pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + }); + + it('has decimals', async () => { + assert.equal((await pricer.decimals.call()).toNumber(), TOKEN_DECIMALS); + }); + + it('has baseCurrency', async () => { + assert.equal(web3.toAscii(await pricer.baseCurrency.call()), baseCurrency); + }); + + }); + + describe('setPriceOracle', async () => { + before(async () => { + contracts = await Pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + usdPriceOracle = contracts.usdPriceOracle; + eurPriceOracle = contracts.eurPriceOracle; + }); + + it('successfully sets priceOracles', async () => { + assert.ok(await pricer.setPriceOracle.call(usdCurrency, usdPriceOracle.address, { from: opsAddress })); + result = await pricer.setPriceOracle(usdCurrency, usdPriceOracle.address, { from: opsAddress }); + assert.equal(await pricer.priceOracles.call(usdCurrency), usdPriceOracle.address); + }); + + }); + +}); diff --git a/test/Pricer_utils.js b/test/Pricer_utils.js new file mode 100644 index 0000000..04f2387 --- /dev/null +++ b/test/Pricer_utils.js @@ -0,0 +1,48 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + + +const Pricer = artifacts.require('./Pricer.sol'), + EIP20TokenMock = artifacts.require('./EIP20TokenMock.sol'), + PriceOracle = artifacts.require('./ost-price-oracle/PriceOracle.sol'); + +/// @dev Deploy +module.exports.deployPricer = async (artifacts, accounts) => { + const baseCurrency = 'OST', + usdCurrency = 'USD', + eurCurrency = 'EUR', + token = await EIP20TokenMock.new(1, baseCurrency, 'name', 18), + TOKEN_DECIMALS = 18, + opsAddress = accounts[1], + pricer = await Pricer.new(token.address, baseCurrency), + usdPriceOracle = await PriceOracle.new(baseCurrency, usdCurrency), + eurPriceOracle = await PriceOracle.new(baseCurrency, eurCurrency); + + assert.ok(await pricer.setOpsAddress(opsAddress)); + assert.ok(await usdPriceOracle.setOpsAddress(opsAddress)); + assert.ok(await eurPriceOracle.setOpsAddress(opsAddress)); + + return { + pricer : pricer, + usdPriceOracle : usdPriceOracle, + eurPriceOracle : eurPriceOracle + }; +}; From 6e7f877523bf3170131d7e6bcf07702e5a312da9 Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Tue, 6 Feb 2018 18:41:13 +0100 Subject: [PATCH 019/242] Tests: Pricer reorganization/refactor for modularity. Relates to #12 --- test/Pricer.js | 73 +++++---------------------------- test/Pricer_constructor.js | 53 ++++++++++++++++++++++++ test/Pricer_properties.js | 45 ++++++++++++++++++++ test/Pricer_set_price_oracle.js | 52 +++++++++++++++++++++++ test/Pricer_utils.js | 33 ++++++++++----- 5 files changed, 183 insertions(+), 73 deletions(-) create mode 100644 test/Pricer_constructor.js create mode 100644 test/Pricer_properties.js create mode 100644 test/Pricer_set_price_oracle.js diff --git a/test/Pricer.js b/test/Pricer.js index 7da40e0..e9d8243 100644 --- a/test/Pricer.js +++ b/test/Pricer.js @@ -19,71 +19,18 @@ // // ---------------------------------------------------------------------------- -const Utils = require('./lib/utils.js'); -const Pricer_utils = require('./Pricer_utils.js'); -const Pricer = artifacts.require('./Pricer.sol'); -const BigNumber = require('bignumber.js'); - -/// -/// Test stories -/// -/// Construction -/// fails to deploy if baseCurrency matches quoteCurrency -/// -/// Properties -/// has decimals -/// has priceValidityDuration -/// has baseCurrency -/// has quoteCurrency - +const Pricer_utils = require('./Pricer_utils.js'), + Pricer_constructor = require('./Pricer_constructor.js'), + Pricer_properties = require('./Pricer_properties.js'), + Pricer_set_price_oracle = require('./Pricer_set_price_oracle.js'); contract('Pricer', function(accounts) { - const baseCurrency = 'OST', - usdCurrency = 'USD', - eurCurrency = 'EUR', - TOKEN_DECIMALS = 18, - opsAddress = accounts[1]; - - var result = null; - - describe ('Construction', async () => { - it('fails to deploy if UUID is bad', async () => { - assert.ok(false); - }); + describe('Constructor', async () => Pricer_constructor.perform()); + describe('Properties', async () => Pricer_properties.perform(accounts)); + describe('SetPriceOracle', async () => Pricer_set_price_oracle.perform(accounts)); + after(async () => { + Pricer_utils.utils.printGasStatistics(); + Pricer_utils.utils.clearReceipts(); }); - - describe('Properties', async () => { - - before(async () => { - contracts = await Pricer_utils.deployPricer(artifacts, accounts); - pricer = contracts.pricer; - }); - - it('has decimals', async () => { - assert.equal((await pricer.decimals.call()).toNumber(), TOKEN_DECIMALS); - }); - - it('has baseCurrency', async () => { - assert.equal(web3.toAscii(await pricer.baseCurrency.call()), baseCurrency); - }); - - }); - - describe('setPriceOracle', async () => { - before(async () => { - contracts = await Pricer_utils.deployPricer(artifacts, accounts); - pricer = contracts.pricer; - usdPriceOracle = contracts.usdPriceOracle; - eurPriceOracle = contracts.eurPriceOracle; - }); - - it('successfully sets priceOracles', async () => { - assert.ok(await pricer.setPriceOracle.call(usdCurrency, usdPriceOracle.address, { from: opsAddress })); - result = await pricer.setPriceOracle(usdCurrency, usdPriceOracle.address, { from: opsAddress }); - assert.equal(await pricer.priceOracles.call(usdCurrency), usdPriceOracle.address); - }); - - }); - }); diff --git a/test/Pricer_constructor.js b/test/Pricer_constructor.js new file mode 100644 index 0000000..93fd485 --- /dev/null +++ b/test/Pricer_constructor.js @@ -0,0 +1,53 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer_constructor.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Pricer_utils = require('./Pricer_utils.js'), + Pricer = artifacts.require('./Pricer.sol'), + EIP20TokenMock = artifacts.require('./EIP20TokenMock.sol'); + +/// +/// Test stories +/// +/// fails to deploy if brandedToken is null +/// fails to deploy if baseCurrency is empty +/// successfully deploys + +module.exports.perform = () => { + var token = null; + var response = null; + + before(async () => { + token = await EIP20TokenMock.new(1, Pricer_utils.currencies.ost, 'name', 18); + }); + + it('fails to deploy if brandedToken is null', async () => { + await Pricer_utils.utils.expectThrow(Pricer.new(0, Pricer_utils.currencies.ost)); + }); + + it('fails to deploy if baseCurrency is empty', async () => { + await Pricer_utils.utils.expectThrow(Pricer.new(token.address, '')); + }); + + it('successfully deploys', async () => { + response = await Pricer.new(token.address, Pricer_utils.currencies.ost); + Pricer_utils.utils.logTransaction(response.transactionHash, 'Pricer.constructor'); + }); +} diff --git a/test/Pricer_properties.js b/test/Pricer_properties.js new file mode 100644 index 0000000..b7611b6 --- /dev/null +++ b/test/Pricer_properties.js @@ -0,0 +1,45 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer_properties.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Pricer_utils = require('./Pricer_utils.js'); + +/// +/// Test stories +/// +/// has decimals +/// has baseCurrency + +module.exports.perform = (accounts) => { + const TOKEN_DECIMALS = 18; + + before(async () => { + contracts = await Pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + }); + + it('has decimals', async () => { + assert.equal((await pricer.decimals.call()).toNumber(), TOKEN_DECIMALS); + }); + + it('has baseCurrency', async () => { + assert.equal(web3.toAscii(await pricer.baseCurrency.call()), Pricer_utils.currencies.ost); + }); +} diff --git a/test/Pricer_set_price_oracle.js b/test/Pricer_set_price_oracle.js new file mode 100644 index 0000000..e89e398 --- /dev/null +++ b/test/Pricer_set_price_oracle.js @@ -0,0 +1,52 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer_properties.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Pricer_utils = require('./Pricer_utils.js'); + +/// +/// Test stories +/// +/// successfully sets priceOracles + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1]; + + var response = null; + + before(async () => { + contracts = await Pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + usdPriceOracle = contracts.usdPriceOracle; + eurPriceOracle = contracts.eurPriceOracle; + }); + + it('successfully sets priceOracles', async () => { + assert.ok(await pricer.setPriceOracle.call(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress })); + response = await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.usd), usdPriceOracle.address); + Pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + Pricer_utils.currencies.usd); + + assert.ok(await pricer.setPriceOracle.call(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress })); + response = await pricer.setPriceOracle(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); + assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.eur), eurPriceOracle.address); + Pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + Pricer_utils.currencies.eur); + }); +} \ No newline at end of file diff --git a/test/Pricer_utils.js b/test/Pricer_utils.js index 04f2387..955d3a2 100644 --- a/test/Pricer_utils.js +++ b/test/Pricer_utils.js @@ -19,22 +19,35 @@ // // ---------------------------------------------------------------------------- - -const Pricer = artifacts.require('./Pricer.sol'), +const Utils = require('./lib/utils.js'), + BigNumber = require('bignumber.js'), + Pricer = artifacts.require('./Pricer.sol'), EIP20TokenMock = artifacts.require('./EIP20TokenMock.sol'), - PriceOracle = artifacts.require('./ost-price-oracle/PriceOracle.sol'); + PriceOracle = artifacts.require('./ost-price-oracle/PriceOracle.sol'); + +const ost = 'OST', + usd = 'USD', + eur = 'EUR'; + +/// @dev Export common requires +module.exports.utils = Utils; +module.exports.bigNumber = BigNumber; + +/// @dev Export constants +module.exports.currencies = { + ost : ost, + usd : usd, + eur : eur +} /// @dev Deploy module.exports.deployPricer = async (artifacts, accounts) => { - const baseCurrency = 'OST', - usdCurrency = 'USD', - eurCurrency = 'EUR', - token = await EIP20TokenMock.new(1, baseCurrency, 'name', 18), + const token = await EIP20TokenMock.new(1, ost, 'name', 18), TOKEN_DECIMALS = 18, opsAddress = accounts[1], - pricer = await Pricer.new(token.address, baseCurrency), - usdPriceOracle = await PriceOracle.new(baseCurrency, usdCurrency), - eurPriceOracle = await PriceOracle.new(baseCurrency, eurCurrency); + pricer = await Pricer.new(token.address, ost), + usdPriceOracle = await PriceOracle.new(ost, usd), + eurPriceOracle = await PriceOracle.new(ost, eur); assert.ok(await pricer.setOpsAddress(opsAddress)); assert.ok(await usdPriceOracle.setOpsAddress(opsAddress)); From 2a771f5e303f9014fe9a79920ce78eb590cc53b7 Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Tue, 6 Feb 2018 19:24:17 +0100 Subject: [PATCH 020/242] Tests: Pricer additional properties and complete setPriceOracle cases. Relates to #12 --- test/Pricer_properties.js | 22 +++++++++++++----- test/Pricer_set_price_oracle.js | 40 +++++++++++++++++++++++++++++++-- test/Pricer_utils.js | 3 ++- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/test/Pricer_properties.js b/test/Pricer_properties.js index b7611b6..09b1b3c 100644 --- a/test/Pricer_properties.js +++ b/test/Pricer_properties.js @@ -23,23 +23,35 @@ const Pricer_utils = require('./Pricer_utils.js'); /// /// Test stories -/// -/// has decimals +/// +/// has brandedToken /// has baseCurrency +/// has decimals +/// has conversionRate module.exports.perform = (accounts) => { - const TOKEN_DECIMALS = 18; + const TOKEN_DECIMALS = 18, + conversionRate = 1; before(async () => { contracts = await Pricer_utils.deployPricer(artifacts, accounts); + token = contracts.token; pricer = contracts.pricer; }); - it('has decimals', async () => { - assert.equal((await pricer.decimals.call()).toNumber(), TOKEN_DECIMALS); + it('has brandedToken', async () => { + assert.equal(await pricer.brandedToken.call(), token.address); }); it('has baseCurrency', async () => { assert.equal(web3.toAscii(await pricer.baseCurrency.call()), Pricer_utils.currencies.ost); }); + + it('has decimals', async () => { + assert.equal((await pricer.decimals.call()).toNumber(), TOKEN_DECIMALS); + }); + + it('has conversionRate', async () => { + assert.equal((await pricer.conversionRate.call()).toNumber(), conversionRate); + }); } diff --git a/test/Pricer_set_price_oracle.js b/test/Pricer_set_price_oracle.js index e89e398..9634d83 100644 --- a/test/Pricer_set_price_oracle.js +++ b/test/Pricer_set_price_oracle.js @@ -13,17 +13,23 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_properties.js +// Test: Pricer_set_price_oracle.js // // http://www.simpletoken.org/ // // ---------------------------------------------------------------------------- const Pricer_utils = require('./Pricer_utils.js'); +const PriceOracle = artifacts.require('./PriceOracle.sol'); /// /// Test stories /// +/// fails to set priceOracle by non-ops +/// fails to set priceOracle if oracleAddress is null +/// fails to set priceOracle if currency is empty +/// fails to set priceOracle if oracle baseCurrency does not match pricer baseCurrency +/// fails to set priceOracle if oracle quoteCurrency does not match currency /// successfully sets priceOracles module.exports.perform = (accounts) => { @@ -38,15 +44,45 @@ module.exports.perform = (accounts) => { eurPriceOracle = contracts.eurPriceOracle; }); + it('fails to set priceOracle by non-ops', async () => { + await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(Pricer_utils.currencies.usd, usdPriceOracle.address)); + }); + + it('fails to set priceOracle if oracleAddress is null', async () => { + await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(Pricer_utils.currencies.usd, 0, { from: opsAddress })); + }); + + it('fails to set priceOracle if currency is empty', async () => { + await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call('', usdPriceOracle.address, { from: opsAddress })); + }); + + it('fails to set priceOracle if oracle baseCurrency does not match pricer baseCurrency', async () => { + var inappositeOracle = await PriceOracle.new(Pricer_utils.currencies.usd, Pricer_utils.currencies.ost); + await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call( + Pricer_utils.currencies.usd, inappositeOracle.address, { from: opsAddress })); + }); + + it('fails to set priceOracle if oracle quoteCurrency does not match currency', async () => { + await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(Pricer_utils.currencies.eur, usdPriceOracle.address)); + }); + it('successfully sets priceOracles', async () => { assert.ok(await pricer.setPriceOracle.call(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress })); response = await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.usd), usdPriceOracle.address); + checkPriceOracleSetEvent(response.logs[0], Pricer_utils.currencies.usd, usdPriceOracle.address); Pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + Pricer_utils.currencies.usd); assert.ok(await pricer.setPriceOracle.call(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress })); response = await pricer.setPriceOracle(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.eur), eurPriceOracle.address); + checkPriceOracleSetEvent(response.logs[0], Pricer_utils.currencies.eur, eurPriceOracle.address); Pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + Pricer_utils.currencies.eur); }); -} \ No newline at end of file +} + +function checkPriceOracleSetEvent(event, _currency, _address) { + assert.equal(event.event, 'PriceOracleSet'); + assert.equal(web3.toAscii(event.args._currency), _currency); + assert.equal(event.args._address, _address); +} diff --git a/test/Pricer_utils.js b/test/Pricer_utils.js index 955d3a2..6275ef2 100644 --- a/test/Pricer_utils.js +++ b/test/Pricer_utils.js @@ -54,7 +54,8 @@ module.exports.deployPricer = async (artifacts, accounts) => { assert.ok(await eurPriceOracle.setOpsAddress(opsAddress)); return { - pricer : pricer, + token : token, + pricer : pricer, usdPriceOracle : usdPriceOracle, eurPriceOracle : eurPriceOracle }; From fd5934feb39247efd383e9e691c273703c331d78 Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Wed, 7 Feb 2018 10:54:29 +0100 Subject: [PATCH 021/242] Tests: Pricer unsetPriceOracle. Relates to #12 --- test/Pricer.js | 2 + test/Pricer_unset_price_oracle.js | 68 +++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 test/Pricer_unset_price_oracle.js diff --git a/test/Pricer.js b/test/Pricer.js index e9d8243..8db7465 100644 --- a/test/Pricer.js +++ b/test/Pricer.js @@ -23,12 +23,14 @@ const Pricer_utils = require('./Pricer_utils.js'), Pricer_constructor = require('./Pricer_constructor.js'), Pricer_properties = require('./Pricer_properties.js'), Pricer_set_price_oracle = require('./Pricer_set_price_oracle.js'); + Pricer_unset_price_oracle = require('./Pricer_unset_price_oracle.js'); contract('Pricer', function(accounts) { describe('Constructor', async () => Pricer_constructor.perform()); describe('Properties', async () => Pricer_properties.perform(accounts)); describe('SetPriceOracle', async () => Pricer_set_price_oracle.perform(accounts)); + describe('UnsetPriceOracle', async () => Pricer_unset_price_oracle.perform(accounts)); after(async () => { Pricer_utils.utils.printGasStatistics(); Pricer_utils.utils.clearReceipts(); diff --git a/test/Pricer_unset_price_oracle.js b/test/Pricer_unset_price_oracle.js new file mode 100644 index 0000000..c8dab62 --- /dev/null +++ b/test/Pricer_unset_price_oracle.js @@ -0,0 +1,68 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer_unset_price_oracle.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Pricer_utils = require('./Pricer_utils.js'); + +/// +/// Test stories +/// +/// fails to unset priceOracle by non-ops +/// fails to unset priceOracle if not already set +/// successfully unsets priceOracle + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1]; + + var response = null; + + before(async () => { + contracts = await Pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + usdPriceOracle = contracts.usdPriceOracle; + eurPriceOracle = contracts.eurPriceOracle; + await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); + }); + + it('fails to set priceOracle by non-ops', async () => { + await Pricer_utils.utils.expectThrow(pricer.unsetPriceOracle.call(Pricer_utils.currencies.usd)); + }); + + it('successfully unsets priceOracle', async () => { + assert.ok(await pricer.unsetPriceOracle.call(Pricer_utils.currencies.usd, { from: opsAddress })); + response = await pricer.unsetPriceOracle(Pricer_utils.currencies.usd, { from: opsAddress }); + assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.usd), 0); + checkPriceOracleUnsetEvent(response.logs[0], Pricer_utils.currencies.usd); + Pricer_utils.utils.logResponse(response, 'Pricer.unsetPriceOracle: ' + Pricer_utils.currencies.usd); + + // confirm EUR priceOracle unaffected + assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.eur), eurPriceOracle.address); + }); + + it('fails to unset priceOracle if not already set', async () => { + await Pricer_utils.utils.expectThrow(pricer.unsetPriceOracle.call(Pricer_utils.currencies.usd, { from: opsAddress })); + }); +} + +function checkPriceOracleUnsetEvent(event, _currency) { + assert.equal(event.event, 'PriceOracleUnset'); + assert.equal(web3.toAscii(event.args._currency), _currency); +} From 25ed3c35d07a0beef4085c8156340f38456bdb4a Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Wed, 7 Feb 2018 12:29:02 +0100 Subject: [PATCH 022/242] Tests: Pricer setAcceptedMargin. Relates to #12 --- test/Pricer.js | 12 +++-- test/Pricer_set_accepted_margin.js | 78 ++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 test/Pricer_set_accepted_margin.js diff --git a/test/Pricer.js b/test/Pricer.js index 8db7465..f99ab97 100644 --- a/test/Pricer.js +++ b/test/Pricer.js @@ -19,11 +19,12 @@ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'), - Pricer_constructor = require('./Pricer_constructor.js'), - Pricer_properties = require('./Pricer_properties.js'), - Pricer_set_price_oracle = require('./Pricer_set_price_oracle.js'); - Pricer_unset_price_oracle = require('./Pricer_unset_price_oracle.js'); +const Pricer_utils = require('./Pricer_utils.js'), + Pricer_constructor = require('./Pricer_constructor.js'), + Pricer_properties = require('./Pricer_properties.js'), + Pricer_set_price_oracle = require('./Pricer_set_price_oracle.js'), + Pricer_unset_price_oracle = require('./Pricer_unset_price_oracle.js'), + Pricer_set_accepted_margin = require('./Pricer_set_accepted_margin.js'); contract('Pricer', function(accounts) { @@ -31,6 +32,7 @@ contract('Pricer', function(accounts) { describe('Properties', async () => Pricer_properties.perform(accounts)); describe('SetPriceOracle', async () => Pricer_set_price_oracle.perform(accounts)); describe('UnsetPriceOracle', async () => Pricer_unset_price_oracle.perform(accounts)); + describe('SetAcceptedMargin', async () => Pricer_set_accepted_margin.perform(accounts)); after(async () => { Pricer_utils.utils.printGasStatistics(); Pricer_utils.utils.clearReceipts(); diff --git a/test/Pricer_set_accepted_margin.js b/test/Pricer_set_accepted_margin.js new file mode 100644 index 0000000..6e5af56 --- /dev/null +++ b/test/Pricer_set_accepted_margin.js @@ -0,0 +1,78 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer_set_accepted_margin.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Pricer_utils = require('./Pricer_utils.js'); + +/// +/// Test stories +/// +/// fails to set acceptedMargin by non-ops +/// successfully sets acceptedMargin + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1]; + + var response = null; + var acceptedMargin = null; + + before(async () => { + contracts = await Pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + usdPriceOracle = contracts.usdPriceOracle; + eurPriceOracle = contracts.eurPriceOracle; + await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + }); + + it('fails to set acceptedMargin by non-ops', async () => { + acceptedMargin = 1; + await Pricer_utils.utils.expectThrow(pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin)); + }); + + it('successfully sets acceptedMargin', async () => { + // Sets accepted margin multiple times to show range of gas usages + acceptedMargin = new Pricer_utils.bigNumber(0); + assert.ok(await pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); + response = await pricer.setAcceptedMargin(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); + assert.equal((await pricer.acceptedMargins.call(Pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); + checkAcceptedMarginSetEvent(response.logs[0], Pricer_utils.currencies.usd, acceptedMargin); + Pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); + + acceptedMargin = new Pricer_utils.bigNumber(1); + assert.ok(await pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); + response = await pricer.setAcceptedMargin(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); + assert.equal((await pricer.acceptedMargins.call(Pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); + checkAcceptedMarginSetEvent(response.logs[0], Pricer_utils.currencies.usd, acceptedMargin); + Pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); + + acceptedMargin = new Pricer_utils.bigNumber(7.778 * 10**18); + assert.ok(await pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); + response = await pricer.setAcceptedMargin(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); + assert.equal((await pricer.acceptedMargins.call(Pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); + checkAcceptedMarginSetEvent(response.logs[0], Pricer_utils.currencies.usd, acceptedMargin); + Pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); + }); +} + +function checkAcceptedMarginSetEvent(event, _currency, _acceptedMargin) { + assert.equal(event.event, 'AcceptedMarginSet'); + assert.equal(web3.toAscii(event.args._currency), _currency); + assert.equal(event.args._acceptedMargin.toNumber(), _acceptedMargin); +} From b360e5c43a9bd9e051de22d05d86717ea9da41cb Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 7 Feb 2018 20:11:20 +0530 Subject: [PATCH 023/242] Test: Mocha tests --- contracts/Pricer.sol | 3 +- lib/contract_interact/EIP20TokenMock.js | 126 +++ lib/contract_interact/pricer.js | 135 ++- test/scripts/deploy_all.sh | 33 + test/scripts/deploy_price_oracle.sh | 3 +- test/scripts/run_chain.sh | 2 +- test/scripts/travis_test.sh | 3 +- test/services/pricer/constants.js | 15 +- .../get_pricepoint_and_calculated_amounts.js | 117 ++- test/services/pricer/pay.js | 873 +++++++++++++++--- test/services/pricer/set_accepted_margin.js | 177 +++- test/services/pricer/set_price_oracle.js | 210 +++-- test/services/pricer/unset_price_oracle.js | 160 +++- 13 files changed, 1480 insertions(+), 377 deletions(-) create mode 100644 lib/contract_interact/EIP20TokenMock.js diff --git a/contracts/Pricer.sol b/contracts/Pricer.sol index 935b48b..fdd68eb 100644 --- a/contracts/Pricer.sol +++ b/contracts/Pricer.sol @@ -153,7 +153,8 @@ contract Pricer is OpsManaged, PricerInterface { function setPriceOracle( bytes3 _currency, address _oracleAddress) - public + public + onlyOps returns (bool /* success */) { require(_oracleAddress != address(0)); diff --git a/lib/contract_interact/EIP20TokenMock.js b/lib/contract_interact/EIP20TokenMock.js new file mode 100644 index 0000000..e311553 --- /dev/null +++ b/lib/contract_interact/EIP20TokenMock.js @@ -0,0 +1,126 @@ +//"use strict"; + +/** + * + * This is a utility file which would be used for executing all methods on Pricer contract.

+ * + * @module lib/contract_interact/pricer + * + */ +const rootPrefix = '../..'; +const helper = require(rootPrefix + '/lib/contract_interact/helper'); +const coreAddresses = require(rootPrefix + '/config/core_addresses'); +const web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc'); +const coreConstants = require(rootPrefix + '/config/core_constants'); +const contractName = 'eip20tokenmock'; +const contractAbi = coreAddresses.getAbiForContract(contractName); +const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; +const currContract = new web3RpcProvider.eth.Contract(contractAbi); + + +/** + * @constructor + * + */ +const MockToken = module.exports = function (mockTokenAddress) { + this.contractAddress = mockTokenAddress; +}; + +MockToken.prototype = { + + /** + * Get balance of address + * + * @return {Promise} + * + */ + balanceOf: async function (ownerAddress) { + const transactionObject = currContract.methods.balanceOf(ownerAddress); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + + /** + * Set balance + * + * @return {Promise} + * + */ + setBalance: function (senderAddress, senderPassphrase, ownerAddress, value, gasPrice) { + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { + return Promise.reject('GasPrice is mandatory'); + } + helper.assertAddress(ownerAddress); + helper.assertAddress(senderAddress); + + currContract.options.address = this.contractAddress; + currContract.setProvider( web3RpcProvider.currentProvider ); + const transactionObject = currContract.methods.setBalance(ownerAddress, value); + const encodedABI = transactionObject.encodeABI(); + return helper.safeSendFromAddr( + web3RpcProvider, + this.contractAddress, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: gasPrice, gas: GAS_LIMIT } + ).then(function(transactionReceipt) { + return Promise.resolve(transactionReceipt); + }); + }, + + /** + * Set balance + * + * @return {Promise} + * + */ + setConversionRate: function (senderAddress, senderPassphrase, conversionRate, gasPrice) { + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { + return Promise.reject('GasPrice is mandatory'); + } + helper.assertAddress(senderAddress); + + currContract.options.address = this.contractAddress; + currContract.setProvider( web3RpcProvider.currentProvider ); + const transactionObject = currContract.methods.setConverionRate(conversionRate); + const encodedABI = transactionObject.encodeABI(); + return helper.safeSendFromAddr( + web3RpcProvider, + this.contractAddress, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: gasPrice, gas: GAS_LIMIT } + ).then(function(transactionReceipt) { + return Promise.resolve(transactionReceipt); + }); + }, + + approve: function (senderAddress, senderPassphrase, spenderAddress, value, gasPrice) { + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { + return Promise.reject('GasPrice is mandatory'); + } + helper.assertAddress(senderAddress); + helper.assertAddress(spenderAddress); + + currContract.options.address = this.contractAddress; + currContract.setProvider( web3RpcProvider.currentProvider ); + const transactionObject = currContract.methods.approve(spenderAddress, value); + const encodedABI = transactionObject.encodeABI(); + return helper.safeSendFromAddr( + web3RpcProvider, + this.contractAddress, + encodedABI, + senderAddress, + senderPassphrase, + { gasPrice: gasPrice, gas: GAS_LIMIT } + ).then(function(transactionReceipt) { + return Promise.resolve(transactionReceipt); + }); + } + +}; + diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index 8b58be7..3cd684b 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -16,7 +16,7 @@ const contractName = 'pricer'; const contractAbi = coreAddresses.getAbiForContract(contractName); const GAS_PRICE = coreConstants.OST_GAS_PRICE; const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; -const currContract = new web3RpcProvider.eth.Contract(contractAbi);; +const currContract = new web3RpcProvider.eth.Contract(contractAbi); const logger = require(rootPrefix + '/helpers/custom_console_logger'); const responseHelper = require(rootPrefix + '/lib/formatter/response'); @@ -52,7 +52,7 @@ Pricer.prototype = { * */ acceptedMargins: async function (currency) { - const transactionObject = currContract.methods.acceptedMargins(currency); + const transactionObject = currContract.methods.acceptedMargins(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); @@ -101,6 +101,20 @@ Pricer.prototype = { return Promise.resolve(response[0]); }, + /** + * Get conversion rate of pricer + * + * @return {Promise} + * + */ + conversionRate: async function () { + const transactionObject = currContract.methods.conversionRate(); + const encodedABI = transactionObject.encodeABI(); + const transactionOutputs = helper.getTransactionOutputs(transactionObject); + const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + return Promise.resolve(response[0]); + }, + /** * Updates the price oracle address for a given currency @@ -108,24 +122,23 @@ Pricer.prototype = { * @return {Promise} * */ - setPriceOracle: async function (senderAddress, senderPassphrase, currency, address, gasPrice) { + setPriceOracle: function (senderAddress, senderPassphrase, currency, address, gasPrice) { + if (currency === undefined || currency === '') { + return Promise.reject('Currency is mandatory'); + } + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { + return Promise.reject('GasPrice is mandatory'); + } + helper.assertAddress(address); + helper.assertAddress(senderAddress); currContract.options.address = this.contractAddress; currContract.setProvider( web3RpcProvider.currentProvider ); - - console.log(this.contractAddress); - console.log(senderAddress); - console.log(senderPassphrase); - console.log(currency); - console.log(address); - console.log(gasPrice); - console.log({ gasPrice: gasPrice, gas: GAS_LIMIT }); - const transactionObject = currContract.methods.setPriceOracle(web3RpcProvider.utils.asciiToHex(currency), address); const encodedABI = transactionObject.encodeABI(); return helper.safeSendFromAddr( web3RpcProvider, - this.contractAddr, + this.contractAddress, encodedABI, senderAddress, senderPassphrase, @@ -141,18 +154,29 @@ Pricer.prototype = { * @return {Promise} * */ - unsetPriceOracle: async function (senderAddress, senderPassphrase, currency) { - const transactionObject = currContract.methods.unsetPriceOracle(currency); + unsetPriceOracle: function (senderAddress, senderPassphrase, currency, gasPrice) { + if (currency === undefined || currency === '') { + return Promise.reject('Currency is mandatory'); + } + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { + return Promise.reject('GasPrice is mandatory'); + } + helper.assertAddress(senderAddress); + + currContract.options.address = this.contractAddress; + currContract.setProvider( web3RpcProvider.currentProvider ); + const transactionObject = currContract.methods.unsetPriceOracle(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); - const transactionReceipt = await helper.safeSendFromAddr( + return helper.safeSendFromAddr( web3RpcProvider, - this.contractAddr, + this.contractAddress, encodedABI, senderAddress, senderPassphrase, - { gasPrice: GAS_PRICE, gas: GAS_LIMIT } - ); - return Promise.resolve(transactionReceipt); + { gasPrice: gasPrice, gas: GAS_LIMIT } + ).then(function(transactionReceipt) { + return Promise.resolve(transactionReceipt); + }); }, /** @@ -161,18 +185,32 @@ Pricer.prototype = { * @return {Promise} * */ - setAcceptedMargin: async function (senderAddress, senderPassphrase, currency, acceptedMargin) { - const transactionObject = currContract.methods.setAcceptedMargin(currency, acceptedMargin); + setAcceptedMargin: function (senderAddress, senderPassphrase, currency, acceptedMargin, gasPrice) { + if (currency === undefined || currency === '') { + return Promise.reject('Currency is mandatory'); + } + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { + return Promise.reject('GasPrice is mandatory'); + } + if (acceptedMargin<0) { + return Promise.reject('Accepted margin cannot be negetive'); + } + helper.assertAddress(senderAddress); + + //TODO: Convert accepted margin to wei as per token decimal + + const transactionObject = currContract.methods.setAcceptedMargin(web3RpcProvider.utils.asciiToHex(currency), acceptedMargin); const encodedABI = transactionObject.encodeABI(); - const transactionReceipt = await helper.safeSendFromAddr( + return helper.safeSendFromAddr( web3RpcProvider, - this.contractAddr, + this.contractAddress, encodedABI, senderAddress, senderPassphrase, - { gasPrice: GAS_PRICE, gas: GAS_LIMIT } - ); - return Promise.resolve(transactionReceipt); + { gasPrice: gasPrice, gas: GAS_LIMIT } + ).then(function(transactionReceipt) { + return Promise.resolve(transactionReceipt); + }); }, @@ -190,25 +228,43 @@ Pricer.prototype = { commissionBeneficiaryAddress, commissionAmount, currency, - intendedPricePoint) { + intendedPricePoint, + gasPrice) { + + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { + return Promise.reject('GasPrice is mandatory'); + } + if (transferAmount < 0) { + return Promise.reject('Transfer amount cannot be negetive'); + } + if (commissionAmount < 0) { + return Promise.reject('Commission amount cannot be negetive'); + } + helper.assertAddress(senderAddress); + if (transferAmount > 0 || (beneficiaryAddress !== undefined && beneficiaryAddress !== '')) { + helper.assertAddress(beneficiaryAddress); + } + if (commissionAmount > 0 || (commissionBeneficiaryAddress !== undefined && commissionBeneficiaryAddress !== '')) { + helper.assertAddress(commissionBeneficiaryAddress); + } const transactionObject = currContract.methods.pay( beneficiaryAddress, transferAmount, commissionBeneficiaryAddress, commissionAmount, - currency, + web3RpcProvider.utils.asciiToHex(currency), intendedPricePoint); const encodedABI = transactionObject.encodeABI(); const transactionReceipt = await helper.safeSendFromAddr( web3RpcProvider, - this.contractAddr, + this.contractAddress, encodedABI, senderAddress, senderPassphrase, - { gasPrice: GAS_PRICE, gas: GAS_LIMIT } + { gasPrice: gasPrice, gas: GAS_LIMIT } ); return Promise.resolve(transactionReceipt); }, @@ -221,7 +277,10 @@ Pricer.prototype = { * */ getPricePoint: async function (currency) { - const transactionObject = currContract.methods.getPricePoint(currency); + if (currency === undefined || currency === '') { + return Promise.reject('Currency is mandatory'); + } + const transactionObject = currContract.methods.getPricePoint(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); @@ -234,10 +293,15 @@ Pricer.prototype = { * @return {Promise} * */ - getPricePointAndCalculatedAmounts: async function ( + getPricePointAndCalculatedAmounts: function ( transferAmount, commissionAmount, currency) { + + if (currency === undefined || currency === '') { + return Promise.reject('Currency is mandatory'); + } + const transactionObject = currContract.methods.getPricePointAndCalculatedAmounts(transferAmount, commissionAmount, web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); @@ -249,10 +313,10 @@ Pricer.prototype = { {}, transactionOutputs) .then(function (response) { - return Promise.resolve(responseHelper.successWithData(response)); + return Promise.resolve(response); }) .catch(function(err) { - return Promise.resolve(responseHelper.error('ci_gppaca_1', 'Something went wrong !!!')); + return Promise.reject(err); }); }, @@ -262,5 +326,6 @@ Pricer.prototype = { toWei: function(value) { return web3RpcProvider.utils.toWei(value, "ether"); } + }; diff --git a/test/scripts/deploy_all.sh b/test/scripts/deploy_all.sh index 9d6573f..d75a9bd 100644 --- a/test/scripts/deploy_all.sh +++ b/test/scripts/deploy_all.sh @@ -6,6 +6,7 @@ source scripts/env_vars.sh echo "\n********* Deploying test coin 1 *************" node ../tools/deploy/EIP20TokenMock.js 5 TC1 TestCoin1 18 0x12A05F200 travis tc1.txt export TEST_COIN1_C5_ADDRESS=$(cat ../tools/deploy/tc1.txt) +echo '\nexport TEST_COIN1_C5_ADDRESS='\'$TEST_COIN1_C5_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tc1.txt #TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" @@ -14,14 +15,28 @@ echo "\n********* Deploying test coin 2 *************" source scripts/env_vars.sh node ../tools/deploy/EIP20TokenMock.js 2 TC2 TestCoin2 18 0x12A05F200 travis tc2.txt export TEST_COIN2_C2_ADDRESS=$(cat ../tools/deploy/tc2.txt) +echo '\nexport TEST_COIN2_C2_ADDRESS='\'$TEST_COIN2_C2_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tc2.txt #TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" +echo "\n********* Deploying test coin 3 *************" +source scripts/env_vars.sh +node ../tools/deploy/EIP20TokenMock.js 3 TC3 TestCoin3 10 0x12A05F200 travis tc3.txt +export TEST_COIN2_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) +echo '\nexport TEST_COIN2_C3_ADDRESS='\'$TEST_COIN2_C3_ADDRESS\'>>scripts/env_vars.sh +rm ../tools/deploy/tc3.txt +#TO_DO: Write this to scripts/env_vars.sh +echo "\n********* Done *************" + + + + echo "\n********* Deploying Pricer 1 *************" source scripts/env_vars.sh node ../tools/deploy/pricer.js $TEST_COIN1_C5_ADDRESS OST 0x12A05F200 travis tp1.txt export TEST_PRICER_C5_ADDRESS=$(cat ../tools/deploy/tp1.txt) +echo '\nexport TEST_PRICER_C5_ADDRESS='\'$TEST_PRICER_C5_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tp1.txt #TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" @@ -30,10 +45,20 @@ echo "\n********* Deploying Pricer 2 *************" source scripts/env_vars.sh node ../tools/deploy/pricer.js $TEST_COIN2_C2_ADDRESS OST 0x12A05F200 travis tp2.txt export TEST_PRICER_C2_ADDRESS=$(cat ../tools/deploy/tp2.txt) +echo '\nexport TEST_PRICER_C2_ADDRESS='\'$TEST_PRICER_C2_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tp2.txt #TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" +echo "\n********* Deploying Pricer 3 *************" +source scripts/env_vars.sh +node ../tools/deploy/pricer.js $TEST_COIN2_C3_ADDRESS OST 0x12A05F200 travis tp3.txt +export TEST_PRICER_C3_ADDRESS=$(cat ../tools/deploy/tp3.txt) +echo '\nexport TEST_PRICER_C3_ADDRESS='\'$TEST_PRICER_C3_ADDRESS\'>>scripts/env_vars.sh +rm ../tools/deploy/tp3.txt +#TO_DO: Write this to scripts/env_vars.sh +echo "\n********* Done *************" + echo "\n********* Setting env variables *************" source scripts/env_vars.sh @@ -46,6 +71,14 @@ export OST_PO_OPS_ADDR=$OST_PRICER_OPS_ADDR export OST_PO_OPS_PASSPHRASE=$OST_PRICER_OPS_PASSPHRASE export OST_PO_PRICE_ORACLES='{}' +echo '\nexport OST_PO_GETH_RPC_PROVIDER='\'$OST_PO_GETH_RPC_PROVIDER\'>>env_vars.sh +echo '\nexport OST_PO_DEPLOYER_ADDR='\'$OST_PO_DEPLOYER_ADDR\'>>env_vars.sh +echo '\nexport OST_PO_DEPLOYER_PASSPHRASE='\'$OST_PO_DEPLOYER_PASSPHRASE\'>>env_vars.sh +echo '\nexport OST_PO_OPS_ADDR='\'$OST_PO_OPS_ADDR\'>>env_vars.sh +echo '\nexport OST_PO_OPS_PASSPHRASE='\'$OST_PO_OPS_PASSPHRASE\'>>env_vars.sh +echo '\nexport OST_PO_PRICE_ORACLES='\'$OST_PO_PRICE_ORACLES\'>>env_vars.sh + + echo "\n********* Done *************" sh deploy_price_oracle.sh diff --git a/test/scripts/deploy_price_oracle.sh b/test/scripts/deploy_price_oracle.sh index 817cf28..ce608cc 100644 --- a/test/scripts/deploy_price_oracle.sh +++ b/test/scripts/deploy_price_oracle.sh @@ -32,7 +32,8 @@ echo "\n********* Deploying PO 4 *************" node ./ost-price-oracle/tools/deploy/price_oracle.js ETH USD 0x12A05F200 travis po4.txt echo "\n********* Done *************" -export OST_PO_PRICE_ORACLES="{\"OST\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po1.txt)\",\"EUR\":\"$(cat ./ost-price-oracle/tools/deploy/po2.txt)\",\"INR\":\"$(cat ./ost-price-oracle/tools/deploy/po3.txt)\"}, \"ETH\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po4.txt)\"}}" +export OST_PO_PRICE_ORACLES="{\"OST\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po1.txt)\",\"EUR\":\"$(cat ./ost-price-oracle/tools/deploy/po2.txt)\",\"INR\":\"$(cat ./ost-price-oracle/tools/deploy/po3.txt)\"},\"ETH\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po4.txt)\"}}" +echo '\nexport OST_PO_PRICE_ORACLES='\'$OST_PO_PRICE_ORACLES\'>>env_vars.sh echo OST_PO_PRICE_ORACLES=$OST_PO_PRICE_ORACLES node ./ost-price-oracle/test/scripts/set_price.js OST USD 0.5 0x12A05F200 diff --git a/test/scripts/run_chain.sh b/test/scripts/run_chain.sh index 36ec321..d11186e 100755 --- a/test/scripts/run_chain.sh +++ b/test/scripts/run_chain.sh @@ -3,4 +3,4 @@ DATADIR=./st-poa LOCAL_NETWORK_ID="--networkid 20171010" -geth --datadir "$DATADIR" $LOCAL_NETWORK_ID --port 30301 --rpcport 9546 --ws --wsport 19546 --wsorigins "*" --gasprice 0 --targetgaslimit 100000000 --etherbase 0 --unlock 0 --password pw --rpc --maxpeers 0 --mine --minerthreads 1 --rpcapi net,eth,web3,personal +geth --datadir "$DATADIR" $LOCAL_NETWORK_ID --port 30301 --rpcport 9546 --ws --wsport 19546 --wsorigins "*" --gasprice 0 --targetgaslimit 100000000 --etherbase 0 --unlock 0 --password pw --rpc --maxpeers 0 --mine --minerthreads 4 --rpcapi net,eth,web3,personal diff --git a/test/scripts/travis_test.sh b/test/scripts/travis_test.sh index 8615e64..750df65 100644 --- a/test/scripts/travis_test.sh +++ b/test/scripts/travis_test.sh @@ -1,5 +1,4 @@ -sh contracts/compile.sh -cd /test/scripts sh start_test_chain.sh sh deploy_all.sh +source env_vars.sh ./../../node_modules/mocha/bin/mocha ./../../test/services/pricer \ No newline at end of file diff --git a/test/services/pricer/constants.js b/test/services/pricer/constants.js index 5ffe255..900bae6 100644 --- a/test/services/pricer/constants.js +++ b/test/services/pricer/constants.js @@ -17,13 +17,10 @@ const constants = { currencyBlank: "", pricerOstUsdAddress: process.env.TEST_PRICER_C5_ADDRESS, pricerOstEurAddress: process.env.TEST_PRICER_C2_ADDRESS, - priceOracles: JSON.parse(process.env.OST_PO_PRICE_ORACLES) - /*priceOracleOstUsdAddress: process.env., //conversionRate is 5 - priceOracleOstEurAddress: process.env., //conversionRate is 2 - priceOracleOstUsdZeroPricePointAddress: process.env., - pricerOstAddress: process.env., - pricerOstZeroPricePointAddress: process.env., - pricerDummyAddress: process.env., - */ + pricerOstUsd10DecimalAddress: process.env.TEST_PRICER_C3_ADDRESS, + priceOracles: JSON.parse(process.env.OST_PO_PRICE_ORACLES), + TC5Address: process.env.TEST_COIN1_C5_ADDRESS, + TC2Address: process.env.TEST_COIN1_C2_ADDRESS, + TC3Address: process.env.TEST_COIN1_C3_ADDRESS }; -module.exports = constants; \ No newline at end of file +module.exports = constants; diff --git a/test/services/pricer/get_pricepoint_and_calculated_amounts.js b/test/services/pricer/get_pricepoint_and_calculated_amounts.js index a2b7b7b..72f40e7 100644 --- a/test/services/pricer/get_pricepoint_and_calculated_amounts.js +++ b/test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -1,6 +1,6 @@ -/* -// Load external packages +/* global describe, it */ + const chai = require('chai') , assert = chai.assert; @@ -9,83 +9,104 @@ const rootPrefix = "../../.." , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) , pricerOstEur = new pricer(constants.pricerOstEurAddress) - , pricerOstUsdZeroPricePoint = null;//new pricer(pricerOstZeroPricePointAddress) ; + describe('Get price point and calculated amounts', function() { it('should pass the initial address checks', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + assert.isDefined(constants.deployer); assert.isDefined(constants.ops); assert.isDefined(constants.account1); assert.notEqual(constants.deployer, constants.ops); assert.notEqual(constants.deployer, constants.account1); assert.notEqual(constants.ops, constants.account1); + + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(constants.priceOracles.OST.USD, poResult1); + + await pricerOstEur.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyEUR, + constants.priceOracles.OST.EUR, + 0xBA43B7400); + const poResult2 = await pricerOstEur.priceOracles(constants.currencyEUR); + assert.equal(constants.priceOracles.OST.EUR, poResult2); + }); it('should fail when currency is 0', async function() { - const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( - pricerOstUsd.toWei('1'), - pricerOstUsd.toWei('0.5'), - constants.currencyBlank); - assert.equal(result.success, false); + try { + await pricerOstUsd.getPricePointAndCalculatedAmounts( + pricerOstUsd.toWei('1'), + pricerOstUsd.toWei('0.5'), + constants.currencyBlank); + } + catch (err) { + assert.equal(err, 'Currency is mandatory'); + } }); it('should fail when price point is 0', async function() { - const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( - pricerOstUsd.toWei('1'), - pricerOstUsd.toWei('0.5'), - constants.currencyEUR); - assert.equal(result.success, false); + try { + await pricerOstUsd.getPricePointAndCalculatedAmounts( + pricerOstUsd.toWei('1'), + pricerOstUsd.toWei('0.5'), + constants.currencyINR); + } + catch (err) { + assert.instanceOf(err, Error); + } }); it('should pass when all parameters are valid and conversion rate is 5', async function() { - const amount = pricerOstUsd.toWei('1') + const pricePoint = await pricerOstUsd.getPricePoint(constants.currencyUSD) + , decimal = await pricerOstUsd.decimals() + , conversionRate = await pricerOstUsd.conversionRate() + , amount = pricerOstUsd.toWei('1') , commissionAmount = pricerOstUsd.toWei('0.5') - ; + , calculatedAmount = (amount*conversionRate*(10**decimal))/pricePoint + , calculatedCommisionAmount = (commissionAmount*conversionRate*(10**decimal))/pricePoint; const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( amount, commissionAmount, constants.currencyUSD); - console.log(result); - assert.equal(result.success, true); - - // var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstUsd.getPricePointAndCalculatedAmounts( - // amount, - // commissionAmount, - // constants.currencyUSD); - // const poPricePoint = await pricerOstUsd.getPricePoint(constants.currencyUSD); - // const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 5); - // const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 5); - // assert.equal(pricePoint, poPricePoint); - // assert.equal(tokenAmount, calculatedTokenAmount); - // assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); + + assert.equal(result.pricePoint, pricePoint); + assert.equal(result.tokenAmount, calculatedAmount); + assert.equal(result.commissionTokenAmount, calculatedCommisionAmount); + }); it('should pass when all parameters are valid and conversion rate is 2', async function() { - const amount = pricerOstEur.toWei('1') + const pricePoint = await pricerOstEur.getPricePoint(constants.currencyEUR) + , decimal = await pricerOstEur.decimals() + , conversionRate = await pricerOstEur.conversionRate() + , amount = pricerOstEur.toWei('1') , commissionAmount = pricerOstEur.toWei('0.5') - ; - const result = await pricerOstUsd.getPricePointAndCalculatedAmounts( + , calculatedAmount = (amount*conversionRate*(10**decimal))/pricePoint + , calculatedCommisionAmount = (commissionAmount*conversionRate*(10**decimal))/pricePoint; + + const result = await pricerOstEur.getPricePointAndCalculatedAmounts( amount, commissionAmount, - constants.currencyUSD); - console.log(result); - assert.equal(result.success, true); - // var {pricePoint, tokenAmount, commissionTokenAmount } = await pricerOstEur.getPricePointAndCalculatedAmounts( - // constants.account1, - // constants.accountPassphrase1, - // amount, - // commissionAmount, - // constants.currencyUSD); - // const poPricePoint = await pricerOstEur.getPricePoint(constants.currencyEur); - // const calculatedTokenAmount = calculate(tokenAmount, poPricePoint, 2); - // const calculatedCommissionTokenAmount = calculate(commissionAmount, poPricePoint, 2); - // assert.equal(pricePoint, poPricePoint); - // assert.equal(tokenAmount, calculatedTokenAmount); - // assert.equal(commissionTokenAmount, calculatedCommissionTokenAmount); + constants.currencyEUR); + + assert.equal(result.pricePoint, pricePoint); + assert.equal(result.tokenAmount, calculatedAmount); + assert.equal(result.commissionTokenAmount, calculatedCommisionAmount); }); - + }); -*/ + diff --git a/test/services/pricer/pay.js b/test/services/pricer/pay.js index a79abbc..52ff90c 100644 --- a/test/services/pricer/pay.js +++ b/test/services/pricer/pay.js @@ -1,178 +1,803 @@ -/* -// Load external packages -const assert = require('assert'); +const chai = require('chai') + , assert = chai.assert; const rootPrefix = "../../.." - , Utils = require(rootPrefix + './test/lib/utils.js'); , constants = require(rootPrefix + '/test/services/pricer/constants') + , BigNumber = require('bignumber.js') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') - , pricerOstUsd = new pricer(pricerOstAddress) - , pricerOstEur = new pricer(priceOracleOstEurAddress) - , pricerOstUsdZeroPricePoint = new pricer(pricerOstZeroPricePointAddress) + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , mockToken = require(rootPrefix + '/lib/contract_interact/EIP20TokenMock') + , TC5 = new mockToken(constants.TC5Address) ; +/* global describe, it */ describe('Pay', function() { - it('should pass the initial address checks', async function() { - assert.notEqual(deployer, ops); - assert.notEqual(deployer, user); - assert.notEqual(ops, user); + it('should pass the initial checks', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(300000); + + assert.isDefined(constants.deployer); + assert.isDefined(constants.ops); + assert.isDefined(constants.account1); + assert.notEqual(constants.deployer, constants.ops); + assert.notEqual(constants.deployer, constants.account1); + assert.notEqual(constants.ops, constants.account1); + + await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 50, + 0xBA43B7400); + + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(50, amResult); + + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(constants.priceOracles.OST.USD, poResult); + + + await TC5.setBalance( + constants.ops, + constants.opsPassphrase, + constants.account1, + pricerOstUsd.toWei('1000'), + 0xBA43B7400); + + const account1Balance = await TC5.balanceOf(constants.account1); + assert.equal(account1Balance, pricerOstUsd.toWei('1000')); + + await TC5.setBalance( + constants.ops, + constants.opsPassphrase, + constants.account2, + pricerOstUsd.toWei('0'), + 0xBA43B7400); + + const account2Balance = await TC5.balanceOf(constants.account2); + assert.equal(account2Balance, pricerOstUsd.toWei('0')); + + await TC5.setBalance( + constants.ops, + constants.opsPassphrase, + constants.account3, + pricerOstUsd.toWei('0'), + 0xBA43B7400); + + const account3Balance = await TC5.balanceOf(constants.account3); + assert.equal(account3Balance, pricerOstUsd.toWei('0')); + + await TC5.setBalance( + constants.ops, + constants.opsPassphrase, + constants.account4, + pricerOstUsd.toWei('0'), + 0xBA43B7400); + + const account4Balance = await TC5.balanceOf(constants.account4); + assert.equal(account4Balance, pricerOstUsd.toWei('0')); + }); - it('should fail when beneficiary address is 0', async function() { - var beneficiary = 0 - , transferAmount = pricerOstUsd.toWei(5) - , commissionBeneficiary = constants.account3 - , commissionAmount = pricerOstUsd.toWei(1) + it('should pass when all parameters are valid', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) + , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = pricerOstUsd.getPricePoint(currency) + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('10')) ; - var response = await pricerOstUsd.pay(constants.account1, - constants.accountPassphrase1, - beneficiary, - transferAmount, - commissionBeneficiary, - commissionAmount, - currency, - intendedPricePoint); - - assert.equal(response.isSuccess(), false); + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const estimatedTotalAmount = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + estimatedTotalAmount, + 0xBA43B7400); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal( + initialAccount1Balance + .minus(estimatedTokenAmount) + .minus(estimatedCommissionTokenAmount) + .toNumber(), account1Balance.toNumber()); + + assert.equal( + initialAccount3Balance + .plus(estimatedTokenAmount) + .toNumber(), account3Balance.toNumber()); + + assert.equal( + initialAccount4Balance + .plus(estimatedCommissionTokenAmount) + .toNumber(), account4Balance.toNumber()); + + }); + + it('should fail when sender balance is less than the amount being transfered', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('100000')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('5000')) + ; + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); + }); - it('should fail when beneficiary transfer amount is 0', async function() { - var beneficiary = constants.account2 - , transferAmount = pricerOstUsd - , commissionBeneficiary = account3 - , commissionAmount = 1 - , currency = "USD" - , intendedPricePoint = pricerOstUsd.getPricePoint(currency) + + it('should fail when sender has approved less amount than the amount being transfered', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('12')) ; - var response = pricer.pay(account1, - accountPassphrase1, - beneficiary, + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount + .plus(estimatedCommissionTokenAmount) + .minus(estimatedMargin) + .minus(new BigNumber(100)); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); + + }); + + it('should fail when beneficiary address is 0', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = 0 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('7')) + ; + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount + .plus(estimatedCommissionTokenAmount) + .plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + var isError = false; + try { + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, transferAmount, commissionBeneficiary, commissionAmount, currency, - intendedPricePoint); - - assert.equal(response.isSuccess(), false); + intendedPricePoint, + 0xBA43B7400); + } + catch (err) { + isError = true; + assert.instanceOf(err, Error); + } + assert.equal(isError, true); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); + }); it('should fail when currency is not available in pricer', async function() { - var beneficiary = account2 - , transferAmount = 1 - , commissionBeneficiary = account3 - , commissionAmount = 1 - , currency = "INR" - , intendedPricePoint = pricer.getPricePoint(currency) + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) + ; + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount + .plus(estimatedCommissionTokenAmount) + .plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + constants.currencyINR, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); + + }); + + it('should fail when commision amount is not 0 and commision beneficiary address is 0', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account1 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) + , commissionBeneficiary = 0 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - var response = pricer.pay(account1, - accountPassphrase1, - beneficiary, + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount + .plus(estimatedCommissionTokenAmount) + .plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + var isError = false; + try { + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, transferAmount, commissionBeneficiary, commissionAmount, currency, - intendedPricePoint); - - assert.equal(response.isSuccess(), false); + intendedPricePoint, + 0xBA43B7400); + } + catch (err) { + isError = true; + assert.instanceOf(err, Error); + } + assert.equal(isError, true); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); }); + it('should fail when intendedPricePoint is more than the acceptable margin of current price point', async function() { - var beneficiary = account2 - , transferAmount = 1 - , commissionBeneficiary = account3 - , commissionAmount = 1 - , currency = "USD" - , margin = "0.5"; - - var setMarginResponse = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), true); - - var intendedPricePoint = margin + pricer.getPricePoint(currency); - - var response = pricer.pay(account1, - accountPassphrase1, - beneficiary, - transferAmount, - commissionBeneficiary, - commissionAmount, - currency, - intendedPricePoint); - - assert.equal(response.isSuccess(), false); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) + ; + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + const changedPricePoint = new BigNumber(intendedPricePoint) + .plus(estimatedMargin) + .plus(new BigNumber(1)); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + changedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); + }); + it('should fail when intendedPricePoint is less than the acceptable margin of current price point', async function() { - var beneficiary = account2 - , transferAmount = 1 - , commissionBeneficiary = account3 - , commissionAmount = 1 - , currency = "USD" - , margin = "0.5"; - - var setMarginResponse = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), true); - - var intendedPricePoint = pricer.getPricePoint(currency) - margin; - - var response = pricer.pay(account1, - accountPassphrase1, - beneficiary, - transferAmount, - commissionBeneficiary, - commissionAmount, - currency, - intendedPricePoint); - - assert.equal(response.isSuccess(), false); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) + ; + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount + .plus(estimatedCommissionTokenAmount) + .plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + const changedPricePoint = new BigNumber(intendedPricePoint) + .minus(estimatedMargin) + .minus(new BigNumber(1)); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + changedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); + }); + it('should fail when price point is 0 and currency is not blank', async function() { - var beneficiary = account2 - , transferAmount = 1 - , commissionBeneficiary = account3 - , commissionAmount = 1 - , currency = "USD"; - - var intendedPricePoint = pricer.getPricePoint(currency) - margin; - - var response = pricer.pay(account1, - accountPassphrase1, - beneficiary, - transferAmount, - commissionBeneficiary, - commissionAmount, - currency, - intendedPricePoint); - - assert.equal(response.isSuccess(), false); - }); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); - it('should fail when price point changes beyond acceptable margins', async function() { + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); - }); + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) + ; - it('should fail when beneficiary has insufficent balance', async function() { + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); - }); + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); - it('should fail when commision beneficiary address is 0 and commissionAmount is > 0', async function() { + const total = estimatedTokenAmount + .plus(estimatedCommissionTokenAmount) + .plus(estimatedMargin); - }); + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + const result = await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + constants.currencyINR, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); - it('should pass when all parameters are valid and commision beneficiary address, commissionAmount is 0', async function() { + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); }); - it('should pass when all parameters are valid', async function() { + it('should pass when all parameters are valid and commission beneficiary address, commissionAmount is 0', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('0')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) + ; + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + assert.equal(estimatedValues.commissionTokenAmount, 0); + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount.plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + const result = await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.minus(estimatedTokenAmount).toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.plus(estimatedTokenAmount).toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); }); it('should pass when all parameters are currency is blank', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyBlank + , intendedPricePoint = new BigNumber(0) + , transferAmount = new BigNumber(pricerOstUsd.toWei('10')) + ; + + const total = transferAmount.plus(commissionAmount); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.minus(total).toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.plus(transferAmount).toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.plus(commissionAmount).toNumber(), account4Balance.toNumber()); + }); + + it('should fail when intended price point is 0', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const initialAccount1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , initialAccount3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , initialAccount4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + const beneficiary = constants.account3 + , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) + , commissionBeneficiary = constants.account4 + , currency = constants.currencyUSD + , intendedPricePoint = 0 + , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) + ; + + const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( + transferAmount, + commissionAmount, + currency); + + const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMargin); + + const total = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); + + await TC5.approve( + constants.account1, + constants.accountPassphrase1, + constants.pricerOstUsdAddress, + total, + 0xBA43B7400); + + await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + constants.currencyUSD, + intendedPricePoint, + 0xBA43B7400); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) + , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) + , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); + + assert.equal(initialAccount1Balance.toNumber(), account1Balance.toNumber()); + assert.equal(initialAccount3Balance.toNumber(), account3Balance.toNumber()); + assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); }); }); -*/ \ No newline at end of file diff --git a/test/services/pricer/set_accepted_margin.js b/test/services/pricer/set_accepted_margin.js index 098234c..5da58a3 100644 --- a/test/services/pricer/set_accepted_margin.js +++ b/test/services/pricer/set_accepted_margin.js @@ -1,73 +1,152 @@ -/* -// Load external packages -const assert = require('assert'); +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; const rootPrefix = "../../.." + , constants = require(rootPrefix + '/test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') - , deployer = "" - , deployerPassphrase = "" - , ops = "" - , opsPassphrase = "" - , user ="" - , userPassphrase = "" - + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) ; describe('Set accepted margins', function() { it('should pass the initial address checks', async function() { - assert.notEqual(deployer, ops); - assert.notEqual(deployer, user); - assert.notEqual(ops, user); - }); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + assert.isDefined(constants.deployer); + assert.isDefined(constants.ops); + assert.isDefined(constants.account1); + assert.notEqual(constants.deployer, constants.ops); + assert.notEqual(constants.deployer, constants.account1); + assert.notEqual(constants.ops, constants.account1); + + await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 30, + 0xBA43B7400); + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(30, amResult); - it('should fail when sender is not ops', async function() { - var currency = "USD" - , margin = "0.5" - , response = pricer.setAcceptedMargin(deployer, deployerPassphrase, currency, margin); - assert.equal(response.isSuccess(), false); }); it('should fail when currency is blank', async function() { - var currency = "" - , margin = "0.5" - , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), false); + try { + await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyBlank, + 3, + 0xBA43B7400); + } + catch (err) { + assert.equal(err, 'Currency is mandatory'); + } }); - it('should fail when pricer doesnot have price oracle of given currency', async function() { - var currency = "INR" - , margin = "0.5" - , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), false); + it('should fail when gas amount is 0', async function() { + var error = false; + try { + await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 3, + 0); + } + catch (err) { + error = true; + } + assert.isTrue(error); }); - it('should fail when pricer when margin is less than 0', async function() { - var currency = "USD" - , margin = "-0.5" - , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), false); + it('should fail when sender address is 0', async function() { + var error = false; + try { + await pricerOstUsd.setAcceptedMargin( + 0, + constants.opsPassphrase, + constants.currencyUSD, + 3, + 0xBA43B7400); + } + catch (err) { + error = true; + } + assert.isTrue(error); }); - it('should pass when pricer when margin is 0', async function() { - var currency = "USD" - , margin = "0" - , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), true); + + it('should fail when accepted margin is negetive', async function() { + var error = false; + try { + await pricerOstUsd.setAcceptedMargin( + 0, + constants.opsPassphrase, + constants.currencyUSD, + -30, + 0xBA43B7400); + } + catch (err) { + error = true; + } + assert.isTrue(error); }); - it('should pass when pricer when margin is 0.5', async function() { - var currency = "USD" - , margin = "0.5" - , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), true); + it('should fail when sender is not ops', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 3, + 0xBA43B7400); + const amResult1 = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(3, amResult1); + + await pricerOstUsd.setAcceptedMargin( + constants.deployer, + constants.deployerPassphrase, + constants.currencyUSD, + 8, + 0xBA43B7400); + const amResult2 = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(3, amResult2); + + }); + + it('should pass when margin is 0', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0, + 0xBA43B7400); + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(0, amResult); + }); - it('should fail when pricer when margin is more than uint64 => 9223372036854775808', async function() { - var currency = "USD" - , margin = "9223372036854775808" - , response = pricer.setAcceptedMargin(ops, opsPassphrase, currency, margin); - assert.equal(response.isSuccess(), false); + it('should pass when margin is 50', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 50, + 0xBA43B7400); + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(50, amResult); + }); }); -*/ diff --git a/test/services/pricer/set_price_oracle.js b/test/services/pricer/set_price_oracle.js index 1b11312..ea9d1ab 100644 --- a/test/services/pricer/set_price_oracle.js +++ b/test/services/pricer/set_price_oracle.js @@ -1,5 +1,6 @@ -// Load external packages +/* global describe, it */ + const chai = require('chai') , assert = chai.assert; @@ -8,99 +9,190 @@ const rootPrefix = "../../.." , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) , pricerOstEur = new pricer(constants.pricerOstEurAddress) - , pricerOstUsdZeroPricePoint = null;//new pricer(pricerOstZeroPricePointAddress) + , pricerOstUsd10Decimal = new pricer(constants.pricerOstUsd10DecimalAddress) ; describe('Set price oracle', function() { it('should pass the initial address checks', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); assert.isDefined(constants.deployer); assert.isDefined(constants.ops); assert.isDefined(constants.account1); assert.notEqual(constants.deployer, constants.ops); assert.notEqual(constants.deployer, constants.account1); assert.notEqual(constants.ops, constants.account1); + + await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0xBA43B7400); + + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult1, 0x0); + + await pricerOstEur.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyEUR, + 0xBA43B7400); + + const poResult2 = await pricerOstEur.priceOracles(constants.currencyEUR); + assert.equal(poResult2, 0x0); + }); -/* it('should fail when sender is not ops', function(done) { + it('should fail when sender is not ops', async function() { + // eslint-disable-next-line no-invalid-this this.timeout(100000); - pricerOstUsd.setPriceOracle( + + await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0xBA43B7400); + + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult1, 0x0); + + await pricerOstUsd.setPriceOracle( constants.deployer, constants.deployerPassphrase, constants.currencyUSD, - constants.priceOracles["OST"]["USD"], - 0xBA43B7400).then(function(result){ - console.log("Here in result"); - console.log(result); - done(); - }); - + constants.priceOracles.OST.USD, + 0xBA43B7400); + + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult2, 0x0); + }); it('should fail when currency is blank', async function() { - var currency = "" - , oracleAddress = priceOracleOstUsdAddress - , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + try { + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyBlank, + constants.priceOracles.OST.USD, + 0xBA43B7400); + } + catch (err) { + assert.equal(err, 'Currency is mandatory'); + } }); + it('should fail when oracleAddress is 0', async function() { - var currency = "USD" - , oracleAddress = 0 - , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + var error = false; + try { + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0, + 0xBA43B7400); + } + catch (err) { + error = true; + } + assert.isTrue(error); + }); + + it('should fail when gas amount is 0', async function() { + var error = false; + try { + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0); + } + catch (err) { + error = true; + } + assert.isTrue(error); + }); + + it('should fail when sender address is 0', async function() { + var error = false; + try { + await pricerOstUsd.setPriceOracle( + 0, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + } + catch (err) { + error = true; + } + assert.isTrue(error); }); it('should fail when price oracle has different quote currency', async function() { - var currency = "USD" - , oracleAddress = priceOracleOstEurAddress - , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.ETH.USD, + 0xBA43B7400); + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.notEqual(poResult, constants.priceOracles.ETH.USD); + }); + it('should fail when price oracle has different decimal', async function() { - var currency = "USD" - , oracleAddress = priceOracleOstUsdAddressDEC10 - , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd10Decimal.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult, 0); + }); -*/ - it('should pass when OST/USD price oracle is set', async function(done) { + + it('should pass when OST/USD price oracle is set', async function() { + // eslint-disable-next-line no-invalid-this this.timeout(100000); - pricerOstUsd.setPriceOracle( + + await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, - constants.priceOracles["OST"]["USD"], - 0xBA43B7400).then(function(result) { - console.log("Here in result"); - console.log(result); - done(); - }); - /*.then(function() { - pricerOstUsd.decimals().then( function(poResult) { - console.log("Here in po"); - console.log(poResult); - }); - // console.log("Here in po"); - // pricerOstUsd.priceOracles(constants.currencyUSD).then( function(poResult) { - // console.log("Here in po1"); - // console.log(poResult); - // done(); - // }); - }); - */ + constants.priceOracles.OST.USD, + 0xBA43B7400); + + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(constants.priceOracles.OST.USD, poResult); + }); -/* + it('should pass when OST/EUR price oracle is set', async function() { - var currency = "EUR" - , oracleAddress = priceOracleOstEurAddress - , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); - var addressFromPricer = pricer.priceOracles(currency); - assert.equal(addressFromPricer, oracleAddress); - }); -*/ - + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyEUR, + constants.priceOracles.OST.EUR, + 0xBA43B7400); + const poResult = await pricerOstUsd.priceOracles(constants.currencyEUR); + assert.equal(constants.priceOracles.OST.EUR, poResult); + }); }); + diff --git a/test/services/pricer/unset_price_oracle.js b/test/services/pricer/unset_price_oracle.js index 4f69238..a19674d 100644 --- a/test/services/pricer/unset_price_oracle.js +++ b/test/services/pricer/unset_price_oracle.js @@ -1,68 +1,132 @@ -/* -// Load external packages -const assert = require('assert'); +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; const rootPrefix = "../../.." + , constants = require(rootPrefix + '/test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') - , deployer = "" - , deployerPassphrase = "" - , ops = "" - , opsPassphrase = "" - , user ="" - , userPassphrase = "" - , priceOracleOstUsdAddress = "" - , priceOracleOstEurAddress = "" - , priceOracleEthUsdAddress = "" - , priceOracleOstUsdAddressDEC10 = "" + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) ; + describe('Unset price oracle', function() { - it('should pass the initial address checks', async function() { - assert.notEqual(deployer, ops); - assert.notEqual(deployer, user); - assert.notEqual(ops, user); + it('should pass the initial address checks', function() { + assert.isDefined(constants.deployer); + assert.isDefined(constants.ops); + assert.isDefined(constants.account1); + assert.notEqual(constants.deployer, constants.ops); + assert.notEqual(constants.deployer, constants.account1); + assert.notEqual(constants.ops, constants.account1); }); it('should fail when sender is not ops', async function() { - var currency = "USD" - , oracleAddress = priceOracleOstUsdAddress - , response = pricer.unsetPriceOracle(deployer, deployerPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult1, constants.priceOracles.OST.USD); + + await pricerOstUsd.unsetPriceOracle( + constants.deployer, + constants.deployerPassphrase, + constants.currencyUSD, + 0xBA43B7400); + + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult2, constants.priceOracles.OST.USD); + }); - it('should fail when sender is not ops', async function() { - var currency = "USD" - , oracleAddress = priceOracleOstUsdAddress - , response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + it('should fail when currency is blank', async function() { + + try { + await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyBlank, + 0xBA43B7400); + } + catch (err) { + assert.equal(err, 'Currency is mandatory'); + } + }); - it('should fail when price oracle was not set prior', async function() { - var currency = "INR" - response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + it('should fail when gas amount is 0', async function() { + var error = false; + try { + await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0); + } + catch (err) { + error = true; + } + assert.isTrue(error); }); + it('should fail when sender address is 0', async function() { + var error = false; + try { + await pricerOstUsd.unsetPriceOracle( + 0, + constants.opsPassphrase, + constants.currencyUSD, + 0xBA43B7400); + } + catch (err) { + error = true; + } + assert.isTrue(error); + }); + + // it('should fail when price oracle was not set prior', async function() { + // this.timeout(100000); + // const result = await pricerOstUsd.unsetPriceOracle( + // constants.ops, + // constants.opsPassphrase, + // constants.currencyINR, + // 0xBA43B7400); + // const poResult = await pricerOstUsd.priceOracles(constants.currencyINR); + // assert.equal(poResult, 0x0); + // }); + + it('should pass when price oracle was set prior', async function() { - //set - var currency = "USD" - , oracleAddress = priceOracleOstUsdAddress - , response = pricer.setPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); - var addressFromPricer = pricer.priceOracles(currency); - assert.equal(addressFromPricer, oracleAddress); - - // unset - response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), true); - addressFromPricer = pricer.priceOracles(currency); - assert.equal(addressFromPricer, 0); - - // unset again - response = pricer.unsetPriceOracle(ops, opsPassphrase, currency, oracleAddress); - assert.equal(response.isSuccess(), false); + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult1, constants.priceOracles.OST.USD); + + await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0xBA43B7400); + + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult2, 0x0); + }); }); -*/ \ No newline at end of file + From e9e5f6806b8e161e6bd0308a7f79bcae16229b36 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 7 Feb 2018 20:37:55 +0530 Subject: [PATCH 024/242] Travis: updated .travis.yml file --- .travis.yml | 13 +++++++++++ test/scripts/deploy_all.sh | 36 +++++++++++------------------ test/scripts/deploy_price_oracle.sh | 10 -------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3f20573..435136d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,5 +27,18 @@ before_script: - nohup ./tools/runTestRpc.sh /dev/null 2>&1 & script: - truffle test + - kill $(ps aux | grep 'testrpc' | awk '{print $2}') + - rm -r contracts/abi + - rm -r contracts/bin + - rm -r test/scripts/ost-price-oracle + - rm -r test/scripts/st-poa + - rm test/scripts/env_vars.sh + - rm test/scripts/poa-genesis.json + - rm test/scripts/pw + - sh contracts/compile.sh + - cd ./test/scripts/ + - sh travis_test.sh after_script: - kill $(ps aux | grep 'testrpc' | awk '{print $2}') + - kill $(ps aux | grep 'geth' | awk '{print $2}') + diff --git a/test/scripts/deploy_all.sh b/test/scripts/deploy_all.sh index d75a9bd..5a296f2 100644 --- a/test/scripts/deploy_all.sh +++ b/test/scripts/deploy_all.sh @@ -8,7 +8,6 @@ node ../tools/deploy/EIP20TokenMock.js 5 TC1 TestCoin1 18 0x12A05F200 travis tc1 export TEST_COIN1_C5_ADDRESS=$(cat ../tools/deploy/tc1.txt) echo '\nexport TEST_COIN1_C5_ADDRESS='\'$TEST_COIN1_C5_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tc1.txt -#TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" echo "\n********* Deploying test coin 2 *************" @@ -17,19 +16,15 @@ node ../tools/deploy/EIP20TokenMock.js 2 TC2 TestCoin2 18 0x12A05F200 travis tc2 export TEST_COIN2_C2_ADDRESS=$(cat ../tools/deploy/tc2.txt) echo '\nexport TEST_COIN2_C2_ADDRESS='\'$TEST_COIN2_C2_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tc2.txt -#TO_DO: Write this to scripts/env_vars.sh -echo "\n********* Done *************" - -echo "\n********* Deploying test coin 3 *************" -source scripts/env_vars.sh -node ../tools/deploy/EIP20TokenMock.js 3 TC3 TestCoin3 10 0x12A05F200 travis tc3.txt -export TEST_COIN2_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) -echo '\nexport TEST_COIN2_C3_ADDRESS='\'$TEST_COIN2_C3_ADDRESS\'>>scripts/env_vars.sh -rm ../tools/deploy/tc3.txt -#TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" - +# echo "\n********* Deploying test coin 3 *************" +# source scripts/env_vars.sh +# node ../tools/deploy/EIP20TokenMock.js 3 TC3 TestCoin3 10 0x12A05F200 travis tc3.txt +# export TEST_COIN2_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) +# echo '\nexport TEST_COIN2_C3_ADDRESS='\'$TEST_COIN2_C3_ADDRESS\'>>scripts/env_vars.sh +# rm ../tools/deploy/tc3.txt +# echo "\n********* Done *************" echo "\n********* Deploying Pricer 1 *************" @@ -38,7 +33,6 @@ node ../tools/deploy/pricer.js $TEST_COIN1_C5_ADDRESS OST 0x12A05F200 travis tp1 export TEST_PRICER_C5_ADDRESS=$(cat ../tools/deploy/tp1.txt) echo '\nexport TEST_PRICER_C5_ADDRESS='\'$TEST_PRICER_C5_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tp1.txt -#TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" echo "\n********* Deploying Pricer 2 *************" @@ -47,17 +41,15 @@ node ../tools/deploy/pricer.js $TEST_COIN2_C2_ADDRESS OST 0x12A05F200 travis tp2 export TEST_PRICER_C2_ADDRESS=$(cat ../tools/deploy/tp2.txt) echo '\nexport TEST_PRICER_C2_ADDRESS='\'$TEST_PRICER_C2_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tp2.txt -#TO_DO: Write this to scripts/env_vars.sh echo "\n********* Done *************" -echo "\n********* Deploying Pricer 3 *************" -source scripts/env_vars.sh -node ../tools/deploy/pricer.js $TEST_COIN2_C3_ADDRESS OST 0x12A05F200 travis tp3.txt -export TEST_PRICER_C3_ADDRESS=$(cat ../tools/deploy/tp3.txt) -echo '\nexport TEST_PRICER_C3_ADDRESS='\'$TEST_PRICER_C3_ADDRESS\'>>scripts/env_vars.sh -rm ../tools/deploy/tp3.txt -#TO_DO: Write this to scripts/env_vars.sh -echo "\n********* Done *************" +# echo "\n********* Deploying Pricer 3 *************" +# source scripts/env_vars.sh +# node ../tools/deploy/pricer.js $TEST_COIN2_C3_ADDRESS OST 0x12A05F200 travis tp3.txt +# export TEST_PRICER_C3_ADDRESS=$(cat ../tools/deploy/tp3.txt) +# echo '\nexport TEST_PRICER_C3_ADDRESS='\'$TEST_PRICER_C3_ADDRESS\'>>scripts/env_vars.sh +# rm ../tools/deploy/tp3.txt +#echo "\n********* Done *************" echo "\n********* Setting env variables *************" diff --git a/test/scripts/deploy_price_oracle.sh b/test/scripts/deploy_price_oracle.sh index ce608cc..1ce637c 100644 --- a/test/scripts/deploy_price_oracle.sh +++ b/test/scripts/deploy_price_oracle.sh @@ -1,13 +1,3 @@ -#git clone git@github.com:OpenSTFoundation/ost-price-oracle.git -#cd ost-price-oracle -#git checkout abhay/mocha_test -#git pull --rebase -#sh contracts/compile.sh -#node tools/deploy/price_oracle.js OST USD 0x12A05F200 travis po_ost_usd.txt -#set /p PO_OST_USD_0.5= Date: Wed, 7 Feb 2018 20:42:06 +0530 Subject: [PATCH 025/242] Travis: updated .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 435136d..6c124f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,7 +30,7 @@ script: - kill $(ps aux | grep 'testrpc' | awk '{print $2}') - rm -r contracts/abi - rm -r contracts/bin - - rm -r test/scripts/ost-price-oracle + - rm -rf test/scripts/ost-price-oracle - rm -r test/scripts/st-poa - rm test/scripts/env_vars.sh - rm test/scripts/poa-genesis.json From 4fd15f8a089349ab4317b811c875acb6f423fe66 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 7 Feb 2018 20:52:01 +0530 Subject: [PATCH 026/242] Updated: package.json --- package-lock.json | 6936 --------------------------------------------- package.json | 1 - 2 files changed, 6937 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 96ef37b..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6936 +0,0 @@ -{ - "name": "openst-payments", - "version": "0.9.2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abi-decoder": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.0.9.tgz", - "integrity": "sha1-a8/Yb39j++yFc9l3izpPkruS4B8=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-loader": "6.4.1", - "babel-plugin-add-module-exports": "0.2.1", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-preset-es2015": "6.24.1", - "chai": "3.5.0", - "web3": "0.18.4", - "webpack": "2.7.0" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "dev": true - }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, - "requires": { - "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - } - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true - }, - "web3": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", - "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", - "dev": true, - "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "3.1.8", - "utf8": "2.1.1", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" - } - } - } - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.1", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.5" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "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==" - }, - "async-listener": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", - "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", - "requires": { - "semver": "5.5.0", - "shimmer": "1.2.0" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-loader": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", - "dev": true, - "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-add-module-exports": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", - "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", - "dev": true - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.5" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "bignumber": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bignumber/-/bignumber-1.1.0.tgz", - "integrity": "sha1-5qsKdD2l8+oBjlwXWX0SH3howVk=" - }, - "bignumber.js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "2.0.1" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - } - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.1", - "safe-buffer": "5.1.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.1" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" - } - }, - "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", - "requires": { - "js-sha3": "0.3.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.1", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "1.0.6" - } - }, - "buffer": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", - "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.1", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.1" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "0.6.9", - "emitter-listener": "1.1.1" - } - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", - "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.1", - "ripemd160": "2.0.1", - "sha.js": "2.4.10" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.1", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.1", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.6", - "randomfill": "1.0.3" - } - }, - "crypto-js": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.38" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "requires": { - "decompress-tar": "4.1.1", - "decompress-tarbz2": "4.1.1", - "decompress-targz": "4.1.1", - "decompress-unzip": "4.0.1", - "graceful-fs": "4.1.11", - "make-dir": "1.1.0", - "pify": "2.3.0", - "strip-dirs": "2.1.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { - "file-type": "5.2.0", - "is-stream": "1.1.0", - "tar-stream": "1.5.5" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { - "decompress-tar": "4.1.1", - "file-type": "6.2.0", - "is-stream": "1.1.0", - "seek-bzip": "1.0.5", - "unbzip2-stream": "1.2.5" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { - "decompress-tar": "4.1.1", - "file-type": "5.2.0", - "is-stream": "1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { - "file-type": "3.9.0", - "get-stream": "2.3.1", - "pify": "2.3.0", - "yauzl": "2.9.1" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" - } - } - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "requires": { - "type-detect": "4.0.8" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "2.0.1", - "minimalistic-assert": "1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.1", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emitter-listener": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", - "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", - "requires": { - "shimmer": "1.2.0" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "1.4.0" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" - } - }, - "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", - "dev": true, - "requires": { - "prr": "1.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es5-ext": { - "version": "0.10.38", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", - "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint-config-google": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", - "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", - "dev": true - }, - "eslint-config-standard": { - "version": "11.0.0-beta.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz", - "integrity": "sha512-f+vs5HAHQo7NRZ3hVe+UVdT5DbebMNaFTWFp95orJ0LUdYPoWdM8xw/bMeO/IZMvHOPmIteGKGc2QOhSXd5nRg==", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "2.6.9", - "resolve": "1.5.0" - } - }, - "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", - "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", - "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", - "dev": true, - "requires": { - "ignore": "3.3.7", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", - "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", - "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eth-lib": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", - "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0", - "keccakjs": "0.2.1", - "nano-json-stream-parser": "0.1.2", - "servify": "0.1.12", - "ws": "3.3.3", - "xhr-request-promise": "0.1.2" - } - }, - "ethereumjs-testrpc": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", - "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", - "dev": true, - "requires": { - "webpack": "3.10.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.4.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38" - } - }, - "eventemitter3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", - "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "requires": { - "pend": "1.2.0" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "for-each": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", - "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", - "requires": { - "is-function": "1.0.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - } - }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", - "requires": { - "any-promise": "1.3.0", - "fs-extra": "2.1.2", - "mz": "2.7.0", - "thenify-all": "1.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "ganache-cli": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", - "integrity": "sha512-C7a8su4Zwtootvcy9HtroshTsyUtLC51+aOGUREpy/G4CXbAuLa3nNQri2NyFdqGyOrm/D+jxYP/PWnnrGLyXg==", - "dev": true, - "requires": { - "webpack": "3.10.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.4.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", - "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "1.4.1" - } - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "2.0.1" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.11.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" - } - }, - "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccakjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", - "requires": { - "browserify-sha3": "0.0.1", - "sha3": "1.2.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", - "requires": { - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.1" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.1" - } - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.6", - "readable-stream": "2.3.3" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "0.1.1" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "requires": { - "mkdirp": "0.5.1" - } - }, - "mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", - "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "mock-fs": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.4.2.tgz", - "integrity": "sha512-dF+yxZSojSiI8AXGoxj5qdFWpucndc54Ug+TwlpHFaV7j22MGG+OML2+FVa6xAZtjb/OFFQhOC37Jegx2GbEwA==" - }, - "moment": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" - }, - "mout": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mustache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", - "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "1.3.0", - "object-assign": "4.1.1", - "thenify-all": "1.6.0" - } - }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.8.0", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.6", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "oboe": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", - "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", - "requires": { - "http-https": "1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "original-require": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", - "dev": true - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "ost-price-oracle": { - "version": "file:test/scripts/ost-price-oracle", - "requires": { - "assert": "1.4.1", - "bignumber.js": "4.1.0", - "continuation-local-storage": "3.2.1", - "moment": "2.20.1", - "web3": "1.0.0-beta.26" - } - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", - "requires": { - "for-each": "0.3.2", - "trim": "0.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.6" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "query-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", - "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", - "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", - "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" - } - }, - "randomhex": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - } - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "requires": { - "nan": "2.8.0" - } - }, - "scrypt.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", - "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", - "requires": { - "scrypt": "6.0.3", - "scryptsy": "1.2.1" - } - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "requires": { - "pbkdf2": "3.0.14" - } - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "requires": { - "commander": "2.8.1" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "requires": { - "body-parser": "1.18.2", - "cors": "2.8.4", - "express": "4.16.2", - "request": "2.83.0", - "xhr": "2.4.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "sha.js": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", - "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", - "requires": { - "inherits": "2.0.1", - "safe-buffer": "5.1.1" - } - }, - "sha3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", - "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", - "requires": { - "nan": "2.8.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" - }, - "shortid": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", - "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz", - "integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==", - "requires": { - "decompress-response": "3.3.0", - "once": "1.4.0", - "simple-concat": "1.0.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.2.0" - } - }, - "solc": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.19.tgz", - "integrity": "sha512-hvi/vi9rQcB73poRLoLRfQIYKwmdhrNbZlOOFCGd5v58gEsYEUr3+oHPSXhyk4CFNchWC2ojpMYrHDJNm0h4jQ==", - "dev": true, - "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.5.0", - "yargs": "4.8.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - } - } - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.1", - "readable-stream": "2.3.3" - } - }, - "stream-http": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.1", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { - "is-natural-number": "4.0.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "swarm-js": { - "version": "0.1.37", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", - "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", - "requires": { - "bluebird": "3.5.1", - "buffer": "5.0.8", - "decompress": "4.2.0", - "eth-lib": "0.1.27", - "fs-extra": "2.1.2", - "fs-promise": "2.0.3", - "got": "7.1.0", - "mime-types": "2.1.17", - "mkdirp-promise": "5.0.1", - "mock-fs": "4.4.2", - "setimmediate": "1.0.5", - "tar.gz": "1.0.7", - "xhr-request-promise": "0.1.2" - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.1" - } - }, - "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.1", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "tar.gz": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", - "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", - "requires": { - "bluebird": "2.11.0", - "commander": "2.8.1", - "fstream": "1.0.11", - "mout": "0.11.1", - "tar": "2.2.1" - }, - "dependencies": { - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" - } - } - }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "requires": { - "any-promise": "1.3.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": "3.3.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "1.4.1" - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "truffle": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.6.tgz", - "integrity": "sha512-E4u1dZr2IGY4liulO/nGMtavx4jVLXIJp48lxFq54N+gMRGhmBQp5kf1etA3bYhHVtO9IO76qRiHMMVuId7cRg==", - "dev": true, - "requires": { - "mocha": "3.5.3", - "original-require": "1.0.1", - "solc": "0.4.19" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.17" - } - }, - "typedarray-to-buffer": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz", - "integrity": "sha1-EBezLZhP9VbroQD1AViauhrOLgQ=", - "requires": { - "is-typedarray": "1.0.0" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "unbzip2-stream": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", - "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", - "requires": { - "buffer": "3.6.0", - "through": "2.3.8" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "requires": { - "base64-js": "0.0.8", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - } - } - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - } - }, - "web3": { - "version": "1.0.0-beta.26", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.26.tgz", - "integrity": "sha1-u0ba9q78MT92iz3jnX9KjXvQZmM=", - "requires": { - "web3-bzz": "1.0.0-beta.29", - "web3-core": "1.0.0-beta.29", - "web3-eth": "1.0.0-beta.29", - "web3-eth-personal": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29", - "web3-shh": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-bzz": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.29.tgz", - "integrity": "sha1-xAVVzjKB9jf8X1yD3HsIy+70K3I=", - "requires": { - "got": "7.1.0", - "swarm-js": "0.1.37", - "underscore": "1.8.3" - } - }, - "web3-core": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.29.tgz", - "integrity": "sha1-G/uc3AHMPqcZDplh+PeIa7Qc/PE=", - "requires": { - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-requestmanager": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-core-helpers": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.29.tgz", - "integrity": "sha1-kUJt7MEEEmI4TA3quRvXmnCLGQI=", - "requires": { - "underscore": "1.8.3", - "web3-eth-iban": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-core-method": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.29.tgz", - "integrity": "sha1-11trk9FuK5yoxPcc3G/ubCk2HHY=", - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-promievent": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-core-promievent": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.29.tgz", - "integrity": "sha1-zziMs052BSiFp8K9Fec1jDm32Zg=", - "requires": { - "bluebird": "3.3.1", - "eventemitter3": "1.1.1" - }, - "dependencies": { - "bluebird": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", - "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" - } - } - }, - "web3-core-requestmanager": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.29.tgz", - "integrity": "sha1-7s36oLtNJ8SEbEaFmJr2NVqxBzw=", - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "web3-providers-http": "1.0.0-beta.29", - "web3-providers-ipc": "1.0.0-beta.29", - "web3-providers-ws": "1.0.0-beta.29" - } - }, - "web3-core-subscriptions": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.29.tgz", - "integrity": "sha1-D5R1q0diCQC4gsrILsQr3NNbRKE=", - "requires": { - "eventemitter3": "1.1.1", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29" - } - }, - "web3-eth": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.29.tgz", - "integrity": "sha1-FTovYTcM50Qc4/JK5eFSC0K5PSQ=", - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-eth-abi": "1.0.0-beta.29", - "web3-eth-accounts": "1.0.0-beta.29", - "web3-eth-contract": "1.0.0-beta.29", - "web3-eth-iban": "1.0.0-beta.29", - "web3-eth-personal": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-eth-abi": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.29.tgz", - "integrity": "sha1-eRPArlRRAFmpjb0MubqG00IO+II=", - "requires": { - "bn.js": "4.11.6", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "web3-eth-accounts": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.29.tgz", - "integrity": "sha1-mG/z7X0XHam6egPByblLMb4vk+w=", - "requires": { - "bluebird": "3.3.1", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scrypt.js": "0.2.0", - "underscore": "1.8.3", - "uuid": "2.0.1", - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - }, - "dependencies": { - "bluebird": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", - "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" - }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0", - "xhr-request-promise": "0.1.2" - } - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, - "web3-eth-contract": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.29.tgz", - "integrity": "sha1-xXTGOpCEi5gvF2tBwt76tFmMSmk=", - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-promievent": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-eth-abi": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-eth-iban": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.29.tgz", - "integrity": "sha1-eXSsE2X2WXdsxqv1xV4ty8Jw44E=", - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-eth-personal": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.29.tgz", - "integrity": "sha1-qk0e+k7hR4fzcnuxw2DxLtfIqqI=", - "requires": { - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-net": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.29.tgz", - "integrity": "sha1-8zYaw9o26FkB7hVh61K+5S2dS+4=", - "requires": { - "web3-core": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-providers-http": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.29.tgz", - "integrity": "sha1-UAFYhAnMKxj4qqwJINUuOQR+Ir0=", - "requires": { - "web3-core-helpers": "1.0.0-beta.29", - "xhr2": "0.1.4" - } - }, - "web3-providers-ipc": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.29.tgz", - "integrity": "sha1-uMLaC1ql3KoqZc/tq/VXKyJV2rk=", - "requires": { - "oboe": "2.1.3", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29" - } - }, - "web3-providers-ws": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.29.tgz", - "integrity": "sha1-LtnZsoj2IZs3+gV8XlsM/t3NAbs=", - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c" - } - }, - "web3-shh": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.29.tgz", - "integrity": "sha1-HnA1Utrpa/Z7Y+RoNRSxRV+aWEY=", - "requires": { - "web3-core": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29" - } - }, - "web3-utils": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.29.tgz", - "integrity": "sha1-iZkl7RWyDV9wgU34o1Ji5Nb8pqk=", - "requires": { - "bn.js": "4.11.6", - "eth-lib": "0.1.27", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.8.3", - "utf8": "2.1.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "webpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", - "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", - "dev": true, - "requires": { - "acorn": "5.4.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "0.2.17", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "3.2.3", - "tapable": "0.2.8", - "uglify-js": "2.8.29", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "6.6.0" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c", - "requires": { - "debug": "2.6.9", - "nan": "2.8.0", - "typedarray-to-buffer": "3.1.2", - "yaeti": "0.0.6" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.1" - } - }, - "xhr": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz", - "integrity": "sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==", - "requires": { - "global": "4.3.2", - "is-function": "1.0.1", - "parse-headers": "2.0.1", - "xtend": "4.0.1" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "requires": { - "buffer-to-arraybuffer": "0.0.5", - "object-assign": "4.1.1", - "query-string": "5.1.0", - "simple-get": "2.7.0", - "timed-out": "4.0.1", - "url-set-query": "1.0.0", - "xhr": "2.4.1" - } - }, - "xhr-request-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", - "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "requires": { - "xhr-request": "1.1.0" - } - }, - "xhr2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - } - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - }, - "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "requires": { - "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" - } - } - } -} diff --git a/package.json b/package.json index 0972a39..110c03a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,6 @@ "bignumber.js": "^4.1.0", "chai": "^4.1.2", "moment": "^2.19.2", - "ost-price-oracle": "file:test/scripts/ost-price-oracle", "shortid": "2.2.8", "web3": "1.0.0-beta.26" }, From f7b98f0bb91cc53b4b8a6cee1a8db0b42b873463 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 7 Feb 2018 21:01:32 +0530 Subject: [PATCH 027/242] Updated: package.json with solc --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 110c03a..a9986c5 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "ganache-cli": "^6.0.3", "truffle": "^4.0.1", "mustache": "2.3.0", - "mocha": "^5.0.0" + "mocha": "^5.0.0", + "solc": "^0.4.19" }, "author": "OpenST Foundation Ltd.", "license": "LGPL-3.0" From b8a3161aaf33cb5f170f1e5e16ab9df0015fc648 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 7 Feb 2018 21:13:13 +0530 Subject: [PATCH 028/242] Updated: package.json and .travis.yml --- .gitignore | 2 - .travis.yml | 10 +- package-lock.json | 6896 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 4 +- 4 files changed, 6899 insertions(+), 13 deletions(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 37483c5..89d3014 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,3 @@ test/scripts/ost-price-oracle/ test/scripts/poa-genesis.json test/scripts/pw test/scripts/st-poa/ - -package-lock.json \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 6c124f2..bc62a20 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,16 +27,8 @@ before_script: - nohup ./tools/runTestRpc.sh /dev/null 2>&1 & script: - truffle test - - kill $(ps aux | grep 'testrpc' | awk '{print $2}') - - rm -r contracts/abi - - rm -r contracts/bin - - rm -rf test/scripts/ost-price-oracle - - rm -r test/scripts/st-poa - - rm test/scripts/env_vars.sh - - rm test/scripts/poa-genesis.json - - rm test/scripts/pw - sh contracts/compile.sh - - cd ./test/scripts/ + - cd test/scripts/ - sh travis_test.sh after_script: - kill $(ps aux | grep 'testrpc' | awk '{print $2}') diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d8628c8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6896 @@ +{ + "name": "openst-payments", + "version": "0.9.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abi-decoder": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.0.9.tgz", + "integrity": "sha1-a8/Yb39j++yFc9l3izpPkruS4B8=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-loader": "6.4.1", + "babel-plugin-add-module-exports": "0.2.1", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-preset-es2015": "6.24.1", + "chai": "3.5.0", + "web3": "0.18.4", + "webpack": "2.7.0" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "dev": true + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + }, + "web3": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", + "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "dev": true, + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "crypto-js": "3.1.8", + "utf8": "2.1.1", + "xhr2": "0.1.4", + "xmlhttprequest": "1.8.0" + } + } + } + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "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==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-loader": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", + "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "dev": true, + "requires": { + "find-cache-dir": "0.1.1", + "loader-utils": "0.2.17", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-add-module-exports": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", + "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "home-or-tmp": "2.0.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.5" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "bignumber": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bignumber/-/bignumber-1.1.0.tgz", + "integrity": "sha1-5qsKdD2l8+oBjlwXWX0SH3howVk=" + }, + "bignumber.js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "2.0.3" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sha3": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", + "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "requires": { + "js-sha3": "0.3.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", + "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.8" + }, + "dependencies": { + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + } + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "4.1.1", + "vary": "1.1.2" + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.10" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.10" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.6", + "randomfill": "1.0.3" + } + }, + "crypto-js": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.38" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "4.1.1", + "decompress-tarbz2": "4.1.1", + "decompress-targz": "4.1.1", + "decompress-unzip": "4.0.1", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "pify": "2.3.0", + "strip-dirs": "2.1.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "5.2.0", + "is-stream": "1.1.0", + "tar-stream": "1.5.5" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "6.2.0", + "is-stream": "1.1.0", + "seek-bzip": "1.0.5", + "unbzip2-stream": "1.2.5" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "4.1.1", + "file-type": "5.2.0", + "is-stream": "1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "3.9.0", + "get-stream": "2.3.1", + "pify": "2.3.0", + "yauzl": "2.9.1" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + } + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "errno": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.38", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", + "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-config-google": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", + "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", + "dev": true + }, + "eslint-config-standard": { + "version": "11.0.0-beta.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz", + "integrity": "sha512-f+vs5HAHQo7NRZ3hVe+UVdT5DbebMNaFTWFp95orJ0LUdYPoWdM8xw/bMeO/IZMvHOPmIteGKGc2QOhSXd5nRg==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "requires": { + "ignore": "3.3.7", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", + "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eth-lib": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", + "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0", + "keccakjs": "0.2.1", + "nano-json-stream-parser": "0.1.2", + "servify": "0.1.12", + "ws": "3.3.3", + "xhr-request-promise": "0.1.2" + } + }, + "ethereumjs-testrpc": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", + "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", + "dev": true, + "requires": { + "webpack": "3.10.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "webpack": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "dev": true, + "requires": { + "acorn": "5.4.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "1.2.0" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "for-each": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", + "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", + "requires": { + "is-function": "1.0.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0" + } + }, + "fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "requires": { + "any-promise": "1.3.0", + "fs-extra": "2.1.2", + "mz": "2.7.0", + "thenify-all": "1.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "ganache-cli": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", + "integrity": "sha512-C7a8su4Zwtootvcy9HtroshTsyUtLC51+aOGUREpy/G4CXbAuLa3nNQri2NyFdqGyOrm/D+jxYP/PWnnrGLyXg==", + "dev": true, + "requires": { + "webpack": "3.10.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "webpack": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "dev": true, + "requires": { + "acorn": "5.4.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "3.3.0", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-plain-obj": "1.1.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "isurl": "1.0.0", + "lowercase-keys": "1.0.0", + "p-cancelable": "0.3.0", + "p-timeout": "1.2.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "url-parse-lax": "1.0.0", + "url-to-options": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", + "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "1.4.1" + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + } + } + }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "1.4.1", + "is-object": "1.0.1" + } + }, + "js-sha3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", + "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "keccakjs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", + "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "requires": { + "browserify-sha3": "0.0.1", + "sha3": "1.2.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.6", + "readable-stream": "2.3.3" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "0.1.1" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "0.5.1" + } + }, + "mocha": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", + "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "mock-fs": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.4.2.tgz", + "integrity": "sha512-dF+yxZSojSiI8AXGoxj5qdFWpucndc54Ug+TwlpHFaV7j22MGG+OML2+FVa6xAZtjb/OFFQhOC37Jegx2GbEwA==" + }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" + }, + "mout": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mustache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "1.3.0", + "object-assign": "4.1.1", + "thenify-all": "1.6.0" + } + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" + }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.8.0", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.6", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "oboe": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", + "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", + "requires": { + "http-https": "1.0.0" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "original-require": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", + "dev": true + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "requires": { + "for-each": "0.3.2", + "trim": "0.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.10" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.6" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "query-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", + "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", + "requires": { + "decode-uri-component": "0.2.0", + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" + } + }, + "randomhex": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", + "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", + "requires": { + "nan": "2.8.0" + } + }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "requires": { + "scrypt": "6.0.3", + "scryptsy": "1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "requires": { + "pbkdf2": "3.0.14" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "2.8.1" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "1.18.2", + "cors": "2.8.4", + "express": "4.16.2", + "request": "2.83.0", + "xhr": "2.4.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sha.js": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "sha3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", + "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", + "requires": { + "nan": "2.8.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shortid": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", + "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz", + "integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==", + "requires": { + "decompress-response": "3.3.0", + "once": "1.4.0", + "simple-concat": "1.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "requires": { + "hoek": "4.2.0" + } + }, + "solc": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.19.tgz", + "integrity": "sha512-hvi/vi9rQcB73poRLoLRfQIYKwmdhrNbZlOOFCGd5v58gEsYEUr3+oHPSXhyk4CFNchWC2ojpMYrHDJNm0h4jQ==", + "dev": true, + "requires": { + "fs-extra": "0.30.0", + "memorystream": "0.3.1", + "require-from-string": "1.2.1", + "semver": "5.5.0", + "yargs": "4.8.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "requires": { + "is-natural-number": "4.0.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "swarm-js": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", + "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", + "requires": { + "bluebird": "3.5.1", + "buffer": "5.0.8", + "decompress": "4.2.0", + "eth-lib": "0.1.27", + "fs-extra": "2.1.2", + "fs-promise": "2.0.3", + "got": "7.1.0", + "mime-types": "2.1.17", + "mkdirp-promise": "5.0.1", + "mock-fs": "4.4.2", + "setimmediate": "1.0.5", + "tar.gz": "1.0.7", + "xhr-request-promise": "0.1.2" + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-stream": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", + "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.1", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "tar.gz": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", + "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", + "requires": { + "bluebird": "2.11.0", + "commander": "2.8.1", + "fstream": "1.0.11", + "mout": "0.11.1", + "tar": "2.2.1" + }, + "dependencies": { + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + } + } + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "requires": { + "any-promise": "1.3.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": "3.3.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "timers-browserify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "truffle": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.6.tgz", + "integrity": "sha512-E4u1dZr2IGY4liulO/nGMtavx4jVLXIJp48lxFq54N+gMRGhmBQp5kf1etA3bYhHVtO9IO76qRiHMMVuId7cRg==", + "dev": true, + "requires": { + "mocha": "3.5.3", + "original-require": "1.0.1", + "solc": "0.4.19" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray-to-buffer": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz", + "integrity": "sha1-EBezLZhP9VbroQD1AViauhrOLgQ=", + "requires": { + "is-typedarray": "1.0.0" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbzip2-stream": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", + "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", + "requires": { + "buffer": "3.6.0", + "through": "2.3.8" + }, + "dependencies": { + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + } + } + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "utf8": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.6.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + } + }, + "web3": { + "version": "1.0.0-beta.26", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.26.tgz", + "integrity": "sha1-u0ba9q78MT92iz3jnX9KjXvQZmM=", + "requires": { + "web3-bzz": "1.0.0-beta.29", + "web3-core": "1.0.0-beta.29", + "web3-eth": "1.0.0-beta.29", + "web3-eth-personal": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29", + "web3-shh": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-bzz": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.29.tgz", + "integrity": "sha1-xAVVzjKB9jf8X1yD3HsIy+70K3I=", + "requires": { + "got": "7.1.0", + "swarm-js": "0.1.37", + "underscore": "1.8.3" + } + }, + "web3-core": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.29.tgz", + "integrity": "sha1-G/uc3AHMPqcZDplh+PeIa7Qc/PE=", + "requires": { + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-requestmanager": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-core-helpers": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.29.tgz", + "integrity": "sha1-kUJt7MEEEmI4TA3quRvXmnCLGQI=", + "requires": { + "underscore": "1.8.3", + "web3-eth-iban": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-core-method": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.29.tgz", + "integrity": "sha1-11trk9FuK5yoxPcc3G/ubCk2HHY=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-promievent": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-core-promievent": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.29.tgz", + "integrity": "sha1-zziMs052BSiFp8K9Fec1jDm32Zg=", + "requires": { + "bluebird": "3.3.1", + "eventemitter3": "1.1.1" + }, + "dependencies": { + "bluebird": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", + "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" + } + } + }, + "web3-core-requestmanager": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.29.tgz", + "integrity": "sha1-7s36oLtNJ8SEbEaFmJr2NVqxBzw=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "web3-providers-http": "1.0.0-beta.29", + "web3-providers-ipc": "1.0.0-beta.29", + "web3-providers-ws": "1.0.0-beta.29" + } + }, + "web3-core-subscriptions": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.29.tgz", + "integrity": "sha1-D5R1q0diCQC4gsrILsQr3NNbRKE=", + "requires": { + "eventemitter3": "1.1.1", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29" + } + }, + "web3-eth": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.29.tgz", + "integrity": "sha1-FTovYTcM50Qc4/JK5eFSC0K5PSQ=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-eth-abi": "1.0.0-beta.29", + "web3-eth-accounts": "1.0.0-beta.29", + "web3-eth-contract": "1.0.0-beta.29", + "web3-eth-iban": "1.0.0-beta.29", + "web3-eth-personal": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-eth-abi": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.29.tgz", + "integrity": "sha1-eRPArlRRAFmpjb0MubqG00IO+II=", + "requires": { + "bn.js": "4.11.6", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "web3-eth-accounts": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.29.tgz", + "integrity": "sha1-mG/z7X0XHam6egPByblLMb4vk+w=", + "requires": { + "bluebird": "3.3.1", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "scrypt.js": "0.2.0", + "underscore": "1.8.3", + "uuid": "2.0.1", + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + }, + "dependencies": { + "bluebird": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", + "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" + }, + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0", + "xhr-request-promise": "0.1.2" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, + "web3-eth-contract": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.29.tgz", + "integrity": "sha1-xXTGOpCEi5gvF2tBwt76tFmMSmk=", + "requires": { + "underscore": "1.8.3", + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-promievent": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-eth-abi": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-eth-iban": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.29.tgz", + "integrity": "sha1-eXSsE2X2WXdsxqv1xV4ty8Jw44E=", + "requires": { + "bn.js": "4.11.8", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-eth-personal": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.29.tgz", + "integrity": "sha1-qk0e+k7hR4fzcnuxw2DxLtfIqqI=", + "requires": { + "web3-core": "1.0.0-beta.29", + "web3-core-helpers": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-net": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.29.tgz", + "integrity": "sha1-8zYaw9o26FkB7hVh61K+5S2dS+4=", + "requires": { + "web3-core": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-utils": "1.0.0-beta.29" + } + }, + "web3-providers-http": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.29.tgz", + "integrity": "sha1-UAFYhAnMKxj4qqwJINUuOQR+Ir0=", + "requires": { + "web3-core-helpers": "1.0.0-beta.29", + "xhr2": "0.1.4" + } + }, + "web3-providers-ipc": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.29.tgz", + "integrity": "sha1-uMLaC1ql3KoqZc/tq/VXKyJV2rk=", + "requires": { + "oboe": "2.1.3", + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29" + } + }, + "web3-providers-ws": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.29.tgz", + "integrity": "sha1-LtnZsoj2IZs3+gV8XlsM/t3NAbs=", + "requires": { + "underscore": "1.8.3", + "web3-core-helpers": "1.0.0-beta.29", + "websocket": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c" + } + }, + "web3-shh": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.29.tgz", + "integrity": "sha1-HnA1Utrpa/Z7Y+RoNRSxRV+aWEY=", + "requires": { + "web3-core": "1.0.0-beta.29", + "web3-core-method": "1.0.0-beta.29", + "web3-core-subscriptions": "1.0.0-beta.29", + "web3-net": "1.0.0-beta.29" + } + }, + "web3-utils": { + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.29.tgz", + "integrity": "sha1-iZkl7RWyDV9wgU34o1Ji5Nb8pqk=", + "requires": { + "bn.js": "4.11.6", + "eth-lib": "0.1.27", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randomhex": "0.1.5", + "underscore": "1.8.3", + "utf8": "2.1.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "webpack": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", + "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "dev": true, + "requires": { + "acorn": "5.4.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "0.2.17", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "3.2.3", + "tapable": "0.2.8", + "uglify-js": "2.8.29", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "6.6.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket": { + "version": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c", + "requires": { + "debug": "2.6.9", + "nan": "2.8.0", + "typedarray-to-buffer": "3.1.2", + "yaeti": "0.0.6" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, + "xhr": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz", + "integrity": "sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==", + "requires": { + "global": "4.3.2", + "is-function": "1.0.1", + "parse-headers": "2.0.1", + "xtend": "4.0.1" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "0.0.5", + "object-assign": "4.1.1", + "query-string": "5.1.0", + "simple-get": "2.7.0", + "timed-out": "4.0.1", + "url-set-query": "1.0.0", + "xhr": "2.4.1" + } + }, + "xhr-request-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", + "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", + "requires": { + "xhr-request": "1.1.0" + } + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + } + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + } + } +} diff --git a/package.json b/package.json index a9986c5..ffc0a06 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "dependencies": { "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", - "chai": "^4.1.2", "moment": "^2.19.2", "shortid": "2.2.8", "web3": "1.0.0-beta.26" @@ -23,7 +22,8 @@ "truffle": "^4.0.1", "mustache": "2.3.0", "mocha": "^5.0.0", - "solc": "^0.4.19" + "solc": "^0.4.19", + "chai": "^4.1.2" }, "author": "OpenST Foundation Ltd.", "license": "LGPL-3.0" From 86c91c50a3c0833cc7f77e42f2af3eca0019c6fe Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Wed, 7 Feb 2018 16:44:28 +0100 Subject: [PATCH 029/242] Tests: Pricer getPricePoint. Relates to #12 --- test/Pricer.js | 4 ++- test/Pricer_get_price_point.js | 56 +++++++++++++++++++++++++++++++++ test/Pricer_set_price_oracle.js | 4 +-- 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 test/Pricer_get_price_point.js diff --git a/test/Pricer.js b/test/Pricer.js index f99ab97..b1852e7 100644 --- a/test/Pricer.js +++ b/test/Pricer.js @@ -24,7 +24,8 @@ const Pricer_utils = require('./Pricer_utils.js'), Pricer_properties = require('./Pricer_properties.js'), Pricer_set_price_oracle = require('./Pricer_set_price_oracle.js'), Pricer_unset_price_oracle = require('./Pricer_unset_price_oracle.js'), - Pricer_set_accepted_margin = require('./Pricer_set_accepted_margin.js'); + Pricer_set_accepted_margin = require('./Pricer_set_accepted_margin.js'), + Pricer_get_price_point = require('./Pricer_get_price_point.js'); contract('Pricer', function(accounts) { @@ -33,6 +34,7 @@ contract('Pricer', function(accounts) { describe('SetPriceOracle', async () => Pricer_set_price_oracle.perform(accounts)); describe('UnsetPriceOracle', async () => Pricer_unset_price_oracle.perform(accounts)); describe('SetAcceptedMargin', async () => Pricer_set_accepted_margin.perform(accounts)); + describe('GetPricePoint', async () => Pricer_get_price_point.perform(accounts)); after(async () => { Pricer_utils.utils.printGasStatistics(); Pricer_utils.utils.clearReceipts(); diff --git a/test/Pricer_get_price_point.js b/test/Pricer_get_price_point.js new file mode 100644 index 0000000..992fb67 --- /dev/null +++ b/test/Pricer_get_price_point.js @@ -0,0 +1,56 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: Pricer_get_price_point.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Pricer_utils = require('./Pricer_utils.js'); + +/// +/// Test stories +/// +/// fails if priceOracle is not set +/// successfully returns price from priceOracle + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1]; + const usdPrice = 20; + const eurPrice = 10; + + var response = null; + + before(async () => { + contracts = await Pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + usdPriceOracle = contracts.usdPriceOracle; + eurPriceOracle = contracts.eurPriceOracle; + await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); + await usdPriceOracle.setPrice(usdPrice, { from: opsAddress }); + await eurPriceOracle.setPrice(eurPrice, { from: opsAddress }); + }); + + it('fails if priceOracle is not set', async () => { + await Pricer_utils.utils.expectThrow(pricer.getPricePoint.call(Pricer_utils.currencies.ost)); + }); + + it('successfully returns price from priceOracle', async () => { + assert.equal((await pricer.getPricePoint.call(Pricer_utils.currencies.usd)).toNumber(), usdPrice); + assert.equal((await pricer.getPricePoint.call(Pricer_utils.currencies.eur)).toNumber(), eurPrice); + }); +} diff --git a/test/Pricer_set_price_oracle.js b/test/Pricer_set_price_oracle.js index 9634d83..6bc88dc 100644 --- a/test/Pricer_set_price_oracle.js +++ b/test/Pricer_set_price_oracle.js @@ -19,8 +19,8 @@ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'); -const PriceOracle = artifacts.require('./PriceOracle.sol'); +const Pricer_utils = require('./Pricer_utils.js'), + PriceOracle = artifacts.require('./PriceOracle.sol'); /// /// Test stories From fd44e7f2bbe58fe82dc7a8715868013dc682d38c Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 7 Feb 2018 21:19:19 +0530 Subject: [PATCH 030/242] Updated: .travis.yml --- .travis.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index bc62a20..78579eb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,14 +23,13 @@ before_install: - sudo apt-get install npm install: - npm install -before_script: - - nohup ./tools/runTestRpc.sh /dev/null 2>&1 & +before_script: script: - - truffle test - sh contracts/compile.sh - cd test/scripts/ + - pwd - sh travis_test.sh + - pwd after_script: - - kill $(ps aux | grep 'testrpc' | awk '{print $2}') - kill $(ps aux | grep 'geth' | awk '{print $2}') From 24ba4494110f0e88512edc85a62f57e06996d3ff Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Wed, 7 Feb 2018 21:24:02 +0530 Subject: [PATCH 031/242] Updated: travis.yml --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 78579eb..390e0fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,13 +23,16 @@ before_install: - sudo apt-get install npm install: - npm install -before_script: +before_script: + - nohup sh tools/runTestRpc.sh /dev/null 2>&1 & script: + - truffle test - sh contracts/compile.sh - cd test/scripts/ - pwd - sh travis_test.sh - pwd after_script: + - kill $(ps aux | grep 'testrpc' | awk '{print $2}') - kill $(ps aux | grep 'geth' | awk '{print $2}') From 368cfe9a33a1f76265b6ba9836185b80dd2d32a8 Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Wed, 7 Feb 2018 18:27:00 +0100 Subject: [PATCH 032/242] Tests: reorganize Pricer tests. Relates to #12 --- test/Pricer.js | 42 ---------------- test/contracts/pricer/base.js | 42 ++++++++++++++++ .../pricer/constructor.js} | 14 +++--- .../pricer/get_price_point.js} | 16 +++--- .../pricer/pricer_utils.js} | 8 +-- .../pricer/properties.js} | 10 ++-- .../pricer/set_accepted_margin.js} | 50 +++++++++---------- .../pricer/set_price_oracle.js} | 40 +++++++-------- .../pricer/unset_price_oracle.js} | 2 +- 9 files changed, 112 insertions(+), 112 deletions(-) delete mode 100644 test/Pricer.js create mode 100644 test/contracts/pricer/base.js rename test/{Pricer_constructor.js => contracts/pricer/constructor.js} (78%) rename test/{Pricer_get_price_point.js => contracts/pricer/get_price_point.js} (76%) rename test/{Pricer_utils.js => contracts/pricer/pricer_utils.js} (91%) rename test/{Pricer_properties.js => contracts/pricer/properties.js} (88%) rename test/{Pricer_set_accepted_margin.js => contracts/pricer/set_accepted_margin.js} (60%) rename test/{Pricer_set_price_oracle.js => contracts/pricer/set_price_oracle.js} (63%) rename test/{Pricer_unset_price_oracle.js => contracts/pricer/unset_price_oracle.js} (98%) diff --git a/test/Pricer.js b/test/Pricer.js deleted file mode 100644 index b1852e7..0000000 --- a/test/Pricer.js +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 OST.com Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// ---------------------------------------------------------------------------- -// Test: Pricer.js -// -// http://www.simpletoken.org/ -// -// ---------------------------------------------------------------------------- - -const Pricer_utils = require('./Pricer_utils.js'), - Pricer_constructor = require('./Pricer_constructor.js'), - Pricer_properties = require('./Pricer_properties.js'), - Pricer_set_price_oracle = require('./Pricer_set_price_oracle.js'), - Pricer_unset_price_oracle = require('./Pricer_unset_price_oracle.js'), - Pricer_set_accepted_margin = require('./Pricer_set_accepted_margin.js'), - Pricer_get_price_point = require('./Pricer_get_price_point.js'); - -contract('Pricer', function(accounts) { - - describe('Constructor', async () => Pricer_constructor.perform()); - describe('Properties', async () => Pricer_properties.perform(accounts)); - describe('SetPriceOracle', async () => Pricer_set_price_oracle.perform(accounts)); - describe('UnsetPriceOracle', async () => Pricer_unset_price_oracle.perform(accounts)); - describe('SetAcceptedMargin', async () => Pricer_set_accepted_margin.perform(accounts)); - describe('GetPricePoint', async () => Pricer_get_price_point.perform(accounts)); - after(async () => { - Pricer_utils.utils.printGasStatistics(); - Pricer_utils.utils.clearReceipts(); - }); -}); diff --git a/test/contracts/pricer/base.js b/test/contracts/pricer/base.js new file mode 100644 index 0000000..49a860d --- /dev/null +++ b/test/contracts/pricer/base.js @@ -0,0 +1,42 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: base.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const pricer_utils = require('./pricer_utils.js'), + constructor = require('./constructor.js'), + properties = require('./properties.js'), + set_price_oracle = require('./set_price_oracle.js'), + unset_price_oracle = require('./unset_price_oracle.js'), + set_accepted_margin = require('./set_accepted_margin.js'), + get_price_point = require('./get_price_point.js'); + +contract('Pricer', function(accounts) { + + describe('Constructor', async () => constructor.perform()); + describe('Properties', async () => properties.perform(accounts)); + describe('SetPriceOracle', async () => set_price_oracle.perform(accounts)); + describe('UnsetPriceOracle', async () => unset_price_oracle.perform(accounts)); + describe('SetAcceptedMargin', async () => set_accepted_margin.perform(accounts)); + describe('GetPricePoint', async () => get_price_point.perform(accounts)); + after(async () => { + pricer_utils.utils.printGasStatistics(); + pricer_utils.utils.clearReceipts(); + }); +}); diff --git a/test/Pricer_constructor.js b/test/contracts/pricer/constructor.js similarity index 78% rename from test/Pricer_constructor.js rename to test/contracts/pricer/constructor.js index 93fd485..0ac1f29 100644 --- a/test/Pricer_constructor.js +++ b/test/contracts/pricer/constructor.js @@ -13,13 +13,13 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_constructor.js +// Test: constructor.js // // http://www.simpletoken.org/ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'), +const pricer_utils = require('./pricer_utils.js'), Pricer = artifacts.require('./Pricer.sol'), EIP20TokenMock = artifacts.require('./EIP20TokenMock.sol'); @@ -35,19 +35,19 @@ module.exports.perform = () => { var response = null; before(async () => { - token = await EIP20TokenMock.new(1, Pricer_utils.currencies.ost, 'name', 18); + token = await EIP20TokenMock.new(1, pricer_utils.currencies.ost, 'name', 18); }); it('fails to deploy if brandedToken is null', async () => { - await Pricer_utils.utils.expectThrow(Pricer.new(0, Pricer_utils.currencies.ost)); + await pricer_utils.utils.expectThrow(Pricer.new(0, pricer_utils.currencies.ost)); }); it('fails to deploy if baseCurrency is empty', async () => { - await Pricer_utils.utils.expectThrow(Pricer.new(token.address, '')); + await pricer_utils.utils.expectThrow(Pricer.new(token.address, '')); }); it('successfully deploys', async () => { - response = await Pricer.new(token.address, Pricer_utils.currencies.ost); - Pricer_utils.utils.logTransaction(response.transactionHash, 'Pricer.constructor'); + response = await Pricer.new(token.address, pricer_utils.currencies.ost); + pricer_utils.utils.logTransaction(response.transactionHash, 'Pricer.constructor'); }); } diff --git a/test/Pricer_get_price_point.js b/test/contracts/pricer/get_price_point.js similarity index 76% rename from test/Pricer_get_price_point.js rename to test/contracts/pricer/get_price_point.js index 992fb67..086cdbf 100644 --- a/test/Pricer_get_price_point.js +++ b/test/contracts/pricer/get_price_point.js @@ -13,13 +13,13 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_get_price_point.js +// Test: get_price_point.js // // http://www.simpletoken.org/ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'); +const pricer_utils = require('./pricer_utils.js'); /// /// Test stories @@ -35,22 +35,22 @@ module.exports.perform = (accounts) => { var response = null; before(async () => { - contracts = await Pricer_utils.deployPricer(artifacts, accounts); + contracts = await pricer_utils.deployPricer(artifacts, accounts); pricer = contracts.pricer; usdPriceOracle = contracts.usdPriceOracle; eurPriceOracle = contracts.eurPriceOracle; - await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); - await pricer.setPriceOracle(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); await usdPriceOracle.setPrice(usdPrice, { from: opsAddress }); await eurPriceOracle.setPrice(eurPrice, { from: opsAddress }); }); it('fails if priceOracle is not set', async () => { - await Pricer_utils.utils.expectThrow(pricer.getPricePoint.call(Pricer_utils.currencies.ost)); + await pricer_utils.utils.expectThrow(pricer.getPricePoint.call(pricer_utils.currencies.ost)); }); it('successfully returns price from priceOracle', async () => { - assert.equal((await pricer.getPricePoint.call(Pricer_utils.currencies.usd)).toNumber(), usdPrice); - assert.equal((await pricer.getPricePoint.call(Pricer_utils.currencies.eur)).toNumber(), eurPrice); + assert.equal((await pricer.getPricePoint.call(pricer_utils.currencies.usd)).toNumber(), usdPrice); + assert.equal((await pricer.getPricePoint.call(pricer_utils.currencies.eur)).toNumber(), eurPrice); }); } diff --git a/test/Pricer_utils.js b/test/contracts/pricer/pricer_utils.js similarity index 91% rename from test/Pricer_utils.js rename to test/contracts/pricer/pricer_utils.js index 6275ef2..120a079 100644 --- a/test/Pricer_utils.js +++ b/test/contracts/pricer/pricer_utils.js @@ -13,13 +13,13 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_utils.js +// Test: pricer_utils.js // // http://www.simpletoken.org/ // // ---------------------------------------------------------------------------- -const Utils = require('./lib/utils.js'), +const Utils = require('../../lib/utils.js'), BigNumber = require('bignumber.js'), Pricer = artifacts.require('./Pricer.sol'), EIP20TokenMock = artifacts.require('./EIP20TokenMock.sol'), @@ -30,7 +30,7 @@ const ost = 'OST', eur = 'EUR'; /// @dev Export common requires -module.exports.utils = Utils; +module.exports.utils = Utils; module.exports.bigNumber = BigNumber; /// @dev Export constants @@ -42,7 +42,7 @@ module.exports.currencies = { /// @dev Deploy module.exports.deployPricer = async (artifacts, accounts) => { - const token = await EIP20TokenMock.new(1, ost, 'name', 18), + const token = await EIP20TokenMock.new(10, ost, 'name', 18), TOKEN_DECIMALS = 18, opsAddress = accounts[1], pricer = await Pricer.new(token.address, ost), diff --git a/test/Pricer_properties.js b/test/contracts/pricer/properties.js similarity index 88% rename from test/Pricer_properties.js rename to test/contracts/pricer/properties.js index 09b1b3c..4e345a1 100644 --- a/test/Pricer_properties.js +++ b/test/contracts/pricer/properties.js @@ -13,13 +13,13 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_properties.js +// Test: properties.js // // http://www.simpletoken.org/ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'); +const pricer_utils = require('./pricer_utils.js'); /// /// Test stories @@ -31,10 +31,10 @@ const Pricer_utils = require('./Pricer_utils.js'); module.exports.perform = (accounts) => { const TOKEN_DECIMALS = 18, - conversionRate = 1; + conversionRate = 10; before(async () => { - contracts = await Pricer_utils.deployPricer(artifacts, accounts); + contracts = await pricer_utils.deployPricer(artifacts, accounts); token = contracts.token; pricer = contracts.pricer; }); @@ -44,7 +44,7 @@ module.exports.perform = (accounts) => { }); it('has baseCurrency', async () => { - assert.equal(web3.toAscii(await pricer.baseCurrency.call()), Pricer_utils.currencies.ost); + assert.equal(web3.toAscii(await pricer.baseCurrency.call()), pricer_utils.currencies.ost); }); it('has decimals', async () => { diff --git a/test/Pricer_set_accepted_margin.js b/test/contracts/pricer/set_accepted_margin.js similarity index 60% rename from test/Pricer_set_accepted_margin.js rename to test/contracts/pricer/set_accepted_margin.js index 6e5af56..011f7ef 100644 --- a/test/Pricer_set_accepted_margin.js +++ b/test/contracts/pricer/set_accepted_margin.js @@ -13,13 +13,13 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_set_accepted_margin.js +// Test: set_accepted_margin.js // // http://www.simpletoken.org/ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'); +const pricer_utils = require('./pricer_utils.js'); /// /// Test stories @@ -30,44 +30,44 @@ const Pricer_utils = require('./Pricer_utils.js'); module.exports.perform = (accounts) => { const opsAddress = accounts[1]; - var response = null; - var acceptedMargin = null; + var response = null, + acceptedMargin = null; before(async () => { - contracts = await Pricer_utils.deployPricer(artifacts, accounts); + contracts = await pricer_utils.deployPricer(artifacts, accounts); pricer = contracts.pricer; usdPriceOracle = contracts.usdPriceOracle; eurPriceOracle = contracts.eurPriceOracle; - await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); }); it('fails to set acceptedMargin by non-ops', async () => { acceptedMargin = 1; - await Pricer_utils.utils.expectThrow(pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin)); + await pricer_utils.utils.expectThrow(pricer.setAcceptedMargin.call(pricer_utils.currencies.usd, acceptedMargin)); }); it('successfully sets acceptedMargin', async () => { // Sets accepted margin multiple times to show range of gas usages - acceptedMargin = new Pricer_utils.bigNumber(0); - assert.ok(await pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); - response = await pricer.setAcceptedMargin(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); - assert.equal((await pricer.acceptedMargins.call(Pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); - checkAcceptedMarginSetEvent(response.logs[0], Pricer_utils.currencies.usd, acceptedMargin); - Pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); + acceptedMargin = new pricer_utils.bigNumber(0); + assert.ok(await pricer.setAcceptedMargin.call(pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); + response = await pricer.setAcceptedMargin(pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); + assert.equal((await pricer.acceptedMargins.call(pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); + checkAcceptedMarginSetEvent(response.logs[0], pricer_utils.currencies.usd, acceptedMargin); + pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); - acceptedMargin = new Pricer_utils.bigNumber(1); - assert.ok(await pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); - response = await pricer.setAcceptedMargin(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); - assert.equal((await pricer.acceptedMargins.call(Pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); - checkAcceptedMarginSetEvent(response.logs[0], Pricer_utils.currencies.usd, acceptedMargin); - Pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); + acceptedMargin = new pricer_utils.bigNumber(1); + assert.ok(await pricer.setAcceptedMargin.call(pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); + response = await pricer.setAcceptedMargin(pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); + assert.equal((await pricer.acceptedMargins.call(pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); + checkAcceptedMarginSetEvent(response.logs[0], pricer_utils.currencies.usd, acceptedMargin); + pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); - acceptedMargin = new Pricer_utils.bigNumber(7.778 * 10**18); - assert.ok(await pricer.setAcceptedMargin.call(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); - response = await pricer.setAcceptedMargin(Pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); - assert.equal((await pricer.acceptedMargins.call(Pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); - checkAcceptedMarginSetEvent(response.logs[0], Pricer_utils.currencies.usd, acceptedMargin); - Pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); + acceptedMargin = new pricer_utils.bigNumber(7.778 * 10**17); // 10**17 to ease readability in gas usage output + assert.ok(await pricer.setAcceptedMargin.call(pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress })); + response = await pricer.setAcceptedMargin(pricer_utils.currencies.usd, acceptedMargin, { from: opsAddress }); + assert.equal((await pricer.acceptedMargins.call(pricer_utils.currencies.usd)).toNumber(), acceptedMargin.toNumber()); + checkAcceptedMarginSetEvent(response.logs[0], pricer_utils.currencies.usd, acceptedMargin); + pricer_utils.utils.logResponse(response, 'Pricer.setAcceptedMargin: ' + acceptedMargin); }); } diff --git a/test/Pricer_set_price_oracle.js b/test/contracts/pricer/set_price_oracle.js similarity index 63% rename from test/Pricer_set_price_oracle.js rename to test/contracts/pricer/set_price_oracle.js index 6bc88dc..c7c7dfb 100644 --- a/test/Pricer_set_price_oracle.js +++ b/test/contracts/pricer/set_price_oracle.js @@ -13,13 +13,13 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_set_price_oracle.js +// Test: set_price_oracle.js // // http://www.simpletoken.org/ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'), +const pricer_utils = require('./pricer_utils.js'), PriceOracle = artifacts.require('./PriceOracle.sol'); /// @@ -38,46 +38,46 @@ module.exports.perform = (accounts) => { var response = null; before(async () => { - contracts = await Pricer_utils.deployPricer(artifacts, accounts); + contracts = await pricer_utils.deployPricer(artifacts, accounts); pricer = contracts.pricer; usdPriceOracle = contracts.usdPriceOracle; eurPriceOracle = contracts.eurPriceOracle; }); it('fails to set priceOracle by non-ops', async () => { - await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(Pricer_utils.currencies.usd, usdPriceOracle.address)); + await pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(pricer_utils.currencies.usd, usdPriceOracle.address)); }); it('fails to set priceOracle if oracleAddress is null', async () => { - await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(Pricer_utils.currencies.usd, 0, { from: opsAddress })); + await pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(pricer_utils.currencies.usd, 0, { from: opsAddress })); }); it('fails to set priceOracle if currency is empty', async () => { - await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call('', usdPriceOracle.address, { from: opsAddress })); + await pricer_utils.utils.expectThrow(pricer.setPriceOracle.call('', usdPriceOracle.address, { from: opsAddress })); }); it('fails to set priceOracle if oracle baseCurrency does not match pricer baseCurrency', async () => { - var inappositeOracle = await PriceOracle.new(Pricer_utils.currencies.usd, Pricer_utils.currencies.ost); - await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call( - Pricer_utils.currencies.usd, inappositeOracle.address, { from: opsAddress })); + var inappositeOracle = await PriceOracle.new(pricer_utils.currencies.usd, pricer_utils.currencies.ost); + await pricer_utils.utils.expectThrow(pricer.setPriceOracle.call( + pricer_utils.currencies.usd, inappositeOracle.address, { from: opsAddress })); }); it('fails to set priceOracle if oracle quoteCurrency does not match currency', async () => { - await Pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(Pricer_utils.currencies.eur, usdPriceOracle.address)); + await pricer_utils.utils.expectThrow(pricer.setPriceOracle.call(pricer_utils.currencies.eur, usdPriceOracle.address)); }); it('successfully sets priceOracles', async () => { - assert.ok(await pricer.setPriceOracle.call(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress })); - response = await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); - assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.usd), usdPriceOracle.address); - checkPriceOracleSetEvent(response.logs[0], Pricer_utils.currencies.usd, usdPriceOracle.address); - Pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + Pricer_utils.currencies.usd); + assert.ok(await pricer.setPriceOracle.call(pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress })); + response = await pricer.setPriceOracle(pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + assert.equal(await pricer.priceOracles.call(pricer_utils.currencies.usd), usdPriceOracle.address); + checkPriceOracleSetEvent(response.logs[0], pricer_utils.currencies.usd, usdPriceOracle.address); + pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + pricer_utils.currencies.usd); - assert.ok(await pricer.setPriceOracle.call(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress })); - response = await pricer.setPriceOracle(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); - assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.eur), eurPriceOracle.address); - checkPriceOracleSetEvent(response.logs[0], Pricer_utils.currencies.eur, eurPriceOracle.address); - Pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + Pricer_utils.currencies.eur); + assert.ok(await pricer.setPriceOracle.call(pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress })); + response = await pricer.setPriceOracle(pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); + assert.equal(await pricer.priceOracles.call(pricer_utils.currencies.eur), eurPriceOracle.address); + checkPriceOracleSetEvent(response.logs[0], pricer_utils.currencies.eur, eurPriceOracle.address); + pricer_utils.utils.logResponse(response, 'Pricer.setPriceOracle: ' + pricer_utils.currencies.eur); }); } diff --git a/test/Pricer_unset_price_oracle.js b/test/contracts/pricer/unset_price_oracle.js similarity index 98% rename from test/Pricer_unset_price_oracle.js rename to test/contracts/pricer/unset_price_oracle.js index c8dab62..3388e14 100644 --- a/test/Pricer_unset_price_oracle.js +++ b/test/contracts/pricer/unset_price_oracle.js @@ -13,7 +13,7 @@ // limitations under the License. // // ---------------------------------------------------------------------------- -// Test: Pricer_unset_price_oracle.js +// Test: unset_price_oracle.js // // http://www.simpletoken.org/ // From 693d8df4b6d2c13108fab04477ede576b4b89f86 Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Wed, 7 Feb 2018 20:36:48 +0100 Subject: [PATCH 033/242] Tests: use latest PriceOracle; Pricer getPricePointAndCalculatedAmounts. Relates to #12 --- contracts/ost-price-oracle/PriceOracle.sol | 3 +- test/contracts/pricer/base.js | 16 ++-- test/contracts/pricer/get_price_point.js | 6 +- .../get_price_point_and_calculated_amounts.js | 93 +++++++++++++++++++ 4 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 test/contracts/pricer/get_price_point_and_calculated_amounts.js diff --git a/contracts/ost-price-oracle/PriceOracle.sol b/contracts/ost-price-oracle/PriceOracle.sol index 52adb27..80f32ea 100644 --- a/contracts/ost-price-oracle/PriceOracle.sol +++ b/contracts/ost-price-oracle/PriceOracle.sol @@ -1,3 +1,4 @@ +/* solhint-disable-next-line compiler-fixed */ pragma solidity ^0.4.17; // Copyright 2017 OST.com Ltd. @@ -89,7 +90,7 @@ contract PriceOracle is OpsManaged, PriceOracleInterface { price = _price; // update the expiration height - oracleExpirationHeight = block.number + PRICE_VALIDITY_DURATION; + oracleExpirationHeight = block.number + priceValidityDuration(); // Event Emitted PriceUpdated(_price, oracleExpirationHeight); diff --git a/test/contracts/pricer/base.js b/test/contracts/pricer/base.js index 49a860d..8dce7cd 100644 --- a/test/contracts/pricer/base.js +++ b/test/contracts/pricer/base.js @@ -19,13 +19,14 @@ // // ---------------------------------------------------------------------------- -const pricer_utils = require('./pricer_utils.js'), - constructor = require('./constructor.js'), - properties = require('./properties.js'), - set_price_oracle = require('./set_price_oracle.js'), - unset_price_oracle = require('./unset_price_oracle.js'), - set_accepted_margin = require('./set_accepted_margin.js'), - get_price_point = require('./get_price_point.js'); +const pricer_utils = require('./pricer_utils.js'), + constructor = require('./constructor.js'), + properties = require('./properties.js'), + set_price_oracle = require('./set_price_oracle.js'), + unset_price_oracle = require('./unset_price_oracle.js'), + set_accepted_margin = require('./set_accepted_margin.js'), + get_price_point = require('./get_price_point.js'), + get_price_point_and_calculated_amounts = require('./get_price_point_and_calculated_amounts.js'); contract('Pricer', function(accounts) { @@ -35,6 +36,7 @@ contract('Pricer', function(accounts) { describe('UnsetPriceOracle', async () => unset_price_oracle.perform(accounts)); describe('SetAcceptedMargin', async () => set_accepted_margin.perform(accounts)); describe('GetPricePoint', async () => get_price_point.perform(accounts)); + describe('GetPricePointAndCalculatedAmounts', async () => get_price_point_and_calculated_amounts.perform(accounts)); after(async () => { pricer_utils.utils.printGasStatistics(); pricer_utils.utils.clearReceipts(); diff --git a/test/contracts/pricer/get_price_point.js b/test/contracts/pricer/get_price_point.js index 086cdbf..1077273 100644 --- a/test/contracts/pricer/get_price_point.js +++ b/test/contracts/pricer/get_price_point.js @@ -28,9 +28,9 @@ const pricer_utils = require('./pricer_utils.js'); /// successfully returns price from priceOracle module.exports.perform = (accounts) => { - const opsAddress = accounts[1]; - const usdPrice = 20; - const eurPrice = 10; + const opsAddress = accounts[1], + usdPrice = new pricer_utils.bigNumber(20 * 10**18), + eurPrice = new pricer_utils.bigNumber(10 * 10**18); var response = null; diff --git a/test/contracts/pricer/get_price_point_and_calculated_amounts.js b/test/contracts/pricer/get_price_point_and_calculated_amounts.js new file mode 100644 index 0000000..dbbc1b3 --- /dev/null +++ b/test/contracts/pricer/get_price_point_and_calculated_amounts.js @@ -0,0 +1,93 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: get_price_point_and_calculated_amounts.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const pricer_utils = require('./pricer_utils.js'); + + // function getPricePointAndCalculatedAmounts( + // uint256 _transferAmount, + // uint256 _commissionAmount, + // bytes3 _currency) + // public + // returns ( + // uint256 pricePoint, + // uint256 tokenAmount, + // uint256 commissionTokenAmount) + +/// +/// Test stories +/// +/// fails to get pricePoint and calculated amounts if currency is empty +/// fails to get pricePoint and calculated amounts if priceOracle is not set +/// fails to get pricePoint and calculated amounts if pricePoint is 0 +/// successfully gets pricePoints and calculated amounts + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1], + usdPrice = new pricer_utils.bigNumber(20 * 10**18), + eurPrice = new pricer_utils.bigNumber(10 * 10**18), + conversionRate = 10, + transferAmount = new pricer_utils.bigNumber(5 * 10**18), + commissionAmount = new pricer_utils.bigNumber(1.25 * 10**18); + + before(async () => { + contracts = await pricer_utils.deployPricer(artifacts, accounts); + pricer = contracts.pricer; + usdPriceOracle = contracts.usdPriceOracle; + eurPriceOracle = contracts.eurPriceOracle; + await pricer.setPriceOracle(pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); + await eurPriceOracle.setPrice(eurPrice, { from: opsAddress }); + }); + + it('fails to get pricePoint and calculated amounts if currency is empty', async () => { + await pricer_utils.utils.expectThrow(pricer.getPricePointAndCalculatedAmounts.call( + transferAmount, commissionAmount, '')); + }); + + it('fails to get pricePoint and calculated amounts if priceOracle is not set', async () => { + await pricer_utils.utils.expectThrow(pricer.getPricePointAndCalculatedAmounts.call( + transferAmount, commissionAmount, pricer_utils.currencies.ost)); + }); + + it('fails to get pricePoint and calculated amounts if pricePoint is 0', async () => { + // usdPriceOracle price is not yet set, so will return 0 for pricePoint + await pricer_utils.utils.expectThrow(pricer.getPricePointAndCalculatedAmounts.call( + transferAmount, commissionAmount, pricer_utils.currencies.usd)); + }); + + it('successfully gets pricePoints and calculated amounts', async () => { + // set usdPriceOracle price + await usdPriceOracle.setPrice(usdPrice, { from: opsAddress }); + + var returns = await pricer.getPricePointAndCalculatedAmounts.call( + transferAmount, commissionAmount, pricer_utils.currencies.usd); + assert.equal(returns[0].toNumber(), usdPrice.toNumber()); + assert.equal(returns[1].toNumber(), new pricer_utils.bigNumber(2.5 * 10**18)); + assert.equal(returns[2].toNumber(), new pricer_utils.bigNumber(0.625 * 10**18)); + + var returns = await pricer.getPricePointAndCalculatedAmounts.call( + transferAmount, commissionAmount, pricer_utils.currencies.eur); + assert.equal(returns[0].toNumber(), eurPrice.toNumber()); + assert.equal(returns[1].toNumber(), new pricer_utils.bigNumber(5 * 10**18)); + assert.equal(returns[2].toNumber(), new pricer_utils.bigNumber(1.25 * 10**18)); + }); + +} \ No newline at end of file From a650c4f967ab9b555f7bc6f0d6102966f1dc41b9 Mon Sep 17 00:00:00 2001 From: Jason Banks Date: Wed, 7 Feb 2018 22:03:34 +0100 Subject: [PATCH 034/242] Tests: Pricer pay; small tweaks. Relates to #12 --- test/contracts/pricer/base.js | 7 +- .../get_price_point_and_calculated_amounts.js | 10 -- test/contracts/pricer/pay.js | 151 ++++++++++++++++++ test/contracts/pricer/unset_price_oracle.js | 24 +-- 4 files changed, 168 insertions(+), 24 deletions(-) create mode 100644 test/contracts/pricer/pay.js diff --git a/test/contracts/pricer/base.js b/test/contracts/pricer/base.js index 8dce7cd..334390c 100644 --- a/test/contracts/pricer/base.js +++ b/test/contracts/pricer/base.js @@ -26,10 +26,12 @@ const pricer_utils = require('./pricer_utils.js'), unset_price_oracle = require('./unset_price_oracle.js'), set_accepted_margin = require('./set_accepted_margin.js'), get_price_point = require('./get_price_point.js'), - get_price_point_and_calculated_amounts = require('./get_price_point_and_calculated_amounts.js'); + get_price_point_and_calculated_amounts = require('./get_price_point_and_calculated_amounts.js'), + pay = require('./pay.js'); contract('Pricer', function(accounts) { - + // TODO: include PricerMock that wraps getBTAmountFromCurrencyValue and isPricePointInRange + // by public functions to enable testing OR make them public functions describe('Constructor', async () => constructor.perform()); describe('Properties', async () => properties.perform(accounts)); describe('SetPriceOracle', async () => set_price_oracle.perform(accounts)); @@ -37,6 +39,7 @@ contract('Pricer', function(accounts) { describe('SetAcceptedMargin', async () => set_accepted_margin.perform(accounts)); describe('GetPricePoint', async () => get_price_point.perform(accounts)); describe('GetPricePointAndCalculatedAmounts', async () => get_price_point_and_calculated_amounts.perform(accounts)); + describe('Pay', async () => pay.perform(accounts)); after(async () => { pricer_utils.utils.printGasStatistics(); pricer_utils.utils.clearReceipts(); diff --git a/test/contracts/pricer/get_price_point_and_calculated_amounts.js b/test/contracts/pricer/get_price_point_and_calculated_amounts.js index dbbc1b3..e64b08a 100644 --- a/test/contracts/pricer/get_price_point_and_calculated_amounts.js +++ b/test/contracts/pricer/get_price_point_and_calculated_amounts.js @@ -21,16 +21,6 @@ const pricer_utils = require('./pricer_utils.js'); - // function getPricePointAndCalculatedAmounts( - // uint256 _transferAmount, - // uint256 _commissionAmount, - // bytes3 _currency) - // public - // returns ( - // uint256 pricePoint, - // uint256 tokenAmount, - // uint256 commissionTokenAmount) - /// /// Test stories /// diff --git a/test/contracts/pricer/pay.js b/test/contracts/pricer/pay.js new file mode 100644 index 0000000..818fc82 --- /dev/null +++ b/test/contracts/pricer/pay.js @@ -0,0 +1,151 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: pay.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const pricer_utils = require('./pricer_utils.js'); + +/// +/// Test stories +/// +/// fails to pay if beneficiary is null +/// fails to pay if _transferAmount is 0 +/// fails to pay if _commissionAmount > 0 and _commissionBeneficiary is null +/// when currency is not empty +/// fails to pay if pricePoint is not > 0 +/// fails to pay if pricePoint is not in range +/// succesfully pays + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1], + usdPrice = new pricer_utils.bigNumber(20 * 10**18), + conversionRate = 10, + transferAmount = new pricer_utils.bigNumber(5 * 10**18), + commissionAmount = new pricer_utils.bigNumber(1.25 * 10**18), + beneficiary = accounts[2], + commissionBeneficiary = accounts[3]; + + var response = null, + intendedPricePoint = null; + + before(async () => { + contracts = await pricer_utils.deployPricer(artifacts, accounts); + token = contracts.token; + pricer = contracts.pricer; + usdPriceOracle = contracts.usdPriceOracle; + await pricer.setPriceOracle(pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + await usdPriceOracle.setPrice(usdPrice, { from: opsAddress }); + intendedPricePoint = await pricer.getPricePoint.call(pricer_utils.currencies.usd); + await token.setBalance(accounts[0], new pricer_utils.bigNumber(100 * 10**18)); + }); + + it('fails to pay if beneficiary is null', async () => { + await token.approve(pricer.address, transferAmount.plus(commissionAmount)); + await pricer_utils.utils.expectThrow(pricer.pay.call( + 0, transferAmount, commissionBeneficiary, commissionAmount, '', intendedPricePoint)); + }); + + it('fails to pay if _transferAmount is 0', async () => { + await token.approve(pricer.address, transferAmount.plus(commissionAmount)); + await pricer_utils.utils.expectThrow(pricer.pay.call( + beneficiary, 0, commissionBeneficiary, commissionAmount, '', intendedPricePoint)); + }); + + it('fails to pay if _commissionAmount > 0 and _commissionBeneficiary is null', async () => { + await token.approve(pricer.address, transferAmount.plus(commissionAmount)); + await pricer_utils.utils.expectThrow(pricer.pay.call( + beneficiary, transferAmount, 0, commissionAmount, '', intendedPricePoint)); + }); + + it('succesfully pays', async () => { + // without commission + + // reset token balances to 0 + await token.setBalance(beneficiary, 0); + assert.equal(await token.balanceOf.call(beneficiary), 0); + + await token.approve(pricer.address, transferAmount); + assert.ok(await pricer.pay.call(beneficiary, transferAmount, 0, 0, '', 0)); + response = await pricer.pay(beneficiary, transferAmount, 0, 0, '', 0); + assert.equal((await token.balanceOf(beneficiary)).toNumber(), transferAmount); + checkPaymentEvent(response.logs[0], beneficiary, transferAmount, 0, 0, '', 0); + pricer_utils.utils.logResponse(response, 'Pricer.pay: ' + transferAmount); + + // with commission + + // reset token balances to 0 + await token.setBalance(beneficiary, 0); + await token.setBalance(commissionBeneficiary, 0); + + assert.equal(await token.balanceOf.call(beneficiary), 0); + assert.equal(await token.balanceOf.call(commissionBeneficiary), 0); + await token.approve(pricer.address, transferAmount.plus(commissionAmount)); + assert.ok(await pricer.pay.call(beneficiary, transferAmount, commissionBeneficiary, commissionAmount, '', 0)); + response = await pricer.pay(beneficiary, transferAmount, commissionBeneficiary, commissionAmount, '', 0); + assert.equal((await token.balanceOf(beneficiary)).toNumber(), transferAmount); + assert.equal((await token.balanceOf(commissionBeneficiary)).toNumber(), commissionAmount); + checkPaymentEvent(response.logs[0], beneficiary, transferAmount, commissionBeneficiary, commissionAmount, '', 0); + pricer_utils.utils.logResponse(response, 'Pricer.pay: ' + transferAmount.plus(commissionAmount)); + }); + + context('when currency is not empty', async () => { + it('fails to pay if pricePoint is not > 0', async () => { + await pricer_utils.utils.expectThrow(pricer.pay.call( + beneficiary, transferAmount, 0, 0, pricer_utils.currencies.eur, intendedPricePoint)); + }); + + it('fails to pay if pricePoint is not in range', async () => { + await pricer_utils.utils.expectThrow(pricer.pay.call( + beneficiary, transferAmount, 0, 0, pricer_utils.currencies.usd, intendedPricePoint.plus(1))); + }); + + it('succesfully pays', async () => { + // reset token balances to 0 + await token.setBalance(beneficiary, 0); + assert.equal(await token.balanceOf.call(beneficiary), 0); + + // get amount of tokens from currency value + var convertedTransferAmount = (await pricer.getPricePointAndCalculatedAmounts.call( + transferAmount, commissionAmount, pricer_utils.currencies.usd))[1]; + + await token.approve(pricer.address, convertedTransferAmount); + assert.ok(await pricer.pay.call(beneficiary, transferAmount, 0, 0, pricer_utils.currencies.usd, intendedPricePoint)); + response = await pricer.pay(beneficiary, transferAmount, 0, 0, pricer_utils.currencies.usd, intendedPricePoint); + assert.equal((await token.balanceOf(beneficiary)).toNumber(), convertedTransferAmount); + + // Note: Payment event publishes unconverted values--this is OK because the Transfer event will show convertedTransferAmount + checkPaymentEvent(response.logs[0], beneficiary, transferAmount, 0, 0, pricer_utils.currencies.usd, intendedPricePoint); + pricer_utils.utils.logResponse(response, 'Pricer.pay (currency): ' + transferAmount); + }); + + }); + +} + +function checkPaymentEvent(event, _beneficiary, _transferAmount, _commissionBeneficiary, _commissionAmount, _currency, _intendedPricePoint) { + assert.equal(event.event, 'Payment'); + assert.equal(event.args._beneficiary, _beneficiary); + assert.equal(event.args._transferAmount.toNumber(), _transferAmount); + assert.equal(event.args._commissionBeneficiary, _commissionBeneficiary); + assert.equal(event.args._commissionAmount.toNumber(), _commissionAmount); + if (_currency) { + assert.equal(web3.toAscii(event.args._currency), _currency); + } + assert.equal(event.args._intendedPricePoint.toNumber(), _intendedPricePoint); +} diff --git a/test/contracts/pricer/unset_price_oracle.js b/test/contracts/pricer/unset_price_oracle.js index 3388e14..d03504b 100644 --- a/test/contracts/pricer/unset_price_oracle.js +++ b/test/contracts/pricer/unset_price_oracle.js @@ -19,7 +19,7 @@ // // ---------------------------------------------------------------------------- -const Pricer_utils = require('./Pricer_utils.js'); +const pricer_utils = require('./pricer_utils.js'); /// /// Test stories @@ -34,31 +34,31 @@ module.exports.perform = (accounts) => { var response = null; before(async () => { - contracts = await Pricer_utils.deployPricer(artifacts, accounts); + contracts = await pricer_utils.deployPricer(artifacts, accounts); pricer = contracts.pricer; usdPriceOracle = contracts.usdPriceOracle; eurPriceOracle = contracts.eurPriceOracle; - await pricer.setPriceOracle(Pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); - await pricer.setPriceOracle(Pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(pricer_utils.currencies.usd, usdPriceOracle.address, { from: opsAddress }); + await pricer.setPriceOracle(pricer_utils.currencies.eur, eurPriceOracle.address, { from: opsAddress }); }); it('fails to set priceOracle by non-ops', async () => { - await Pricer_utils.utils.expectThrow(pricer.unsetPriceOracle.call(Pricer_utils.currencies.usd)); + await pricer_utils.utils.expectThrow(pricer.unsetPriceOracle.call(pricer_utils.currencies.usd)); }); it('successfully unsets priceOracle', async () => { - assert.ok(await pricer.unsetPriceOracle.call(Pricer_utils.currencies.usd, { from: opsAddress })); - response = await pricer.unsetPriceOracle(Pricer_utils.currencies.usd, { from: opsAddress }); - assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.usd), 0); - checkPriceOracleUnsetEvent(response.logs[0], Pricer_utils.currencies.usd); - Pricer_utils.utils.logResponse(response, 'Pricer.unsetPriceOracle: ' + Pricer_utils.currencies.usd); + assert.ok(await pricer.unsetPriceOracle.call(pricer_utils.currencies.usd, { from: opsAddress })); + response = await pricer.unsetPriceOracle(pricer_utils.currencies.usd, { from: opsAddress }); + assert.equal(await pricer.priceOracles.call(pricer_utils.currencies.usd), 0); + checkPriceOracleUnsetEvent(response.logs[0], pricer_utils.currencies.usd); + pricer_utils.utils.logResponse(response, 'Pricer.unsetPriceOracle: ' + pricer_utils.currencies.usd); // confirm EUR priceOracle unaffected - assert.equal(await pricer.priceOracles.call(Pricer_utils.currencies.eur), eurPriceOracle.address); + assert.equal(await pricer.priceOracles.call(pricer_utils.currencies.eur), eurPriceOracle.address); }); it('fails to unset priceOracle if not already set', async () => { - await Pricer_utils.utils.expectThrow(pricer.unsetPriceOracle.call(Pricer_utils.currencies.usd, { from: opsAddress })); + await pricer_utils.utils.expectThrow(pricer.unsetPriceOracle.call(pricer_utils.currencies.usd, { from: opsAddress })); }); } From 2314ac4c9e5a1a227d4fc3671ea8cd666cbe9ae5 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 8 Feb 2018 13:34:53 +0530 Subject: [PATCH 035/242] Travis: changed shell and source command --- .travis.yml | 16 ++++++++++------ test/scripts/deploy_all.sh | 15 ++++++++------- test/scripts/deploy_price_oracle.sh | 1 + test/scripts/init_chain.sh | 2 +- test/scripts/init_keys.sh | 3 ++- test/scripts/run_chain.sh | 2 +- test/scripts/set_env_vars.sh | 2 ++ test/scripts/start_test_chain.sh | 3 ++- test/scripts/travis_test.sh | 3 ++- 9 files changed, 29 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 390e0fa..c1a7513 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,17 +21,21 @@ before_install: - sudo apt-get update - sudo apt-get install nodejs - sudo apt-get install npm + - sudo apt-get install software-properties-common + - sudo add-apt-repository -y ppa:ethereum/ethereum + - sudo apt-get update + - sudo apt-get install ethereum + - sudo apt-get install solc + - geth version install: - npm install before_script: - nohup sh tools/runTestRpc.sh /dev/null 2>&1 & + - bash contracts/compile.sh script: - - truffle test - - sh contracts/compile.sh - - cd test/scripts/ - - pwd - - sh travis_test.sh - - pwd + - truffle test + - cd test/scripts/ + - bash travis_test.sh after_script: - kill $(ps aux | grep 'testrpc' | awk '{print $2}') - kill $(ps aux | grep 'geth' | awk '{print $2}') diff --git a/test/scripts/deploy_all.sh b/test/scripts/deploy_all.sh index 5a296f2..784ba2d 100644 --- a/test/scripts/deploy_all.sh +++ b/test/scripts/deploy_all.sh @@ -1,7 +1,8 @@ +#!/bin/bash cd .. sh ../contracts/compile.sh -source scripts/env_vars.sh +. ./scripts/env_vars.sh echo "\n********* Deploying test coin 1 *************" node ../tools/deploy/EIP20TokenMock.js 5 TC1 TestCoin1 18 0x12A05F200 travis tc1.txt @@ -11,7 +12,7 @@ rm ../tools/deploy/tc1.txt echo "\n********* Done *************" echo "\n********* Deploying test coin 2 *************" -source scripts/env_vars.sh +. ./scripts/env_vars.sh node ../tools/deploy/EIP20TokenMock.js 2 TC2 TestCoin2 18 0x12A05F200 travis tc2.txt export TEST_COIN2_C2_ADDRESS=$(cat ../tools/deploy/tc2.txt) echo '\nexport TEST_COIN2_C2_ADDRESS='\'$TEST_COIN2_C2_ADDRESS\'>>scripts/env_vars.sh @@ -19,7 +20,7 @@ rm ../tools/deploy/tc2.txt echo "\n********* Done *************" # echo "\n********* Deploying test coin 3 *************" -# source scripts/env_vars.sh +# . ./scripts/env_vars.sh # node ../tools/deploy/EIP20TokenMock.js 3 TC3 TestCoin3 10 0x12A05F200 travis tc3.txt # export TEST_COIN2_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) # echo '\nexport TEST_COIN2_C3_ADDRESS='\'$TEST_COIN2_C3_ADDRESS\'>>scripts/env_vars.sh @@ -28,7 +29,7 @@ echo "\n********* Done *************" echo "\n********* Deploying Pricer 1 *************" -source scripts/env_vars.sh +. ./scripts/env_vars.sh node ../tools/deploy/pricer.js $TEST_COIN1_C5_ADDRESS OST 0x12A05F200 travis tp1.txt export TEST_PRICER_C5_ADDRESS=$(cat ../tools/deploy/tp1.txt) echo '\nexport TEST_PRICER_C5_ADDRESS='\'$TEST_PRICER_C5_ADDRESS\'>>scripts/env_vars.sh @@ -36,7 +37,7 @@ rm ../tools/deploy/tp1.txt echo "\n********* Done *************" echo "\n********* Deploying Pricer 2 *************" -source scripts/env_vars.sh +. ./scripts/env_vars.sh node ../tools/deploy/pricer.js $TEST_COIN2_C2_ADDRESS OST 0x12A05F200 travis tp2.txt export TEST_PRICER_C2_ADDRESS=$(cat ../tools/deploy/tp2.txt) echo '\nexport TEST_PRICER_C2_ADDRESS='\'$TEST_PRICER_C2_ADDRESS\'>>scripts/env_vars.sh @@ -44,7 +45,7 @@ rm ../tools/deploy/tp2.txt echo "\n********* Done *************" # echo "\n********* Deploying Pricer 3 *************" -# source scripts/env_vars.sh +# . ./scripts/env_vars.sh # node ../tools/deploy/pricer.js $TEST_COIN2_C3_ADDRESS OST 0x12A05F200 travis tp3.txt # export TEST_PRICER_C3_ADDRESS=$(cat ../tools/deploy/tp3.txt) # echo '\nexport TEST_PRICER_C3_ADDRESS='\'$TEST_PRICER_C3_ADDRESS\'>>scripts/env_vars.sh @@ -53,7 +54,7 @@ echo "\n********* Done *************" echo "\n********* Setting env variables *************" -source scripts/env_vars.sh +. ./scripts/env_vars.sh cd scripts export OST_PO_GETH_RPC_PROVIDER=$OST_PRICER_GETH_RPC_PROVIDER diff --git a/test/scripts/deploy_price_oracle.sh b/test/scripts/deploy_price_oracle.sh index 1ce637c..1db9480 100644 --- a/test/scripts/deploy_price_oracle.sh +++ b/test/scripts/deploy_price_oracle.sh @@ -1,3 +1,4 @@ +#!/bin/bash echo "\n********* Preparing price oracle deployment *************" git clone git@github.com:OpenSTFoundation/ost-price-oracle.git diff --git a/test/scripts/init_chain.sh b/test/scripts/init_chain.sh index 610c107..ebfa5e7 100755 --- a/test/scripts/init_chain.sh +++ b/test/scripts/init_chain.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash DATADIR=./st-poa mkdir -p "$DATADIR" diff --git a/test/scripts/init_keys.sh b/test/scripts/init_keys.sh index 0a78f32..b04c734 100755 --- a/test/scripts/init_keys.sh +++ b/test/scripts/init_keys.sh @@ -3,6 +3,7 @@ DATADIR=./st-poa ADDRESS_FILE=./new_addresses echo "Init/Re-Init chain..." +#!/bin/bash sh ./init_chain.sh echo "" > $ADDRESS_FILE echo "...Done Init" @@ -10,7 +11,7 @@ echo "...Done Init" echo "Generate new addresses..." -source ./env_vars.sh +. ./env_vars.sh # Utility Chain Deployer Address diff --git a/test/scripts/run_chain.sh b/test/scripts/run_chain.sh index d11186e..d34497a 100755 --- a/test/scripts/run_chain.sh +++ b/test/scripts/run_chain.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash DATADIR=./st-poa LOCAL_NETWORK_ID="--networkid 20171010" diff --git a/test/scripts/set_env_vars.sh b/test/scripts/set_env_vars.sh index c294671..b158719 100644 --- a/test/scripts/set_env_vars.sh +++ b/test/scripts/set_env_vars.sh @@ -1,4 +1,6 @@ +#!/bin/bash + export OST_PRICER_GAS_PRICE='0x12A05F200' export OST_PRICER_GETH_RPC_PROVIDER='http://127.0.0.1:9546' export OST_PRICER_GETH_WS_PROVIDER='ws://127.0.0.1:19546' diff --git a/test/scripts/start_test_chain.sh b/test/scripts/start_test_chain.sh index 123366e..17a8ae8 100644 --- a/test/scripts/start_test_chain.sh +++ b/test/scripts/start_test_chain.sh @@ -1,6 +1,7 @@ +#!/bin/bash cat poa-genesis-template.json>poa-genesis.json cat set_env_vars.sh>env_vars.sh -source env_vars.sh +. ./env_vars.sh sh init_keys.sh sh init_chain.sh nohup sh run_chain.sh /dev/null 2>&1 & diff --git a/test/scripts/travis_test.sh b/test/scripts/travis_test.sh index 750df65..51ff050 100644 --- a/test/scripts/travis_test.sh +++ b/test/scripts/travis_test.sh @@ -1,4 +1,5 @@ +#!/bin/bash sh start_test_chain.sh sh deploy_all.sh -source env_vars.sh +. ./env_vars.sh ./../../node_modules/mocha/bin/mocha ./../../test/services/pricer \ No newline at end of file From 80142a2247576ed3e388294183e24c9b2b1e45cb Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 8 Feb 2018 16:05:54 +0530 Subject: [PATCH 036/242] Linting fixes --- lib/contract_interact/pricer.js | 5 ++--- lib/web3/providers/ws.js | 8 -------- test/lib/populate_env_vars.js | 4 ++-- 3 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 lib/web3/providers/ws.js diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index 3cd684b..e9ce606 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -14,11 +14,10 @@ const web3RpcProvider = require(rootPrefix + '/lib/web3/providers/rpc'); const coreConstants = require(rootPrefix + '/config/core_constants'); const contractName = 'pricer'; const contractAbi = coreAddresses.getAbiForContract(contractName); -const GAS_PRICE = coreConstants.OST_GAS_PRICE; const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; const currContract = new web3RpcProvider.eth.Contract(contractAbi); -const logger = require(rootPrefix + '/helpers/custom_console_logger'); -const responseHelper = require(rootPrefix + '/lib/formatter/response'); +//const logger = require(rootPrefix + '/helpers/custom_console_logger'); +//const responseHelper = require(rootPrefix + '/lib/formatter/response'); /** diff --git a/lib/web3/providers/ws.js b/lib/web3/providers/ws.js deleted file mode 100644 index a95fbc1..0000000 --- a/lib/web3/providers/ws.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; - -const coreConstants = require('../../../config/core_constants'); - -const Web3 = require('web3') - , web3WsProvider = new Web3(coreConstants.OST_PRICER_GETH_WS_PROVIDER); - -module.exports = web3WsProvider; diff --git a/test/lib/populate_env_vars.js b/test/lib/populate_env_vars.js index 1e455aa..8ed8bf3 100644 --- a/test/lib/populate_env_vars.js +++ b/test/lib/populate_env_vars.js @@ -11,7 +11,7 @@ const mustache = require('mustache') , fs = require('fs') , Path = require('path') - , envVarsSourceFile = '../../test/scripts/env_vars.sh'; + , envVarsSourceFile = '../../test/scripts/env_vars.sh'; const addressTemplate = "export OST_PRICER_DEPLOYER_ADDR='{{ost_pricer_deployer_address}}'\n" + @@ -53,7 +53,7 @@ const populateEnvVars = { //console.log("ENV Constants to Write"); //console.log(dataToWrite); fs.writeFileSync(Path.join(__dirname, '/' + envVarsSourceFile), dataToWrite); - } catch(e) { + } catch (e) { console.error("Error Reading and Populating Source File"); console.error(e); process.exit(1); From d0b89fc2d9ea4c2c59bca99f1457636e6922cf7f Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 8 Feb 2018 21:03:04 +0530 Subject: [PATCH 037/242] Mocha tests: changed folder to resolve issues with truffle --- .gitignore | 10 +++---- {test => mocha_test}/lib/populate_env_vars.js | 2 +- .../scripts/_init_addresses.js | 4 +-- {test => mocha_test}/scripts/deploy_all.sh | 28 +++++++++---------- .../scripts/deploy_price_oracle.sh | 0 {test => mocha_test}/scripts/geth_checker.js | 0 {test => mocha_test}/scripts/init_chain.sh | 0 {test => mocha_test}/scripts/init_keys.sh | 0 .../scripts/poa-genesis-template.json | 0 {test => mocha_test}/scripts/run_chain.sh | 0 {test => mocha_test}/scripts/set_env_vars.sh | 0 .../scripts/start_test_chain.sh | 0 mocha_test/scripts/travis_test.sh | 5 ++++ .../services/pricer/constants.js | 0 .../get_pricepoint_and_calculated_amounts.js | 2 +- {test => mocha_test}/services/pricer/pay.js | 2 +- .../services/pricer/set_accepted_margin.js | 2 +- .../services/pricer/set_price_oracle.js | 2 +- .../services/pricer/unset_price_oracle.js | 2 +- test/scripts/travis_test.sh | 5 ---- tools/deploy/helper.js | 2 +- 21 files changed, 33 insertions(+), 33 deletions(-) rename {test => mocha_test}/lib/populate_env_vars.js (97%) rename {test => mocha_test}/scripts/_init_addresses.js (94%) rename {test => mocha_test}/scripts/deploy_all.sh (77%) rename {test => mocha_test}/scripts/deploy_price_oracle.sh (100%) rename {test => mocha_test}/scripts/geth_checker.js (100%) rename {test => mocha_test}/scripts/init_chain.sh (100%) rename {test => mocha_test}/scripts/init_keys.sh (100%) rename {test => mocha_test}/scripts/poa-genesis-template.json (100%) rename {test => mocha_test}/scripts/run_chain.sh (100%) rename {test => mocha_test}/scripts/set_env_vars.sh (100%) rename {test => mocha_test}/scripts/start_test_chain.sh (100%) create mode 100644 mocha_test/scripts/travis_test.sh rename {test => mocha_test}/services/pricer/constants.js (100%) rename {test => mocha_test}/services/pricer/get_pricepoint_and_calculated_amounts.js (98%) rename {test => mocha_test}/services/pricer/pay.js (99%) rename {test => mocha_test}/services/pricer/set_accepted_margin.js (98%) rename {test => mocha_test}/services/pricer/set_price_oracle.js (98%) rename {test => mocha_test}/services/pricer/unset_price_oracle.js (97%) delete mode 100644 test/scripts/travis_test.sh diff --git a/.gitignore b/.gitignore index 89d3014..d6bf8f4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,8 @@ contracts/abi/ # don't commit node_modules node_modules -test/scripts/env_vars.sh -test/scripts/ost-price-oracle/ -test/scripts/poa-genesis.json -test/scripts/pw -test/scripts/st-poa/ +mocha_test/scripts/env_vars.sh +mocha_test/scripts/ost-price-oracle/ +mocha_test/scripts/poa-genesis.json +mocha_test/scripts/pw +mocha_test/scripts/st-poa/ diff --git a/test/lib/populate_env_vars.js b/mocha_test/lib/populate_env_vars.js similarity index 97% rename from test/lib/populate_env_vars.js rename to mocha_test/lib/populate_env_vars.js index 8ed8bf3..7df1029 100644 --- a/test/lib/populate_env_vars.js +++ b/mocha_test/lib/populate_env_vars.js @@ -11,7 +11,7 @@ const mustache = require('mustache') , fs = require('fs') , Path = require('path') - , envVarsSourceFile = '../../test/scripts/env_vars.sh'; + , envVarsSourceFile = '../../mocha_test/scripts/env_vars.sh'; const addressTemplate = "export OST_PRICER_DEPLOYER_ADDR='{{ost_pricer_deployer_address}}'\n" + diff --git a/test/scripts/_init_addresses.js b/mocha_test/scripts/_init_addresses.js similarity index 94% rename from test/scripts/_init_addresses.js rename to mocha_test/scripts/_init_addresses.js index 6013fe8..c3e8023 100644 --- a/test/scripts/_init_addresses.js +++ b/mocha_test/scripts/_init_addresses.js @@ -12,8 +12,8 @@ const _addresses = { const rootPrefix = "../.." , coreConstants = require( rootPrefix + '/config/core_constants' ) - , populateEnvVars = require( rootPrefix + "/test/lib/populate_env_vars.js") - , poaGenesis = require( rootPrefix + "/test/scripts/poa-genesis.json") + , populateEnvVars = require( rootPrefix + "/mocha_test/lib/populate_env_vars.js") + , poaGenesis = require( rootPrefix + "/mocha_test/scripts/poa-genesis.json") ; function main( addressFile ) { diff --git a/test/scripts/deploy_all.sh b/mocha_test/scripts/deploy_all.sh similarity index 77% rename from test/scripts/deploy_all.sh rename to mocha_test/scripts/deploy_all.sh index 784ba2d..84a9920 100644 --- a/test/scripts/deploy_all.sh +++ b/mocha_test/scripts/deploy_all.sh @@ -19,13 +19,13 @@ echo '\nexport TEST_COIN2_C2_ADDRESS='\'$TEST_COIN2_C2_ADDRESS\'>>scripts/env_va rm ../tools/deploy/tc2.txt echo "\n********* Done *************" -# echo "\n********* Deploying test coin 3 *************" -# . ./scripts/env_vars.sh -# node ../tools/deploy/EIP20TokenMock.js 3 TC3 TestCoin3 10 0x12A05F200 travis tc3.txt -# export TEST_COIN2_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) -# echo '\nexport TEST_COIN2_C3_ADDRESS='\'$TEST_COIN2_C3_ADDRESS\'>>scripts/env_vars.sh -# rm ../tools/deploy/tc3.txt -# echo "\n********* Done *************" +echo "\n********* Deploying test coin 3 *************" +. ./scripts/env_vars.sh +node ../tools/deploy/EIP20TokenMock.js 3 TC3 TestCoin3 10 0x12A05F200 travis tc3.txt +export TEST_COIN2_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) +echo '\nexport TEST_COIN2_C3_ADDRESS='\'$TEST_COIN2_C3_ADDRESS\'>>scripts/env_vars.sh +rm ../tools/deploy/tc3.txt +echo "\n********* Done *************" echo "\n********* Deploying Pricer 1 *************" @@ -44,13 +44,13 @@ echo '\nexport TEST_PRICER_C2_ADDRESS='\'$TEST_PRICER_C2_ADDRESS\'>>scripts/env_ rm ../tools/deploy/tp2.txt echo "\n********* Done *************" -# echo "\n********* Deploying Pricer 3 *************" -# . ./scripts/env_vars.sh -# node ../tools/deploy/pricer.js $TEST_COIN2_C3_ADDRESS OST 0x12A05F200 travis tp3.txt -# export TEST_PRICER_C3_ADDRESS=$(cat ../tools/deploy/tp3.txt) -# echo '\nexport TEST_PRICER_C3_ADDRESS='\'$TEST_PRICER_C3_ADDRESS\'>>scripts/env_vars.sh -# rm ../tools/deploy/tp3.txt -#echo "\n********* Done *************" +echo "\n********* Deploying Pricer 3 *************" +. ./scripts/env_vars.sh +node ../tools/deploy/pricer.js $TEST_COIN2_C3_ADDRESS OST 0x12A05F200 travis tp3.txt +export TEST_PRICER_C3_ADDRESS=$(cat ../tools/deploy/tp3.txt) +echo '\nexport TEST_PRICER_C3_ADDRESS='\'$TEST_PRICER_C3_ADDRESS\'>>scripts/env_vars.sh +rm ../tools/deploy/tp3.txt +echo "\n********* Done *************" echo "\n********* Setting env variables *************" diff --git a/test/scripts/deploy_price_oracle.sh b/mocha_test/scripts/deploy_price_oracle.sh similarity index 100% rename from test/scripts/deploy_price_oracle.sh rename to mocha_test/scripts/deploy_price_oracle.sh diff --git a/test/scripts/geth_checker.js b/mocha_test/scripts/geth_checker.js similarity index 100% rename from test/scripts/geth_checker.js rename to mocha_test/scripts/geth_checker.js diff --git a/test/scripts/init_chain.sh b/mocha_test/scripts/init_chain.sh similarity index 100% rename from test/scripts/init_chain.sh rename to mocha_test/scripts/init_chain.sh diff --git a/test/scripts/init_keys.sh b/mocha_test/scripts/init_keys.sh similarity index 100% rename from test/scripts/init_keys.sh rename to mocha_test/scripts/init_keys.sh diff --git a/test/scripts/poa-genesis-template.json b/mocha_test/scripts/poa-genesis-template.json similarity index 100% rename from test/scripts/poa-genesis-template.json rename to mocha_test/scripts/poa-genesis-template.json diff --git a/test/scripts/run_chain.sh b/mocha_test/scripts/run_chain.sh similarity index 100% rename from test/scripts/run_chain.sh rename to mocha_test/scripts/run_chain.sh diff --git a/test/scripts/set_env_vars.sh b/mocha_test/scripts/set_env_vars.sh similarity index 100% rename from test/scripts/set_env_vars.sh rename to mocha_test/scripts/set_env_vars.sh diff --git a/test/scripts/start_test_chain.sh b/mocha_test/scripts/start_test_chain.sh similarity index 100% rename from test/scripts/start_test_chain.sh rename to mocha_test/scripts/start_test_chain.sh diff --git a/mocha_test/scripts/travis_test.sh b/mocha_test/scripts/travis_test.sh new file mode 100644 index 0000000..52218f0 --- /dev/null +++ b/mocha_test/scripts/travis_test.sh @@ -0,0 +1,5 @@ +#!/bin/bash +sh start_test_chain.sh +sh deploy_all.sh +. ./env_vars.sh +./../../node_modules/mocha/bin/mocha ./../../mocha_test/services/pricer \ No newline at end of file diff --git a/test/services/pricer/constants.js b/mocha_test/services/pricer/constants.js similarity index 100% rename from test/services/pricer/constants.js rename to mocha_test/services/pricer/constants.js diff --git a/test/services/pricer/get_pricepoint_and_calculated_amounts.js b/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js similarity index 98% rename from test/services/pricer/get_pricepoint_and_calculated_amounts.js rename to mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js index 72f40e7..d4a2ea4 100644 --- a/test/services/pricer/get_pricepoint_and_calculated_amounts.js +++ b/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -5,7 +5,7 @@ const chai = require('chai') , assert = chai.assert; const rootPrefix = "../../.." - , constants = require(rootPrefix + '/test/services/pricer/constants') + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) , pricerOstEur = new pricer(constants.pricerOstEurAddress) diff --git a/test/services/pricer/pay.js b/mocha_test/services/pricer/pay.js similarity index 99% rename from test/services/pricer/pay.js rename to mocha_test/services/pricer/pay.js index 52ff90c..7e4724d 100644 --- a/test/services/pricer/pay.js +++ b/mocha_test/services/pricer/pay.js @@ -2,7 +2,7 @@ const chai = require('chai') , assert = chai.assert; const rootPrefix = "../../.." - , constants = require(rootPrefix + '/test/services/pricer/constants') + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') , BigNumber = require('bignumber.js') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) diff --git a/test/services/pricer/set_accepted_margin.js b/mocha_test/services/pricer/set_accepted_margin.js similarity index 98% rename from test/services/pricer/set_accepted_margin.js rename to mocha_test/services/pricer/set_accepted_margin.js index 5da58a3..16d1e7f 100644 --- a/test/services/pricer/set_accepted_margin.js +++ b/mocha_test/services/pricer/set_accepted_margin.js @@ -4,7 +4,7 @@ const chai = require('chai') , assert = chai.assert; const rootPrefix = "../../.." - , constants = require(rootPrefix + '/test/services/pricer/constants') + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) ; diff --git a/test/services/pricer/set_price_oracle.js b/mocha_test/services/pricer/set_price_oracle.js similarity index 98% rename from test/services/pricer/set_price_oracle.js rename to mocha_test/services/pricer/set_price_oracle.js index ea9d1ab..3b1f261 100644 --- a/test/services/pricer/set_price_oracle.js +++ b/mocha_test/services/pricer/set_price_oracle.js @@ -5,7 +5,7 @@ const chai = require('chai') , assert = chai.assert; const rootPrefix = "../../.." - , constants = require(rootPrefix + '/test/services/pricer/constants') + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) , pricerOstEur = new pricer(constants.pricerOstEurAddress) diff --git a/test/services/pricer/unset_price_oracle.js b/mocha_test/services/pricer/unset_price_oracle.js similarity index 97% rename from test/services/pricer/unset_price_oracle.js rename to mocha_test/services/pricer/unset_price_oracle.js index a19674d..41ee42f 100644 --- a/test/services/pricer/unset_price_oracle.js +++ b/mocha_test/services/pricer/unset_price_oracle.js @@ -4,7 +4,7 @@ const chai = require('chai') , assert = chai.assert; const rootPrefix = "../../.." - , constants = require(rootPrefix + '/test/services/pricer/constants') + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) ; diff --git a/test/scripts/travis_test.sh b/test/scripts/travis_test.sh deleted file mode 100644 index 51ff050..0000000 --- a/test/scripts/travis_test.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -sh start_test_chain.sh -sh deploy_all.sh -. ./env_vars.sh -./../../node_modules/mocha/bin/mocha ./../../test/services/pricer \ No newline at end of file diff --git a/tools/deploy/helper.js b/tools/deploy/helper.js index 41f4e5c..548e83b 100644 --- a/tools/deploy/helper.js +++ b/tools/deploy/helper.js @@ -15,7 +15,7 @@ const rootPrefix = '../..' , coreAddresses = require(rootPrefix + '/config/core_addresses') , logger = require(rootPrefix + '/helpers/custom_console_logger') , web3EventsFormatter = require(rootPrefix + '/lib/web3/events/formatter') - , populateEnvVars = require(rootPrefix + "/test/lib/populate_env_vars.js") + , populateEnvVars = require(rootPrefix + "/mocha_test/lib/populate_env_vars.js") , fs = require('fs') , Path = require('path'); From 12242d2555713dea2d7c7de7c72090f57bb850f6 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Thu, 8 Feb 2018 21:11:06 +0530 Subject: [PATCH 038/242] Travis: updated .travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c1a7513..43d2cec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,7 +34,7 @@ before_script: - bash contracts/compile.sh script: - truffle test - - cd test/scripts/ + - cd mocha_test/scripts/ - bash travis_test.sh after_script: - kill $(ps aux | grep 'testrpc' | awk '{print $2}') From 8c3fe3c63f6a021d75d3fc30df0cfc06979cdd11 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Sun, 11 Feb 2018 12:27:28 +0530 Subject: [PATCH 039/242] Contract: Worker.sol and Truffle tests --- contracts/Workers.sol | 114 ++++++++++++++++++++++++ test/contracts/pricer/base.js | 1 + test/contracts/workers/base.js | 40 +++++++++ test/contracts/workers/constructor.js | 35 ++++++++ test/contracts/workers/is_worker.js | 95 ++++++++++++++++++++ test/contracts/workers/remove.js | 76 ++++++++++++++++ test/contracts/workers/remove_worker.js | 101 +++++++++++++++++++++ test/contracts/workers/set_worker.js | 110 +++++++++++++++++++++++ test/contracts/workers/workers_utils.js | 44 +++++++++ test/lib/utils.js | 65 -------------- 10 files changed, 616 insertions(+), 65 deletions(-) create mode 100644 contracts/Workers.sol create mode 100644 test/contracts/workers/base.js create mode 100644 test/contracts/workers/constructor.js create mode 100644 test/contracts/workers/is_worker.js create mode 100644 test/contracts/workers/remove.js create mode 100644 test/contracts/workers/remove_worker.js create mode 100644 test/contracts/workers/set_worker.js create mode 100644 test/contracts/workers/workers_utils.js diff --git a/contracts/Workers.sol b/contracts/Workers.sol new file mode 100644 index 0000000..2c53fe7 --- /dev/null +++ b/contracts/Workers.sol @@ -0,0 +1,114 @@ +pragma solidity ^0.4.17; + +// Copyright 2018 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Utility chain: Workers +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +import "./OpsManaged.sol"; +import "./SafeMath.sol"; + + +/// A set of authorised workers +contract Workers is OpsManaged { + using SafeMath for uint256; + + /* + * Storage + */ + /// workers are active up unto the deactivation height + mapping(address => uint256 /* deactivation height */) public workers; + + /* + * Events + */ + ///Event for worker set + event WrokerSet( + address _worker, + uint256 _deactivationHeight, + uint256 _remainingHeight); + + ///Event for worker set + event WrokerUnset( + address _worker, + bool _existed); + + /* + * Public functions + */ + function Workers() + public + OpsManaged() + { + } + + function setWorker( + address _worker, + uint256 _deactivationHeight) + external + onlyOps + returns (uint256 /* remaining activation length */) + { + require(_worker != address(0)); + require(_deactivationHeight >= block.number); + + workers[_worker] = _deactivationHeight; + uint256 remainingHeight = _deactivationHeight - block.number; + //Event for worker set + WrokerSet(_worker, _deactivationHeight, remainingHeight); + + return (remainingHeight); + } + + function removeWorker( + address _worker) + external + onlyOps + returns (bool existed) + { + existed = (workers[_worker] > 0); + + delete workers[_worker]; + //Event for worker removed + WrokerUnset(_worker, existed); + + return existed; + } + + // clean up or collectively revoke all workers + function remove() + external + onlyAdminOrOps + { + selfdestruct(msg.sender); + } + + /* + * Public view functions + */ + function isWorker( + address _worker) + external + view + returns (bool /* is active worker */) + { + return (workers[_worker] >= block.number); + } + +} \ No newline at end of file diff --git a/test/contracts/pricer/base.js b/test/contracts/pricer/base.js index 334390c..fb7bb5f 100644 --- a/test/contracts/pricer/base.js +++ b/test/contracts/pricer/base.js @@ -44,4 +44,5 @@ contract('Pricer', function(accounts) { pricer_utils.utils.printGasStatistics(); pricer_utils.utils.clearReceipts(); }); + }); diff --git a/test/contracts/workers/base.js b/test/contracts/workers/base.js new file mode 100644 index 0000000..b3c9606 --- /dev/null +++ b/test/contracts/workers/base.js @@ -0,0 +1,40 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: base.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const workers_utils = require('./workers_utils.js'), + constructor = require('./constructor.js'); + setWorker = require('./set_worker.js'); + removeWorker = require('./remove_worker.js'); + isWorker = require('./is_worker.js'); + remove = require('./remove.js'); + +contract('Workers', function(accounts) { + describe('Constructor', async () => constructor.perform()); + describe('setWorker', async () => setWorker.perform(accounts)); + describe('removeWorker', async () => removeWorker.perform(accounts)); + describe('isWorker', async () => isWorker.perform(accounts)); + describe('remove', async () => remove.perform(accounts)); + + after(async () => { + workers_utils.utils.printGasStatistics(); + workers_utils.utils.clearReceipts(); + }); +}); diff --git a/test/contracts/workers/constructor.js b/test/contracts/workers/constructor.js new file mode 100644 index 0000000..085e74e --- /dev/null +++ b/test/contracts/workers/constructor.js @@ -0,0 +1,35 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: constructor.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const workers_utils = require('./workers_utils.js'), + Workers = artifacts.require('./Workers.sol'); + +/// +/// Test stories +/// +/// successfully deploys + +module.exports.perform = () => { + it('successfully deploys', async () => { + const response = await Workers.new(); + workers_utils.utils.logTransaction(response.transactionHash, 'Workers.constructor'); + }); +} diff --git a/test/contracts/workers/is_worker.js b/test/contracts/workers/is_worker.js new file mode 100644 index 0000000..31bd8de --- /dev/null +++ b/test/contracts/workers/is_worker.js @@ -0,0 +1,95 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: is_workers.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const workers_utils = require('./workers_utils.js'); +const Workers = artifacts.require('./Workers.sol'); + +/// +/// Test stories +/// +/// returns false when worker was not set +/// returns true when worker was is set and not reached deactivationHeight +/// validate expiry + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1], + worker1Address = accounts[2], + worker2Address = accounts[3], + worker3Address = accounts[4], + height1 = new workers_utils.bigNumber(50), + height2 = new workers_utils.bigNumber(40); + + before(async () => { + workers = await Workers.new(); + assert.ok(await workers.setOpsAddress(opsAddress)); + + // set worker 1 + deactivationHeight = web3.eth.blockNumber + height1.toNumber(); + assert.ok(await workers.setWorker.call(worker1Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker1Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker1Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height1.toNumber()-1); + + // set worker 2 + deactivationHeight = web3.eth.blockNumber + height2.toNumber(); + assert.ok(await workers.setWorker.call(worker2Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker2Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker2Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height2.toNumber()-1); + + }); + + it('returns false when worker was not set', async () => { + + assert.equal(await workers.isWorker.call(worker3Address), false); + + }); + + it('returns true when worker was is set and not reached deactivationHeight', async () => { + + assert.equal(await workers.isWorker.call(worker1Address), true); + assert.equal(await workers.isWorker.call(worker2Address), true); + + }); + + it('validate expiry', async () => { + + // set a worker with expiration height of 30 + height = 30; + deactivationHeight = web3.eth.blockNumber + height; + assert.ok(await workers.setWorker.call(worker3Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker3Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker3Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height-1); + for (var i = height-1; i >= 0; i--) { + // Perform random transaction to increase block number. In this case using removeWorker for worker1Address + response = await workers.removeWorker(worker1Address, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker3Address), i>0); + } + //Do one more time to confirm. + response = await workers.removeWorker(worker1Address, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker3Address), false); + + }); + +} + + diff --git a/test/contracts/workers/remove.js b/test/contracts/workers/remove.js new file mode 100644 index 0000000..ccc37d0 --- /dev/null +++ b/test/contracts/workers/remove.js @@ -0,0 +1,76 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: remove.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const workers_utils = require('./workers_utils.js'); +const Workers = artifacts.require('./Workers.sol'); + +/// +/// Test stories +/// +/// fails to remove when sender is not opsAddress +/// pass to remove when sender is opsAddress + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1], + worker1Address = accounts[2], + worker2Address = accounts[3], + height1 = new workers_utils.bigNumber(100), + height2 = new workers_utils.bigNumber(140); + + before(async () => { + + workers = await Workers.new(); + assert.ok(await workers.setOpsAddress(opsAddress)); + + // set worker 1 + deactivationHeight = web3.eth.blockNumber + height1.toNumber(); + assert.ok(await workers.setWorker.call(worker1Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker1Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker1Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height1.toNumber()-1); + + // set worker 2 + deactivationHeight = web3.eth.blockNumber + height2.toNumber(); + assert.ok(await workers.setWorker.call(worker2Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker2Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker2Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height2.toNumber()-1); + + }); + + it('fails to remove when sender is not opsAddress', async () => { + + await workers_utils.utils.expectThrow(workers.remove.call({ from: accounts[4] })); + + }); + + it('pass to remove when sender is opsAddress', async () => { + + assert.ok(await workers.remove.call({ from: opsAddress })); + response = await workers.remove({ from: opsAddress }) + workers_utils.utils.logResponse(response, 'Worker.remove'); + assert.equal(await workers.isWorker.call(worker2Address), false); + + }); + +} + + diff --git a/test/contracts/workers/remove_worker.js b/test/contracts/workers/remove_worker.js new file mode 100644 index 0000000..bacbdf5 --- /dev/null +++ b/test/contracts/workers/remove_worker.js @@ -0,0 +1,101 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: remove_workers.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const workers_utils = require('./workers_utils.js'); +const Workers = artifacts.require('./Workers.sol'); + +/// +/// Test stories +/// +/// fails to remove worker if sender is not opsAddress +/// fails to remove worker if worker was not set +/// pass to remove worker + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1], + worker1Address = accounts[2], + worker2Address = accounts[3], + worker3Address = accounts[4], + height1 = new workers_utils.bigNumber(500), + height2 = new workers_utils.bigNumber(1000); + + before(async () => { + workers = await Workers.new(); + assert.ok(await workers.setOpsAddress(opsAddress)); + + // set worker 1 + deactivationHeight = web3.eth.blockNumber + height1.toNumber(); + assert.ok(await workers.setWorker.call(worker1Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker1Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker1Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height1.toNumber()-1); + + // set worker 2 + deactivationHeight = web3.eth.blockNumber + height2.toNumber(); + assert.ok(await workers.setWorker.call(worker2Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker2Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker2Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height2.toNumber()-1); + + }); + + + it('fails to remove worker if sender is not opsAddress', async () => { + + await workers_utils.utils.expectThrow(workers.removeWorker.call(worker1Address, { from: accounts[5] })); + + }); + + + it('fails to remove worker if worker was not set', async () => { + + assert.equal(await workers.removeWorker.call(worker3Address, { from: opsAddress }), false); + response = await workers.removeWorker(worker3Address, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker3Address), false); + workers_utils.checkWorkerUnsetEvent(response.logs[0], worker3Address, false); + workers_utils.utils.logResponse(response, 'Worker.removeWorker not existed worker'); + + }); + + + it('pass to remove worker', async () => { + + assert.equal(await workers.removeWorker.call(worker1Address, { from: opsAddress }), true); + response = await workers.removeWorker(worker1Address, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker1Address), false); + workers_utils.checkWorkerUnsetEvent(response.logs[0], worker1Address, true); + workers_utils.utils.logResponse(response, 'Worker.removeWorker'); + + assert.equal(await workers.removeWorker.call(worker2Address, { from: opsAddress }), true); + response = await workers.removeWorker(worker2Address, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker2Address), false); + workers_utils.checkWorkerUnsetEvent(response.logs[0], worker2Address, true); + + assert.equal(await workers.removeWorker.call(worker2Address, { from: opsAddress }), false); + response = await workers.removeWorker(worker2Address, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker2Address), false); + workers_utils.checkWorkerUnsetEvent(response.logs[0], worker2Address, false); + + }); + +} + + diff --git a/test/contracts/workers/set_worker.js b/test/contracts/workers/set_worker.js new file mode 100644 index 0000000..356fdef --- /dev/null +++ b/test/contracts/workers/set_worker.js @@ -0,0 +1,110 @@ +// Copyright 2017 OST.com Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: set_workers.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const workers_utils = require('./workers_utils.js'); +const Workers = artifacts.require('./Workers.sol'); + +/// +/// Test stories +/// +/// fails to set worker if worker address is 0 +/// fails to set worker if _deactivationHeight is equal to current block number +/// fails to set worker if _deactivationHeight is less than current block number +/// fails to set worker if sender is not opsAddress +/// pass to set worker if worker is not already set +/// pass to set worker if worker was already set + +module.exports.perform = (accounts) => { + const opsAddress = accounts[1], + worker1Address = accounts[2], + worker2Address = accounts[3], + height1 = new workers_utils.bigNumber(500), + height2 = new workers_utils.bigNumber(1000); + + before(async () => { + + workers = await Workers.new(); + assert.ok(await workers.setOpsAddress(opsAddress)); + + }); + + + it('fails to set worker if worker address is 0', async () => { + + await workers_utils.utils.expectThrow(workers.setWorker.call(0, height1, { from: opsAddress })); + + }); + + + it('fails to set worker if _deactivationHeight is equal to current block number', async () => { + + await workers_utils.utils.expectThrow(workers.setWorker.call(0, web3.eth.blockNumber, { from: opsAddress })); + + }); + + + it('fails to set worker if _deactivationHeight is less than current block number', async () => { + + await workers_utils.utils.expectThrow(workers.setWorker.call(0, 0, { from: opsAddress })); + + }); + + + it('fails to set worker if sender is not opsAddress', async () => { + + deactivationHeight = web3.eth.blockNumber + height1.toNumber(); + await workers_utils.utils.expectThrow(workers.setWorker.call(worker1Address, deactivationHeight, { from: accounts[5] })); + + }); + + + it('pass to set worker if worker is not already set', async () => { + + deactivationHeight = web3.eth.blockNumber + height1.toNumber(); + assert.ok(await workers.setWorker.call(worker1Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker1Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker1Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height1.toNumber()-1); + + deactivationHeight = web3.eth.blockNumber + height2.toNumber(); + assert.ok(await workers.setWorker.call(worker2Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker2Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker2Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height2.toNumber()-1); + workers_utils.utils.logResponse(response, 'Worker.setWorker'); + + }); + + + it('pass to set worker if worker was already set', async () => { + + deactivationHeight = web3.eth.blockNumber + height2.toNumber(); + assert.ok(await workers.setWorker.call(worker1Address, deactivationHeight, { from: opsAddress })); + response = await workers.setWorker(worker1Address, deactivationHeight, { from: opsAddress }); + assert.equal(await workers.isWorker.call(worker1Address), true); + workers_utils.checkWorkerSetEvent(response.logs[0], deactivationHeight, height2.toNumber()-1); + workers_utils.utils.logResponse(response, 'Worker.setWorker(update)'); + + }); + +} + + diff --git a/test/contracts/workers/workers_utils.js b/test/contracts/workers/workers_utils.js new file mode 100644 index 0000000..120ba2b --- /dev/null +++ b/test/contracts/workers/workers_utils.js @@ -0,0 +1,44 @@ +// Copyright 2017 OpenST Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ---------------------------------------------------------------------------- +// Test: pricer_utils.js +// +// http://www.simpletoken.org/ +// +// ---------------------------------------------------------------------------- + +const Utils = require('../../lib/utils.js'), + BigNumber = require('bignumber.js'), + Workers = artifacts.require('./Workers.sol'); + + +/// @dev Export common requires +module.exports.utils = Utils; +module.exports.bigNumber = BigNumber; + +function checkWorkerSetEvent(event, deactivationHeight, remainingHeight) { + assert.equal(event.event, 'WrokerSet'); + assert.equal(event.args._deactivationHeight.toNumber(), deactivationHeight); + assert.equal(event.args._remainingHeight.toNumber(), remainingHeight); +} +module.exports.checkWorkerSetEvent = checkWorkerSetEvent; + +function checkWorkerUnsetEvent(event, worker, existed) { + assert.equal(event.event, 'WrokerUnset'); + assert.equal(event.args._worker, worker); + assert.equal(event.args._existed, existed); +} +module.exports.checkWorkerUnsetEvent = checkWorkerUnsetEvent; + diff --git a/test/lib/utils.js b/test/lib/utils.js index da8f169..6c5ee65 100644 --- a/test/lib/utils.js +++ b/test/lib/utils.js @@ -20,7 +20,6 @@ // ---------------------------------------------------------------------------- const Assert = require('assert'); -const SolidityEvent = require("web3/lib/web3/event.js"); const NullAddress = "0x0000000000000000000000000000000000000000"; @@ -156,70 +155,6 @@ function decodeLogs(abi, logs) { } -function decodeLogsInternal(abi, logs) { - - // Find events in the ABI - var abiEvents = abi.filter(json => { - return json.type === 'event' - }) - - if (abiEvents.length === 0) { - return - } - - // Build SolidityEvent objects - var solidityEvents = [] - for (i = 0; i < abiEvents.length; i++) { - solidityEvents.push(new SolidityEvent(null, abiEvents[i], null)) - } - - // Decode each log entry - var decodedLogs = [] - for (i = 0; i < logs.length; i++) { - - var event = null - for (j = 0; j < solidityEvents.length; j++) { - if (solidityEvents[j].signature() == logs[i].topics[0].replace("0x", "")) { - event = solidityEvents[j] - break - } - } - - var decodedLog = null - - if (event != null) { - decodedLog = event.decode(logs[i]) - } else { - // We could not find the right event to decode this log entry, just keep as is. - decodedLog = logs[i] - } - - // Convert bytes32 parameters to ascii - for (j = 0; j < abiEvents.length; j++) { - const abiEvent = abiEvents[j] - - if (!abiEvent.inputs) { - continue - } - - if (abiEvent.name != decodedLog.name) { - continue - } - - for (k = 0; k < abiEvent.inputs; k++) { - if (abiEvent.inputs[k].type == 'bytes32') { - decodedLog.args[abiEvent.inputs[k].name] = hexToAscii(decodedLog.args[abiEvent.inputs[k]]); - } - } - } - - decodedLogs.push(decodedLog) - } - - return decodedLogs -} - - function hexToAscii(hexStr) { var asciiStr = '' From 97fe4300c5238a63e753f5db7aeb6bf3ec6d6a51 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Sun, 11 Feb 2018 13:14:32 +0530 Subject: [PATCH 040/242] Mocha test: updated deployment script to use price oracle npm --- mocha_test/scripts/deploy_price_oracle.sh | 34 ++++++++++------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/mocha_test/scripts/deploy_price_oracle.sh b/mocha_test/scripts/deploy_price_oracle.sh index 1db9480..57359f5 100644 --- a/mocha_test/scripts/deploy_price_oracle.sh +++ b/mocha_test/scripts/deploy_price_oracle.sh @@ -1,39 +1,35 @@ #!/bin/bash echo "\n********* Preparing price oracle deployment *************" -git clone git@github.com:OpenSTFoundation/ost-price-oracle.git -cd ost-price-oracle -git stash -git checkout abhay/mocha_test -git pull --rebase -cd .. -npm install ./ost-price-oracle +npm install @ostdotcom/ost-price-oracle +cd ../../node_modules/@ostdotcom/ost-price-oracle/ +pwd echo "\n********* Done *************" echo "\n********* Deploying PO 1 *************" -node ./ost-price-oracle/tools/deploy/price_oracle.js OST USD 0x12A05F200 travis po1.txt +node ./tools/deploy/price_oracle.js OST USD 0x12A05F200 travis po1.txt echo "\n********* Done *************" echo "\n********* Deploying PO 2 *************" -node ./ost-price-oracle/tools/deploy/price_oracle.js OST EUR 0x12A05F200 travis po2.txt +node ./tools/deploy/price_oracle.js OST EUR 0x12A05F200 travis po2.txt echo "\n********* Done *************" echo "\n********* Deploying PO 3 *************" -node ./ost-price-oracle/tools/deploy/price_oracle.js OST INR 0x12A05F200 travis po3.txt +node ./tools/deploy/price_oracle.js OST INR 0x12A05F200 travis po3.txt echo "\n********* Done *************" echo "\n********* Deploying PO 4 *************" -node ./ost-price-oracle/tools/deploy/price_oracle.js ETH USD 0x12A05F200 travis po4.txt +node ./tools/deploy/price_oracle.js ETH USD 0x12A05F200 travis po4.txt echo "\n********* Done *************" export OST_PO_PRICE_ORACLES="{\"OST\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po1.txt)\",\"EUR\":\"$(cat ./ost-price-oracle/tools/deploy/po2.txt)\",\"INR\":\"$(cat ./ost-price-oracle/tools/deploy/po3.txt)\"},\"ETH\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po4.txt)\"}}" -echo '\nexport OST_PO_PRICE_ORACLES='\'$OST_PO_PRICE_ORACLES\'>>env_vars.sh +echo '\nexport OST_PO_PRICE_ORACLES='\'$OST_PO_PRICE_ORACLES\'>>../../../mocha_test/scripts/env_vars.sh echo OST_PO_PRICE_ORACLES=$OST_PO_PRICE_ORACLES -node ./ost-price-oracle/test/scripts/set_price.js OST USD 0.5 0x12A05F200 -node ./ost-price-oracle/test/scripts/set_price.js OST EUR 0.2 0x12A05F200 -node ./ost-price-oracle/test/scripts/set_price.js ETH USD 20.2 0x12A05F200 +node ./test/scripts/set_price.js OST USD 0.5 0x12A05F200 +node ./test/scripts/set_price.js OST EUR 0.2 0x12A05F200 +node ./test/scripts/set_price.js ETH USD 20.2 0x12A05F200 -rm ./ost-price-oracle/tools/deploy/po1.txt -rm ./ost-price-oracle/tools/deploy/po2.txt -rm ./ost-price-oracle/tools/deploy/po3.txt -rm ./ost-price-oracle/tools/deploy/po4.txt +rm ./tools/deploy/po1.txt +rm ./tools/deploy/po2.txt +rm ./tools/deploy/po3.txt +rm ./tools/deploy/po4.txt From a2eef3bda4126f830d7a9ddd419ff4b115ca2774 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 12 Feb 2018 00:16:20 +0530 Subject: [PATCH 041/242] Interaction Layer: Added response formatter, updated mocha tests --- lib/contract_interact/helper.js | 7 +- lib/contract_interact/pricer.js | 83 ++++-- lib/formatter/response.js | 2 +- mocha_test/scripts/deploy_all.sh | 6 +- mocha_test/scripts/deploy_price_oracle.sh | 11 +- .../services/pricer/accepted_margins.js | 102 +++++++ mocha_test/services/pricer/base_currency.js | 34 +++ mocha_test/services/pricer/branded_token.js | 35 +++ mocha_test/services/pricer/constants.js | 4 +- mocha_test/services/pricer/conversion_rate.js | 34 +++ mocha_test/services/pricer/decimals.js | 34 +++ mocha_test/services/pricer/get_price_point.js | 122 +++++++++ .../get_pricepoint_and_calculated_amounts.js | 87 ++++-- mocha_test/services/pricer/pay.js | 249 ++++++++++++------ mocha_test/services/pricer/price_oracles.js | 111 ++++++++ mocha_test/services/pricer/pricer_utils.js | 14 + .../services/pricer/set_accepted_margin.js | 59 ++++- .../services/pricer/set_price_oracle.js | 87 ++++-- .../services/pricer/unset_price_oracle.js | 48 +++- 19 files changed, 953 insertions(+), 176 deletions(-) create mode 100644 mocha_test/services/pricer/accepted_margins.js create mode 100644 mocha_test/services/pricer/base_currency.js create mode 100644 mocha_test/services/pricer/branded_token.js create mode 100644 mocha_test/services/pricer/conversion_rate.js create mode 100644 mocha_test/services/pricer/decimals.js create mode 100644 mocha_test/services/pricer/get_price_point.js create mode 100644 mocha_test/services/pricer/price_oracles.js create mode 100644 mocha_test/services/pricer/pricer_utils.js diff --git a/lib/contract_interact/helper.js b/lib/contract_interact/helper.js index 3d1584b..3acd652 100644 --- a/lib/contract_interact/helper.js +++ b/lib/contract_interact/helper.js @@ -44,7 +44,12 @@ const helper = { return web3RpcProvider.eth.call(params) .then(function(response) { if (transactionOutputs ) { - return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); + try { + return web3RpcProvider.eth.abi.decodeParameters(transactionOutputs, response); + } + catch (err) { + return Promise.reject(err); + } } else { return response; } diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index e9ce606..0f6c064 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -17,7 +17,7 @@ const contractAbi = coreAddresses.getAbiForContract(contractName); const GAS_LIMIT = coreConstants.OST_GAS_LIMIT; const currContract = new web3RpcProvider.eth.Contract(contractAbi); //const logger = require(rootPrefix + '/helpers/custom_console_logger'); -//const responseHelper = require(rootPrefix + '/lib/formatter/response'); +const responseHelper = require(rootPrefix + '/lib/formatter/response'); /** @@ -41,7 +41,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + return Promise.resolve(responseHelper.successWithData({brandedToken: response[0]})); }, /** @@ -55,7 +55,8 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + return Promise.resolve(responseHelper.successWithData({acceptedMargins: response[0]})); + }, /** @@ -69,7 +70,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + return Promise.resolve(responseHelper.successWithData({priceOracles: response[0]})); }, /** @@ -83,7 +84,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + return Promise.resolve(responseHelper.successWithData({baseCurrency: response[0], symbol: web3RpcProvider.utils.hexToString(response[0])})); }, /** @@ -97,7 +98,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + return Promise.resolve(responseHelper.successWithData({decimals: response[0]})); }, /** @@ -111,7 +112,7 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + return Promise.resolve(responseHelper.successWithData({conversionRate: response[0]})); }, @@ -135,15 +136,15 @@ Pricer.prototype = { currContract.setProvider( web3RpcProvider.currentProvider ); const transactionObject = currContract.methods.setPriceOracle(web3RpcProvider.utils.asciiToHex(currency), address); const encodedABI = transactionObject.encodeABI(); - return helper.safeSendFromAddr( + return helper.sendTxAsyncFromAddr( web3RpcProvider, this.contractAddress, encodedABI, senderAddress, senderPassphrase, { gasPrice: gasPrice, gas: GAS_LIMIT } - ).then(function(transactionReceipt) { - return Promise.resolve(transactionReceipt); + ).then(function(transactionHash) { + return Promise.resolve(responseHelper.successWithData({transactionHash: transactionHash})); }); }, @@ -166,15 +167,15 @@ Pricer.prototype = { currContract.setProvider( web3RpcProvider.currentProvider ); const transactionObject = currContract.methods.unsetPriceOracle(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); - return helper.safeSendFromAddr( + return helper.sendTxAsyncFromAddr( web3RpcProvider, this.contractAddress, encodedABI, senderAddress, senderPassphrase, { gasPrice: gasPrice, gas: GAS_LIMIT } - ).then(function(transactionReceipt) { - return Promise.resolve(transactionReceipt); + ).then(function(transactionHash) { + return Promise.resolve(responseHelper.successWithData({transactionHash: transactionHash})); }); }, @@ -196,19 +197,17 @@ Pricer.prototype = { } helper.assertAddress(senderAddress); - //TODO: Convert accepted margin to wei as per token decimal - const transactionObject = currContract.methods.setAcceptedMargin(web3RpcProvider.utils.asciiToHex(currency), acceptedMargin); const encodedABI = transactionObject.encodeABI(); - return helper.safeSendFromAddr( + return helper.sendTxAsyncFromAddr( web3RpcProvider, this.contractAddress, encodedABI, senderAddress, senderPassphrase, { gasPrice: gasPrice, gas: GAS_LIMIT } - ).then(function(transactionReceipt) { - return Promise.resolve(transactionReceipt); + ).then(function(transactionHash) { + return Promise.resolve(responseHelper.successWithData({transactionHash: transactionHash})); }); }, @@ -219,7 +218,7 @@ Pricer.prototype = { * @return {Promise} * */ - pay: async function ( + pay: function ( senderAddress, senderPassphrase, beneficiaryAddress, @@ -257,15 +256,17 @@ Pricer.prototype = { const encodedABI = transactionObject.encodeABI(); - const transactionReceipt = await helper.safeSendFromAddr( + return helper.sendTxAsyncFromAddr( web3RpcProvider, this.contractAddress, encodedABI, senderAddress, senderPassphrase, { gasPrice: gasPrice, gas: GAS_LIMIT } - ); - return Promise.resolve(transactionReceipt); + ).then(function(transactionHash) { + return Promise.resolve(responseHelper.successWithData({transactionHash: transactionHash})); + }); + }, @@ -282,8 +283,20 @@ Pricer.prototype = { const transactionObject = currContract.methods.getPricePoint(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); - const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - return Promise.resolve(response[0]); + //const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); + //return Promise.resolve(responseHelper.successWithData({pricePoint: response[0]})); + return helper.call( + web3RpcProvider, + this.contractAddress, + encodedABI, + {}, + transactionOutputs) + .then(function(response) { + return Promise.resolve(responseHelper.successWithData({pricePoint: response[0]})); + }) + .catch(function(err) { + return Promise.resolve(responseHelper.error("err_gpp_01", err)); + }); }, /** @@ -312,10 +325,12 @@ Pricer.prototype = { {}, transactionOutputs) .then(function (response) { - return Promise.resolve(response); - }) - .catch(function(err) { - return Promise.reject(err); + return Promise.resolve(responseHelper.successWithData( + { + pricePoint: response[0], + tokenAmount: response[1], + commissionTokenAmount: response[2] + })); }); }, @@ -324,6 +339,18 @@ Pricer.prototype = { */ toWei: function(value) { return web3RpcProvider.utils.toWei(value, "ether"); + }, + + getTxReceipt: function(transactionHash) { + + return helper.getTxReceipt( + web3RpcProvider, + transactionHash, + {}) + .then(function (transactionReceipt) { + return Promise.resolve(responseHelper.successWithData({transactionReceipt: transactionReceipt})); + }); + } }; diff --git a/lib/formatter/response.js b/lib/formatter/response.js index bca50ac..1d873cc 100644 --- a/lib/formatter/response.js +++ b/lib/formatter/response.js @@ -8,7 +8,7 @@ const shortId = require('shortid'); function Result(data, errCode, errMsg) { - this.success = (typeof errCode === "undefined"); + this.success = (typeof errCode === undefined || typeof errCode === "undefined"); this.data = data || {}; diff --git a/mocha_test/scripts/deploy_all.sh b/mocha_test/scripts/deploy_all.sh index 84a9920..ff19bcb 100644 --- a/mocha_test/scripts/deploy_all.sh +++ b/mocha_test/scripts/deploy_all.sh @@ -22,8 +22,8 @@ echo "\n********* Done *************" echo "\n********* Deploying test coin 3 *************" . ./scripts/env_vars.sh node ../tools/deploy/EIP20TokenMock.js 3 TC3 TestCoin3 10 0x12A05F200 travis tc3.txt -export TEST_COIN2_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) -echo '\nexport TEST_COIN2_C3_ADDRESS='\'$TEST_COIN2_C3_ADDRESS\'>>scripts/env_vars.sh +export TEST_COIN3_C3_ADDRESS=$(cat ../tools/deploy/tc3.txt) +echo '\nexport TEST_COIN3_C3_ADDRESS='\'$TEST_COIN3_C3_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tc3.txt echo "\n********* Done *************" @@ -46,7 +46,7 @@ echo "\n********* Done *************" echo "\n********* Deploying Pricer 3 *************" . ./scripts/env_vars.sh -node ../tools/deploy/pricer.js $TEST_COIN2_C3_ADDRESS OST 0x12A05F200 travis tp3.txt +node ../tools/deploy/pricer.js $TEST_COIN3_C3_ADDRESS OST 0x12A05F200 travis tp3.txt export TEST_PRICER_C3_ADDRESS=$(cat ../tools/deploy/tp3.txt) echo '\nexport TEST_PRICER_C3_ADDRESS='\'$TEST_PRICER_C3_ADDRESS\'>>scripts/env_vars.sh rm ../tools/deploy/tp3.txt diff --git a/mocha_test/scripts/deploy_price_oracle.sh b/mocha_test/scripts/deploy_price_oracle.sh index 57359f5..7d74689 100644 --- a/mocha_test/scripts/deploy_price_oracle.sh +++ b/mocha_test/scripts/deploy_price_oracle.sh @@ -3,7 +3,16 @@ echo "\n********* Preparing price oracle deployment *************" npm install @ostdotcom/ost-price-oracle cd ../../node_modules/@ostdotcom/ost-price-oracle/ -pwd + +# git clone git@github.com:OpenSTFoundation/ost-price-oracle.git +# cd ost-price-oracle +# git stash +# git checkout develop +# git pull --rebase +# cd .. +# npm install ./ost-price-oracle +# cd ost-price-oracle + echo "\n********* Done *************" echo "\n********* Deploying PO 1 *************" diff --git a/mocha_test/services/pricer/accepted_margins.js b/mocha_test/services/pricer/accepted_margins.js new file mode 100644 index 0000000..54a6291 --- /dev/null +++ b/mocha_test/services/pricer/accepted_margins.js @@ -0,0 +1,102 @@ +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; + +const rootPrefix = "../../.." + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) +; + + +describe('Get accepted margins', function() { + + it('should pass the initial address checks', function() { + + assert.isDefined(constants.deployer); + assert.isDefined(constants.ops); + assert.isDefined(constants.account1); + assert.notEqual(constants.deployer, constants.ops); + assert.notEqual(constants.deployer, constants.account1); + assert.notEqual(constants.ops, constants.account1); + + }); + + it('should return 0 when margin was not set for given currency', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const amResult = await pricerOstUsd.acceptedMargins("ABC"); + assert.equal(amResult.isSuccess(), true); + assert.equal(0, amResult.data.acceptedMargins); + + }); + + it('should return 0 when margin when currency is blank', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyBlank); + assert.equal(amResult.isSuccess(), true); + assert.equal(0, amResult.data.acceptedMargins); + + }); + + it('should return the accepted margin as 50, 100 and 300', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const response1 = await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 50, + 0xBA43B7400); + + assert.equal(response1.isSuccess(), true); + assert.exists(response1.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response1.data.transactionHash); + + const amResult1 = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(amResult1.isSuccess(), true); + assert.equal(50, amResult1.data.acceptedMargins); + + + const response2 = await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 300, + 0xBA43B7400); + + assert.equal(response2.isSuccess(), true); + assert.exists(response2.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response2.data.transactionHash); + + const amResult2 = await pricerOstUsd.acceptedMargins(constants.currencyUSD); + assert.equal(amResult2.isSuccess(), true); + assert.equal(300, amResult2.data.acceptedMargins); + + + const response3 = await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyEUR, + 100, + 0xBA43B7400); + + assert.equal(response3.isSuccess(), true); + assert.exists(response3.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response3.data.transactionHash); + + const amResult3 = await pricerOstUsd.acceptedMargins(constants.currencyEUR); + assert.equal(amResult3.isSuccess(), true); + assert.equal(100, amResult3.data.acceptedMargins); + + }); + +}); + + diff --git a/mocha_test/services/pricer/base_currency.js b/mocha_test/services/pricer/base_currency.js new file mode 100644 index 0000000..916b309 --- /dev/null +++ b/mocha_test/services/pricer/base_currency.js @@ -0,0 +1,34 @@ + +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; + +const rootPrefix = "../../.." + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , pricerOstUsd10Decimal = new pricer(constants.pricerOstUsd10DecimalAddress) +; + +describe('Get base currency', function() { + + it('should return correct base currency (OST)', async function() { + + const pricerOstUsdResult = await pricerOstUsd.baseCurrency(); + assert.equal(pricerOstUsdResult.isSuccess(), true); + assert.equal(pricerOstUsdResult.data.symbol, 'OST'); + + const pricerOstEurResult = await pricerOstEur.baseCurrency(); + assert.equal(pricerOstEurResult.isSuccess(), true); + assert.equal(pricerOstEurResult.data.symbol, 'OST'); + + const pricerOstUsd10Result = await pricerOstUsd10Decimal.baseCurrency(); + assert.equal(pricerOstUsd10Result.isSuccess(), true); + assert.equal(pricerOstUsd10Result.data.symbol, 'OST'); + + }); + +}); diff --git a/mocha_test/services/pricer/branded_token.js b/mocha_test/services/pricer/branded_token.js new file mode 100644 index 0000000..643b8c5 --- /dev/null +++ b/mocha_test/services/pricer/branded_token.js @@ -0,0 +1,35 @@ + +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; + +const rootPrefix = "../../.." + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , pricerOstUsd10Decimal = new pricer(constants.pricerOstUsd10DecimalAddress) +; + +describe('Get branded token', function() { + + it('should return correct branded token', async function() { + + const pricerOstUsdResult = await pricerOstUsd.brandedToken(); + assert.equal(pricerOstUsdResult.isSuccess(), true); + assert.equal(pricerOstUsdResult.data.brandedToken, constants.TC5Address); + + const pricerOstEurResult = await pricerOstEur.brandedToken(); + assert.equal(pricerOstEurResult.isSuccess(), true); + assert.equal(pricerOstEurResult.data.brandedToken, constants.TC2Address); + + const pricerOstUsd10Result = await pricerOstUsd10Decimal.brandedToken(); + assert.equal(pricerOstUsd10Result.isSuccess(), true); + assert.equal(pricerOstUsd10Result.data.brandedToken, constants.TC3Address); + + }); + +}); + diff --git a/mocha_test/services/pricer/constants.js b/mocha_test/services/pricer/constants.js index 900bae6..1d79401 100644 --- a/mocha_test/services/pricer/constants.js +++ b/mocha_test/services/pricer/constants.js @@ -20,7 +20,7 @@ const constants = { pricerOstUsd10DecimalAddress: process.env.TEST_PRICER_C3_ADDRESS, priceOracles: JSON.parse(process.env.OST_PO_PRICE_ORACLES), TC5Address: process.env.TEST_COIN1_C5_ADDRESS, - TC2Address: process.env.TEST_COIN1_C2_ADDRESS, - TC3Address: process.env.TEST_COIN1_C3_ADDRESS + TC2Address: process.env.TEST_COIN2_C2_ADDRESS, + TC3Address: process.env.TEST_COIN3_C3_ADDRESS }; module.exports = constants; diff --git a/mocha_test/services/pricer/conversion_rate.js b/mocha_test/services/pricer/conversion_rate.js new file mode 100644 index 0000000..a763824 --- /dev/null +++ b/mocha_test/services/pricer/conversion_rate.js @@ -0,0 +1,34 @@ + +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; + +const rootPrefix = "../../.." + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , pricerOstUsd10Decimal = new pricer(constants.pricerOstUsd10DecimalAddress) +; + +describe('Get conversion rate', function() { + + it('should return correct conversion rate', async function() { + + const pricerOstUsdResult = await pricerOstUsd.conversionRate(); + assert.equal(pricerOstUsdResult.isSuccess(), true); + assert.equal(pricerOstUsdResult.data.conversionRate, 5); + + const pricerOstEurResult = await pricerOstEur.conversionRate(); + assert.equal(pricerOstEurResult.isSuccess(), true); + assert.equal(pricerOstEurResult.data.conversionRate, 2); + + const pricerOstUsd10Result = await pricerOstUsd10Decimal.conversionRate(); + assert.equal(pricerOstUsd10Result.isSuccess(), true); + assert.equal(pricerOstUsd10Result.data.conversionRate, 3); + + }); + +}); diff --git a/mocha_test/services/pricer/decimals.js b/mocha_test/services/pricer/decimals.js new file mode 100644 index 0000000..ab44672 --- /dev/null +++ b/mocha_test/services/pricer/decimals.js @@ -0,0 +1,34 @@ + +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; + +const rootPrefix = "../../.." + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , pricerOstUsd10Decimal = new pricer(constants.pricerOstUsd10DecimalAddress) +; + +describe('Get decimals', function() { + + it('should return correct decimals', async function() { + + const pricerOstUsdResult = await pricerOstUsd.decimals(); + assert.equal(pricerOstUsdResult.isSuccess(), true); + assert.equal(pricerOstUsdResult.data.decimals, 18); + + const pricerOstEurResult = await pricerOstEur.decimals(); + assert.equal(pricerOstEurResult.isSuccess(), true); + assert.equal(pricerOstEurResult.data.decimals, 18); + + const pricerOstUsd10Result = await pricerOstUsd10Decimal.decimals(); + assert.equal(pricerOstUsd10Result.isSuccess(), true); + assert.equal(pricerOstUsd10Result.data.decimals, 10); + + }); + +}); diff --git a/mocha_test/services/pricer/get_price_point.js b/mocha_test/services/pricer/get_price_point.js new file mode 100644 index 0000000..fe390ff --- /dev/null +++ b/mocha_test/services/pricer/get_price_point.js @@ -0,0 +1,122 @@ + +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; + +const rootPrefix = "../../.." + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) +; + +describe('Get price point', function() { + + it('should pass the initial address checks', function() { + + assert.isDefined(constants.deployer); + assert.isDefined(constants.ops); + assert.isDefined(constants.account1); + assert.notEqual(constants.deployer, constants.ops); + assert.notEqual(constants.deployer, constants.account1); + assert.notEqual(constants.ops, constants.account1); + + }); + + it('should get failure when currency is blank', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + const pricePoint = await pricerOstUsd.getPricePoint(constants.currencyINR); + assert.equal(pricePoint.isFailure(), true); + + }); + + + it('should get failure when currency is does not exists in system', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + const pricePoint = await pricerOstUsd.getPricePoint("ABC"); + assert.equal(pricePoint.isFailure(), true); + + }); + + + it('should get correct price oracle address after set', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + // set price point 1 + const response = await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyEUR, + constants.priceOracles.OST.EUR, + 0xBA43B7400); + + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + + const poResult = await pricerOstUsd.priceOracles(constants.currencyEUR); + assert.equal(poResult.isSuccess(), true); + assert.equal(poResult.data.priceOracles, constants.priceOracles.OST.EUR); + + + // set price point 2 + const response2 = await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + + assert.equal(response2.isSuccess(), true); + assert.exists(response2.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response2.data.transactionHash); + + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult2.isSuccess(), true); + assert.equal(poResult2.data.priceOracles, constants.priceOracles.OST.USD); + + const pricePoint1 = await pricerOstUsd.getPricePoint(constants.currencyUSD); + assert.equal(pricePoint1.isSuccess(), true); + assert.equal(pricePoint1.data.pricePoint, pricerOstUsd.toWei('0.5')); + + const pricePoint2 = await pricerOstUsd.getPricePoint(constants.currencyEUR); + assert.equal(pricePoint2.isSuccess(), true); + assert.equal(pricePoint2.data.pricePoint, pricerOstUsd.toWei('0.2')); + + }); + + + it('should get correct price oracle address after unset', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const response = await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0xBA43B7400); + + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult.isSuccess(), true); + assert.equal(poResult.data.priceOracles, 0x0); + + const pricePoint1 = await pricerOstUsd.getPricePoint(constants.currencyUSD); + assert.equal(pricePoint1.isFailure(), true); + + // price point for OST/EUR will remain the same + const pricePoint2 = await pricerOstUsd.getPricePoint(constants.currencyEUR); + assert.equal(pricePoint2.isSuccess(), true); + assert.equal(pricePoint2.data.pricePoint, pricerOstUsd.toWei('0.2')); + + }); + +}); + diff --git a/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js b/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js index d4a2ea4..afe604d 100644 --- a/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js +++ b/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -6,6 +6,7 @@ const chai = require('chai') const rootPrefix = "../../.." , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) , pricerOstEur = new pricer(constants.pricerOstEurAddress) @@ -25,27 +26,42 @@ describe('Get price point and calculated amounts', function() { assert.notEqual(constants.deployer, constants.account1); assert.notEqual(constants.ops, constants.account1); - await pricerOstUsd.setPriceOracle( + const response1 = await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, constants.priceOracles.OST.USD, 0xBA43B7400); + + assert.equal(response1.isSuccess(), true); + assert.exists(response1.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response1.data.transactionHash); + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(constants.priceOracles.OST.USD, poResult1); + assert.equal(poResult1.isSuccess(), true); + assert.equal(constants.priceOracles.OST.USD, poResult1.data.priceOracles); - await pricerOstEur.setPriceOracle( + const response2 = await pricerOstEur.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyEUR, constants.priceOracles.OST.EUR, 0xBA43B7400); + + assert.equal(response2.isSuccess(), true); + assert.exists(response2.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstEur, response2.data.transactionHash); + const poResult2 = await pricerOstEur.priceOracles(constants.currencyEUR); - assert.equal(constants.priceOracles.OST.EUR, poResult2); + assert.equal(poResult2.isSuccess(), true); + assert.equal(constants.priceOracles.OST.EUR, poResult2.data.priceOracles); }); + it('should fail when currency is 0', async function() { + + var isError = false; try { await pricerOstUsd.getPricePointAndCalculatedAmounts( pricerOstUsd.toWei('1'), @@ -53,11 +69,15 @@ describe('Get price point and calculated amounts', function() { constants.currencyBlank); } catch (err) { - assert.equal(err, 'Currency is mandatory'); + isError = true; } + assert.equal(isError, true); + }); it('should fail when price point is 0', async function() { + + var isError = false; try { await pricerOstUsd.getPricePointAndCalculatedAmounts( pricerOstUsd.toWei('1'), @@ -65,15 +85,29 @@ describe('Get price point and calculated amounts', function() { constants.currencyINR); } catch (err) { + isError = true; assert.instanceOf(err, Error); } + assert.equal(isError, true); + }); + it('should pass when all parameters are valid and conversion rate is 5', async function() { - const pricePoint = await pricerOstUsd.getPricePoint(constants.currencyUSD) - , decimal = await pricerOstUsd.decimals() - , conversionRate = await pricerOstUsd.conversionRate() - , amount = pricerOstUsd.toWei('1') + + const pricePointData = await pricerOstUsd.getPricePoint(constants.currencyUSD); + assert.equal(pricePointData.isSuccess(), true); + const pricePoint = pricePointData.data.pricePoint; + + const decimalData = await pricerOstUsd.decimals(); + assert.equal(decimalData.isSuccess(), true); + const decimal = decimalData.data.decimals; + + const conversionRateData = await pricerOstUsd.conversionRate(); + assert.equal(conversionRateData.isSuccess(), true); + const conversionRate = conversionRateData.data.conversionRate; + + const amount = pricerOstUsd.toWei('1') , commissionAmount = pricerOstUsd.toWei('0.5') , calculatedAmount = (amount*conversionRate*(10**decimal))/pricePoint , calculatedCommisionAmount = (commissionAmount*conversionRate*(10**decimal))/pricePoint; @@ -82,18 +116,30 @@ describe('Get price point and calculated amounts', function() { amount, commissionAmount, constants.currencyUSD); + assert.equal(result.isSuccess(), true); - assert.equal(result.pricePoint, pricePoint); - assert.equal(result.tokenAmount, calculatedAmount); - assert.equal(result.commissionTokenAmount, calculatedCommisionAmount); + assert.equal(result.data.pricePoint, pricePoint); + assert.equal(result.data.tokenAmount, calculatedAmount); + assert.equal(result.data.commissionTokenAmount, calculatedCommisionAmount); }); + it('should pass when all parameters are valid and conversion rate is 2', async function() { - const pricePoint = await pricerOstEur.getPricePoint(constants.currencyEUR) - , decimal = await pricerOstEur.decimals() - , conversionRate = await pricerOstEur.conversionRate() - , amount = pricerOstEur.toWei('1') + + const pricePointData = await pricerOstEur.getPricePoint(constants.currencyEUR); + assert.equal(pricePointData.isSuccess(), true); + const pricePoint = pricePointData.data.pricePoint; + + const decimalData = await pricerOstEur.decimals(); + assert.equal(decimalData.isSuccess(), true); + const decimal = decimalData.data.decimals; + + const conversionRateData = await pricerOstEur.conversionRate(); + assert.equal(conversionRateData.isSuccess(), true); + const conversionRate = conversionRateData.data.conversionRate; + + const amount = pricerOstEur.toWei('1') , commissionAmount = pricerOstEur.toWei('0.5') , calculatedAmount = (amount*conversionRate*(10**decimal))/pricePoint , calculatedCommisionAmount = (commissionAmount*conversionRate*(10**decimal))/pricePoint; @@ -102,11 +148,12 @@ describe('Get price point and calculated amounts', function() { amount, commissionAmount, constants.currencyEUR); + assert.equal(result.isSuccess(), true); + + assert.equal(result.data.pricePoint, pricePoint); + assert.equal(result.data.tokenAmount, calculatedAmount); + assert.equal(result.data.commissionTokenAmount, calculatedCommisionAmount); - assert.equal(result.pricePoint, pricePoint); - assert.equal(result.tokenAmount, calculatedAmount); - assert.equal(result.commissionTokenAmount, calculatedCommisionAmount); }); }); - diff --git a/mocha_test/services/pricer/pay.js b/mocha_test/services/pricer/pay.js index 7e4724d..aef7239 100644 --- a/mocha_test/services/pricer/pay.js +++ b/mocha_test/services/pricer/pay.js @@ -1,9 +1,12 @@ +/* global describe, it */ + const chai = require('chai') , assert = chai.assert; const rootPrefix = "../../.." , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') , BigNumber = require('bignumber.js') + , pricerUtils = require('./pricer_utils') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) , pricerOstEur = new pricer(constants.pricerOstEurAddress) @@ -11,8 +14,6 @@ const rootPrefix = "../../.." , TC5 = new mockToken(constants.TC5Address) ; -/* global describe, it */ - describe('Pay', function() { it('should pass the initial checks', async function() { @@ -26,25 +27,35 @@ describe('Pay', function() { assert.notEqual(constants.deployer, constants.account1); assert.notEqual(constants.ops, constants.account1); - await pricerOstUsd.setAcceptedMargin( + const amResponse = await pricerOstUsd.setAcceptedMargin( constants.ops, constants.opsPassphrase, constants.currencyUSD, 50, 0xBA43B7400); + assert.equal(amResponse.isSuccess(), true); + assert.exists(amResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, amResponse.data.transactionHash); + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); - assert.equal(50, amResult); + assert.equal(amResult.isSuccess(), true); + assert.equal(50, amResult.data.acceptedMargins); - await pricerOstUsd.setPriceOracle( + const spoResponse = await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, constants.priceOracles.OST.USD, 0xBA43B7400); - const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(constants.priceOracles.OST.USD, poResult); + assert.equal(spoResponse.isSuccess(), true); + assert.exists(spoResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, spoResponse.data.transactionHash); + + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult.isSuccess(), true); + assert.equal(constants.priceOracles.OST.USD, poResult.data.priceOracles); await TC5.setBalance( constants.ops, @@ -88,6 +99,7 @@ describe('Pay', function() { }); + it('should pass when all parameters are valid', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -99,20 +111,24 @@ describe('Pay', function() { const beneficiary = constants.account3 , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) , commissionBeneficiary = constants.account4 - , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) + , currency = constants.currencyUSD , transferAmount = new BigNumber(pricerOstUsd.toWei('10')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + assert.equal(estimatedValues.isSuccess(), true); + + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const intendedPricePoint = estimatedValues.data.pricePoint; + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); const estimatedTotalAmount = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); @@ -123,7 +139,7 @@ describe('Pay', function() { estimatedTotalAmount, 0xBA43B7400); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -134,6 +150,11 @@ describe('Pay', function() { intendedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -156,6 +177,7 @@ describe('Pay', function() { }); + it('should fail when sender balance is less than the amount being transfered', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -168,19 +190,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('100000')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('5000')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const intendedPricePoint = estimatedValues.data.pricePoint; + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); const total = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); @@ -191,7 +216,7 @@ describe('Pay', function() { total, 0xBA43B7400); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -202,6 +227,10 @@ describe('Pay', function() { intendedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -225,19 +254,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('12')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const intendedPricePoint = estimatedValues.data.pricePoint; + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); const total = estimatedTokenAmount .plus(estimatedCommissionTokenAmount) @@ -251,7 +283,7 @@ describe('Pay', function() { total, 0xBA43B7400); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -262,6 +294,10 @@ describe('Pay', function() { intendedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -272,6 +308,7 @@ describe('Pay', function() { }); + it('should fail when beneficiary address is 0', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -284,19 +321,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('7')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); + const intendedPricePoint = estimatedValues.data.pricePoint; const total = estimatedTokenAmount .plus(estimatedCommissionTokenAmount) @@ -338,6 +378,7 @@ describe('Pay', function() { }); + it('should fail when currency is not available in pricer', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -350,19 +391,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); + const intendedPricePoint = estimatedValues.data.pricePoint; const total = estimatedTokenAmount .plus(estimatedCommissionTokenAmount) @@ -375,7 +419,7 @@ describe('Pay', function() { total, 0xBA43B7400); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -386,6 +430,10 @@ describe('Pay', function() { intendedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -396,6 +444,7 @@ describe('Pay', function() { }); + it('should fail when commision amount is not 0 and commision beneficiary address is 0', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -408,19 +457,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) , commissionBeneficiary = 0 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); + const intendedPricePoint = estimatedValues.data.pricePoint; const total = estimatedTokenAmount .plus(estimatedCommissionTokenAmount) @@ -474,19 +526,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); + const intendedPricePoint = estimatedValues.data.pricePoint; const total = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); @@ -501,7 +556,7 @@ describe('Pay', function() { .plus(estimatedMargin) .plus(new BigNumber(1)); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -512,6 +567,10 @@ describe('Pay', function() { changedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -535,19 +594,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); + const intendedPricePoint = estimatedValues.data.pricePoint; const total = estimatedTokenAmount .plus(estimatedCommissionTokenAmount) @@ -564,7 +626,7 @@ describe('Pay', function() { .minus(estimatedMargin) .minus(new BigNumber(1)); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -575,6 +637,10 @@ describe('Pay', function() { changedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -598,19 +664,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); + const intendedPricePoint = estimatedValues.data.pricePoint; const total = estimatedTokenAmount .plus(estimatedCommissionTokenAmount) @@ -623,7 +692,7 @@ describe('Pay', function() { total, 0xBA43B7400); - const result = await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -634,6 +703,10 @@ describe('Pay', function() { intendedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -644,6 +717,7 @@ describe('Pay', function() { }); + it('should pass when all parameters are valid and commission beneficiary address, commissionAmount is 0', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -656,19 +730,22 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('0')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = await pricerOstUsd.getPricePoint(currency) , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); + assert.equal(estimatedValues.data.commissionTokenAmount, 0); - assert.equal(estimatedValues.commissionTokenAmount, 0); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); + const intendedPricePoint = estimatedValues.data.pricePoint; const total = estimatedTokenAmount.plus(estimatedMargin); @@ -679,7 +756,7 @@ describe('Pay', function() { total, 0xBA43B7400); - const result = await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -690,6 +767,10 @@ describe('Pay', function() { intendedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -700,7 +781,8 @@ describe('Pay', function() { }); - it('should pass when all parameters are currency is blank', async function() { + + it('should pass when all parameters are valid and currency is blank (BT Transfer)', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -712,10 +794,11 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('5')) , commissionBeneficiary = constants.account4 , currency = constants.currencyBlank - , intendedPricePoint = new BigNumber(0) , transferAmount = new BigNumber(pricerOstUsd.toWei('10')) ; + const intendedPricePoint = 0; + const total = transferAmount.plus(commissionAmount); await TC5.approve( @@ -725,7 +808,7 @@ describe('Pay', function() { total, 0xBA43B7400); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -736,6 +819,10 @@ describe('Pay', function() { intendedPricePoint, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -745,6 +832,7 @@ describe('Pay', function() { assert.equal(initialAccount4Balance.plus(commissionAmount).toNumber(), account4Balance.toNumber()); }); + it('should fail when intended price point is 0', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); @@ -757,19 +845,21 @@ describe('Pay', function() { , commissionAmount = new BigNumber(pricerOstUsd.toWei('10')) , commissionBeneficiary = constants.account4 , currency = constants.currencyUSD - , intendedPricePoint = 0 , transferAmount = new BigNumber(pricerOstUsd.toWei('5')) ; - const acceptedMargin = await pricerOstUsd.acceptedMargins(currency); + const acceptedMarginData = await pricerOstUsd.acceptedMargins(currency); + assert.equal(acceptedMarginData.isSuccess(), true); + const estimatedValues = await pricerOstUsd.getPricePointAndCalculatedAmounts( transferAmount, commissionAmount, currency); + assert.equal(estimatedValues.isSuccess(), true); - const estimatedTokenAmount = new BigNumber(estimatedValues.tokenAmount); - const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.commissionTokenAmount); - const estimatedMargin = new BigNumber(acceptedMargin); + const estimatedTokenAmount = new BigNumber(estimatedValues.data.tokenAmount); + const estimatedCommissionTokenAmount = new BigNumber(estimatedValues.data.commissionTokenAmount); + const estimatedMargin = new BigNumber(acceptedMarginData.data.acceptedMargins); const total = estimatedTokenAmount.plus(estimatedCommissionTokenAmount).plus(estimatedMargin); @@ -780,7 +870,7 @@ describe('Pay', function() { total, 0xBA43B7400); - await pricerOstUsd.pay( + const payResponse = await pricerOstUsd.pay( constants.account1, constants.accountPassphrase1, beneficiary, @@ -788,9 +878,13 @@ describe('Pay', function() { commissionBeneficiary, commissionAmount, constants.currencyUSD, - intendedPricePoint, + 0, 0xBA43B7400); + assert.equal(payResponse.isSuccess(), true); + assert.exists(payResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, payResponse.data.transactionHash); + const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) , account4Balance = new BigNumber(await TC5.balanceOf(constants.account4)); @@ -800,4 +894,7 @@ describe('Pay', function() { assert.equal(initialAccount4Balance.toNumber(), account4Balance.toNumber()); }); + }); + + diff --git a/mocha_test/services/pricer/price_oracles.js b/mocha_test/services/pricer/price_oracles.js new file mode 100644 index 0000000..9737193 --- /dev/null +++ b/mocha_test/services/pricer/price_oracles.js @@ -0,0 +1,111 @@ + +/* global describe, it */ + +const chai = require('chai') + , assert = chai.assert; + +const rootPrefix = "../../.." + , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') + , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) + , pricerOstEur = new pricer(constants.pricerOstEurAddress) + , pricerOstUsd10Decimal = new pricer(constants.pricerOstUsd10DecimalAddress) +; + +describe('Get price oracles', function() { + + it('should return 0x0 when currency is blank', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const poResult = await pricerOstUsd.priceOracles(constants.currencyBlank); + assert.equal(poResult.isSuccess(), true); + assert.equal(poResult.data.priceOracles, 0x0); + + }); + + it('should return 0x0 when currency is not set', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const poResult = await pricerOstUsd.priceOracles("ABC"); + assert.equal(poResult.isSuccess(), true); + assert.equal(poResult.data.priceOracles, 0x0); + + }); + + it('should return correct price oracles (after set)', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const setResponse = await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + + assert.equal(setResponse.isSuccess(), true); + assert.exists(setResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, setResponse.data.transactionHash); + + + const setResponse1 = await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyEUR, + constants.priceOracles.OST.EUR, + 0xBA43B7400); + + assert.equal(setResponse1.isSuccess(), true); + assert.exists(setResponse1.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, setResponse1.data.transactionHash); + + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult1.isSuccess(), true); + assert.equal(poResult1.data.priceOracles, constants.priceOracles.OST.USD); + + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyEUR); + assert.equal(poResult2.isSuccess(), true); + assert.equal(poResult2.data.priceOracles, constants.priceOracles.OST.EUR); + + }); + + it('should return 0x0 (after unset)', async function() { + // eslint-disable-next-line no-invalid-this + this.timeout(100000); + + const unsetResponse = await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0xBA43B7400); + + assert.equal(unsetResponse.isSuccess(), true); + assert.exists(unsetResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, unsetResponse.data.transactionHash); + + + const unsetResponse1 = await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyEUR, + 0xBA43B7400); + + assert.equal(unsetResponse1.isSuccess(), true); + assert.exists(unsetResponse1.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, unsetResponse1.data.transactionHash); + + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); + assert.equal(poResult1.isSuccess(), true); + assert.equal(poResult1.data.priceOracles, 0x0); + + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyEUR); + assert.equal(poResult2.isSuccess(), true); + assert.equal(poResult2.data.priceOracles, 0x0); + + }); + +}); + diff --git a/mocha_test/services/pricer/pricer_utils.js b/mocha_test/services/pricer/pricer_utils.js new file mode 100644 index 0000000..fa7216c --- /dev/null +++ b/mocha_test/services/pricer/pricer_utils.js @@ -0,0 +1,14 @@ + +const chai = require('chai') + , assert = chai.assert; + +module.exports.verifyReceipt = async (pricer, transactionHash) => { + + const receipt = await pricer.getTxReceipt(transactionHash); + + assert.equal(receipt.isSuccess(), true); + assert.equal(transactionHash, receipt.data.transactionReceipt.formattedTransactionReceipt.transactionHash); + assert.exists(receipt.data.transactionReceipt); + +}; + diff --git a/mocha_test/services/pricer/set_accepted_margin.js b/mocha_test/services/pricer/set_accepted_margin.js index 16d1e7f..9a82a65 100644 --- a/mocha_test/services/pricer/set_accepted_margin.js +++ b/mocha_test/services/pricer/set_accepted_margin.js @@ -6,6 +6,7 @@ const chai = require('chai') const rootPrefix = "../../.." , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') + , pricerUtils = require('./pricer_utils') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) ; @@ -21,18 +22,26 @@ describe('Set accepted margins', function() { assert.notEqual(constants.deployer, constants.account1); assert.notEqual(constants.ops, constants.account1); - await pricerOstUsd.setAcceptedMargin( + const response = await pricerOstUsd.setAcceptedMargin( constants.ops, constants.opsPassphrase, constants.currencyUSD, 30, 0xBA43B7400); + + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); - assert.equal(30, amResult); + assert.equal(amResult.isSuccess(), true); + assert.equal(30, amResult.data.acceptedMargins); }); it('should fail when currency is blank', async function() { + var error = false; try { await pricerOstUsd.setAcceptedMargin( constants.ops, @@ -42,8 +51,9 @@ describe('Set accepted margins', function() { 0xBA43B7400); } catch (err) { - assert.equal(err, 'Currency is mandatory'); + error = true; } + assert.isTrue(error); }); it('should fail when gas amount is 0', async function() { @@ -99,38 +109,57 @@ describe('Set accepted margins', function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setAcceptedMargin( + const response1 = await pricerOstUsd.setAcceptedMargin( constants.ops, constants.opsPassphrase, constants.currencyUSD, 3, 0xBA43B7400); + assert.equal(response1.isSuccess(), true); + assert.exists(response1.data.transactionHash); + + await pricerUtils.verifyReceipt(pricerOstUsd, response1.data.transactionHash); + const amResult1 = await pricerOstUsd.acceptedMargins(constants.currencyUSD); - assert.equal(3, amResult1); + assert.equal(amResult1.isSuccess(), true); + assert.equal(3, amResult1.data.acceptedMargins); - await pricerOstUsd.setAcceptedMargin( + const response2 = await pricerOstUsd.setAcceptedMargin( constants.deployer, constants.deployerPassphrase, constants.currencyUSD, 8, 0xBA43B7400); + assert.equal(response2.isSuccess(), true); + assert.exists(response2.data.transactionHash); + + await pricerUtils.verifyReceipt(pricerOstUsd, response2.data.transactionHash); + const amResult2 = await pricerOstUsd.acceptedMargins(constants.currencyUSD); - assert.equal(3, amResult2); + assert.equal(amResult2.isSuccess(), true); + assert.equal(3, amResult2.data.acceptedMargins); }); + it('should pass when margin is 0', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setAcceptedMargin( + const response = await pricerOstUsd.setAcceptedMargin( constants.ops, constants.opsPassphrase, constants.currencyUSD, 0, 0xBA43B7400); + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); - assert.equal(0, amResult); + assert.equal(amResult.isSuccess(), true); + assert.equal(0, amResult.data.acceptedMargins); }); @@ -138,15 +167,23 @@ describe('Set accepted margins', function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setAcceptedMargin( + const response = await pricerOstUsd.setAcceptedMargin( constants.ops, constants.opsPassphrase, constants.currencyUSD, 50, 0xBA43B7400); + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const amResult = await pricerOstUsd.acceptedMargins(constants.currencyUSD); - assert.equal(50, amResult); + assert.equal(amResult.isSuccess(), true); + assert.equal(50, amResult.data.acceptedMargins); }); }); + + diff --git a/mocha_test/services/pricer/set_price_oracle.js b/mocha_test/services/pricer/set_price_oracle.js index 3b1f261..af8280f 100644 --- a/mocha_test/services/pricer/set_price_oracle.js +++ b/mocha_test/services/pricer/set_price_oracle.js @@ -6,6 +6,7 @@ const chai = require('chai') const rootPrefix = "../../.." , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) , pricerOstEur = new pricer(constants.pricerOstEurAddress) @@ -24,52 +25,61 @@ describe('Set price oracle', function() { assert.notEqual(constants.deployer, constants.account1); assert.notEqual(constants.ops, constants.account1); - await pricerOstUsd.unsetPriceOracle( + const response = await pricerOstUsd.unsetPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, 0xBA43B7400); + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult1, 0x0); + assert.equal(poResult1.isSuccess(), true); + assert.equal(0x0, poResult1.data.priceOracles); - await pricerOstEur.unsetPriceOracle( + const response2 = await pricerOstEur.unsetPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyEUR, 0xBA43B7400); + assert.equal(response2.isSuccess(), true); + assert.exists(response2.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstEur, response2.data.transactionHash); + const poResult2 = await pricerOstEur.priceOracles(constants.currencyEUR); - assert.equal(poResult2, 0x0); + assert.equal(poResult2.isSuccess(), true); + assert.equal(0x0, poResult2.data.priceOracles); }); + it('should fail when sender is not ops', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.unsetPriceOracle( - constants.ops, - constants.opsPassphrase, - constants.currencyUSD, - 0xBA43B7400); - - const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult1, 0x0); - - await pricerOstUsd.setPriceOracle( + const setResponse = await pricerOstUsd.setPriceOracle( constants.deployer, constants.deployerPassphrase, constants.currencyUSD, constants.priceOracles.OST.USD, 0xBA43B7400); + assert.equal(setResponse.isSuccess(), true); + assert.exists(setResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, setResponse.data.transactionHash); + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult2, 0x0); + assert.equal(poResult2.isSuccess(), true); + assert.equal(0x0, poResult2.data.priceOracles); }); + it('should fail when currency is blank', async function() { + var error = false; try { await pricerOstUsd.setPriceOracle( constants.ops, @@ -79,8 +89,9 @@ describe('Set price oracle', function() { 0xBA43B7400); } catch (err) { - assert.equal(err, 'Currency is mandatory'); + error = true; } + assert.isTrue(error); }); @@ -100,6 +111,7 @@ describe('Set price oracle', function() { assert.isTrue(error); }); + it('should fail when gas amount is 0', async function() { var error = false; try { @@ -116,6 +128,7 @@ describe('Set price oracle', function() { assert.isTrue(error); }); + it('should fail when sender address is 0', async function() { var error = false; try { @@ -132,18 +145,25 @@ describe('Set price oracle', function() { assert.isTrue(error); }); + it('should fail when price oracle has different quote currency', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setPriceOracle( + const response = await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, constants.priceOracles.ETH.USD, 0xBA43B7400); + + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.notEqual(poResult, constants.priceOracles.ETH.USD); + assert.equal(poResult.isSuccess(), true); + assert.notEqual(poResult.data.priceOracles, constants.priceOracles.ETH.USD); }); @@ -152,47 +172,66 @@ describe('Set price oracle', function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd10Decimal.setPriceOracle( + const response = await pricerOstUsd10Decimal.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, constants.priceOracles.OST.USD, 0xBA43B7400); + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd10Decimal, response.data.transactionHash); + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult, 0); + assert.equal(poResult.isSuccess(), true); + assert.equal(poResult.data.priceOracles, 0x0); }); + it('should pass when OST/USD price oracle is set', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setPriceOracle( + const response = await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, constants.priceOracles.OST.USD, 0xBA43B7400); + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const poResult = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(constants.priceOracles.OST.USD, poResult); + assert.equal(poResult.isSuccess(), true); + assert.equal(poResult.data.priceOracles, constants.priceOracles.OST.USD); }); + it('should pass when OST/EUR price oracle is set', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setPriceOracle( + const response = await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyEUR, constants.priceOracles.OST.EUR, 0xBA43B7400); + + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const poResult = await pricerOstUsd.priceOracles(constants.currencyEUR); - assert.equal(constants.priceOracles.OST.EUR, poResult); + assert.equal(poResult.isSuccess(), true); + assert.equal(poResult.data.priceOracles, constants.priceOracles.OST.EUR); }); + }); diff --git a/mocha_test/services/pricer/unset_price_oracle.js b/mocha_test/services/pricer/unset_price_oracle.js index 41ee42f..2782f48 100644 --- a/mocha_test/services/pricer/unset_price_oracle.js +++ b/mocha_test/services/pricer/unset_price_oracle.js @@ -5,6 +5,7 @@ const chai = require('chai') const rootPrefix = "../../.." , constants = require(rootPrefix + '/mocha_test/services/pricer/constants') + , pricerUtils = require('./pricer_utils') , pricer = require(rootPrefix + '/lib/contract_interact/pricer') , pricerOstUsd = new pricer(constants.pricerOstUsdAddress) ; @@ -25,29 +26,41 @@ describe('Unset price oracle', function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setPriceOracle( + const response = await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, constants.priceOracles.OST.USD, 0xBA43B7400); + assert.equal(response.isSuccess(), true); + assert.exists(response.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response.data.transactionHash); + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult1, constants.priceOracles.OST.USD); + assert.equal(poResult1.isSuccess(), true); + assert.equal(poResult1.data.priceOracles, constants.priceOracles.OST.USD); - await pricerOstUsd.unsetPriceOracle( + const response2 = await pricerOstUsd.unsetPriceOracle( constants.deployer, constants.deployerPassphrase, constants.currencyUSD, 0xBA43B7400); + assert.equal(response2.isSuccess(), true); + assert.exists(response2.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, response2.data.transactionHash); + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult2, constants.priceOracles.OST.USD); + assert.equal(poResult2.isSuccess(), true); + assert.equal(poResult2.data.priceOracles, constants.priceOracles.OST.USD); }); + it('should fail when currency is blank', async function() { + var error = false; try { await pricerOstUsd.unsetPriceOracle( constants.ops, @@ -56,12 +69,15 @@ describe('Unset price oracle', function() { 0xBA43B7400); } catch (err) { - assert.equal(err, 'Currency is mandatory'); + error = true; } + assert.isTrue(error); }); + it('should fail when gas amount is 0', async function() { + var error = false; try { await pricerOstUsd.unsetPriceOracle( @@ -74,9 +90,11 @@ describe('Unset price oracle', function() { error = true; } assert.isTrue(error); + }); it('should fail when sender address is 0', async function() { + var error = false; try { await pricerOstUsd.unsetPriceOracle( @@ -89,6 +107,7 @@ describe('Unset price oracle', function() { error = true; } assert.isTrue(error); + }); // it('should fail when price oracle was not set prior', async function() { @@ -107,26 +126,37 @@ describe('Unset price oracle', function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); - await pricerOstUsd.setPriceOracle( + const setResponse = await pricerOstUsd.setPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, constants.priceOracles.OST.USD, 0xBA43B7400); + assert.equal(setResponse.isSuccess(), true); + assert.exists(setResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, setResponse.data.transactionHash); + const poResult1 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult1, constants.priceOracles.OST.USD); + assert.equal(poResult1.isSuccess(), true); + assert.equal(poResult1.data.priceOracles, constants.priceOracles.OST.USD); - await pricerOstUsd.unsetPriceOracle( + const unsetResponse = await pricerOstUsd.unsetPriceOracle( constants.ops, constants.opsPassphrase, constants.currencyUSD, 0xBA43B7400); + assert.equal(unsetResponse.isSuccess(), true); + assert.exists(unsetResponse.data.transactionHash); + await pricerUtils.verifyReceipt(pricerOstUsd, unsetResponse.data.transactionHash); + const poResult2 = await pricerOstUsd.priceOracles(constants.currencyUSD); - assert.equal(poResult2, 0x0); + assert.equal(poResult2.isSuccess(), true); + assert.equal(poResult2.data.priceOracles, 0x0); }); }); + From 648ea124730639bbcf72e8163a68aa7cdcbdaec6 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 12 Feb 2018 19:56:41 +0530 Subject: [PATCH 042/242] PR: changes --- .gitignore | 2 + config/core_constants.js | 11 +- helpers/custom_console_logger.js | 24 +- lib/contract_interact/EIP20TokenMock.js | 27 +- lib/contract_interact/pricer.js | 154 +- mocha_test/scripts/deploy_all.sh | 4 + mocha_test/scripts/deploy_price_oracle.sh | 2 +- .../services/pricer/accepted_margins.js | 5 +- .../get_pricepoint_and_calculated_amounts.js | 16 +- mocha_test/services/pricer/pay.js | 58 +- mocha_test/services/pricer/price_oracles.js | 5 +- .../services/pricer/set_accepted_margin.js | 88 +- .../services/pricer/set_price_oracle.js | 88 +- .../services/pricer/unset_price_oracle.js | 54 +- package-lock.json | 6896 ----------------- package.json | 2 +- 16 files changed, 288 insertions(+), 7148 deletions(-) delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index d6bf8f4..08745c8 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ mocha_test/scripts/ost-price-oracle/ mocha_test/scripts/poa-genesis.json mocha_test/scripts/pw mocha_test/scripts/st-poa/ + +package-lock.json \ No newline at end of file diff --git a/config/core_constants.js b/config/core_constants.js index d8e296b..679d9b0 100644 --- a/config/core_constants.js +++ b/config/core_constants.js @@ -16,21 +16,14 @@ function define(name, value) { }); } -// Gas price -define("OST_PRICER_GAS_PRICE", process.env.OST_PRICER_GAS_PRICE); - -// Zero gas constant to deploy -define("OST_GAS_PRICE_FOR_DEPLOYMENT", '0x0'); - -// ST' UUID +// ST' UUID define('OST_PRICER_ST_PRIME_UUID', process.env.OST_PRICER_ST_PRIME_UUID); // Geth define('OST_PRICER_GETH_RPC_PROVIDER', process.env.OST_PRICER_GETH_RPC_PROVIDER); -define('OST_PRICER_GETH_WS_PROVIDER', process.env.OST_PRICER_GETH_WS_PROVIDER); // Chain ID define('OST_PRICER_CHAIN_ID', process.env.OST_PRICER_CHAIN_ID); -// Gas limit +// Gas limit define('OST_GAS_LIMIT', 9100000); diff --git a/helpers/custom_console_logger.js b/helpers/custom_console_logger.js index 02824ef..96ed4a7 100644 --- a/helpers/custom_console_logger.js +++ b/helpers/custom_console_logger.js @@ -5,20 +5,20 @@ * */ // -// const CONSOLE_RESET = "\x1b[0m"; -// const ERR_PRE = "\x1b[31m"; //Error. (RED) -// const INFO_PRE = "\x1b[33m "; //Info (YELLOW) -// const WIN_PRE = "\x1b[32m"; //Success (GREEN) -// const WARN_PRE = "\x1b[43m"; -// const STEP_PRE = "\n\x1b[34m"; //Step Description (BLUE) +const CONSOLE_RESET = "\x1b[0m"; +const ERR_PRE = "\x1b[31m"; //Error. (RED) +const INFO_PRE = "\x1b[33m "; //Info (YELLOW) +const WIN_PRE = "\x1b[32m"; //Success (GREEN) +const WARN_PRE = "\x1b[43m"; +const STEP_PRE = "\n\x1b[34m"; //Step Description (BLUE) -const CONSOLE_RESET = ""; -const ERR_PRE = ""; -const INFO_PRE = ""; -const WIN_PRE = ""; -const WARN_PRE = ""; -const STEP_PRE = ""; +// const CONSOLE_RESET = ""; +// const ERR_PRE = ""; +// const INFO_PRE = ""; +// const WIN_PRE = ""; +// const WARN_PRE = ""; +// const STEP_PRE = ""; module.exports = { diff --git a/lib/contract_interact/EIP20TokenMock.js b/lib/contract_interact/EIP20TokenMock.js index e311553..55307c7 100644 --- a/lib/contract_interact/EIP20TokenMock.js +++ b/lib/contract_interact/EIP20TokenMock.js @@ -31,6 +31,8 @@ MockToken.prototype = { /** * Get balance of address * + * @param {String} ownerAddress - address for which balance is to be fetched + * * @return {Promise} * */ @@ -45,6 +47,12 @@ MockToken.prototype = { /** * Set balance * + * @param {string} senderAddr - address of user who is sending amount + * @param {string} senderPassphrase - sender address passphrase + * @param {string} ownerAddress - address for which balance is to be set + * @param {BigNumber} value - amount which is being transferred (in wei) + * @param {BigNumber} gasPrice - gas price + * * @return {Promise} * */ @@ -72,7 +80,12 @@ MockToken.prototype = { }, /** - * Set balance + * Set conversion rate + * + * @param {string} senderAddr - address of sender + * @param {string} senderPassphrase - passphrase of sender + * @param {number} conversionRate - conversion rate of branded token + * @param {BigNumber} gasPrice - gas price * * @return {Promise} * @@ -99,6 +112,18 @@ MockToken.prototype = { }); }, + /** + * Approve + * + * @param {string} senderAddr - address of sender + * @param {string} senderPassphrase - passphrase of sender + * @param {string} spenderAddress - address which will be approved for spending + * @param {BigNumber} value - amount which is being approved (in wei) + * @param {BigNumber} gasPrice - gas price + * + * @return {Promise} + * + */ approve: function (senderAddress, senderPassphrase, spenderAddress, value, gasPrice) { if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { return Promise.reject('GasPrice is mandatory'); diff --git a/lib/contract_interact/pricer.js b/lib/contract_interact/pricer.js index 0f6c064..a026eeb 100644 --- a/lib/contract_interact/pricer.js +++ b/lib/contract_interact/pricer.js @@ -30,6 +30,7 @@ const Pricer = module.exports = function (pricerAddress) { Pricer.prototype = { + /** * Get branded token address of pricer * @@ -44,13 +45,19 @@ Pricer.prototype = { return Promise.resolve(responseHelper.successWithData({brandedToken: response[0]})); }, + /** * Get acceptable margin for the given currency * + * @param {string} currency - quote currency + * * @return {Promise} * */ acceptedMargins: async function (currency) { + if (currency === undefined || currency === '' || currency === null) { + return responseHelper.error('l_ci_p_am_1', 'currency is mandatory'); + } const transactionObject = currContract.methods.acceptedMargins(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); @@ -59,13 +66,19 @@ Pricer.prototype = { }, + /** * Get address of price oracle for the given currency * + * @param {string} currency - quote currency + * * @return {Promise} * */ priceOracles: async function (currency) { + if (currency === undefined || currency === '' || currency === null) { + return responseHelper.error('l_ci_p_po_1', 'currency is mandatory'); + } const transactionObject = currContract.methods.priceOracles(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); @@ -73,6 +86,7 @@ Pricer.prototype = { return Promise.resolve(responseHelper.successWithData({priceOracles: response[0]})); }, + /** * Get base currency of pricer * @@ -87,6 +101,7 @@ Pricer.prototype = { return Promise.resolve(responseHelper.successWithData({baseCurrency: response[0], symbol: web3RpcProvider.utils.hexToString(response[0])})); }, + /** * Get decimal of pricer * @@ -101,6 +116,7 @@ Pricer.prototype = { return Promise.resolve(responseHelper.successWithData({decimals: response[0]})); }, + /** * Get conversion rate of pricer * @@ -117,20 +133,31 @@ Pricer.prototype = { /** - * Updates the price oracle address for a given currency + * Set or updates the price oracle address for a given currency + * + * @param {string} senderAddr - address of sender + * @param {string} senderPassphrase - passphrase of sender + * @param {string} currency - quote currency + * @param {string} address - address of price pracle + * @param {BigNumber} gasPrice - gas price * * @return {Promise} * */ setPriceOracle: function (senderAddress, senderPassphrase, currency, address, gasPrice) { - if (currency === undefined || currency === '') { - return Promise.reject('Currency is mandatory'); + + if (currency === undefined || currency === '' || currency === null) { + return responseHelper.error('l_ci_p_spo_1', 'currency is mandatory'); } - if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { - return Promise.reject('GasPrice is mandatory'); + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 || gasPrice === null) { + return responseHelper.error('l_ci_p_spo_2', 'gas is mandatory'); + } + if (!helper.isAddressValid(address)) { + return responseHelper.error('l_ci_p_spo_3', 'address is invalid'); + } + if (!helper.isAddressValid(senderAddress)) { + return responseHelper.error('l_ci_p_spo_4', 'address is invalid'); } - helper.assertAddress(address); - helper.assertAddress(senderAddress); currContract.options.address = this.contractAddress; currContract.setProvider( web3RpcProvider.currentProvider ); @@ -148,20 +175,28 @@ Pricer.prototype = { }); }, + /** * Remove the price oracle address for a given currency * + * @param {string} senderAddr - address of sender + * @param {string} senderPassphrase - passphrase of sender + * @param {string} currency - quote currency + * @param {BigNumber} gasPrice - gas price + * * @return {Promise} * */ unsetPriceOracle: function (senderAddress, senderPassphrase, currency, gasPrice) { - if (currency === undefined || currency === '') { - return Promise.reject('Currency is mandatory'); + if (currency === undefined || currency === '' || currency === null) { + return responseHelper.error('l_ci_p_uspo_1', 'currency is mandatory'); } - if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { - return Promise.reject('GasPrice is mandatory'); + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 || gasPrice === null) { + return responseHelper.error('l_ci_p_uspo_2', 'gas is mandatory'); + } + if (!helper.isAddressValid(senderAddress)) { + return responseHelper.error('l_ci_p_spo_3', 'address is invalid'); } - helper.assertAddress(senderAddress); currContract.options.address = this.contractAddress; currContract.setProvider( web3RpcProvider.currentProvider ); @@ -179,23 +214,33 @@ Pricer.prototype = { }); }, + /** - * Updates the acceptable margin range for a given currency + * Set or update the acceptable margin range for a given currency + * + * @param {string} senderAddr - address of sender + * @param {string} senderPassphrase - passphrase of sender + * @param {string} currency - quote currency + * @param {BigNumber} acceptedMargin - accepted margin for the given currency (in wei) + * @param {BigNumber} gasPrice - gas price * * @return {Promise} * */ setAcceptedMargin: function (senderAddress, senderPassphrase, currency, acceptedMargin, gasPrice) { - if (currency === undefined || currency === '') { - return Promise.reject('Currency is mandatory'); + + if (currency === undefined || currency === '' || currency === null) { + return responseHelper.error('l_ci_p_sam_1', 'currency is mandatory'); } - if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { - return Promise.reject('GasPrice is mandatory'); + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 || gasPrice === null) { + return responseHelper.error('l_ci_p_sam_2', 'gas price is mandatory'); } if (acceptedMargin<0) { - return Promise.reject('Accepted margin cannot be negetive'); + return responseHelper.error('l_ci_p_sam_3', 'accepted margin cannot be negetive'); + } + if (!helper.isAddressValid(senderAddress)) { + return responseHelper.error('l_ci_p_sam_4', 'address is invalid'); } - helper.assertAddress(senderAddress); const transactionObject = currContract.methods.setAcceptedMargin(web3RpcProvider.utils.asciiToHex(currency), acceptedMargin); const encodedABI = transactionObject.encodeABI(); @@ -215,6 +260,16 @@ Pricer.prototype = { /** * Pay * + * @param {string} senderAddr - address of sender + * @param {string} senderPassphrase - passphrase of sender + * @param {string} beneficiaryAddress - address of beneficiary account + * @param {BigNumber} transferAmount - transfer amount (in wei) + * @param {string} commissionBeneficiaryAddress - address of commision beneficiary account + * @param {BigNumber} commissionAmount - commission amount (in wei) + * @param {string} currency - quote currency + * @param {BigNumber} intendedPricePoint - price point at which the pay is intended (in wei) + * @param {BigNumber} gasPrice - gas price + * * @return {Promise} * */ @@ -229,21 +284,25 @@ Pricer.prototype = { intendedPricePoint, gasPrice) { - if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 ) { - return Promise.reject('GasPrice is mandatory'); + if (gasPrice === undefined || gasPrice === '' || gasPrice == 0 || gasPrice === null) { + return responseHelper.error('l_ci_p_p_1', 'gas price is mandatory'); } if (transferAmount < 0) { - return Promise.reject('Transfer amount cannot be negetive'); + return responseHelper.error('l_ci_p_p_2', 'transfer amount cannot be negetive'); } if (commissionAmount < 0) { - return Promise.reject('Commission amount cannot be negetive'); + return responseHelper.error('l_ci_p_p_3', 'Commission amount cannot be negetive'); } helper.assertAddress(senderAddress); if (transferAmount > 0 || (beneficiaryAddress !== undefined && beneficiaryAddress !== '')) { - helper.assertAddress(beneficiaryAddress); + if (!helper.isAddressValid(beneficiaryAddress)) { + return responseHelper.error('l_ci_p_p_3', 'address is invalid'); + } } if (commissionAmount > 0 || (commissionBeneficiaryAddress !== undefined && commissionBeneficiaryAddress !== '')) { - helper.assertAddress(commissionBeneficiaryAddress); + if (!helper.isAddressValid(commissionBeneficiaryAddress)) { + return responseHelper.error('l_ci_p_p_4', 'address is invalid'); + } } const transactionObject = currContract.methods.pay( @@ -271,20 +330,21 @@ Pricer.prototype = { /** - * Get current price point and token decimal for the price oracle for the give currency + * Get current price point from the price oracle for the give currency + * + * @param {string} currency - quote currency * * @return {Promise} * */ - getPricePoint: async function (currency) { - if (currency === undefined || currency === '') { - return Promise.reject('Currency is mandatory'); + getPricePoint: function (currency) { + + if (currency === undefined || currency === '' || currency === null) { + return responseHelper.error('l_ci_p_gpp_1', 'currency is mandatory'); } const transactionObject = currContract.methods.getPricePoint(web3RpcProvider.utils.asciiToHex(currency)); const encodedABI = transactionObject.encodeABI(); const transactionOutputs = helper.getTransactionOutputs(transactionObject); - //const response = await helper.call(web3RpcProvider, this.contractAddress, encodedABI, {}, transactionOutputs); - //return Promise.resolve(responseHelper.successWithData({pricePoint: response[0]})); return helper.call( web3RpcProvider, this.contractAddress, @@ -297,11 +357,16 @@ Pricer.prototype = { .catch(function(err) { return Promise.resolve(responseHelper.error("err_gpp_01", err)); }); + }, /** * Get current price point and calculated token amounts * + * @param {BigNumber} transferAmount - transfer amount (in wei) + * @param {BigNumber} commissionAmount - commision amount (in wei) + * @param {string} currency - quote currency + * * @return {Promise} * */ @@ -310,8 +375,8 @@ Pricer.prototype = { commissionAmount, currency) { - if (currency === undefined || currency === '') { - return Promise.reject('Currency is mandatory'); + if (currency === undefined || currency === '' || currency === null) { + return responseHelper.error('l_ci_p_gppaca_1', 'currency is mandatory'); } const transactionObject = currContract.methods.getPricePointAndCalculatedAmounts(transferAmount, commissionAmount, web3RpcProvider.utils.asciiToHex(currency)); @@ -334,15 +399,34 @@ Pricer.prototype = { }); }, + /** - * * @return {BigNumer} 10^18 - */ + * Convert value in wei + * + * @param {BigNumber} value - amount in decimal + * + * @return {BigNumer} 10^18 + * + */ toWei: function(value) { return web3RpcProvider.utils.toWei(value, "ether"); }, + + /** + * Get transaction receipt from transaction hash + * + * @param {string} transactionHash - transaction hash + * + * @return {BigNumer} 10^18 + * + */ getTxReceipt: function(transactionHash) { + if (transactionHash === undefined || transactionHash === '' || transactionHash === null) { + return responseHelper.error('l_ci_p_gtr_1', 'transaction hash is mandatory'); + } + return helper.getTxReceipt( web3RpcProvider, transactionHash, diff --git a/mocha_test/scripts/deploy_all.sh b/mocha_test/scripts/deploy_all.sh index ff19bcb..8a68ed2 100644 --- a/mocha_test/scripts/deploy_all.sh +++ b/mocha_test/scripts/deploy_all.sh @@ -63,6 +63,8 @@ export OST_PO_DEPLOYER_PASSPHRASE=$OST_PRICER_DEPLOYER_PASSPHRASE export OST_PO_OPS_ADDR=$OST_PRICER_OPS_ADDR export OST_PO_OPS_PASSPHRASE=$OST_PRICER_OPS_PASSPHRASE export OST_PO_PRICE_ORACLES='{}' +export OST_PO_CHAIN_ID=$OST_PRICER_CHAIN_ID +export OST_CACHING_ENGINE='none' echo '\nexport OST_PO_GETH_RPC_PROVIDER='\'$OST_PO_GETH_RPC_PROVIDER\'>>env_vars.sh echo '\nexport OST_PO_DEPLOYER_ADDR='\'$OST_PO_DEPLOYER_ADDR\'>>env_vars.sh @@ -70,6 +72,8 @@ echo '\nexport OST_PO_DEPLOYER_PASSPHRASE='\'$OST_PO_DEPLOYER_PASSPHRASE\'>>env_ echo '\nexport OST_PO_OPS_ADDR='\'$OST_PO_OPS_ADDR\'>>env_vars.sh echo '\nexport OST_PO_OPS_PASSPHRASE='\'$OST_PO_OPS_PASSPHRASE\'>>env_vars.sh echo '\nexport OST_PO_PRICE_ORACLES='\'$OST_PO_PRICE_ORACLES\'>>env_vars.sh +echo '\nexport OST_PO_CHAIN_ID='\'$OST_PO_CHAIN_ID\'>>env_vars.sh +echo '\nexport OST_CACHING_ENGINE='\'$OST_CACHING_ENGINE\'>>env_vars.sh echo "\n********* Done *************" diff --git a/mocha_test/scripts/deploy_price_oracle.sh b/mocha_test/scripts/deploy_price_oracle.sh index 7d74689..661c321 100644 --- a/mocha_test/scripts/deploy_price_oracle.sh +++ b/mocha_test/scripts/deploy_price_oracle.sh @@ -28,7 +28,7 @@ echo "\n********* Deploying PO 4 *************" node ./tools/deploy/price_oracle.js ETH USD 0x12A05F200 travis po4.txt echo "\n********* Done *************" -export OST_PO_PRICE_ORACLES="{\"OST\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po1.txt)\",\"EUR\":\"$(cat ./ost-price-oracle/tools/deploy/po2.txt)\",\"INR\":\"$(cat ./ost-price-oracle/tools/deploy/po3.txt)\"},\"ETH\":{\"USD\":\"$(cat ./ost-price-oracle/tools/deploy/po4.txt)\"}}" +export OST_PO_PRICE_ORACLES="{\"OST\":{\"USD\":\"$(cat ./tools/deploy/po1.txt)\",\"EUR\":\"$(cat ./tools/deploy/po2.txt)\",\"INR\":\"$(cat ./tools/deploy/po3.txt)\"},\"ETH\":{\"USD\":\"$(cat ./tools/deploy/po4.txt)\"}}" echo '\nexport OST_PO_PRICE_ORACLES='\'$OST_PO_PRICE_ORACLES\'>>../../../mocha_test/scripts/env_vars.sh echo OST_PO_PRICE_ORACLES=$OST_PO_PRICE_ORACLES diff --git a/mocha_test/services/pricer/accepted_margins.js b/mocha_test/services/pricer/accepted_margins.js index 54a6291..d93e28c 100644 --- a/mocha_test/services/pricer/accepted_margins.js +++ b/mocha_test/services/pricer/accepted_margins.js @@ -34,13 +34,12 @@ describe('Get accepted margins', function() { }); - it('should return 0 when margin when currency is blank', async function() { + it('should return error when margin when currency is blank', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); const amResult = await pricerOstUsd.acceptedMargins(constants.currencyBlank); - assert.equal(amResult.isSuccess(), true); - assert.equal(0, amResult.data.acceptedMargins); + assert.equal(amResult.isFailure(), true); }); diff --git a/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js b/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js index afe604d..83e41b6 100644 --- a/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js +++ b/mocha_test/services/pricer/get_pricepoint_and_calculated_amounts.js @@ -61,17 +61,11 @@ describe('Get price point and calculated amounts', function() { it('should fail when currency is 0', async function() { - var isError = false; - try { - await pricerOstUsd.getPricePointAndCalculatedAmounts( - pricerOstUsd.toWei('1'), - pricerOstUsd.toWei('0.5'), - constants.currencyBlank); - } - catch (err) { - isError = true; - } - assert.equal(isError, true); + const response = await pricerOstUsd.getPricePointAndCalculatedAmounts( + pricerOstUsd.toWei('1'), + pricerOstUsd.toWei('0.5'), + constants.currencyBlank); + assert.equal(response.isFailure(), true); }); diff --git a/mocha_test/services/pricer/pay.js b/mocha_test/services/pricer/pay.js index aef7239..d8c35df 100644 --- a/mocha_test/services/pricer/pay.js +++ b/mocha_test/services/pricer/pay.js @@ -349,24 +349,17 @@ describe('Pay', function() { total, 0xBA43B7400); - var isError = false; - try { - await pricerOstUsd.pay( - constants.account1, - constants.accountPassphrase1, - beneficiary, - transferAmount, - commissionBeneficiary, - commissionAmount, - currency, - intendedPricePoint, - 0xBA43B7400); - } - catch (err) { - isError = true; - assert.instanceOf(err, Error); - } - assert.equal(isError, true); + const payResponse = await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint, + 0xBA43B7400); + assert.equal(payResponse.isFailure(), true); const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) @@ -485,24 +478,17 @@ describe('Pay', function() { total, 0xBA43B7400); - var isError = false; - try { - await pricerOstUsd.pay( - constants.account1, - constants.accountPassphrase1, - beneficiary, - transferAmount, - commissionBeneficiary, - commissionAmount, - currency, - intendedPricePoint, - 0xBA43B7400); - } - catch (err) { - isError = true; - assert.instanceOf(err, Error); - } - assert.equal(isError, true); + const payResponse = await pricerOstUsd.pay( + constants.account1, + constants.accountPassphrase1, + beneficiary, + transferAmount, + commissionBeneficiary, + commissionAmount, + currency, + intendedPricePoint, + 0xBA43B7400); + assert.equal(payResponse.isFailure(), true); const account1Balance = new BigNumber(await TC5.balanceOf(constants.account1)) , account3Balance = new BigNumber(await TC5.balanceOf(constants.account3)) diff --git a/mocha_test/services/pricer/price_oracles.js b/mocha_test/services/pricer/price_oracles.js index 9737193..2783575 100644 --- a/mocha_test/services/pricer/price_oracles.js +++ b/mocha_test/services/pricer/price_oracles.js @@ -15,13 +15,12 @@ const rootPrefix = "../../.." describe('Get price oracles', function() { - it('should return 0x0 when currency is blank', async function() { + it('should fail when currency is blank', async function() { // eslint-disable-next-line no-invalid-this this.timeout(100000); const poResult = await pricerOstUsd.priceOracles(constants.currencyBlank); - assert.equal(poResult.isSuccess(), true); - assert.equal(poResult.data.priceOracles, 0x0); + assert.equal(poResult.isFailure(), true); }); diff --git a/mocha_test/services/pricer/set_accepted_margin.js b/mocha_test/services/pricer/set_accepted_margin.js index 9a82a65..bf353e9 100644 --- a/mocha_test/services/pricer/set_accepted_margin.js +++ b/mocha_test/services/pricer/set_accepted_margin.js @@ -41,68 +41,52 @@ describe('Set accepted margins', function() { }); it('should fail when currency is blank', async function() { - var error = false; - try { - await pricerOstUsd.setAcceptedMargin( - constants.ops, - constants.opsPassphrase, - constants.currencyBlank, - 3, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyBlank, + 3, + 0xBA43B7400); + assert.equal(response.isFailure(), true); + }); it('should fail when gas amount is 0', async function() { - var error = false; - try { - await pricerOstUsd.setAcceptedMargin( - constants.ops, - constants.opsPassphrase, - constants.currencyUSD, - 3, - 0); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setAcceptedMargin( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 3, + 0); + assert.equal(response.isFailure(), true); + }); it('should fail when sender address is 0', async function() { - var error = false; - try { - await pricerOstUsd.setAcceptedMargin( - 0, - constants.opsPassphrase, - constants.currencyUSD, - 3, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setAcceptedMargin( + 0, + constants.opsPassphrase, + constants.currencyUSD, + 3, + 0xBA43B7400); + assert.equal(response.isFailure(), true); + }); it('should fail when accepted margin is negetive', async function() { - var error = false; - try { - await pricerOstUsd.setAcceptedMargin( - 0, - constants.opsPassphrase, - constants.currencyUSD, - -30, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setAcceptedMargin( + 0, + constants.opsPassphrase, + constants.currencyUSD, + -30, + 0xBA43B7400); + assert.equal(response.isFailure(), true); + }); it('should fail when sender is not ops', async function() { diff --git a/mocha_test/services/pricer/set_price_oracle.js b/mocha_test/services/pricer/set_price_oracle.js index af8280f..7f20835 100644 --- a/mocha_test/services/pricer/set_price_oracle.js +++ b/mocha_test/services/pricer/set_price_oracle.js @@ -79,70 +79,54 @@ describe('Set price oracle', function() { it('should fail when currency is blank', async function() { - var error = false; - try { - await pricerOstUsd.setPriceOracle( - constants.ops, - constants.opsPassphrase, - constants.currencyBlank, - constants.priceOracles.OST.USD, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyBlank, + constants.priceOracles.OST.USD, + 0xBA43B7400); + assert.equal(response.isFailure(), true); + }); it('should fail when oracleAddress is 0', async function() { - var error = false; - try { - await pricerOstUsd.setPriceOracle( - constants.ops, - constants.opsPassphrase, - constants.currencyUSD, - 0, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0, + 0xBA43B7400); + assert.equal(response.isFailure(), true); + }); it('should fail when gas amount is 0', async function() { - var error = false; - try { - await pricerOstUsd.setPriceOracle( - constants.ops, - constants.opsPassphrase, - constants.currencyUSD, - constants.priceOracles.OST.USD, - 0); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0); + assert.equal(response.isFailure(), true); + }); it('should fail when sender address is 0', async function() { - var error = false; - try { - await pricerOstUsd.setPriceOracle( - 0, - constants.opsPassphrase, - constants.currencyUSD, - constants.priceOracles.OST.USD, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + + const response = await pricerOstUsd.setPriceOracle( + 0, + constants.opsPassphrase, + constants.currencyUSD, + constants.priceOracles.OST.USD, + 0xBA43B7400); + assert.equal(response.isFailure(), true); + }); diff --git a/mocha_test/services/pricer/unset_price_oracle.js b/mocha_test/services/pricer/unset_price_oracle.js index 2782f48..a24e0eb 100644 --- a/mocha_test/services/pricer/unset_price_oracle.js +++ b/mocha_test/services/pricer/unset_price_oracle.js @@ -60,53 +60,35 @@ describe('Unset price oracle', function() { it('should fail when currency is blank', async function() { - var error = false; - try { - await pricerOstUsd.unsetPriceOracle( - constants.ops, - constants.opsPassphrase, - constants.currencyBlank, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + const response = await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyBlank, + 0xBA43B7400); + assert.equal(response.isFailure(), true); }); it('should fail when gas amount is 0', async function() { - var error = false; - try { - await pricerOstUsd.unsetPriceOracle( - constants.ops, - constants.opsPassphrase, - constants.currencyUSD, - 0); - } - catch (err) { - error = true; - } - assert.isTrue(error); + const response = await pricerOstUsd.unsetPriceOracle( + constants.ops, + constants.opsPassphrase, + constants.currencyUSD, + 0); + assert.equal(response.isFailure(), true); }); it('should fail when sender address is 0', async function() { - var error = false; - try { - await pricerOstUsd.unsetPriceOracle( - 0, - constants.opsPassphrase, - constants.currencyUSD, - 0xBA43B7400); - } - catch (err) { - error = true; - } - assert.isTrue(error); + const response = await pricerOstUsd.unsetPriceOracle( + 0, + constants.opsPassphrase, + constants.currencyUSD, + 0xBA43B7400); + assert.equal(response.isFailure(), true); }); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index d8628c8..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6896 +0,0 @@ -{ - "name": "openst-payments", - "version": "0.9.2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abi-decoder": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.0.9.tgz", - "integrity": "sha1-a8/Yb39j++yFc9l3izpPkruS4B8=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-loader": "6.4.1", - "babel-plugin-add-module-exports": "0.2.1", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-preset-es2015": "6.24.1", - "chai": "3.5.0", - "web3": "0.18.4", - "webpack": "2.7.0" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "dev": true - }, - "chai": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", - "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", - "dev": true, - "requires": { - "assertion-error": "1.1.0", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" - } - }, - "web3": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", - "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", - "dev": true, - "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "3.1.8", - "utf8": "2.1.1", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" - } - } - } - }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", - "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.5" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "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==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-loader": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", - "dev": true, - "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-add-module-exports": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", - "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", - "dev": true - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.5" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "bignumber": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bignumber/-/bignumber-1.1.0.tgz", - "integrity": "sha1-5qsKdD2l8+oBjlwXWX0SH3howVk=" - }, - "bignumber.js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "2.0.3" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" - } - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" - } - }, - "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", - "requires": { - "js-sha3": "0.3.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "1.0.6" - } - }, - "buffer": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", - "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" - }, - "dependencies": { - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - } - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", - "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.10" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.6", - "randomfill": "1.0.3" - } - }, - "crypto-js": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.38" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "requires": { - "decompress-tar": "4.1.1", - "decompress-tarbz2": "4.1.1", - "decompress-targz": "4.1.1", - "decompress-unzip": "4.0.1", - "graceful-fs": "4.1.11", - "make-dir": "1.1.0", - "pify": "2.3.0", - "strip-dirs": "2.1.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { - "file-type": "5.2.0", - "is-stream": "1.1.0", - "tar-stream": "1.5.5" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { - "decompress-tar": "4.1.1", - "file-type": "6.2.0", - "is-stream": "1.1.0", - "seek-bzip": "1.0.5", - "unbzip2-stream": "1.2.5" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { - "decompress-tar": "4.1.1", - "file-type": "5.2.0", - "is-stream": "1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { - "file-type": "3.9.0", - "get-stream": "2.3.1", - "pify": "2.3.0", - "yauzl": "2.9.1" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" - } - } - } - }, - "deep-eql": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", - "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", - "dev": true, - "requires": { - "type-detect": "0.1.1" - }, - "dependencies": { - "type-detect": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "1.4.0" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" - } - }, - "errno": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", - "dev": true, - "requires": { - "prr": "1.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es5-ext": { - "version": "0.10.38", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", - "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint-config-google": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.9.1.tgz", - "integrity": "sha512-5A83D+lH0PA81QMESKbLJd/a3ic8tPZtwUmqNrxMRo54nfFaUvtt89q/+icQ+fd66c2xQHn0KyFkzJDoAUfpZA==", - "dev": true - }, - "eslint-config-standard": { - "version": "11.0.0-beta.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz", - "integrity": "sha512-f+vs5HAHQo7NRZ3hVe+UVdT5DbebMNaFTWFp95orJ0LUdYPoWdM8xw/bMeO/IZMvHOPmIteGKGc2QOhSXd5nRg==", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "2.6.9", - "resolve": "1.5.0" - } - }, - "eslint-module-utils": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", - "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", - "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", - "dev": true, - "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.1.1", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", - "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", - "dev": true, - "requires": { - "ignore": "3.3.7", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", - "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", - "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eth-lib": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", - "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0", - "keccakjs": "0.2.1", - "nano-json-stream-parser": "0.1.2", - "servify": "0.1.12", - "ws": "3.3.3", - "xhr-request-promise": "0.1.2" - } - }, - "ethereumjs-testrpc": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz", - "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", - "dev": true, - "requires": { - "webpack": "3.10.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.4.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.38" - } - }, - "eventemitter3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", - "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", - "requires": { - "accepts": "1.3.4", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "requires": { - "pend": "1.2.0" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "for-each": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", - "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", - "requires": { - "is-function": "1.0.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - } - }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", - "requires": { - "any-promise": "1.3.0", - "fs-extra": "2.1.2", - "mz": "2.7.0", - "thenify-all": "1.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "ganache-cli": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", - "integrity": "sha512-C7a8su4Zwtootvcy9HtroshTsyUtLC51+aOGUREpy/G4CXbAuLa3nNQri2NyFdqGyOrm/D+jxYP/PWnnrGLyXg==", - "dev": true, - "requires": { - "webpack": "3.10.0" - }, - "dependencies": { - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.4.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.0", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-symbol-support-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz", - "integrity": "sha512-JkaetveU7hFbqnAC1EV1sF4rlojU2D4Usc5CmS69l6NfmPDnpnFUegzFg33eDkkpNCxZ0mQp65HwUDrNFS/8MA==" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "1.4.1" - } - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - } - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.11.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" - } - }, - "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccakjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", - "requires": { - "browserify-sha3": "0.0.1", - "sha3": "1.2.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.cond": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", - "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", - "dev": true - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", - "requires": { - "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.6", - "readable-stream": "2.3.3" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mimic-response": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "0.1.1" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "requires": { - "mkdirp": "0.5.1" - } - }, - "mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", - "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "mock-fs": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.4.2.tgz", - "integrity": "sha512-dF+yxZSojSiI8AXGoxj5qdFWpucndc54Ug+TwlpHFaV7j22MGG+OML2+FVa6xAZtjb/OFFQhOC37Jegx2GbEwA==" - }, - "moment": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" - }, - "mout": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mustache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", - "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "1.3.0", - "object-assign": "4.1.1", - "thenify-all": "1.6.0" - } - }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.8.0", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.6", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "oboe": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", - "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", - "requires": { - "http-https": "1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "original-require": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", - "dev": true - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", - "requires": { - "for-each": "0.3.2", - "trim": "0.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "1.1.2" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.6" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "query-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.0.tgz", - "integrity": "sha512-F3DkxxlY0AqD/rwe4YAwjRE2HjOkKW7TxsuteyrS/Jbwrxw887PqYBL4sWUJ9D/V1hmFns0SCD6FDyvlwo9RCQ==", - "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", - "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" - } - }, - "randomhex": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=" - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - } - }, - "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "requires": { - "nan": "2.8.0" - } - }, - "scrypt.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", - "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", - "requires": { - "scrypt": "6.0.3", - "scryptsy": "1.2.1" - } - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "requires": { - "pbkdf2": "3.0.14" - } - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "requires": { - "commander": "2.8.1" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" - }, - "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" - } - } - }, - "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "requires": { - "body-parser": "1.18.2", - "cors": "2.8.4", - "express": "4.16.2", - "request": "2.83.0", - "xhr": "2.4.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - }, - "sha.js": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", - "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "sha3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", - "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", - "requires": { - "nan": "2.8.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shortid": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", - "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz", - "integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==", - "requires": { - "decompress-response": "3.3.0", - "once": "1.4.0", - "simple-concat": "1.0.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.2.0" - } - }, - "solc": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.19.tgz", - "integrity": "sha512-hvi/vi9rQcB73poRLoLRfQIYKwmdhrNbZlOOFCGd5v58gEsYEUr3+oHPSXhyk4CFNchWC2ojpMYrHDJNm0h4jQ==", - "dev": true, - "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.5.0", - "yargs": "4.8.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - } - } - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "stream-http": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { - "is-natural-number": "4.0.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "swarm-js": { - "version": "0.1.37", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", - "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", - "requires": { - "bluebird": "3.5.1", - "buffer": "5.0.8", - "decompress": "4.2.0", - "eth-lib": "0.1.27", - "fs-extra": "2.1.2", - "fs-promise": "2.0.3", - "got": "7.1.0", - "mime-types": "2.1.17", - "mkdirp-promise": "5.0.1", - "mock-fs": "4.4.2", - "setimmediate": "1.0.5", - "tar.gz": "1.0.7", - "xhr-request-promise": "0.1.2" - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.1", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "tar.gz": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", - "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", - "requires": { - "bluebird": "2.11.0", - "commander": "2.8.1", - "fstream": "1.0.11", - "mout": "0.11.1", - "tar": "2.2.1" - }, - "dependencies": { - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" - } - } - }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "requires": { - "any-promise": "1.3.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": "3.3.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "1.4.1" - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "truffle": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.6.tgz", - "integrity": "sha512-E4u1dZr2IGY4liulO/nGMtavx4jVLXIJp48lxFq54N+gMRGhmBQp5kf1etA3bYhHVtO9IO76qRiHMMVuId7cRg==", - "dev": true, - "requires": { - "mocha": "3.5.3", - "original-require": "1.0.1", - "solc": "0.4.19" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", - "dev": true - }, - "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", - "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "0.5.1", - "supports-color": "3.1.2" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-detect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", - "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", - "dev": true - }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.17" - } - }, - "typedarray-to-buffer": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz", - "integrity": "sha1-EBezLZhP9VbroQD1AViauhrOLgQ=", - "requires": { - "is-typedarray": "1.0.0" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" - } - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "unbzip2-stream": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", - "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", - "requires": { - "buffer": "3.6.0", - "through": "2.3.8" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "buffer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "requires": { - "base64-js": "0.0.8", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - } - } - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - } - }, - "web3": { - "version": "1.0.0-beta.26", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.26.tgz", - "integrity": "sha1-u0ba9q78MT92iz3jnX9KjXvQZmM=", - "requires": { - "web3-bzz": "1.0.0-beta.29", - "web3-core": "1.0.0-beta.29", - "web3-eth": "1.0.0-beta.29", - "web3-eth-personal": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29", - "web3-shh": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-bzz": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.29.tgz", - "integrity": "sha1-xAVVzjKB9jf8X1yD3HsIy+70K3I=", - "requires": { - "got": "7.1.0", - "swarm-js": "0.1.37", - "underscore": "1.8.3" - } - }, - "web3-core": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.29.tgz", - "integrity": "sha1-G/uc3AHMPqcZDplh+PeIa7Qc/PE=", - "requires": { - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-requestmanager": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-core-helpers": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.29.tgz", - "integrity": "sha1-kUJt7MEEEmI4TA3quRvXmnCLGQI=", - "requires": { - "underscore": "1.8.3", - "web3-eth-iban": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-core-method": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.29.tgz", - "integrity": "sha1-11trk9FuK5yoxPcc3G/ubCk2HHY=", - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-promievent": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-core-promievent": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.29.tgz", - "integrity": "sha1-zziMs052BSiFp8K9Fec1jDm32Zg=", - "requires": { - "bluebird": "3.3.1", - "eventemitter3": "1.1.1" - }, - "dependencies": { - "bluebird": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", - "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" - } - } - }, - "web3-core-requestmanager": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.29.tgz", - "integrity": "sha1-7s36oLtNJ8SEbEaFmJr2NVqxBzw=", - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "web3-providers-http": "1.0.0-beta.29", - "web3-providers-ipc": "1.0.0-beta.29", - "web3-providers-ws": "1.0.0-beta.29" - } - }, - "web3-core-subscriptions": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.29.tgz", - "integrity": "sha1-D5R1q0diCQC4gsrILsQr3NNbRKE=", - "requires": { - "eventemitter3": "1.1.1", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29" - } - }, - "web3-eth": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.29.tgz", - "integrity": "sha1-FTovYTcM50Qc4/JK5eFSC0K5PSQ=", - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-eth-abi": "1.0.0-beta.29", - "web3-eth-accounts": "1.0.0-beta.29", - "web3-eth-contract": "1.0.0-beta.29", - "web3-eth-iban": "1.0.0-beta.29", - "web3-eth-personal": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-eth-abi": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.29.tgz", - "integrity": "sha1-eRPArlRRAFmpjb0MubqG00IO+II=", - "requires": { - "bn.js": "4.11.6", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "web3-eth-accounts": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.29.tgz", - "integrity": "sha1-mG/z7X0XHam6egPByblLMb4vk+w=", - "requires": { - "bluebird": "3.3.1", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scrypt.js": "0.2.0", - "underscore": "1.8.3", - "uuid": "2.0.1", - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - }, - "dependencies": { - "bluebird": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.1.tgz", - "integrity": "sha1-+Xrhlw9B2FF3KDBT6aEgFg5mxh0=" - }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0", - "xhr-request-promise": "0.1.2" - } - }, - "uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" - } - } - }, - "web3-eth-contract": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.29.tgz", - "integrity": "sha1-xXTGOpCEi5gvF2tBwt76tFmMSmk=", - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-promievent": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-eth-abi": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-eth-iban": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.29.tgz", - "integrity": "sha1-eXSsE2X2WXdsxqv1xV4ty8Jw44E=", - "requires": { - "bn.js": "4.11.8", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-eth-personal": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.29.tgz", - "integrity": "sha1-qk0e+k7hR4fzcnuxw2DxLtfIqqI=", - "requires": { - "web3-core": "1.0.0-beta.29", - "web3-core-helpers": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-net": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.29.tgz", - "integrity": "sha1-8zYaw9o26FkB7hVh61K+5S2dS+4=", - "requires": { - "web3-core": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-utils": "1.0.0-beta.29" - } - }, - "web3-providers-http": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.29.tgz", - "integrity": "sha1-UAFYhAnMKxj4qqwJINUuOQR+Ir0=", - "requires": { - "web3-core-helpers": "1.0.0-beta.29", - "xhr2": "0.1.4" - } - }, - "web3-providers-ipc": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.29.tgz", - "integrity": "sha1-uMLaC1ql3KoqZc/tq/VXKyJV2rk=", - "requires": { - "oboe": "2.1.3", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29" - } - }, - "web3-providers-ws": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.29.tgz", - "integrity": "sha1-LtnZsoj2IZs3+gV8XlsM/t3NAbs=", - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.29", - "websocket": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c" - } - }, - "web3-shh": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.29.tgz", - "integrity": "sha1-HnA1Utrpa/Z7Y+RoNRSxRV+aWEY=", - "requires": { - "web3-core": "1.0.0-beta.29", - "web3-core-method": "1.0.0-beta.29", - "web3-core-subscriptions": "1.0.0-beta.29", - "web3-net": "1.0.0-beta.29" - } - }, - "web3-utils": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.29.tgz", - "integrity": "sha1-iZkl7RWyDV9wgU34o1Ji5Nb8pqk=", - "requires": { - "bn.js": "4.11.6", - "eth-lib": "0.1.27", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.8.3", - "utf8": "2.1.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" - } - } - }, - "webpack": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", - "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", - "dev": true, - "requires": { - "acorn": "5.4.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "0.2.17", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "3.2.3", - "tapable": "0.2.8", - "uglify-js": "2.8.29", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "6.6.0" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c", - "requires": { - "debug": "2.6.9", - "nan": "2.8.0", - "typedarray-to-buffer": "3.1.2", - "yaeti": "0.0.6" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.1" - } - }, - "xhr": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz", - "integrity": "sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==", - "requires": { - "global": "4.3.2", - "is-function": "1.0.1", - "parse-headers": "2.0.1", - "xtend": "4.0.1" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "requires": { - "buffer-to-arraybuffer": "0.0.5", - "object-assign": "4.1.1", - "query-string": "5.1.0", - "simple-get": "2.7.0", - "timed-out": "4.0.1", - "url-set-query": "1.0.0", - "xhr": "2.4.1" - } - }, - "xhr-request-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", - "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "requires": { - "xhr-request": "1.1.0" - } - }, - "xhr2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" - }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - } - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - }, - "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "requires": { - "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" - } - } - } -} diff --git a/package.json b/package.json index ffc0a06..df4daec 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "bignumber": "^1.1.0", "bignumber.js": "^4.1.0", "moment": "^2.19.2", + "mustache": "2.3.0", "shortid": "2.2.8", "web3": "1.0.0-beta.26" }, @@ -20,7 +21,6 @@ "ethereumjs-testrpc": "^6.0.3", "ganache-cli": "^6.0.3", "truffle": "^4.0.1", - "mustache": "2.3.0", "mocha": "^5.0.0", "solc": "^0.4.19", "chai": "^4.1.2" From e2557a21e571e4cf135e4137551c5544b28d0101 Mon Sep 17 00:00:00 2001 From: deepesh KN Date: Mon, 12 Feb 2018 20:41:41 +0530 Subject: [PATCH 043/242] Docs: Updated docs --- .jsdoc.json | 37 + docs/classes.list.html | 333 + docs/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes docs/fonts/glyphicons-halflings-regular.svg | 288 + docs/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes docs/fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes docs/fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes docs/global.html | 375 + docs/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes docs/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes docs/index.html | 252 + docs/module-lib_contract_helper_helper.html | 4433 ++++++++++ ...s_managed_contract-OpsManagedContract.html | 770 ++ ...ontract_interact_ops_managed_contract.html | 311 + ...interact_owned_contract-OwnedContract.html | 759 ++ ...-lib_contract_interact_owned_contract.html | 311 + ...ib_contract_interact_pricer-MockToken.html | 1199 +++ ...e-lib_contract_interact_pricer-Pricer.html | 2727 ++++++ docs/module-lib_contract_interact_pricer.html | 407 + ...b3_events_formatter-web3EventsDecoder.html | 491 ++ ..._events_formatter-web3EventsFormatter.html | 457 + docs/module-lib_web3_events_formatter.html | 407 + docs/module-tools_deploy_DeployHelper.html | 821 ++ docs/module-tools_deploy_helper.html | 306 + docs/module-tools_deploy_pricer.html | 1225 +++ docs/modules.list.html | 333 + docs/namespaces.list.html | 333 + docs/quicksearch.html | 31 + docs/scripts/docstrap.lib.js | 11 + docs/scripts/fulltext-search-ui.js | 89 + docs/scripts/fulltext-search.js | 36 + docs/scripts/lunr.min.js | 6 + docs/scripts/prettify/Apache-License-2.0.txt | 202 + docs/scripts/prettify/jquery.min.js | 6 + docs/scripts/prettify/lang-css.js | 21 + docs/scripts/prettify/prettify.js | 496 ++ docs/scripts/sunlight.js | 1157 +++ docs/scripts/toc.js | 203 + docs/styles/darkstrap.css | 960 +++ docs/styles/prettify-tomorrow.css | 132 + docs/styles/site.cerulean.css | 7008 +++++++++++++++ docs/styles/site.cosmo.css | 7061 +++++++++++++++ docs/styles/site.cyborg.css | 7048 +++++++++++++++ docs/styles/site.darkly.css | 7171 ++++++++++++++++ docs/styles/site.darkstrap.css | 5638 ++++++++++++ docs/styles/site.dibs-bootstrap.css | 5899 +++++++++++++ docs/styles/site.flatly.css | 7147 ++++++++++++++++ docs/styles/site.journal.css | 6973 +++++++++++++++ docs/styles/site.lumen.css | 7298 ++++++++++++++++ docs/styles/site.paper.css | 7623 +++++++++++++++++ docs/styles/site.readable.css | 6997 +++++++++++++++ docs/styles/site.sandstone.css | 7035 +++++++++++++++ docs/styles/site.simplex.css | 7023 +++++++++++++++ docs/styles/site.slate.css | 7343 ++++++++++++++++ docs/styles/site.spacelab.css | 7055 +++++++++++++++ docs/styles/site.superhero.css | 7131 +++++++++++++++ docs/styles/site.united.css | 6895 +++++++++++++++ docs/styles/site.yeti.css | 7195 ++++++++++++++++ docs/styles/sunlight.dark.css | 345 + docs/styles/sunlight.default.css | 344 + package.json | 6 + 61 files changed, 146160 insertions(+) create mode 100644 .jsdoc.json create mode 100644 docs/classes.list.html create mode 100644 docs/fonts/glyphicons-halflings-regular.eot create mode 100644 docs/fonts/glyphicons-halflings-regular.svg create mode 100644 docs/fonts/glyphicons-halflings-regular.ttf create mode 100644 docs/fonts/glyphicons-halflings-regular.woff create mode 100644 docs/fonts/glyphicons-halflings-regular.woff2 create mode 100644 docs/global.html create mode 100644 docs/img/glyphicons-halflings-white.png create mode 100644 docs/img/glyphicons-halflings.png create mode 100644 docs/index.html create mode 100644 docs/module-lib_contract_helper_helper.html create mode 100644 docs/module-lib_contract_interact_ops_managed_contract-OpsManagedContract.html create mode 100644 docs/module-lib_contract_interact_ops_managed_contract.html create mode 100644 docs/module-lib_contract_interact_owned_contract-OwnedContract.html create mode 100644 docs/module-lib_contract_interact_owned_contract.html create mode 100644 docs/module-lib_contract_interact_pricer-MockToken.html create mode 100644 docs/module-lib_contract_interact_pricer-Pricer.html create mode 100644 docs/module-lib_contract_interact_pricer.html create mode 100644 docs/module-lib_web3_events_formatter-web3EventsDecoder.html create mode 100644 docs/module-lib_web3_events_formatter-web3EventsFormatter.html create mode 100644 docs/module-lib_web3_events_formatter.html create mode 100644 docs/module-tools_deploy_DeployHelper.html create mode 100644 docs/module-tools_deploy_helper.html create mode 100644 docs/module-tools_deploy_pricer.html create mode 100644 docs/modules.list.html create mode 100644 docs/namespaces.list.html create mode 100644 docs/quicksearch.html create mode 100644 docs/scripts/docstrap.lib.js create mode 100644 docs/scripts/fulltext-search-ui.js create mode 100644 docs/scripts/fulltext-search.js create mode 100644 docs/scripts/lunr.min.js create mode 100644 docs/scripts/prettify/Apache-License-2.0.txt create mode 100644 docs/scripts/prettify/jquery.min.js create mode 100644 docs/scripts/prettify/lang-css.js create mode 100644 docs/scripts/prettify/prettify.js create mode 100644 docs/scripts/sunlight.js create mode 100644 docs/scripts/toc.js create mode 100644 docs/styles/darkstrap.css create mode 100644 docs/styles/prettify-tomorrow.css create mode 100644 docs/styles/site.cerulean.css create mode 100644 docs/styles/site.cosmo.css create mode 100644 docs/styles/site.cyborg.css create mode 100644 docs/styles/site.darkly.css create mode 100644 docs/styles/site.darkstrap.css create mode 100644 docs/styles/site.dibs-bootstrap.css create mode 100644 docs/styles/site.flatly.css create mode 100644 docs/styles/site.journal.css create mode 100644 docs/styles/site.lumen.css create mode 100644 docs/styles/site.paper.css create mode 100644 docs/styles/site.readable.css create mode 100644 docs/styles/site.sandstone.css create mode 100644 docs/styles/site.simplex.css create mode 100644 docs/styles/site.slate.css create mode 100644 docs/styles/site.spacelab.css create mode 100644 docs/styles/site.superhero.css create mode 100644 docs/styles/site.united.css create mode 100644 docs/styles/site.yeti.css create mode 100644 docs/styles/sunlight.dark.css create mode 100644 docs/styles/sunlight.default.css diff --git a/.jsdoc.json b/.jsdoc.json new file mode 100644 index 0000000..62e9f85 --- /dev/null +++ b/.jsdoc.json @@ -0,0 +1,37 @@ +{ + "tags": { + "allowUnknownTags": true + }, + "source": { + "include": ["config/", "helpers/", "lib/", "tools"], + "exclude": [], + "includePattern": ".+\\.js(doc|x)?$", + "excludePattern": "(^|\\/|\\\\)_" + }, + "plugins": [ + "jsdoc-route-plugin" + ], + "recurseDepth": 5, + "templates": { + "systemName" : "Pricer Contracts and Service Layer", + "footer" : "", + "copyright" : "OST.com Ltd.", + "includeDate" : false, + "theme" : "lumen", + "navType" : "vertical", + "linenums" : true, + "cleverLinks" : true, + "monospaceLinks" : true, + "default": { + "outputSourceFiles": true + } + }, + "opts": { + "destination": "./docs/", + "encoding": "utf8", + "private": true, + "recurse": true, + "template": "./node_modules/ink-docstrap/template", + "readme": "./README.md" + } +} \ No newline at end of file diff --git a/docs/classes.list.html b/docs/classes.list.html new file mode 100644 index 0000000..30e28b4 --- /dev/null +++ b/docs/classes.list.html @@ -0,0 +1,333 @@ + + + + + + + Pricer Contracts and Service Layer Classes + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Classes

+
+ +
+ +

+ +

+ + +
+ + + + +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/glyphicons-halflings-regular.eot b/docs/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/fonts/glyphicons-halflings-regular.ttf b/docs/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/docs/fonts/glyphicons-halflings-regular.woff2 b/docs/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/docs/global.html b/docs/global.html new file mode 100644 index 0000000..2603980 --- /dev/null +++ b/docs/global.html @@ -0,0 +1,375 @@ + + + + + + + Pricer Contracts and Service Layer Global + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Global

+
+ +
+ +

+ +

+ + +
+ + +
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + +

Members

+ +
+ +
+
+

<constant> rootPrefix

+ + +
+
+ +
+ List of all addresses and there respective abi, bin, passphrase +required for platform. + +And helper methods to access this information using human readable +names. +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/img/glyphicons-halflings-white.png b/docs/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/docs/img/glyphicons-halflings.png b/docs/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..42b7eea --- /dev/null +++ b/docs/index.html @@ -0,0 +1,252 @@ + + + + + + + Pricer Contracts and Service Layer Index + + + + + + + + + + + + + +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+

OpenST Payments - Payment infrastructure on top of the OpenST network

Gitter: JOIN CHAT

+

While OpenST 0.9 is available as-is for anyone to use, we caution that this is early stage software and under heavy ongoing development and improvement. Please report bugs and suggested improvements.

+
+ + + + + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_helper_helper.html b/docs/module-lib_contract_helper_helper.html new file mode 100644 index 0000000..3ee889f --- /dev/null +++ b/docs/module-lib_contract_helper_helper.html @@ -0,0 +1,4433 @@ + + + + + + + Pricer Contracts and Service Layer Module: lib/contract_helper/helper + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: lib/contract_helper/helper

+
+ +
+ +
+ + +
+
+ + +
This is utility class for contract interacts

+ +Ref: module:ContractHelper
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<static> call(web3RpcProvider, currContractAddr, encodeABI [, options] [, transactionOutputs])

+ + +
+
+ + +
+ Call methods (execute methods which DO NOT modify state of contracts) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
options + + +Object + + + + + + + <optional>
+ + + + + +
optional params
transactionOutputs + + +Object + + + + + + + <optional>
+ + + + + +
optional transactionOutputs
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> generateManagedKeyPassphrase()

+ + +
+
+ + +
+ Stub method to generate managed key passphrase +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +String + + + +
+
+ + + + + +
+ + + +
+
+

<static> getTransactionOutputs(transactionObject)

+ + +
+
+ + +
+ get outputs of a given transaction +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
transactionObject + + +Object + + + + + transactionObject is returned from call method.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Object + + + +
+
+ + + + + +
+ + + +
+
+

<static> safeSend(web3RpcProvider, currContractAddr, senderName, encodeABI [, txOptions] [, addressToNameMap])

+ + +
+
+ + +
+ Safe Send a transaction (this internally waits for transaction to be mined) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
senderName + + +String + + + + + + + + + + + name of transaction's sender
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
txOptions + + +Object + + + + + + + <optional>
+ + + + + +
optional txOptions
addressToNameMap + + +Object + + + + + + + <optional>
+ + + + + +
optional addressToNameMap
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> safeSendFromAddr(web3RpcProvider, currContractAddr, senderAddr, senderPassphrase, encodeABI [, txOptions] [, addressToNameMap])

+ + +
+
+ + +
+ Safe Send a transaction (this internally waits for transaction to be mined) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
senderAddr + + +String + + + + + + + + + + + address of transaction's sender senderAddr
senderPassphrase + + +String + + + + + + + + + + + passphrase of
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
txOptions + + +Object + + + + + + + <optional>
+ + + + + +
optional txOptions
addressToNameMap + + +Object + + + + + + + <optional>
+ + + + + +
optional addressToNameMap
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> send(web3RpcProvider, currContractAddr, encodeABI [, options] [, transactionOutputs])

+ + +
+
+ + +
+ Send methods (execute methods which modify state of a contracts) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
options + + +Object + + + + + + + <optional>
+ + + + + +
optional params
transactionOutputs + + +Object + + + + + + + <optional>
+ + + + + +
optional transactionOutputs
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> toAddress(web3RpcProvider, result)

+ + +
+
+ + +
+ Decode result and typecast it to an Address +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
web3RpcProvider + + +Web3 + + + + + It could be value chain or utility chain provider
result + + +String + + + + + current contract address
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> toNumber(web3RpcProvider, result)

+ + +
+
+ + +
+ Decode result and typecast it to a Number +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
web3RpcProvider + + +Web3 + + + + + It could be value chain or utility chain provider
result + + +String + + + + + current contract address
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> toString(web3RpcProvider, result)

+ + +
+
+ + +
+ Decode result and typecast it to a String +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
web3RpcProvider + + +Web3 + + + + + It could be value chain or utility chain provider
result + + +String + + + + + current contract address
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Module: lib/contract_helper/helper

+
+ +
+ +
+ + +
+
+ + +
Deploy Helper class to perform deploy
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<static> call(web3RpcProvider, currContractAddr, encodeABI [, options] [, transactionOutputs])

+ + +
+
+ + +
+ Call methods (execute methods which DO NOT modify state of contracts) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
options + + +Object + + + + + + + <optional>
+ + + + + +
optional params
transactionOutputs + + +Object + + + + + + + <optional>
+ + + + + +
optional transactionOutputs
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> generateManagedKeyPassphrase()

+ + +
+
+ + +
+ Stub method to generate managed key passphrase +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +String + + + +
+
+ + + + + +
+ + + +
+
+

<static> getTransactionOutputs(transactionObject)

+ + +
+
+ + +
+ get outputs of a given transaction +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
transactionObject + + +Object + + + + + transactionObject is returned from call method.
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Object + + + +
+
+ + + + + +
+ + + +
+
+

<static> safeSend(web3RpcProvider, currContractAddr, senderName, encodeABI [, txOptions] [, addressToNameMap])

+ + +
+
+ + +
+ Safe Send a transaction (this internally waits for transaction to be mined) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
senderName + + +String + + + + + + + + + + + name of transaction's sender
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
txOptions + + +Object + + + + + + + <optional>
+ + + + + +
optional txOptions
addressToNameMap + + +Object + + + + + + + <optional>
+ + + + + +
optional addressToNameMap
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> safeSendFromAddr(web3RpcProvider, currContractAddr, senderAddr, senderPassphrase, encodeABI [, txOptions] [, addressToNameMap])

+ + +
+
+ + +
+ Safe Send a transaction (this internally waits for transaction to be mined) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
senderAddr + + +String + + + + + + + + + + + address of transaction's sender senderAddr
senderPassphrase + + +String + + + + + + + + + + + passphrase of
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
txOptions + + +Object + + + + + + + <optional>
+ + + + + +
optional txOptions
addressToNameMap + + +Object + + + + + + + <optional>
+ + + + + +
optional addressToNameMap
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> send(web3RpcProvider, currContractAddr, encodeABI [, options] [, transactionOutputs])

+ + +
+
+ + +
+ Send methods (execute methods which modify state of a contracts) +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
web3RpcProvider + + +Web3 + + + + + + + + + + + It could be value chain or utility chain provider
currContractAddr + + +String + + + + + + + + + + + current contract address
encodeABI + + +Object + + + + + + + + + + + encoded method ABI data
options + + +Object + + + + + + + <optional>
+ + + + + +
optional params
transactionOutputs + + +Object + + + + + + + <optional>
+ + + + + +
optional transactionOutputs
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> toAddress(web3RpcProvider, result)

+ + +
+
+ + +
+ Decode result and typecast it to an Address +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
web3RpcProvider + + +Web3 + + + + + It could be value chain or utility chain provider
result + + +String + + + + + current contract address
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> toNumber(web3RpcProvider, result)

+ + +
+
+ + +
+ Decode result and typecast it to a Number +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
web3RpcProvider + + +Web3 + + + + + It could be value chain or utility chain provider
result + + +String + + + + + current contract address
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

<static> toString(web3RpcProvider, result)

+ + +
+
+ + +
+ Decode result and typecast it to a String +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
web3RpcProvider + + +Web3 + + + + + It could be value chain or utility chain provider
result + + +String + + + + + current contract address
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_interact_ops_managed_contract-OpsManagedContract.html b/docs/module-lib_contract_interact_ops_managed_contract-OpsManagedContract.html new file mode 100644 index 0000000..7e5ec8e --- /dev/null +++ b/docs/module-lib_contract_interact_ops_managed_contract-OpsManagedContract.html @@ -0,0 +1,770 @@ + + + + + + + Pricer Contracts and Service Layer Class: OpsManagedContract + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: OpsManagedContract

+
+ +
+ +

+ lib/contract_interact/ops_managed_contract~ + + OpsManagedContract +

+ + +
+ + +
+
+ + +
+
+

new OpsManagedContract(contractAddress, web3RpcProvider, currContract, defaultGasPrice)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
contractAddress + + +String + + + + + address where Contract has been deployed
web3RpcProvider + + +String + + + + + webRpc provider of network where currContract has been deployed
currContract + + +String + + + + + Contract Instance
defaultGasPrice + + +String + + + + + default Gas Price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + +

Extends

+ + + + +
    +
  • OwnedContract
  • +
+ + + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

getOpsAddress()

+ + +
+
+ + +
+ Get currContract's Ops Address +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Result + + + +
+
+ + + + + +
+ + + +
+
+

setOpsAddress(defaultGasPrice, opsAddress, customOptions)

+ + +
+
+ + +
+ Set currContract's Ops Address +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
defaultGasPrice + + +String + + + + + default Gas Price
opsAddress + + +String + + + + + address which is to be made Ops Address of currContract
customOptions + + +Object + + + + + custom params for this transaction
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_interact_ops_managed_contract.html b/docs/module-lib_contract_interact_ops_managed_contract.html new file mode 100644 index 0000000..46cb3ac --- /dev/null +++ b/docs/module-lib_contract_interact_ops_managed_contract.html @@ -0,0 +1,311 @@ + + + + + + + Pricer Contracts and Service Layer Module: lib/contract_interact/ops_managed_contract + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: lib/contract_interact/ops_managed_contract

+
+ +
+ +
+ + +
+
+ + +
This is a utility file which would be used for executing all methods on OpsManaged Contract.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +

Classes

+ +
+
OpsManagedContract
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_interact_owned_contract-OwnedContract.html b/docs/module-lib_contract_interact_owned_contract-OwnedContract.html new file mode 100644 index 0000000..0ddc7ca --- /dev/null +++ b/docs/module-lib_contract_interact_owned_contract-OwnedContract.html @@ -0,0 +1,759 @@ + + + + + + + Pricer Contracts and Service Layer Class: OwnedContract + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: OwnedContract

+
+ +
+ +

+ lib/contract_interact/owned_contract~ + + OwnedContract +

+ + +
+ + +
+
+ + +
+
+

new OwnedContract(contractAddress, web3RpcProvider, currContract, defaultGasPrice)

+ + +
+
+ + + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
contractAddress + + +String + + + + + address where Contract has been deployed
web3RpcProvider + + +String + + + + + webRpc provider of network where currContract has been deployed
currContract + + +String + + + + + Contract Instance
defaultGasPrice + + +String + + + + + default Gas Price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

getOwner()

+ + +
+
+ + +
+ Get address of Owner of currContract +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

initiateOwnerShipTransfer(senderName, proposedOwner, customOptions)

+ + +
+
+ + +
+ Initiate Ownership of currContract +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderName + + +String + + + + + Sender of this Transaction
proposedOwner + + +String + + + + + address to which ownership needs to be transferred
customOptions + + +Object + + + + + custom params of this transaction
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_interact_owned_contract.html b/docs/module-lib_contract_interact_owned_contract.html new file mode 100644 index 0000000..c789406 --- /dev/null +++ b/docs/module-lib_contract_interact_owned_contract.html @@ -0,0 +1,311 @@ + + + + + + + Pricer Contracts and Service Layer Module: lib/contract_interact/owned_contract + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: lib/contract_interact/owned_contract

+
+ +
+ +
+ + +
+
+ + +
This is a utility file which would be used for executing all methods on Owned Contract.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +

Classes

+ +
+
OwnedContract
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_interact_pricer-MockToken.html b/docs/module-lib_contract_interact_pricer-MockToken.html new file mode 100644 index 0000000..99e1b8f --- /dev/null +++ b/docs/module-lib_contract_interact_pricer-MockToken.html @@ -0,0 +1,1199 @@ + + + + + + + Pricer Contracts and Service Layer Class: MockToken + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: MockToken

+
+ +
+ +

+ lib/contract_interact/pricer~ + + MockToken +

+ + +
+ + +
+
+ + +
+
+

new MockToken()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

approve(senderAddr, senderPassphrase, spenderAddress, value, gasPrice)

+ + +
+
+ + +
+ Approve +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderAddr + + +string + + + + + address of sender
senderPassphrase + + +string + + + + + passphrase of sender
spenderAddress + + +string + + + + + address which will be approved for spending
value + + +BigNumber + + + + + amount which is being approved (in wei)
gasPrice + + +BigNumber + + + + + gas price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

balanceOf(ownerAddress)

+ + +
+
+ + +
+ Get balance of address +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
ownerAddress + + +String + + + + + address for which balance is to be fetched
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

setBalance(senderAddr, senderPassphrase, ownerAddress, value, gasPrice)

+ + +
+
+ + +
+ Set balance +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderAddr + + +string + + + + + address of user who is sending amount
senderPassphrase + + +string + + + + + sender address passphrase
ownerAddress + + +string + + + + + address for which balance is to be set
value + + +BigNumber + + + + + amount which is being transferred (in wei)
gasPrice + + +BigNumber + + + + + gas price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

setConversionRate(senderAddr, senderPassphrase, conversionRate, gasPrice)

+ + +
+
+ + +
+ Set conversion rate +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderAddr + + +string + + + + + address of sender
senderPassphrase + + +string + + + + + passphrase of sender
conversionRate + + +number + + + + + conversion rate of branded token
gasPrice + + +BigNumber + + + + + gas price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_interact_pricer-Pricer.html b/docs/module-lib_contract_interact_pricer-Pricer.html new file mode 100644 index 0000000..47357da --- /dev/null +++ b/docs/module-lib_contract_interact_pricer-Pricer.html @@ -0,0 +1,2727 @@ + + + + + + + Pricer Contracts and Service Layer Class: Pricer + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Class: Pricer

+
+ +
+ +

+ lib/contract_interact/pricer~ + + Pricer +

+ + +
+ + +
+
+ + +
+
+

new Pricer()

+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

acceptedMargins(currency)

+ + +
+
+ + +
+ Get acceptable margin for the given currency +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
currency + + +string + + + + + quote currency
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

baseCurrency()

+ + +
+
+ + +
+ Get base currency of pricer +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

brandedToken()

+ + +
+
+ + +
+ Get branded token address of pricer +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

conversionRate()

+ + +
+
+ + +
+ Get conversion rate of pricer +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

decimals()

+ + +
+
+ + +
+ Get decimal of pricer +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

getPricePoint(currency)

+ + +
+
+ + +
+ Get current price point from the price oracle for the give currency +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
currency + + +string + + + + + quote currency
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

getPricePointAndCalculatedAmounts(transferAmount, commissionAmount, currency)

+ + +
+
+ + +
+ Get current price point and calculated token amounts +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
transferAmount + + +BigNumber + + + + + transfer amount (in wei)
commissionAmount + + +BigNumber + + + + + commision amount (in wei)
currency + + +string + + + + + quote currency
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

getTxReceipt(transactionHash)

+ + +
+
+ + +
+ Get transaction receipt from transaction hash +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
transactionHash + + +string + + + + + transaction hash
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ 10^18 +
+ + + +
+
+ Type +
+
+ +BigNumer + + + +
+
+ + + + + +
+ + + +
+
+

pay(senderAddr, senderPassphrase, beneficiaryAddress, transferAmount, commissionBeneficiaryAddress, commissionAmount, currency, intendedPricePoint, gasPrice)

+ + +
+
+ + +
+ Pay +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderAddr + + +string + + + + + address of sender
senderPassphrase + + +string + + + + + passphrase of sender
beneficiaryAddress + + +string + + + + + address of beneficiary account
transferAmount + + +BigNumber + + + + + transfer amount (in wei)
commissionBeneficiaryAddress + + +string + + + + + address of commision beneficiary account
commissionAmount + + +BigNumber + + + + + commission amount (in wei)
currency + + +string + + + + + quote currency
intendedPricePoint + + +BigNumber + + + + + price point at which the pay is intended (in wei)
gasPrice + + +BigNumber + + + + + gas price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

priceOracles(currency)

+ + +
+
+ + +
+ Get address of price oracle for the given currency +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
currency + + +string + + + + + quote currency
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

setAcceptedMargin(senderAddr, senderPassphrase, currency, acceptedMargin, gasPrice)

+ + +
+
+ + +
+ Set or update the acceptable margin range for a given currency +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderAddr + + +string + + + + + address of sender
senderPassphrase + + +string + + + + + passphrase of sender
currency + + +string + + + + + quote currency
acceptedMargin + + +BigNumber + + + + + accepted margin for the given currency (in wei)
gasPrice + + +BigNumber + + + + + gas price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

setPriceOracle(senderAddr, senderPassphrase, currency, address, gasPrice)

+ + +
+
+ + +
+ Set or updates the price oracle address for a given currency +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderAddr + + +string + + + + + address of sender
senderPassphrase + + +string + + + + + passphrase of sender
currency + + +string + + + + + quote currency
address + + +string + + + + + address of price pracle
gasPrice + + +BigNumber + + + + + gas price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ + + +
+
+

toWei(value)

+ + +
+
+ + +
+ Convert value in wei +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
value + + +BigNumber + + + + + amount in decimal
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ 10^18 +
+ + + +
+
+ Type +
+
+ +BigNumer + + + +
+
+ + + + + +
+ + + +
+
+

unsetPriceOracle(senderAddr, senderPassphrase, currency, gasPrice)

+ + +
+
+ + +
+ Remove the price oracle address for a given currency +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
senderAddr + + +string + + + + + address of sender
senderPassphrase + + +string + + + + + passphrase of sender
currency + + +string + + + + + quote currency
gasPrice + + +BigNumber + + + + + gas price
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_contract_interact_pricer.html b/docs/module-lib_contract_interact_pricer.html new file mode 100644 index 0000000..e14da39 --- /dev/null +++ b/docs/module-lib_contract_interact_pricer.html @@ -0,0 +1,407 @@ + + + + + + + Pricer Contracts and Service Layer Module: lib/contract_interact/pricer + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: lib/contract_interact/pricer

+
+ +
+ +
+ + +
+
+ + +
This is a utility file which would be used for executing all methods on Pricer contract.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +

Classes

+ +
+
MockToken
+
+ +
Pricer
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + +

Module: lib/contract_interact/pricer

+
+ +
+ +
+ + +
+
+ + +
This is a utility file which would be used for executing all methods on Pricer contract.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + +

Classes

+ +
+
MockToken
+
+ +
Pricer
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_web3_events_formatter-web3EventsDecoder.html b/docs/module-lib_web3_events_formatter-web3EventsDecoder.html new file mode 100644 index 0000000..eaf4b6f --- /dev/null +++ b/docs/module-lib_web3_events_formatter-web3EventsDecoder.html @@ -0,0 +1,491 @@ + + + + + + + Pricer Contracts and Service Layer Namespace: web3EventsDecoder + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Namespace: web3EventsDecoder

+
+ +
+ +

+ lib/web3/events/formatter~ + + web3EventsDecoder +

+ + +
+ + +
+
+ + +
Ivent Decoder.
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

perform(txReceipt, addressToNameMap)

+ + +
+
+ + +
+ performer +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
txReceipt + + +Object + + + + +
addressToNameMap + + +Hash + + + + + Map of the address(key) to name(value)
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + +
+ object of resulthelpwe\\er +
+ + + +
+
+ Type +
+
+ +result + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_web3_events_formatter-web3EventsFormatter.html b/docs/module-lib_web3_events_formatter-web3EventsFormatter.html new file mode 100644 index 0000000..0b113d9 --- /dev/null +++ b/docs/module-lib_web3_events_formatter-web3EventsFormatter.html @@ -0,0 +1,457 @@ + + + + + + + Pricer Contracts and Service Layer Namespace: web3EventsFormatter + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Namespace: web3EventsFormatter

+
+ +
+ +

+ lib/web3/events/formatter~ + + web3EventsFormatter +

+ + +
+ + +
+
+ + +
Event Formatter.
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

perform(formattedTransactionReceipt)

+ + +
+
+ + +
+ performer +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
formattedTransactionReceipt + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise.<{}> + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-lib_web3_events_formatter.html b/docs/module-lib_web3_events_formatter.html new file mode 100644 index 0000000..f87a4b3 --- /dev/null +++ b/docs/module-lib_web3_events_formatter.html @@ -0,0 +1,407 @@ + + + + + + + Pricer Contracts and Service Layer Module: lib/web3/events/formatter + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: lib/web3/events/formatter

+
+ +
+ +
+ + +
+
+ + +
Decode logs from a transaction receipt
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + +

Namespaces

+ +
+
web3EventsDecoder
+
+ +
web3EventsFormatter
+
+
+ + + + + + + + + +
+ +
+ + + + +

Module: lib/web3/events/formatter

+
+ +
+ +
+ + +
+
+ + +
Format decoded event into Hash with all the events received into it.
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + +

Namespaces

+ +
+
web3EventsDecoder
+
+ +
web3EventsFormatter
+
+
+ + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-tools_deploy_DeployHelper.html b/docs/module-tools_deploy_DeployHelper.html new file mode 100644 index 0000000..b70c9be --- /dev/null +++ b/docs/module-tools_deploy_DeployHelper.html @@ -0,0 +1,821 @@ + + + + + + + Pricer Contracts and Service Layer Module: tools/deploy/DeployHelper + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: tools/deploy/DeployHelper

+
+ +
+ +
+ + +
+
+ + +
Deploy Helper class to perform deploy
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<static> writeContractAddressToFile(fileName, contractAddress)

+ + +
+
+ + +
+ Write contract address to file based on parameter +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
fileName + + +String + + + + + file name
contractAddress + + +Hex + + + + + contract Address
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + + + + + +
+ + + +
+
+

<async, inner> perform(contractName, web3Provider, contractAbi, contractBin, deployerName [, customOptions] [, constructorArgs])

+ + +
+
+ + +
+ Method deploys contract +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDescription
contractName + + +String + + + + + + + + + + + Contract Name to be deployed
web3Provider + + +Web3 + + + + + + + + + + + Web3 Provider object
contractAbi + + +String + + + + + + + + + + + Contract Abi to be deployed
contractBin + + +String + + + + + + + + + + + Contract Bin file to be deployed
deployerName + + +String + + + + + + + + + + + Deployer name
customOptions + + +Object + + + + + + + <optional>
+ + + + + +
Custom options for value/utility chain
constructorArgs + + +Object + + + + + + + <optional>
+ + + + + +
Arguments to be passed while deploying contract
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + +
+
+ Type +
+
+ +Promise.<Object> + + + +
+
+ + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-tools_deploy_helper.html b/docs/module-tools_deploy_helper.html new file mode 100644 index 0000000..89d8526 --- /dev/null +++ b/docs/module-tools_deploy_helper.html @@ -0,0 +1,306 @@ + + + + + + + Pricer Contracts and Service Layer Module: tools/deploy/helper + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: tools/deploy/helper

+
+ +
+ +
+ + +
+
+ + +
This is utility class for deploying contract

+ +Ref: module:tools/deploy/DeployHelper
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/module-tools_deploy_pricer.html b/docs/module-tools_deploy_pricer.html new file mode 100644 index 0000000..c9427ba --- /dev/null +++ b/docs/module-tools_deploy_pricer.html @@ -0,0 +1,1225 @@ + + + + + + + Pricer Contracts and Service Layer Module: tools/deploy/pricer + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Module: tools/deploy/pricer

+
+ +
+ +
+ + +
+
+ + +
This is script for deploying Pricer contract on any chain.

+ + Prerequisite: +
    +
  1. Deployer Address
  2. +
+ + These are the following steps:
+
    +
  1. Deploy Pricer contract
  2. +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async, inner> performer(arguments)

+ + +
+
+ + +
+ It is the main performer method of this deployment script +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + +Array + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + + + + + +
+ + + +
+
+

<async, inner> performer(arguments)

+ + +
+
+ + +
+ It is the main performer method of this deployment script +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + +Array + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + + + + + +
+ + + +
+
+

<inner> validate(arguments)

+ + +
+
+ + +
+ Validation Method +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + +Array + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +

Module: tools/deploy/pricer

+
+ +
+ +
+ + +
+
+ + +
This is script for deploying Pricer contract on any chain.

+ + Prerequisite: +
    +
  1. Deployer Address
  2. +
+ + These are the following steps:
+
    +
  1. Deploy Pricer contract
  2. +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + +

Methods

+ +
+ +
+
+

<async, inner> performer(arguments)

+ + +
+
+ + +
+ It is the main performer method of this deployment script +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + +Array + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + + + + + +
+ + + +
+
+

<async, inner> performer(arguments)

+ + +
+
+ + +
+ It is the main performer method of this deployment script +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + +Array + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + + + + + +
+ + + +
+
+

<inner> validate(arguments)

+ + +
+
+ + +
+ Validation Method +
+ + + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
arguments + + +Array + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
Returns:
+ + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/modules.list.html b/docs/modules.list.html new file mode 100644 index 0000000..4ffaf65 --- /dev/null +++ b/docs/modules.list.html @@ -0,0 +1,333 @@ + + + + + + + Pricer Contracts and Service Layer Modules + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Modules

+
+ +
+ +

+ +

+ + +
+ + + + +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/namespaces.list.html b/docs/namespaces.list.html new file mode 100644 index 0000000..bbba834 --- /dev/null +++ b/docs/namespaces.list.html @@ -0,0 +1,333 @@ + + + + + + + Pricer Contracts and Service Layer Namespaces + + + + + + + + + + + + + +
+
+ + +
+ +
+ + +

Namespaces

+
+ +
+ +

+ +

+ + +
+ + + + +
+ + + + +
+
+ +
+ + +
+ +
+ + +
+
+ + + + + +
+ + + + + + OST.com Ltd. + + + + Documentation generated by JSDoc 3.5.5 + + using the DocStrap template. + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/quicksearch.html b/docs/quicksearch.html new file mode 100644 index 0000000..25d10d8 --- /dev/null +++ b/docs/quicksearch.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + diff --git a/docs/scripts/docstrap.lib.js b/docs/scripts/docstrap.lib.js new file mode 100644 index 0000000..09d9272 --- /dev/null +++ b/docs/scripts/docstrap.lib.js @@ -0,0 +1,11 @@ +if(!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b="length"in a&&a.length,c=_.type(a);return"function"!==c&&!_.isWindow(a)&&(!(1!==a.nodeType||!b)||("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a))}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ha.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=oa[a]={};return _.each(a.match(na)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+h.uid++}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ua,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:ta.test(c)?_.parseJSON(c):c)}catch(a){}sa.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Ka.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)ra.set(a[c],"globalEval",!b||ra.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(ra.hasData(a)&&(f=ra.access(a),g=ra.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sa.hasData(a)&&(h=sa.access(a),i=_.extend({},h),sa.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ya.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Oa[a];return c||(c=t(a,b),"none"!==c&&c||(Na=(Na||_("