From 0d01aaf332f39a431589100ce1c96e9bca0bd9b9 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Thu, 15 Nov 2018 19:38:30 +0100 Subject: [PATCH 01/44] Actor app: inherit Vault and test vault functionality --- future-apps/actor/.solcover.js | 9 + future-apps/actor/.soliumignore | 1 + future-apps/actor/.soliumrc.json | 23 ++ future-apps/actor/arapp.json | 33 +++ future-apps/actor/contracts/.npmignore | 1 + future-apps/actor/contracts/Actor.sol | 10 + .../actor/contracts/test/TestImports.sol | 28 +++ .../contracts/test/mocks/DestinationMock.sol | 10 + .../test/mocks/EtherTokenConstantMock.sol | 8 + .../contracts/test/mocks/ExecutionTarget.sol | 17 ++ .../contracts/test/mocks/ForceSendETH.sol | 11 + .../test/mocks/KernelDepositableMock.sol | 14 ++ .../contracts/test/mocks/SimpleERC20.sol | 81 ++++++ future-apps/actor/manifest.json | 10 + .../actor/migrations/1_initial_migration.js | 5 + future-apps/actor/package.json | 55 ++++ future-apps/actor/scripts/deploy.js | 5 + future-apps/actor/test/vault.js | 238 ++++++++++++++++++ future-apps/actor/truffle.js | 1 + 19 files changed, 560 insertions(+) create mode 100644 future-apps/actor/.solcover.js create mode 100644 future-apps/actor/.soliumignore create mode 100644 future-apps/actor/.soliumrc.json create mode 100644 future-apps/actor/arapp.json create mode 100644 future-apps/actor/contracts/.npmignore create mode 100644 future-apps/actor/contracts/Actor.sol create mode 100644 future-apps/actor/contracts/test/TestImports.sol create mode 100644 future-apps/actor/contracts/test/mocks/DestinationMock.sol create mode 100644 future-apps/actor/contracts/test/mocks/EtherTokenConstantMock.sol create mode 100644 future-apps/actor/contracts/test/mocks/ExecutionTarget.sol create mode 100644 future-apps/actor/contracts/test/mocks/ForceSendETH.sol create mode 100644 future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol create mode 100644 future-apps/actor/contracts/test/mocks/SimpleERC20.sol create mode 100644 future-apps/actor/manifest.json create mode 100644 future-apps/actor/migrations/1_initial_migration.js create mode 100644 future-apps/actor/package.json create mode 100644 future-apps/actor/scripts/deploy.js create mode 100644 future-apps/actor/test/vault.js create mode 100644 future-apps/actor/truffle.js diff --git a/future-apps/actor/.solcover.js b/future-apps/actor/.solcover.js new file mode 100644 index 0000000000..2f9a331fdc --- /dev/null +++ b/future-apps/actor/.solcover.js @@ -0,0 +1,9 @@ +module.exports = { + norpc: true, + copyPackages: ['@aragon/os', '@aragon/apps-vault'], + skipFiles: [ + 'test/TestImports.sol', + 'test/mocks/ExecutionTarget.sol', + 'test/mocks/FinanceMock.sol', + ] +} diff --git a/future-apps/actor/.soliumignore b/future-apps/actor/.soliumignore new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/future-apps/actor/.soliumignore @@ -0,0 +1 @@ + diff --git a/future-apps/actor/.soliumrc.json b/future-apps/actor/.soliumrc.json new file mode 100644 index 0000000000..cc47c10c26 --- /dev/null +++ b/future-apps/actor/.soliumrc.json @@ -0,0 +1,23 @@ +{ + "extends": "solium:all", + "rules": { + "imports-on-top": ["error"], + "variable-declarations": ["error"], + "array-declarations": ["error"], + "operator-whitespace": ["error"], + "lbrace": ["error"], + "mixedcase": 0, + "camelcase": ["error"], + "uppercase": 0, + "no-empty-blocks": ["error"], + "no-unused-vars": ["error"], + "quotes": ["error"], + "indentation": 0, + "whitespace": ["error"], + "deprecated-suicide": ["error"], + "arg-overflow": ["error", 8], + "pragma-on-top": ["error"], + "security/enforce-explicit-visibility": ["error"], + "error-reason": 0 + } +} diff --git a/future-apps/actor/arapp.json b/future-apps/actor/arapp.json new file mode 100644 index 0000000000..730668f10e --- /dev/null +++ b/future-apps/actor/arapp.json @@ -0,0 +1,33 @@ +{ + "environments": { + "default": { + "registry": "0x5f6f7e8cc7346a11ca2def8f827b7a0b612c56a1", + "appName": "actor.aragonpm.eth", + "network": "rpc" + }, + "rinkeby": { + "registry": "0x98Df287B6C145399Aaa709692c8D308357bC085D", + "appName": "actor.aragonpm.eth", + "network": "rinkeby" + }, + "staging": { + "registry": "0xfe03625ea880a8cba336f9b5ad6e15b0a3b5a939", + "appName": "actor.aragonpm.eth", + "network": "rinkeby" + }, + "mainnet": { + "registry": "0x314159265dd8dbb310642f98f50c066173c1259b", + "appName": "actor.aragonpm.eth", + "network": "mainnet" + }, + "rinkeby-old": { + "registry": "0xfbae32d1cde62858bc45f51efc8cc4fa1415447e", + "appName": "actor.aragonpm.eth", + "network": "rinkeby" + } + }, + "roles": [ + TODO + ], + "path": "contracts/Actor.sol" +} diff --git a/future-apps/actor/contracts/.npmignore b/future-apps/actor/contracts/.npmignore new file mode 100644 index 0000000000..ee4c926823 --- /dev/null +++ b/future-apps/actor/contracts/.npmignore @@ -0,0 +1 @@ +/test diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol new file mode 100644 index 0000000000..34310b64b7 --- /dev/null +++ b/future-apps/actor/contracts/Actor.sol @@ -0,0 +1,10 @@ +/* + * SPDX-License-Identitifer: GPL-3.0-or-later + */ + +pragma solidity 0.4.24; + +import "@aragon/apps-vault/contracts/Vault.sol"; + + +contract Actor is Vault {} diff --git a/future-apps/actor/contracts/test/TestImports.sol b/future-apps/actor/contracts/test/TestImports.sol new file mode 100644 index 0000000000..025289c578 --- /dev/null +++ b/future-apps/actor/contracts/test/TestImports.sol @@ -0,0 +1,28 @@ +pragma solidity 0.4.24; + +import "@aragon/os/contracts/acl/ACL.sol"; +import "@aragon/os/contracts/apps/AppProxyBase.sol"; +import "@aragon/os/contracts/factory/DAOFactory.sol"; +import "@aragon/os/contracts/kernel/Kernel.sol"; +import "@aragon/os/contracts/kernel/KernelProxy.sol"; + +import "@aragon/apps-shared-migrations/contracts/Migrations.sol"; + +// You might think this file is a bit odd, but let me explain. +// We only use some contracts in our tests, which means Truffle +// will not compile it for us, because it is from an external +// dependency. +// +// We are now left with three options: +// - Copy/paste these contracts +// - Run the tests with `truffle compile --all` on +// - Or trick Truffle by claiming we use it in a Solidity test +// +// You know which one I went for. + + +contract TestImports { + constructor() public { + // to avoid lint error + } +} diff --git a/future-apps/actor/contracts/test/mocks/DestinationMock.sol b/future-apps/actor/contracts/test/mocks/DestinationMock.sol new file mode 100644 index 0000000000..665fcbf3cf --- /dev/null +++ b/future-apps/actor/contracts/test/mocks/DestinationMock.sol @@ -0,0 +1,10 @@ +pragma solidity 0.4.24; + + +contract DestinationMock { + uint256 test; + + function () external payable { + test = test + 1; + } +} diff --git a/future-apps/actor/contracts/test/mocks/EtherTokenConstantMock.sol b/future-apps/actor/contracts/test/mocks/EtherTokenConstantMock.sol new file mode 100644 index 0000000000..048457da69 --- /dev/null +++ b/future-apps/actor/contracts/test/mocks/EtherTokenConstantMock.sol @@ -0,0 +1,8 @@ +pragma solidity 0.4.24; + +import "@aragon/os/contracts/common/EtherTokenConstant.sol"; + + +contract EtherTokenConstantMock is EtherTokenConstant { + function getETHConstant() external pure returns (address) { return ETH; } +} diff --git a/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol b/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol new file mode 100644 index 0000000000..3671f26dd3 --- /dev/null +++ b/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol @@ -0,0 +1,17 @@ +pragma solidity 0.4.24; + + +contract ExecutionTarget { + uint public counter; + + function execute() public { + counter += 1; + emit Executed(counter); + } + + function setCounter(uint x) public { + counter = x; + } + + event Executed(uint x); +} diff --git a/future-apps/actor/contracts/test/mocks/ForceSendETH.sol b/future-apps/actor/contracts/test/mocks/ForceSendETH.sol new file mode 100644 index 0000000000..33cdb5472d --- /dev/null +++ b/future-apps/actor/contracts/test/mocks/ForceSendETH.sol @@ -0,0 +1,11 @@ +pragma solidity 0.4.24; + + +contract ForceSendETH { + // Truffle doesn't support selfdestructing on constructor: + // Error: The contract code couldn't be stored, please check your gas amount. + + function sendByDying(address recipient) external payable { + selfdestruct(recipient); + } +} \ No newline at end of file diff --git a/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol b/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol new file mode 100644 index 0000000000..416e235bc3 --- /dev/null +++ b/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol @@ -0,0 +1,14 @@ +pragma solidity 0.4.24; + +import "@aragon/os/contracts/kernel/Kernel.sol"; +import "@aragon/os/contracts/common/DepositableStorage.sol"; + + +contract KernelDepositableMock is DepositableStorage, Kernel { + constructor(bool _shouldPetrify) Kernel(_shouldPetrify) public { + } + + function enableDepositable() public { + setDepositable(true); + } +} diff --git a/future-apps/actor/contracts/test/mocks/SimpleERC20.sol b/future-apps/actor/contracts/test/mocks/SimpleERC20.sol new file mode 100644 index 0000000000..29014b0c42 --- /dev/null +++ b/future-apps/actor/contracts/test/mocks/SimpleERC20.sol @@ -0,0 +1,81 @@ +pragma solidity 0.4.24; + +//import "./ERC20Interface.sol"; + + +contract SimpleERC20 { /*is ERC20Interface*/ + + uint256 public _totalSupply = 10**9 * 10**18; + // Balances for each account + mapping(address => uint256) private balances; + // Owner of account approves the transfer of an amount to another account + mapping(address => mapping (address => uint256)) private allowed; + + // Constructor + constructor() public { + balances[msg.sender] = _totalSupply; + } + + function totalSupply() public view returns (uint ts) { + ts = _totalSupply; + } + + // What is the balance of a particular account? + function balanceOf(address _owner) public view returns (uint256 balance) { + return balances[_owner]; + } + + // Transfer the balance from owner's account to another account + function transfer(address _to, uint256 _amount) public returns (bool success) { + /* solium-disable-next-line */ + if (balances[msg.sender] >= _amount + && _amount > 0 + && balances[_to] + _amount > balances[_to]) { + balances[msg.sender] -= _amount; + balances[_to] += _amount; + return true; + } else { + return false; + } + } + + // Send _value amount of tokens from address _from to address _to + // The transferFrom method is used for a withdraw workflow, allowing contracts to send + // tokens on your behalf, for example to "deposit" to a contract address and/or to charge + // fees in sub-currencies; the command should fail unless the _from account has + // deliberately authorized the sender of the message via some mechanism; we propose + // these standardized APIs for approval: + function transferFrom( + address _from, + address _to, + uint256 _amount + ) + public + returns (bool success) + { + /* solium-disable-next-line */ + if (balances[_from] >= _amount + && allowed[_from][msg.sender] >= _amount + && _amount > 0 + && balances[_to] + _amount > balances[_to]) { + balances[_from] -= _amount; + allowed[_from][msg.sender] -= _amount; + balances[_to] += _amount; + return true; + } else { + return false; + } + } + + // Allow _spender to withdraw from your account, multiple times, up to the _value amount. + // If this function is called again it overwrites the current allowance with _value. + function approve(address _spender, uint256 _amount) public returns (bool success) { + allowed[msg.sender][_spender] = _amount; + return true; + } + + // Returns the amount which _spender is still allowed to withdraw from _owner + function allowance(address _owner, address _spender) public view returns (uint remaining) { + remaining = allowed[_owner][_spender]; + } +} diff --git a/future-apps/actor/manifest.json b/future-apps/actor/manifest.json new file mode 100644 index 0000000000..b8f9d16aae --- /dev/null +++ b/future-apps/actor/manifest.json @@ -0,0 +1,10 @@ +{ + "name": "Actor", + "description": "Hold assets and perform actions from DAOs", + "icons": [{ + "src": "images/icon.svg", + "sizes": "192x192" + }], + "script": "/script.js", + "start_url": "/index.html" +} diff --git a/future-apps/actor/migrations/1_initial_migration.js b/future-apps/actor/migrations/1_initial_migration.js new file mode 100644 index 0000000000..2a7bb96eaa --- /dev/null +++ b/future-apps/actor/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +var Migrations = artifacts.require('Migrations.sol') + +module.exports = function(deployer) { + deployer.deploy(Migrations) +} diff --git a/future-apps/actor/package.json b/future-apps/actor/package.json new file mode 100644 index 0000000000..f01129e87d --- /dev/null +++ b/future-apps/actor/package.json @@ -0,0 +1,55 @@ +{ + "name": "@aragon/apps-actor", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "compile": "truffle compile", + "build": "cd app && npm run build", + "deploy:rpc": "truffle exec scripts/deploy.js --network rpc", + "deploy:rinkeby": "truffle exec scripts/deploy.js --network rinkeby", + "deploy:devnet": "truffle exec scripts/deploy.js --network devnet", + "publish:devnet": "npm run compile && aragon publish --apm.ipfs.rpc.protocol http --apm.ipfs.rpc.host ipfs.aragon.network --no-confirm=true --keyfile ../../.localkey.json \"$(npm run deploy:devnet | tail -n 1)\"", + "publish:rpc": "npm run compile && aragon publish --no-confirm=true \"$(npm run deploy:rpc | tail -n 1)\"", + "publish:rpc:content": "aragon publish --no-confirm", + "publish:rinkeby": "npm run compile && aragon publish --no-confirm=true --keyfile ~/.rinkebykey.json \"$(npm run deploy:rinkeby | tail -n 1)\"", + "publish:rinkeby:content": "aragon publish --no-confirm=true --keyfile ~/.rinkebykey.json", + "lint": "solium --dir ./contracts", + "test": "TRUFFLE_TEST=true npm run ganache-cli:test", + "test:gas": "GAS_REPORTER=true npm test", + "coverage": "SOLIDITY_COVERAGE=true npm run ganache-cli:test", + "truffle:dev": "node_modules/.bin/truffle dev", + "ganache-cli:test": "./node_modules/@aragon/test-helpers/ganache-cli.sh", + "prepublishOnly": "truffle compile --all" + }, + "files": [ + "/arapp.json", + "/build", + "/contracts", + "/scripts", + "/test" + ], + "keywords": [], + "author": "Aragon One AG ", + "contributors": [ + "Jorge Izquierdo " + ], + "license": "(GPL-3.0-or-later OR AGPL-3.0-or-later)", + "description": "", + "devDependencies": { + "@aragon/apps-shared-migrations": "1.0.0", + "@aragon/apps-shared-minime": "1.0.0", + "@aragon/cli": "^5.2.0-beta.1", + "@aragon/test-helpers": "^1.0.1", + "eth-gas-reporter": "^0.1.1", + "ganache-cli": "^6.0.3", + "solidity-coverage": "0.5.11", + "solium": "^1.0.4", + "truffle": "4.1.14", + "truffle-hdwallet-provider": "0.0.3", + "webpack": "3.10.0" + }, + "dependencies": { + "@aragon/apps-vault": "^4.0.0", + "@aragon/os": "^4.0.0" + } +} diff --git a/future-apps/actor/scripts/deploy.js b/future-apps/actor/scripts/deploy.js new file mode 100644 index 0000000000..5a45b35e58 --- /dev/null +++ b/future-apps/actor/scripts/deploy.js @@ -0,0 +1,5 @@ +module.exports = async callback => { + const c = await artifacts.require(require('../arapp').path).new() + console.log(c.address) + callback() +} diff --git a/future-apps/actor/test/vault.js b/future-apps/actor/test/vault.js new file mode 100644 index 0000000000..3644b05e28 --- /dev/null +++ b/future-apps/actor/test/vault.js @@ -0,0 +1,238 @@ +// Test that Actor is a fully functioning Vault by running the same tests against the Actor app +const Vault = artifacts.require('Actor') + +const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') +const { hash } = require('eth-ens-namehash') +const getBalance = require('@aragon/test-helpers/balance')(web3) +const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } + +const ACL = artifacts.require('ACL') +const AppProxyUpgradeable = artifacts.require('AppProxyUpgradeable') +const EVMScriptRegistryFactory = artifacts.require('EVMScriptRegistryFactory') +const DAOFactory = artifacts.require('DAOFactory') +const Kernel = artifacts.require('Kernel') +const KernelProxy = artifacts.require('KernelProxy') + +const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') +const KernelDepositableMock = artifacts.require('KernelDepositableMock') + +const SimpleERC20 = artifacts.require('tokens/SimpleERC20') + +const DestinationMock = artifacts.require('DestinationMock') + +const NULL_ADDRESS = '0x00' + +contract('Actor app (Vault compatibility)', (accounts) => { + let daoFact, vaultBase, vault, vaultId + + let ETH, ANY_ENTITY, APP_MANAGER_ROLE, TRANSFER_ROLE + + const root = accounts[0] + + before(async () => { + const kernelBase = await Kernel.new(true) // petrify immediately + const aclBase = await ACL.new() + const regFact = await EVMScriptRegistryFactory.new() + daoFact = await DAOFactory.new(kernelBase.address, aclBase.address, regFact.address) + vaultBase = await Vault.new() + + // Setup constants + ANY_ENTITY = await aclBase.ANY_ENTITY() + APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() + TRANSFER_ROLE = await vaultBase.TRANSFER_ROLE() + + const ethConstant = await EtherTokenConstantMock.new() + ETH = await ethConstant.getETHConstant() + }) + + beforeEach(async () => { + const r = await daoFact.newDAO(root) + const dao = Kernel.at(getEvent(r, 'DeployDAO', 'dao')) + const acl = ACL.at(await dao.acl()) + + await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) + + // vault + vaultId = hash('actor.aragonpm.test') + + const vaultReceipt = await dao.newAppInstance(vaultId, vaultBase.address, '0x', false) + const vaultProxyAddress = getEvent(vaultReceipt, 'NewAppProxy', 'proxy') + vault = Vault.at(vaultProxyAddress) + + await acl.createPermission(ANY_ENTITY, vault.address, TRANSFER_ROLE, root, { from: root }) + + await vault.initialize() + }) + + context('ETH:', async () => { + it('cannot initialize base app', async () => { + const newVault = await Vault.new() + assert.isTrue(await newVault.isPetrified()) + return assertRevert(async () => { + await newVault.initialize() + }) + }) + + it('deposits ETH', async () => { + const value = 1 + + // Deposit without data param + await vault.deposit(ETH, value, { value: value, from: accounts[0] }) + assert.equal((await getBalance(vault.address)).toString(), value, `should hold ${value} wei`) + assert.equal((await vault.balance(ETH)).toString(), value, `should return ${value} wei balance`) + + // Deposit with data param + /* Waiting for truffle to get overloading... + await vault.deposit(ETH, accounts[0], value, [0], { value }) + assert.equal((await getBalance(vault.address)).toString(), value * 2, `should hold ${value * 2} wei`) + assert.equal((await vault.balance(ETH)).toString(), value * 2, `should return ${value * 2} wei balance`) + */ + }) + + it('deposits ETH through callback', async () => { + await vault.sendTransaction( { value: 1 }) + assert.equal((await getBalance(vault.address)).toString(), 1, "should hold 1 wei") + }) + + it('transfers ETH', async () => { + const depositValue = 100 + const transferValue = 10 + + await vault.sendTransaction( { value: depositValue }) + const testAccount = '0xbeef000000000000000000000000000000000000' + const initialBalance = await getBalance(testAccount) + + // Transfer + await vault.transfer(ETH, testAccount, transferValue) + + assert.equal((await getBalance(testAccount)).toString(), initialBalance.add(transferValue).toString(), "should have sent eth") + assert.equal((await getBalance(vault.address)).toString(), depositValue - transferValue, "should have remaining balance") + }) + + it('fails transfering ETH if uses more than 2.3k gas', async () => { + const transferValue = 10 + + const destination = await DestinationMock.new() + await vault.sendTransaction( { value: transferValue }) + + // Transfer + return assertRevert(async () => { + await vault.transfer(ETH, destination.address, transferValue) + }) + }) + + it('fails if depositing a different amount of ETH than sent', async () => { + const value = 1 + + return assertRevert(async () => { + await vault.deposit(ETH, value, { value: value * 2, from: accounts[0] }) + }) + }) + }) + + context('ERC20:', async () => { + let token + + beforeEach(async () => { + token = await SimpleERC20.new() + }) + + it('deposits ERC20s', async () => { + await token.approve(vault.address, 10) + + // Deposit half without data param + await vault.deposit(token.address, 5, { from: accounts[0] }) + + assert.equal(await token.balanceOf(vault.address), 5, "token accounting should be correct") + assert.equal(await vault.balance(token.address), 5, "vault should know its balance") + + // Deposit half with data param + /* Waiting for truffle to get overloading... + await vault.deposit(token.address, accounts[0], 5, '') + + assert.equal(await token.balanceOf(vault.address), 10, "token accounting should be correct") + assert.equal(await vault.balance(token.address), 10, "vault should know its balance") + */ + }) + + it('transfers tokens', async () => { + const tokenReceiver = accounts[2] + await token.transfer(vault.address, 10) + + // Transfer half + await vault.transfer(token.address, tokenReceiver, 5) + + assert.equal(await token.balanceOf(tokenReceiver), 5, "receiver should have correct token balance") + }) + + it('fails if not sufficient token balance available', async () => { + const approvedAmount = 10 + await token.approve(vault.address, approvedAmount) + + return assertRevert(async () => { + await vault.deposit(token.address, approvedAmount * 2, { from: accounts[0] }) + }) + }) + }) + + context('using Vault behind proxy', async () => { + let token + + beforeEach(async () => { + token = await SimpleERC20.new() + }) + + context('disallows recovering assets', async () => { + let kernel, defaultVault + + beforeEach(async () => { + const kernelBase = await KernelDepositableMock.new(true) // petrify immediately + const kernelProxy = await KernelProxy.new(kernelBase.address) + const aclBase = await ACL.new() + kernel = KernelDepositableMock.at(kernelProxy.address) + await kernel.initialize(aclBase.address, root) + await kernel.enableDepositable() + const acl = ACL.at(await kernel.acl()) + await acl.createPermission(root, kernel.address, APP_MANAGER_ROLE, root, { from: root }) + + // Create a new vault and set that vault as the default vault in the kernel + const defaultVaultReceipt = await kernel.newAppInstance(vaultId, vaultBase.address, '0x', true) + const defaultVaultAddress = getEvent(defaultVaultReceipt, 'NewAppProxy', 'proxy') + defaultVault = Vault.at(defaultVaultAddress) + await defaultVault.initialize() + + await kernel.setRecoveryVaultAppId(vaultId) + }) + + it('set up the default vault correctly to recover ETH from the kernel', async () => { + await kernel.sendTransaction({ value: 1, gas: 31000 }) + assert.equal((await getBalance(kernel.address)).valueOf(), 1, 'kernel should have 1 balance') + + await kernel.transferToVault(ETH) + assert.equal((await getBalance(kernel.address)).valueOf(), 0, 'kernel should have 0 balance') + assert.equal((await getBalance(defaultVault.address)).valueOf(), 1, 'default value should have 1 balance') + }) + + it('set up the default vault correctly to recover tokens from the kernel', async () => { + await token.transfer(kernel.address, 10) + assert.equal((await token.balanceOf(kernel.address)), 10, 'kernel should have 10 balance') + + await kernel.transferToVault(token.address) + assert.equal((await token.balanceOf(kernel.address)), 0, 'kernel should have 0 balance') + assert.equal((await token.balanceOf(defaultVault.address)), 10, 'default value should have 10 balance') + }) + + it('fails when attempting to recover ETH out of the vault', async () => { + await vault.sendTransaction({ value: 1, gas: 31000 }) + assert.equal((await getBalance(vault.address)).valueOf(), 1, 'vault should have 1 balance') + await assertRevert(() => vault.transferToVault(ETH)) + }) + + it('fails when attempting to recover tokens out of the vault', async () => { + await token.transfer(vault.address, 10) + assert.equal((await token.balanceOf(vault.address)), 10, 'vault should have 10 balance') + await assertRevert(() => vault.transferToVault(token.address)) + }) + }) + }) +}) diff --git a/future-apps/actor/truffle.js b/future-apps/actor/truffle.js new file mode 100644 index 0000000000..466a16a350 --- /dev/null +++ b/future-apps/actor/truffle.js @@ -0,0 +1 @@ +module.exports = require("@aragon/os/truffle-config") From 1fa63861eb0cb64cfb70e613228a8cf7458c2772 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 16 Nov 2018 16:53:08 +0100 Subject: [PATCH 02/44] Actor app: implement execute action --- future-apps/actor/contracts/Actor.sol | 46 ++++- .../contracts/test/mocks/ExecutionTarget.sol | 12 +- future-apps/actor/test/actor.js | 175 ++++++++++++++++++ shared/test-helpers/call.js | 8 + 4 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 future-apps/actor/test/actor.js create mode 100644 shared/test-helpers/call.js diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 34310b64b7..426a5eec96 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -7,4 +7,48 @@ pragma solidity 0.4.24; import "@aragon/apps-vault/contracts/Vault.sol"; -contract Actor is Vault {} +contract Actor is Vault { + bytes32 public constant EXECUTE_ROLE = keccak256("EXECUTE_ROLE"); + + string private constant ERROR_EXECUTE_ETH_NO_DATA = "VAULT_EXECUTE_ETH_NO_DATA"; + string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "VAULT_EXECUTE_TARGET_NOT_CONTRACT"; + + event Execute(address indexed sender, address indexed target, uint256 ethValue, bytes data); + + // TODO: requires the @decodeData helper to be implemented in radspec + /** + * @notice Execute `@decodeData(target, data)` on `target` `ethValue == 0 ? '' : '(Sending' + @formatToken(ethValue, ETH) + ')'`. + * @param _target Address where the action is being executed + * @param _ethValue Amount of ETH from the contract that is sent with the action + * @param _data Calldata for the action + * @return Exits call frame forwarding the return data of the executed call (either error or success data) + */ + function execute(address _target, uint256 _ethValue, bytes _data) + authP(EXECUTE_ROLE, arr(_target, _ethValue, uint256(getSig(_data)))) // TODO: Test that sig bytes are the least significant bytes + external // This function MUST always be external as the function performs a low level return, exiting the Actor app execution context + { + require(_ethValue == 0 || _data.length > 0, ERROR_EXECUTE_ETH_NO_DATA); // if ETH value is sent, there must be data + require(isContract(_target), ERROR_EXECUTE_TARGET_NOT_CONTRACT); + + bool result = _target.call.value(_ethValue)(_data); + + if (result) { + emit Execute(msg.sender, _target, _ethValue, _data); + } + + assembly { + let size := returndatasize + let ptr := mload(0x40) + returndatacopy(ptr, 0, size) + + // revert instead of invalid() bc if the underlying call failed with invalid() it already wasted gas. + // if the call returned error data, forward it + switch result case 0 { revert(ptr, size) } + default { return(ptr, size) } + } + } + + function getSig(bytes data) internal pure returns (bytes4 sig) { + assembly { sig := add(data, 0x20) } + } +} diff --git a/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol b/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol index 3671f26dd3..5937f108cc 100644 --- a/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol +++ b/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol @@ -3,15 +3,23 @@ pragma solidity 0.4.24; contract ExecutionTarget { uint public counter; + string constant public REASON = "FUNDS_ARE_NOT_SAFU"; - function execute() public { + function execute() payable public returns (uint256) { counter += 1; emit Executed(counter); + return counter; } - function setCounter(uint x) public { + function setCounter(uint x) payable public { counter = x; } + function fail() public { + revert(REASON); + } + + function () payable {} + event Executed(uint x); } diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js new file mode 100644 index 0000000000..8e53843cd0 --- /dev/null +++ b/future-apps/actor/test/actor.js @@ -0,0 +1,175 @@ +// Test that Actor is a fully functioning Actor by running the same tests against the Actor app +const Actor = artifacts.require('Actor') + +const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') +const { hash } = require('eth-ens-namehash') +const getBalance = require('@aragon/test-helpers/balance')(web3) +const web3Call = require('@aragon/test-helpers/call')(web3) +const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } + +const ACL = artifacts.require('ACL') +const AppProxyUpgradeable = artifacts.require('AppProxyUpgradeable') +const EVMScriptRegistryFactory = artifacts.require('EVMScriptRegistryFactory') +const DAOFactory = artifacts.require('DAOFactory') +const Kernel = artifacts.require('Kernel') +const KernelProxy = artifacts.require('KernelProxy') + +const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') +const KernelDepositableMock = artifacts.require('KernelDepositableMock') + +const SimpleERC20 = artifacts.require('tokens/SimpleERC20') + +const ExecutionTarget = artifacts.require('ExecutionTarget') + +const NULL_ADDRESS = '0x00' + +contract('Actor app', (accounts) => { + let daoFact, actorBase, acl, actor, actorId + + let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE + + const root = accounts[0] + + const encodeFunctionCall = (contract, functionName, ...params) => + contract[functionName].request(...params).params[0] + + before(async () => { + const kernelBase = await Kernel.new(true) // petrify immediately + const aclBase = await ACL.new() + const regFact = await EVMScriptRegistryFactory.new() + daoFact = await DAOFactory.new(kernelBase.address, aclBase.address, regFact.address) + actorBase = await Actor.new() + + // Setup constants + ANY_ENTITY = await aclBase.ANY_ENTITY() + APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() + EXECUTE_ROLE = await actorBase.EXECUTE_ROLE() + + const ethConstant = await EtherTokenConstantMock.new() + ETH = await ethConstant.getETHConstant() + }) + + beforeEach(async () => { + const r = await daoFact.newDAO(root) + const dao = Kernel.at(getEvent(r, 'DeployDAO', 'dao')) + acl = ACL.at(await dao.acl()) + + await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) + + // actor + actorAppId = hash('actor.aragonpm.test') + + const actorReceipt = await dao.newAppInstance(actorAppId, actorBase.address, '0x', false) + const actorProxyAddress = getEvent(actorReceipt, 'NewAppProxy', 'proxy') + actor = Actor.at(actorProxyAddress) + + await actor.initialize() + }) + + context('executing actions', () => { + const [nonExecutor, executor] = accounts + let executionTarget + + beforeEach(async () => { + await acl.createPermission(executor, actor.address, EXECUTE_ROLE, root, { from: root }) + + executionTarget = await ExecutionTarget.new() + }) + + it('can execute actions', async () => { + const N = 1102 + + assert.equal(await executionTarget.counter(), 0) + + const { to, data } = encodeFunctionCall(executionTarget, 'setCounter', N) + await actor.execute(to, 0, data, { from: executor }) + + assert.equal(await executionTarget.counter(), N) + }) + + it('fails to execute without permissions', async () => { + const { to, data } = encodeFunctionCall(executionTarget, 'execute') + + await assertRevert(() => + actor.execute(to, 0, data, { from: nonExecutor }) + ) + }) + + it('fails to execute when target is not a contract', async () => { + const nonContract = accounts[8] // random account + const randomData = '0x12345678' + const noData = '0x' + + await assertRevert(() => + actor.execute(nonContract, 0, randomData, { from: executor }) + ) + + await assertRevert(() => + actor.execute(nonContract, 0, noData, { from: executor }) + ) + }) + + it('execution forwards success return data', async () => { + const { to, data } = encodeFunctionCall(executionTarget, 'execute') + + // We make a call to easily get what data could be gotten inside the EVM + // Contract -> Actor.execute -> Target.func (would allow Contract to have access to this data) + assert.equal(await executionTarget.counter(), 0) + const call = encodeFunctionCall(actor, 'execute', to, 0, data, { from: executor }) + const returnData = await web3Call(call) + + const N = 1 + + // TODO: Add decoding for the return data + assert.equal(returnData, `0x000000000000000000000000000000000000000000000000000000000000000${N}`) + }) + + it('it reverts if executed action reverts', async () => { + // TODO: Check revert data was correctly forwarded + // ganache currently doesn't support fetching this data + + const { to, data } = encodeFunctionCall(executionTarget, 'fail') + + await assertRevert(() => + actor.execute(to, 0, data, { from: executor }) + ) + }) + + context('with ETH:', () => { + const depositValue = 3 + let to, data + + beforeEach(async () => { + await actor.deposit(ETH, depositValue, { value: depositValue }) + + const call = encodeFunctionCall(executionTarget, 'execute') + to = call.to + data = call.data + + assert.equal(await executionTarget.counter(), 0) + assert.equal(await getBalance(executionTarget.address), 0) + assert.equal(await getBalance(actor.address), depositValue) + }) + + it('can execute actions with ETH', async () => { + await actor.execute(to, depositValue, data, { from: executor }) + + assert.equal(await executionTarget.counter(), 1) + assert.equal(await getBalance(executionTarget.address), depositValue) + assert.equal(await getBalance(actor.address), 0) + }) + + it('fails to execute actions with more ETH than the actor owns', async () => { + await assertRevert(() => + actor.execute(to, depositValue + 1, data, { from: executor }) + ) + }) + + it('fails to execute when sending ETH and no data', async () => { + await assertRevert(() => + actor.execute(to, depositValue, '0x', { from: executor }) + ) + }) + }) + }) +}) diff --git a/shared/test-helpers/call.js b/shared/test-helpers/call.js new file mode 100644 index 0000000000..27601929f8 --- /dev/null +++ b/shared/test-helpers/call.js @@ -0,0 +1,8 @@ +module.exports = web3 => tx => { + return new Promise((resolve, reject) => { + web3.eth.call(tx, async (err, res) => { + if (err || !res) return reject(err) + resolve(res) + }) + }) +} From 7a4dd5b1afad2413d8bf62a2b0657291b620c2f4 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 16 Nov 2018 18:07:54 +0100 Subject: [PATCH 03/44] Actor app: implement permissioned forwarding --- future-apps/actor/contracts/Actor.sol | 28 ++++++++++++++++++++- future-apps/actor/test/actor.js | 36 ++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 426a5eec96..a7a93771dc 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -6,9 +6,12 @@ pragma solidity 0.4.24; import "@aragon/apps-vault/contracts/Vault.sol"; +import "@aragon/os/contracts/common/IForwarder.sol"; -contract Actor is Vault { + +contract Actor is Vault, IForwarder { bytes32 public constant EXECUTE_ROLE = keccak256("EXECUTE_ROLE"); + bytes32 public constant RUN_SCRIPT_ROLE = keccak256("RUN_SCRIPT_ROLE"); string private constant ERROR_EXECUTE_ETH_NO_DATA = "VAULT_EXECUTE_ETH_NO_DATA"; string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "VAULT_EXECUTE_TARGET_NOT_CONTRACT"; @@ -48,6 +51,29 @@ contract Actor is Vault { } } + function isForwarder() external pure returns (bool) { + return true; + } + + function forward(bytes _evmScript) + authP(RUN_SCRIPT_ROLE, arr(getScriptACLParam(_evmScript))) + public + { + bytes memory input = ""; // no input + address[] memory blacklist = new address[](0); // no addr blacklist, can interact with anything + runScript(_evmScript, input, blacklist); + } + + function canForward(address sender, bytes evmScript) public view returns (bool) { + uint256[] memory params = new uint256[](1); + params[0] = getScriptACLParam(evmScript); + return canPerform(sender, RUN_SCRIPT_ROLE, params); + } + + function getScriptACLParam(bytes evmScript) internal pure returns (uint256) { + return uint256(keccak256(abi.encodePacked(evmScript))); + } + function getSig(bytes data) internal pure returns (bytes4 sig) { assembly { sig := add(data, 0x20) } } diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index 8e53843cd0..b4361aaf0c 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -5,6 +5,7 @@ const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/asse const { hash } = require('eth-ens-namehash') const getBalance = require('@aragon/test-helpers/balance')(web3) const web3Call = require('@aragon/test-helpers/call')(web3) +const { encodeCallScript, EMPTY_SCRIPT } = require('@aragon/test-helpers/evmScript') const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } const ACL = artifacts.require('ACL') @@ -26,7 +27,7 @@ const NULL_ADDRESS = '0x00' contract('Actor app', (accounts) => { let daoFact, actorBase, acl, actor, actorId - let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE + let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE const root = accounts[0] @@ -44,6 +45,7 @@ contract('Actor app', (accounts) => { ANY_ENTITY = await aclBase.ANY_ENTITY() APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() EXECUTE_ROLE = await actorBase.EXECUTE_ROLE() + RUN_SCRIPT_ROLE = await actorBase.RUN_SCRIPT_ROLE() const ethConstant = await EtherTokenConstantMock.new() ETH = await ethConstant.getETHConstant() @@ -84,6 +86,7 @@ contract('Actor app', (accounts) => { const { to, data } = encodeFunctionCall(executionTarget, 'setCounter', N) await actor.execute(to, 0, data, { from: executor }) + // TODO: assert Execute event assert.equal(await executionTarget.counter(), N) }) @@ -172,4 +175,35 @@ contract('Actor app', (accounts) => { }) }) }) + + context('running scripts', () => { + let executionTarget, script + const [nonScriptRunner, scriptRunner] = accounts + + beforeEach(async () => { + executionTarget = await ExecutionTarget.new() + // prepare script + const action = { to: executionTarget.address, calldata: executionTarget.contract.execute.getData() } + script = encodeCallScript([action, action]) // perform action twice + + await acl.createPermission(scriptRunner, actor.address, RUN_SCRIPT_ROLE, root, { from: root }) + }) + + it('runs script', async () => { + assert.isTrue(await actor.canForward(scriptRunner, script)) + assert.equal(await executionTarget.counter(), 0) + + await actor.forward(script, { from: scriptRunner }) + + assert.equal(await executionTarget.counter(), 2) + }) + + it('fails to run script without permissions', async () => { + assert.isFalse(await actor.canForward(nonScriptRunner, script)) + + await assertRevert(() => + actor.forward(script, { from: nonScriptRunner }) + ) + }) + }) }) From 98309813214fcb58c60b8afb3da1c0fa7f4f3cfd Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 16 Nov 2018 19:52:59 +0100 Subject: [PATCH 04/44] Actor app: improve tests --- future-apps/actor/contracts/Actor.sol | 1 + future-apps/actor/package.json | 1 + future-apps/actor/test/actor.js | 17 +++++++---------- shared/test-helpers/assertEvent.js | 5 +++++ 4 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 shared/test-helpers/assertEvent.js diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index a7a93771dc..83dd45dfb6 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -62,6 +62,7 @@ contract Actor is Vault, IForwarder { bytes memory input = ""; // no input address[] memory blacklist = new address[](0); // no addr blacklist, can interact with anything runScript(_evmScript, input, blacklist); + // We don't need to emit an event here as EVMScriptRunner will emit ScriptResult if successful } function canForward(address sender, bytes evmScript) public view returns (bool) { diff --git a/future-apps/actor/package.json b/future-apps/actor/package.json index f01129e87d..4dbfccc73f 100644 --- a/future-apps/actor/package.json +++ b/future-apps/actor/package.json @@ -46,6 +46,7 @@ "solium": "^1.0.4", "truffle": "4.1.14", "truffle-hdwallet-provider": "0.0.3", + "web3-eth-abi": "^1.0.0-beta.36", "webpack": "3.10.0" }, "dependencies": { diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index b4361aaf0c..0f4b146072 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -1,4 +1,3 @@ -// Test that Actor is a fully functioning Actor by running the same tests against the Actor app const Actor = artifacts.require('Actor') const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') @@ -6,6 +5,8 @@ const { hash } = require('eth-ens-namehash') const getBalance = require('@aragon/test-helpers/balance')(web3) const web3Call = require('@aragon/test-helpers/call')(web3) const { encodeCallScript, EMPTY_SCRIPT } = require('@aragon/test-helpers/evmScript') +const assertEvent = require('@aragon/test-helpers/assertEvent') +const ethABI = require('web3-eth-abi') const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } const ACL = artifacts.require('ACL') @@ -18,8 +19,6 @@ const KernelProxy = artifacts.require('KernelProxy') const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') const KernelDepositableMock = artifacts.require('KernelDepositableMock') -const SimpleERC20 = artifacts.require('tokens/SimpleERC20') - const ExecutionTarget = artifacts.require('ExecutionTarget') const NULL_ADDRESS = '0x00' @@ -84,10 +83,10 @@ contract('Actor app', (accounts) => { assert.equal(await executionTarget.counter(), 0) const { to, data } = encodeFunctionCall(executionTarget, 'setCounter', N) - await actor.execute(to, 0, data, { from: executor }) + const receipt = await actor.execute(to, 0, data, { from: executor }) - // TODO: assert Execute event assert.equal(await executionTarget.counter(), N) + assertEvent(receipt, 'Execute') }) it('fails to execute without permissions', async () => { @@ -121,10 +120,7 @@ contract('Actor app', (accounts) => { const call = encodeFunctionCall(actor, 'execute', to, 0, data, { from: executor }) const returnData = await web3Call(call) - const N = 1 - - // TODO: Add decoding for the return data - assert.equal(returnData, `0x000000000000000000000000000000000000000000000000000000000000000${N}`) + assert.equal(ethABI.decodeParameter('uint256', returnData), 1) }) it('it reverts if executed action reverts', async () => { @@ -193,9 +189,10 @@ contract('Actor app', (accounts) => { assert.isTrue(await actor.canForward(scriptRunner, script)) assert.equal(await executionTarget.counter(), 0) - await actor.forward(script, { from: scriptRunner }) + const receipt = await actor.forward(script, { from: scriptRunner }) assert.equal(await executionTarget.counter(), 2) + assertEvent(receipt, 'ScriptResult') }) it('fails to run script without permissions', async () => { diff --git a/shared/test-helpers/assertEvent.js b/shared/test-helpers/assertEvent.js new file mode 100644 index 0000000000..471c1bf195 --- /dev/null +++ b/shared/test-helpers/assertEvent.js @@ -0,0 +1,5 @@ +module.exports = (receipt, eventName, instances = 1) => { + const events = receipt.logs.filter(x => x.event == eventName) + assert.equal(events.length, instances, `'${eventName}' event should have been fired ${instances} times`) + return events +} From 7457eb36c2408c3eb12350725197e7c89d3f8f4b Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 19 Nov 2018 12:20:32 +0100 Subject: [PATCH 05/44] Actor app: signatures --- future-apps/actor/contracts/Actor.sol | 100 +++++++++++++- .../actor/contracts/SignatureValidator.sol | 42 ++++++ .../actor/contracts/standards/IERC1271.sol | 7 + .../actor/contracts/standards/IERC165.sol | 6 + .../contracts/test/mocks/DesignatedSigner.sol | 33 +++++ future-apps/actor/test/actor.js | 129 +++++++++++++++++- package.json | 1 + shared/test-helpers/sign.js | 8 ++ 8 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 future-apps/actor/contracts/SignatureValidator.sol create mode 100644 future-apps/actor/contracts/standards/IERC1271.sol create mode 100644 future-apps/actor/contracts/standards/IERC165.sol create mode 100644 future-apps/actor/contracts/test/mocks/DesignatedSigner.sol create mode 100644 shared/test-helpers/sign.js diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 83dd45dfb6..09ce4b83ba 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -4,19 +4,32 @@ pragma solidity 0.4.24; +import "./SignatureValidator.sol"; +import "./standards/IERC165.sol"; +import "./standards/IERC1271.sol"; + import "@aragon/apps-vault/contracts/Vault.sol"; import "@aragon/os/contracts/common/IForwarder.sol"; -contract Actor is Vault, IForwarder { +contract Actor is Vault, IERC165, IERC1271, IForwarder { bytes32 public constant EXECUTE_ROLE = keccak256("EXECUTE_ROLE"); bytes32 public constant RUN_SCRIPT_ROLE = keccak256("RUN_SCRIPT_ROLE"); + bytes32 public constant PRESIGN_HASH_ROLE = keccak256("PRESIGN_HASH_ROLE"); + bytes32 public constant DESIGNATE_SIGNER_ROLE = keccak256("DESIGNATE_SIGNER_ROLE"); + + bytes4 public constant ISVALIDSIG_INTERFACE_ID = 0xabababab; // TODO: Add actual interfaceId string private constant ERROR_EXECUTE_ETH_NO_DATA = "VAULT_EXECUTE_ETH_NO_DATA"; string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "VAULT_EXECUTE_TARGET_NOT_CONTRACT"; + mapping (bytes32 => bool) public isPresigned; + address public designatedSigner; + event Execute(address indexed sender, address indexed target, uint256 ethValue, bytes data); + event PresignHash(address indexed sender, bytes32 indexed hash); + event SetDesignatedSigner(address indexed sender, address indexed oldSigner, address indexed newSigner); // TODO: requires the @decodeData helper to be implemented in radspec /** @@ -51,10 +64,33 @@ contract Actor is Vault, IForwarder { } } + function setDesignatedSigner(address _designatedSigner) + authP(DESIGNATE_SIGNER_ROLE, arr(_designatedSigner)) + external + { + address oldDesignatedSigner = designatedSigner; + designatedSigner = _designatedSigner; + + emit SetDesignatedSigner(msg.sender, oldDesignatedSigner, _designatedSigner); + } + + function presignHash(bytes32 _hash) + authP(PRESIGN_HASH_ROLE, arr(_hash)) + external + { + isPresigned[_hash] = true; + + emit PresignHash(msg.sender, _hash); + } + function isForwarder() external pure returns (bool) { return true; } + function supportsInterface(bytes4 interfaceId) external pure returns (bool) { + return interfaceId == ISVALIDSIG_INTERFACE_ID; + } + function forward(bytes _evmScript) authP(RUN_SCRIPT_ROLE, arr(getScriptACLParam(_evmScript))) public @@ -65,12 +101,74 @@ contract Actor is Vault, IForwarder { // We don't need to emit an event here as EVMScriptRunner will emit ScriptResult if successful } + function isValidSignature(bytes data, bytes signature) public view returns (bool) { + return isValidSignature(keccak256(data), signature); + } + + function isValidSignature(bytes32 hash, bytes signature) public view returns (bool) { + // Short-circuit in case the hash was presigned. Optimization as performing calls + // and ecrecover is more expensive than an SLOAD. + if (isPresigned[hash]) { + return true; + } + + // Checks if designatedSigner is a contract, and if it supports the isValidSignature interface + if (safeSupportsInterface(IERC165(designatedSigner), ISVALIDSIG_INTERFACE_ID)) { + // designatedSigner.isValidSignature(hash, signature) as a staticall + IERC1271 signerContract = IERC1271(designatedSigner); + bytes memory calldata = abi.encodeWithSelector(signerContract.isValidSignature.selector, hash, signature); + return safeBoolStaticCall(signerContract, calldata); + } + + // `safeSupportsInterface` returns false if designatedSigner is a contract but it + // doesn't support the interface. Here we check the validity of the ECDSA sig + // which will always fail if designatedSigner is not an EOA + + return SignatureValidator.isValidSignature(hash, designatedSigner, signature); + } + function canForward(address sender, bytes evmScript) public view returns (bool) { uint256[] memory params = new uint256[](1); params[0] = getScriptACLParam(evmScript); return canPerform(sender, RUN_SCRIPT_ROLE, params); } + function safeSupportsInterface(IERC165 target, bytes4 interfaceId) internal view returns (bool) { + if (!isContract(target)) { + return false; + } + + bytes memory calldata = abi.encodeWithSelector(target.supportsInterface.selector, interfaceId); + return safeBoolStaticCall(target, calldata); + } + + function safeBoolStaticCall(address target, bytes calldata) internal view returns (bool) { + bool ok; + assembly { + ok := staticcall(gas, target, add(calldata, 0x20), mload(calldata), 0, 0) + } + + if (!ok) { + return false; + } + + uint256 size; + assembly { size := returndatasize } + if (size != 32) { + return false; + } + + bool result; + assembly { + let ptr := mload(0x40) // get next free memory ptr + returndatacopy(ptr, 0, size) // copy return from above `staticcall` + result := mload(ptr) // read data at ptr and set it to result + mstore(ptr, 0) // set pointer memory to 0 so it still is the next free ptr + } + + return result; + } + function getScriptACLParam(bytes evmScript) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(evmScript))); } diff --git a/future-apps/actor/contracts/SignatureValidator.sol b/future-apps/actor/contracts/SignatureValidator.sol new file mode 100644 index 0000000000..f33b9c5ee1 --- /dev/null +++ b/future-apps/actor/contracts/SignatureValidator.sol @@ -0,0 +1,42 @@ +pragma solidity ^0.4.18; + +// From github.com/DexyProject/protocol + +// This should probably be moved into aOS: https://github.com/aragon/aragonOS/pull/442 +library SignatureValidator { + // Maybe use 0x's IDs + enum SignatureMode { + EIP712, + GETH, + TREZOR + } + + /// @dev Validates that a hash was signed by a specified signer. + /// @param hash Hash which was signed. + /// @param signer Address of the signer. + /// @param signature ECDSA signature along with the mode (0 = EIP712, 1 = Geth, 2 = Trezor) {mode}{v}{r}{s}. + /// @return Returns whether signature is from a specified user. + function isValidSignature(bytes32 hash, address signer, bytes signature) internal pure returns (bool) { + if (signature.length != 66) { + return false; + } + + SignatureMode mode = SignatureMode(uint8(signature[0])); + + uint8 v = uint8(signature[1]); + bytes32 r; + bytes32 s; + assembly { + r := mload(add(signature, 34)) + s := mload(add(signature, 66)) + } + + if (mode == SignatureMode.GETH) { + hash = keccak256("\x19Ethereum Signed Message:\n32", hash); + } else if (mode == SignatureMode.TREZOR) { + hash = keccak256("\x19Ethereum Signed Message:\n\x20", hash); + } + + return ecrecover(hash, v, r, s) == signer; + } +} diff --git a/future-apps/actor/contracts/standards/IERC1271.sol b/future-apps/actor/contracts/standards/IERC1271.sol new file mode 100644 index 0000000000..0a0a410068 --- /dev/null +++ b/future-apps/actor/contracts/standards/IERC1271.sol @@ -0,0 +1,7 @@ +pragma solidity 0.4.24; + + +interface IERC1271 { + // TODO: Standard is not finalized, discussion: https://github.com/ethereum/EIPs/issues/1271 + function isValidSignature(bytes32 hash, bytes signature) public view returns (bool); +} \ No newline at end of file diff --git a/future-apps/actor/contracts/standards/IERC165.sol b/future-apps/actor/contracts/standards/IERC165.sol new file mode 100644 index 0000000000..a239f26120 --- /dev/null +++ b/future-apps/actor/contracts/standards/IERC165.sol @@ -0,0 +1,6 @@ +pragma solidity 0.4.24; + + +interface IERC165 { + function supportsInterface(bytes4 interfaceId) external pure returns (bool); +} \ No newline at end of file diff --git a/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol b/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol new file mode 100644 index 0000000000..bb1865c052 --- /dev/null +++ b/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol @@ -0,0 +1,33 @@ +pragma solidity 0.4.24; + +import "../../standards/IERC165.sol"; +import "../../standards/IERC1271.sol"; + + +contract DesignatedSigner is /*IERC165,*/ IERC1271 { + bool isInterface; + bool isValid; + bool isValidRevert; + bool modifyState; + + constructor (bool _isInterface, bool _isValid, bool _isValidRevert, bool _modifyState) { + isInterface = _isInterface; + isValid = _isValid; + isValidRevert = _isValidRevert; + modifyState = _modifyState; + } + + function supportsInterface(bytes4 interfaceId) external view returns (bool) { + return isInterface; + } + + function isValidSignature(bytes32 hash, bytes signature) public view returns (bool) { + require(!isValidRevert); + + if (modifyState) { + modifyState = false; + } + + return isValid; + } +} \ No newline at end of file diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index 0f4b146072..8f98f566e8 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -1,9 +1,11 @@ const Actor = artifacts.require('Actor') const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') -const { hash } = require('eth-ens-namehash') +const { hash: namehash } = require('eth-ens-namehash') +const ethutil = require('ethereumjs-util') const getBalance = require('@aragon/test-helpers/balance')(web3) const web3Call = require('@aragon/test-helpers/call')(web3) +const web3Sign = require('@aragon/test-helpers/sign')(web3) const { encodeCallScript, EMPTY_SCRIPT } = require('@aragon/test-helpers/evmScript') const assertEvent = require('@aragon/test-helpers/assertEvent') const ethABI = require('web3-eth-abi') @@ -20,13 +22,14 @@ const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') const KernelDepositableMock = artifacts.require('KernelDepositableMock') const ExecutionTarget = artifacts.require('ExecutionTarget') +const DesignatedSigner = artifacts.require('DesignatedSigner') const NULL_ADDRESS = '0x00' contract('Actor app', (accounts) => { let daoFact, actorBase, acl, actor, actorId - let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE + let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE, PRESIGN_HASH_ROLE, DESIGNATE_SIGNER_ROLE, ISVALIDSIG_INTERFACE_ID const root = accounts[0] @@ -45,6 +48,9 @@ contract('Actor app', (accounts) => { APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() EXECUTE_ROLE = await actorBase.EXECUTE_ROLE() RUN_SCRIPT_ROLE = await actorBase.RUN_SCRIPT_ROLE() + PRESIGN_HASH_ROLE = await actorBase.PRESIGN_HASH_ROLE() + DESIGNATE_SIGNER_ROLE = await actorBase.DESIGNATE_SIGNER_ROLE() + ISVALIDSIG_INTERFACE_ID = await actorBase.ISVALIDSIG_INTERFACE_ID() const ethConstant = await EtherTokenConstantMock.new() ETH = await ethConstant.getETHConstant() @@ -58,7 +64,7 @@ contract('Actor app', (accounts) => { await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) // actor - actorAppId = hash('actor.aragonpm.test') + actorAppId = namehash('actor.aragonpm.test') const actorReceipt = await dao.newAppInstance(actorAppId, actorBase.address, '0x', false) const actorProxyAddress = getEvent(actorReceipt, 'NewAppProxy', 'proxy') @@ -203,4 +209,121 @@ contract('Actor app', (accounts) => { ) }) }) + + context('signing messages', () => { + const [nobody, presigner, signerDesignator] = accounts + let HASH + const NO_SIG = '0x' + + beforeEach(async () => { + HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing + + await acl.createPermission(presigner, actor.address, PRESIGN_HASH_ROLE, root, { from: root }) + await acl.createPermission(signerDesignator, actor.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) + }) + + it('supports ERC1271 interface', async () => { + assert.isTrue(await actor.supportsInterface(ISVALIDSIG_INTERFACE_ID)) + }) + + it('doesnt support any other interface', async () => { + assert.isFalse(await actor.supportsInterface('0x12345678')) + assert.isFalse(await actor.supportsInterface('0x')) + }) + + it('presigns a hash', async () => { + await actor.presignHash(HASH, { from: presigner }) + + assert.isTrue(await actor.isValidSignature(HASH, NO_SIG)) + }) + + it('fails to presign a hash if not authorized', async () => { + await assertRevert(() => + actor.presignHash(HASH, { from: nobody }) + ) + }) + + context('designated signer: EOAs', () => { + let signer = accounts[7] + + const sign = async (hash, signer) => { + let sig = (await web3Sign(signer, hash)).slice(2) + + let r = ethutil.toBuffer('0x' + sig.substring(0, 64)) + let s = ethutil.toBuffer('0x' + sig.substring(64, 128)) + let v = ethutil.toBuffer(parseInt(sig.substring(128, 130), 16) + 27) + let mode = ethutil.toBuffer(1) + + let signature = '0x' + Buffer.concat([mode, v, r, s]).toString('hex') + return signature + } + + beforeEach(async () => { + await actor.setDesignatedSigner(signer, { from: signerDesignator }) + }) + + it('isValidSignature returns true to a valid signature', async () => { + const signature = await sign(HASH, signer) + assert.isTrue(await actor.isValidSignature(HASH, signature)) + }) + + it('isValidSignature returns false to an invalid signature', async () => { + const badSignature = (await sign(HASH, signer)).substring(0, 132) // drop last byte + assert.isFalse(await actor.isValidSignature(HASH, badSignature)) + }) + + it('isValidSignature returns false to an unauthorized signer', async () => { + const otherSignature = await sign(HASH, nobody) + assert.isFalse(await actor.isValidSignature(HASH, otherSignature)) + }) + + it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { + const badSignature = (await sign(HASH, signer)).substring(0, 132) // drop last byte + await actor.presignHash(HASH, { from: presigner }) + assert.isTrue(await actor.isValidSignature(HASH, badSignature)) + }) + }) + + context('designated signer: contracts', () => { + const setDesignatedSignerContract = async (...params) => { + const designatedSigner = await DesignatedSigner.new(...params) + return actor.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) + } + + it('isValidSignature returns true if designated signer returns true', async () => { + // interface compliance, sig is valid, doesn't revert and doesn't modify state + await setDesignatedSignerContract(true, true, false, false) + + assert.isTrue(await actor.isValidSignature(HASH, NO_SIG)) + }) + + it('isValidSignature returns false if designated signer returns false', async () => { + // interface compliance, sig is invalid, doesn't revert and doesn't modify state + await setDesignatedSignerContract(true, false, false, false) + + assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + }) + + it('isValidSignature returns false if designated signer doesnt support the interface', async () => { + // no interface compliance, sig is valid, doesn't revert and doesn't modify state + await setDesignatedSignerContract(false, true, false, false) + + assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + }) + + it('isValidSignature returns false if designated signer reverts', async () => { + // no interface compliance, sig is valid, reverts and doesn't modify state + await setDesignatedSignerContract(true, true, true, false) + + assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + }) + + it('isValidSignature returns false if designated signer attempts to modify state', async () => { + // no interface compliance, sig is valid, doesn't revert and modifies state + await setDesignatedSignerContract(true, true, false, true) + + assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + }) + }) + }) }) diff --git a/package.json b/package.json index 98f46c1449..4c75d78141 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "license": "(GPL-3.0-or-later OR AGPL-3.0-or-later)", "devDependencies": { "coveralls": "^3.0.1", + "ethereumjs-util": "^6.0.0", "ganache-cli": "^6.1.0", "lcov-result-merger": "^1.2.0", "lerna": "^2.8.0" diff --git a/shared/test-helpers/sign.js b/shared/test-helpers/sign.js new file mode 100644 index 0000000000..ba0007852f --- /dev/null +++ b/shared/test-helpers/sign.js @@ -0,0 +1,8 @@ +module.exports = web3 => (signer, hash) => { + return new Promise((resolve, reject) => { + web3.eth.sign(signer, hash, async (err, res) => { + if (err || !res) return reject(err) + resolve(res) + }) + }) +} From af478c1c2e3e3c8c58e1f4dc7e5abf004b723a6a Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 19 Nov 2018 14:25:17 +0100 Subject: [PATCH 06/44] CI: travis wait on npm install --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 875518f916..1baf8694de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,8 @@ env: matrix: allow_failures: - env: TASK=coverage:finance +install: + - travis_wait 60 npm install before_script: - npm prune script: From ebb10aa8e535ae38125c70d85d54b29c8f33f186 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 19 Nov 2018 16:29:14 +0100 Subject: [PATCH 07/44] Actor app: lint and enable CI --- .travis.yml | 2 ++ future-apps/actor/.soliumignore | 2 +- future-apps/actor/contracts/Actor.sol | 8 ++++---- future-apps/actor/contracts/SignatureValidator.sol | 3 ++- package.json | 2 ++ 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1baf8694de..abfc2dd528 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,11 +27,13 @@ env: - TASK=test:token-manager:app - TASK=test:vault - TASK=test:voting + - TASK=test:actor - TASK=coverage:finance - TASK=coverage:survey - TASK=coverage:token-manager - TASK=coverage:vault - TASK=coverage:voting + - TASK=coverage:actor - TASK=test:shared matrix: allow_failures: diff --git a/future-apps/actor/.soliumignore b/future-apps/actor/.soliumignore index 8b13789179..896c25387c 100644 --- a/future-apps/actor/.soliumignore +++ b/future-apps/actor/.soliumignore @@ -1 +1 @@ - +contracts/test diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 09ce4b83ba..66007dc330 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -40,8 +40,8 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { * @return Exits call frame forwarding the return data of the executed call (either error or success data) */ function execute(address _target, uint256 _ethValue, bytes _data) - authP(EXECUTE_ROLE, arr(_target, _ethValue, uint256(getSig(_data)))) // TODO: Test that sig bytes are the least significant bytes external // This function MUST always be external as the function performs a low level return, exiting the Actor app execution context + authP(EXECUTE_ROLE, arr(_target, _ethValue, uint256(getSig(_data)))) // TODO: Test that sig bytes are the least significant bytes { require(_ethValue == 0 || _data.length > 0, ERROR_EXECUTE_ETH_NO_DATA); // if ETH value is sent, there must be data require(isContract(_target), ERROR_EXECUTE_TARGET_NOT_CONTRACT); @@ -65,8 +65,8 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { } function setDesignatedSigner(address _designatedSigner) - authP(DESIGNATE_SIGNER_ROLE, arr(_designatedSigner)) external + authP(DESIGNATE_SIGNER_ROLE, arr(_designatedSigner)) { address oldDesignatedSigner = designatedSigner; designatedSigner = _designatedSigner; @@ -75,8 +75,8 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { } function presignHash(bytes32 _hash) - authP(PRESIGN_HASH_ROLE, arr(_hash)) external + authP(PRESIGN_HASH_ROLE, arr(_hash)) { isPresigned[_hash] = true; @@ -92,8 +92,8 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { } function forward(bytes _evmScript) - authP(RUN_SCRIPT_ROLE, arr(getScriptACLParam(_evmScript))) public + authP(RUN_SCRIPT_ROLE, arr(getScriptACLParam(_evmScript))) { bytes memory input = ""; // no input address[] memory blacklist = new address[](0); // no addr blacklist, can interact with anything diff --git a/future-apps/actor/contracts/SignatureValidator.sol b/future-apps/actor/contracts/SignatureValidator.sol index f33b9c5ee1..b398578c55 100644 --- a/future-apps/actor/contracts/SignatureValidator.sol +++ b/future-apps/actor/contracts/SignatureValidator.sol @@ -1,8 +1,9 @@ pragma solidity ^0.4.18; // From github.com/DexyProject/protocol - // This should probably be moved into aOS: https://github.com/aragon/aragonOS/pull/442 + + library SignatureValidator { // Maybe use 0x's IDs enum SignatureMode { diff --git a/package.json b/package.json index 4c75d78141..d3583ccad8 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "test:token-manager:app": "npm test --prefix apps/token-manager/app", "test:vault": "lerna run --scope=@aragon/apps-vault --stream test", "test:voting": "lerna run --scope=@aragon/apps-voting --stream test", + "test:actor": "lerna run --scope=@aragon/apps-actor --stream test", "test:future": "lerna run --scope=@aragon/future-apps-* --concurrency=1 --stream test", "test:shared": "lerna run --scope=@aragon/apps-shared-* --concurrency=1 --stream test", "coverage": "npm run coverage:all", @@ -39,6 +40,7 @@ "coverage:token-manager": "lerna run --scope=@aragon/apps-token-manager --concurrency=1 --stream coverage", "coverage:vault": "lerna run --scope=@aragon/apps-vault --concurrency=1 --stream coverage", "coverage:voting": "lerna run --scope=@aragon/apps-voting --concurrency=1 --stream coverage", + "coverage:actor": "lerna run --scope=@aragon/apps-actor --concurrency=1 --stream coverage", "lint": "lerna run --scope=@aragon/apps-* lint", "link:os": "lerna exec --scope '@aragon/apps-*' 'npm link @aragon/os'", "ganache-cli:test": "shared/test-helpers/ganache-cli.sh", From e132297184e75feafa200f3db7412ffa22387759 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 26 Nov 2018 17:13:22 +0100 Subject: [PATCH 08/44] Add max gas for static calls --- future-apps/actor/contracts/Actor.sol | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 66007dc330..0ddac354a7 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -24,6 +24,8 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { string private constant ERROR_EXECUTE_ETH_NO_DATA = "VAULT_EXECUTE_ETH_NO_DATA"; string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "VAULT_EXECUTE_TARGET_NOT_CONTRACT"; + uint256 internal constant STATICCALL_MAX_GAS = 50000; + mapping (bytes32 => bool) public isPresigned; address public designatedSigner; @@ -143,9 +145,12 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { } function safeBoolStaticCall(address target, bytes calldata) internal view returns (bool) { + uint256 gasLeft = gasleft(); + + uint256 callGas = gasLeft > STATICCALL_MAX_GAS ? STATICCALL_MAX_GAS : gasLeft; bool ok; assembly { - ok := staticcall(gas, target, add(calldata, 0x20), mload(calldata), 0, 0) + ok := staticcall(callGas, target, add(calldata, 0x20), mload(calldata), 0, 0) } if (!ok) { From 3ad99206b76705eb5a434be37a7ef1ead1767b6e Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Sat, 26 Jan 2019 14:36:23 +0100 Subject: [PATCH 09/44] chore: upgrade to web3-eth-abi@1.0.0-beta.38 --- future-apps/actor/package.json | 2 +- future-apps/actor/test/actor.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/future-apps/actor/package.json b/future-apps/actor/package.json index 4dbfccc73f..0ce7f192e2 100644 --- a/future-apps/actor/package.json +++ b/future-apps/actor/package.json @@ -46,7 +46,7 @@ "solium": "^1.0.4", "truffle": "4.1.14", "truffle-hdwallet-provider": "0.0.3", - "web3-eth-abi": "^1.0.0-beta.36", + "web3-eth-abi": "^1.0.0-beta.38", "webpack": "3.10.0" }, "dependencies": { diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index 8f98f566e8..d645bf65f5 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -8,7 +8,7 @@ const web3Call = require('@aragon/test-helpers/call')(web3) const web3Sign = require('@aragon/test-helpers/sign')(web3) const { encodeCallScript, EMPTY_SCRIPT } = require('@aragon/test-helpers/evmScript') const assertEvent = require('@aragon/test-helpers/assertEvent') -const ethABI = require('web3-eth-abi') +const ethABI = new (require('web3-eth-abi').AbiCoder)() const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } const ACL = artifacts.require('ACL') From ea9a5aae38b9a03f1adcc9d1631400f61b0111a4 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Sat, 26 Jan 2019 21:48:23 +0100 Subject: [PATCH 10/44] Address review comments --- future-apps/actor/contracts/Actor.sol | 22 +- .../actor/contracts/SignatureValidator.sol | 11 +- .../test/mocks/KernelDepositableMock.sol | 4 + future-apps/actor/package.json | 8 +- future-apps/actor/test/actor.js | 26 +- future-apps/payroll/package-lock.json | 2863 ++++------------- package.json | 1 - 7 files changed, 698 insertions(+), 2237 deletions(-) diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 0ddac354a7..efe99eeac3 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -13,18 +13,20 @@ import "@aragon/apps-vault/contracts/Vault.sol"; import "@aragon/os/contracts/common/IForwarder.sol"; -contract Actor is Vault, IERC165, IERC1271, IForwarder { +contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { bytes32 public constant EXECUTE_ROLE = keccak256("EXECUTE_ROLE"); bytes32 public constant RUN_SCRIPT_ROLE = keccak256("RUN_SCRIPT_ROLE"); bytes32 public constant PRESIGN_HASH_ROLE = keccak256("PRESIGN_HASH_ROLE"); bytes32 public constant DESIGNATE_SIGNER_ROLE = keccak256("DESIGNATE_SIGNER_ROLE"); + bytes4 private constant EIP165_SUPPORT_INTERFACE_ID = 0x01ffc9a7; bytes4 public constant ISVALIDSIG_INTERFACE_ID = 0xabababab; // TODO: Add actual interfaceId - string private constant ERROR_EXECUTE_ETH_NO_DATA = "VAULT_EXECUTE_ETH_NO_DATA"; - string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "VAULT_EXECUTE_TARGET_NOT_CONTRACT"; + string private constant ERROR_EXECUTE_ETH_NO_DATA = "ACTOR_EXECUTE_ETH_NO_DATA"; + string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "ACTOR_EXECUTE_TARGET_NOT_CONTRACT"; - uint256 internal constant STATICCALL_MAX_GAS = 50000; + uint256 internal constant ISVALIDSIG_MAX_GAS = 50000; + uint256 internal constant EIP165_MAX_GAS = 30000; mapping (bytes32 => bool) public isPresigned; address public designatedSigner; @@ -90,7 +92,8 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { } function supportsInterface(bytes4 interfaceId) external pure returns (bool) { - return interfaceId == ISVALIDSIG_INTERFACE_ID; + return interfaceId == ISVALIDSIG_INTERFACE_ID + || interfaceId == EIP165_SUPPORT_INTERFACE_ID; } function forward(bytes _evmScript) @@ -119,7 +122,7 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { // designatedSigner.isValidSignature(hash, signature) as a staticall IERC1271 signerContract = IERC1271(designatedSigner); bytes memory calldata = abi.encodeWithSelector(signerContract.isValidSignature.selector, hash, signature); - return safeBoolStaticCall(signerContract, calldata); + return safeBoolStaticCall(signerContract, calldata, ISVALIDSIG_MAX_GAS); } // `safeSupportsInterface` returns false if designatedSigner is a contract but it @@ -141,13 +144,13 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { } bytes memory calldata = abi.encodeWithSelector(target.supportsInterface.selector, interfaceId); - return safeBoolStaticCall(target, calldata); + return safeBoolStaticCall(target, calldata, EIP165_MAX_GAS); } - function safeBoolStaticCall(address target, bytes calldata) internal view returns (bool) { + function safeBoolStaticCall(address target, bytes calldata, uint256 maxGas) internal view returns (bool) { uint256 gasLeft = gasleft(); - uint256 callGas = gasLeft > STATICCALL_MAX_GAS ? STATICCALL_MAX_GAS : gasLeft; + uint256 callGas = gasLeft > maxGas ? maxGas : gasLeft; bool ok; assembly { ok := staticcall(callGas, target, add(calldata, 0x20), mload(calldata), 0, 0) @@ -168,7 +171,6 @@ contract Actor is Vault, IERC165, IERC1271, IForwarder { let ptr := mload(0x40) // get next free memory ptr returndatacopy(ptr, 0, size) // copy return from above `staticcall` result := mload(ptr) // read data at ptr and set it to result - mstore(ptr, 0) // set pointer memory to 0 so it still is the next free ptr } return result; diff --git a/future-apps/actor/contracts/SignatureValidator.sol b/future-apps/actor/contracts/SignatureValidator.sol index b398578c55..825bfafbd0 100644 --- a/future-apps/actor/contracts/SignatureValidator.sol +++ b/future-apps/actor/contracts/SignatureValidator.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity 0.4.24; // From github.com/DexyProject/protocol // This should probably be moved into aOS: https://github.com/aragon/aragonOS/pull/442 @@ -32,6 +32,15 @@ library SignatureValidator { s := mload(add(signature, 66)) } + // Allow signature version to be 0 or 1 + if (v < 27) { + v += 27; + } + + if (v != 27 && v != 28) { + return false; + } + if (mode == SignatureMode.GETH) { hash = keccak256("\x19Ethereum Signed Message:\n32", hash); } else if (mode == SignatureMode.TREZOR) { diff --git a/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol b/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol index 416e235bc3..d53f704bc9 100644 --- a/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol +++ b/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol @@ -8,6 +8,10 @@ contract KernelDepositableMock is DepositableStorage, Kernel { constructor(bool _shouldPetrify) Kernel(_shouldPetrify) public { } + function () external payable { + require(isDepositable()); + } + function enableDepositable() public { setDepositable(true); } diff --git a/future-apps/actor/package.json b/future-apps/actor/package.json index 0ce7f192e2..29ef93be90 100644 --- a/future-apps/actor/package.json +++ b/future-apps/actor/package.json @@ -37,10 +37,10 @@ "description": "", "devDependencies": { "@aragon/apps-shared-migrations": "1.0.0", - "@aragon/apps-shared-minime": "1.0.0", "@aragon/cli": "^5.2.0-beta.1", "@aragon/test-helpers": "^1.0.1", "eth-gas-reporter": "^0.1.1", + "ethereumjs-util": "^6.0.0", "ganache-cli": "^6.0.3", "solidity-coverage": "0.5.11", "solium": "^1.0.4", @@ -50,7 +50,7 @@ "webpack": "3.10.0" }, "dependencies": { - "@aragon/apps-vault": "^4.0.0", - "@aragon/os": "^4.0.0" + "@aragon/apps-vault": "4.0.0", + "@aragon/os": "4.0.1" } -} +} \ No newline at end of file diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index d645bf65f5..56d5a9dd91 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -26,6 +26,9 @@ const DesignatedSigner = artifacts.require('DesignatedSigner') const NULL_ADDRESS = '0x00' +const EIP165_SUPPORT_INTERFACE_ID = '0x01ffc9a7' +const EIP165_SUPPORT_INVALID_ID = '0xffffffff' + contract('Actor app', (accounts) => { let daoFact, actorBase, acl, actor, actorId @@ -222,6 +225,11 @@ contract('Actor app', (accounts) => { await acl.createPermission(signerDesignator, actor.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) }) + it('complies to EIP165', async () => { + assert.isTrue(await actor.supportsInterface(EIP165_SUPPORT_INTERFACE_ID)) + assert.isFalse(await actor.supportsInterface(EIP165_SUPPORT_INVALID_ID)) + }) + it('supports ERC1271 interface', async () => { assert.isTrue(await actor.supportsInterface(ISVALIDSIG_INTERFACE_ID)) }) @@ -246,14 +254,18 @@ contract('Actor app', (accounts) => { context('designated signer: EOAs', () => { let signer = accounts[7] - const sign = async (hash, signer) => { + const sign = async (hash, signer, useLegacySig = false, useInvalidV = false) => { let sig = (await web3Sign(signer, hash)).slice(2) let r = ethutil.toBuffer('0x' + sig.substring(0, 64)) let s = ethutil.toBuffer('0x' + sig.substring(64, 128)) - let v = ethutil.toBuffer(parseInt(sig.substring(128, 130), 16) + 27) + let v = ethutil.toBuffer((useLegacySig ? 0 : 27) + parseInt(sig.substring(128, 130), 16)) let mode = ethutil.toBuffer(1) + if (useInvalidV) { + v = ethutil.toBuffer(2) // force set an invalid v + } + let signature = '0x' + Buffer.concat([mode, v, r, s]).toString('hex') return signature } @@ -267,11 +279,21 @@ contract('Actor app', (accounts) => { assert.isTrue(await actor.isValidSignature(HASH, signature)) }) + it('isValidSignature returns true to a valid signature with legacy version', async () => { + const legacyVersionSignature = await sign(HASH, signer, true) + assert.isTrue(await actor.isValidSignature(HASH, legacyVersionSignature)) + }) + it('isValidSignature returns false to an invalid signature', async () => { const badSignature = (await sign(HASH, signer)).substring(0, 132) // drop last byte assert.isFalse(await actor.isValidSignature(HASH, badSignature)) }) + it('isValidSignature returns false to a signature with an invalid v', async () => { + const invalidVersionSignature = await sign(HASH, signer, false, true) + assert.isFalse(await actor.isValidSignature(HASH, invalidVersionSignature)) + }) + it('isValidSignature returns false to an unauthorized signer', async () => { const otherSignature = await sign(HASH, nobody) assert.isFalse(await actor.isValidSignature(HASH, otherSignature)) diff --git a/future-apps/payroll/package-lock.json b/future-apps/payroll/package-lock.json index 563a22a3a1..6f1a0cbad9 100644 --- a/future-apps/payroll/package-lock.json +++ b/future-apps/payroll/package-lock.json @@ -1,14 +1,11 @@ { - "name": "@aragon/future-apps-payroll", - "version": "0.0.1", - "lockfileVersion": 1, "requires": true, + "lockfileVersion": 1, "dependencies": { "@aragon/apm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aragon/apm/-/apm-2.0.2.tgz", "integrity": "sha512-fW9ztXNBcsCNjATbKq4epZVU3qpnlWLITSnZVtVxy0FnUDisJec6+IKob79X5B3uuTsuBjsUAabRGUTZe0lOtw==", - "dev": true, "requires": { "@aragon/os": "^3.1.2", "axios": "^0.18.0", @@ -21,7 +18,6 @@ "version": "3.1.12", "resolved": "https://registry.npmjs.org/@aragon/os/-/os-3.1.12.tgz", "integrity": "sha512-q5RwUgs8YDrV7tT4WMCdW1qLSmx4w7yZ4oWWQ7owKasffM+WwPu4/e3yOWSQXCpFRVtg+U6NP4SuSciYjPYafw==", - "dev": true, "requires": { "homedir": "^0.6.0", "truffle-hdwallet-provider": "0.0.3", @@ -32,7 +28,6 @@ "version": "17.5.0", "resolved": "https://registry.npmjs.org/ipfs-api/-/ipfs-api-17.5.0.tgz", "integrity": "sha512-1LMao28nKBCUrvc6BUCsA3GEQ2TAoKx4Jy3BeUR3o5MVcx+dJDtXfEYDKg6WE/PWzfJF1uZGWgR9Dm2OLITR6w==", - "dev": true, "requires": { "async": "^2.6.0", "bs58": "^4.0.1", @@ -68,49 +63,14 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } - } - }, - "@aragon/apps-finance": { - "version": "2.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@aragon/apps-finance/-/apps-finance-2.0.0-beta.2.tgz", - "integrity": "sha512-wIBYDF5+/DFNdjpYiv1Vn5qylNayTfo2Wmf5euVamBs3dlCuxt0JxOotnEkAUXwckjid7naU7xNKa0xjWBKRLg==", - "requires": { - "@aragon/apps-vault": "^3.0.0-beta.2", - "@aragon/os": "4.0.0-beta.2" - }, - "dependencies": { - "@aragon/os": { - "version": "4.0.0-beta.2", - "resolved": "https://registry.npmjs.org/@aragon/os/-/os-4.0.0-beta.2.tgz", - "integrity": "sha512-r2V0EXjCo0ZP3ls0LhbzbzyiHDwyvml+TwC+diNoQkeF4WENRo5qyVcYzHwLphgf0113ua+ZVfgvK7sVbRT0oA==", - "requires": { - "homedir": "^0.6.0", - "truffle-hdwallet-provider": "0.0.3", - "truffle-hdwallet-provider-privkey": "0.3.0" - } + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" } } }, - "@aragon/apps-shared-migrations": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aragon/apps-shared-migrations/-/apps-shared-migrations-1.0.0.tgz", - "integrity": "sha512-whskPlA061n0wa6nBgCktsSk1mgT6Q+9d6gvQ00TF4DHt0fyRCxBSRZiv+17QQGXummDF7nlu4aotcSz6edmjQ==", - "dev": true - }, - "@aragon/apps-shared-minime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@aragon/apps-shared-minime/-/apps-shared-minime-1.0.0.tgz", - "integrity": "sha512-DC0ylnEcsqED8eQIxriDbRTmSmqdUYWJrGmysI/UTuHvdSfsAy9awbx4Ea6To1Acd3F6kca5oPn6m9WjCAhlxQ==", - "dev": true - }, "@aragon/apps-token-manager": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@aragon/apps-token-manager/-/apps-token-manager-1.0.1.tgz", "integrity": "sha512-2EktscZ7VNivFg4pEZjFSePY8HU6rKZQ7dGQN8YreJHAPz4x44rBygBQIUDskV80MJtO5NaQo8fRB8di2rfSrA==", - "dev": true, "requires": { "@aragon/core": "^2.0.0" } @@ -139,7 +99,6 @@ "version": "1.0.0", "resolved": "http://registry.npmjs.org/@aragon/apps-voting/-/apps-voting-1.0.0.tgz", "integrity": "sha512-+Z1o6rSdXrRbDYRoSaoh3PaNzHQt+u7YY0BLUL55/nlZct+tkZM7uIq8Qsk33IZDxr0S58jDB6zNsiR5yXE5TA==", - "dev": true, "requires": { "@aragon/os": "^3.0.8" }, @@ -148,7 +107,6 @@ "version": "3.1.12", "resolved": "https://registry.npmjs.org/@aragon/os/-/os-3.1.12.tgz", "integrity": "sha512-q5RwUgs8YDrV7tT4WMCdW1qLSmx4w7yZ4oWWQ7owKasffM+WwPu4/e3yOWSQXCpFRVtg+U6NP4SuSciYjPYafw==", - "dev": true, "requires": { "homedir": "^0.6.0", "truffle-hdwallet-provider": "0.0.3", @@ -160,14 +118,12 @@ "@aragon/aragen": { "version": "2.0.0-beta.1", "resolved": "https://registry.npmjs.org/@aragon/aragen/-/aragen-2.0.0-beta.1.tgz", - "integrity": "sha512-kWHGgcIZxC3A7pc8pc5TdIyZtAHrT1j/GAnWQQln7ZaTPo6rQhpEL+jfF6TSKE8diWmdQepk+JLfh0islGOCRA==", - "dev": true + "integrity": "sha512-kWHGgcIZxC3A7pc8pc5TdIyZtAHrT1j/GAnWQQln7ZaTPo6rQhpEL+jfF6TSKE8diWmdQepk+JLfh0islGOCRA==" }, "@aragon/cli": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@aragon/cli/-/cli-5.1.0.tgz", "integrity": "sha512-dqLa+g3rUNXYtvk+tSEtRYYdafqTtJ57yIdu/YTv/dc5e9YGWqGcN94tMMrtTZ8oZzDi9LXBPCqyrJXz2rbV1Q==", - "dev": true, "requires": { "@aragon/apm": "^2.0.2", "@aragon/aragen": "2.0.0-beta.1", @@ -210,7 +166,6 @@ "version": "4.0.0-beta.1", "resolved": "https://registry.npmjs.org/@aragon/os/-/os-4.0.0-beta.1.tgz", "integrity": "sha512-kf7GaCnSkVrm6VRgjcOc7ISlSywwlC212U2P1lXoZy7LppOtYwjtuiNQ5CJ6ElRjUw+mD0QiUjP9K2UieRxC/A==", - "dev": true, "requires": { "homedir": "^0.6.0", "truffle-hdwallet-provider": "0.0.3", @@ -220,14 +175,12 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -235,26 +188,22 @@ "bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", - "dev": true + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" }, "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -265,7 +214,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -276,7 +224,6 @@ "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.0.1", "shebang-command": "^1.2.0", @@ -287,7 +234,6 @@ "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" } @@ -296,7 +242,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -306,14 +251,12 @@ "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 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -322,7 +265,6 @@ "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", @@ -333,7 +275,6 @@ "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.0.1", "get-stream": "^3.0.0", @@ -350,7 +291,6 @@ "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" @@ -360,7 +300,6 @@ "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" } @@ -369,7 +308,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -377,26 +315,22 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "utf8": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", - "dev": true + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" }, "uuid": { "version": "2.0.1", "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" }, "web3": { "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.36.tgz", "integrity": "sha512-fZDunw1V0AQS27r5pUN3eOVP7u8YAvyo6vOapdgVRolAu5LgaweP7jncYyLINqIX9ZgWdS5A090bt+ymgaYHsw==", - "dev": true, "requires": { "web3-bzz": "1.0.0-beta.36", "web3-core": "1.0.0-beta.36", @@ -411,7 +345,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.36.tgz", "integrity": "sha512-clDRS/ziboJ5ytnrfxq80YSu9HQsT0vggnT3BkoXadrauyEE/9JNLxRu016jjUxqdkfdv4MgIPDdOS3Bv2ghiw==", - "dev": true, "requires": { "got": "7.1.0", "swarm-js": "0.1.37", @@ -422,7 +355,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.36.tgz", "integrity": "sha512-C2QW9CMMRZdYAiKiLkMrKRSp+gekSqTDgZTNvlxAdN1hXn4d9UmcmWSJXOmIHqr5N2ISbRod+bW+qChODxVE3Q==", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.36", "web3-core-method": "1.0.0-beta.36", @@ -434,7 +366,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.36.tgz", "integrity": "sha512-gu74l0htiGWuxLQuMnZqKToFvkSM+UFPE7qUuy1ZosH/h2Jd+VBWg6k4CyNYVYfP0hL5x3CN8SBmB+HMowo55A==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-eth-iban": "1.0.0-beta.36", @@ -445,7 +376,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.36.tgz", "integrity": "sha512-dJsP3KkGaqBBSdxfzvLsYPOmVaSs1lR/3oKob/gtUYG7UyTnwquwliAc7OXj+gqRA2E/FHZcM83cWdl31ltdSA==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.36", @@ -458,7 +388,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.36.tgz", "integrity": "sha512-RGIL6TjcOeJTullFLMurChPTsg94cPF6LI763y/sPYtXTDol1vVa+J5aGLp/4WW8v+s+1bSQO6zYq2ZtkbmtEQ==", - "dev": true, "requires": { "any-promise": "1.3.0", "eventemitter3": "1.1.1" @@ -468,7 +397,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.36.tgz", "integrity": "sha512-/CHuaMbiMDu1v8ANGYI7yFCnh1GaCWx5pKnUPJf+QTk2xAAw+Bvd97yZJIWPOK5AOPUIzxgwx9Ob/5ln6mTmYA==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.36", @@ -481,7 +409,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.36.tgz", "integrity": "sha512-/evyLQ8CMEYXC5aUCodDpmEnmGVYQxaIjiEIfA/85f9ifHkfzP1aOwCAjcsLsJWnwrWDagxSpjCYrDtnNabdEw==", - "dev": true, "requires": { "eventemitter3": "1.1.1", "underscore": "1.8.3", @@ -492,7 +419,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.36.tgz", "integrity": "sha512-uEa0UnbnNHUB4N2O1U+LsvxzSPJ/w3azy5115IseaUdDaiz6IFFgFfFP3ssauayQNCf7v2F44GXLfPhrNeb/Sw==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.36", @@ -513,7 +439,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.36.tgz", "integrity": "sha512-fBfW+7hvA0rxEMV45fO7JU+0R32ayT7aRwG9Cl6NW2/QvhFeME2qVbMIWw0q5MryPZGIN8A6366hKNuWvVidDg==", - "dev": true, "requires": { "ethers": "4.0.0-beta.1", "underscore": "1.8.3", @@ -524,7 +449,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.36.tgz", "integrity": "sha512-MmgIlBEZ0ILLWV4+wfMrbeVVMU/VmQnCpgSDcw7wHKOKu47bKncJ6rVqVsUbC6d9F613Rios+Yj2Ua6SCHtmrg==", - "dev": true, "requires": { "any-promise": "1.3.0", "crypto-browserify": "3.12.0", @@ -542,7 +466,6 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -555,7 +478,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.36.tgz", "integrity": "sha512-cywqcIrUsCW4fyqsHdOb24OCC8AnBol8kNiptI+IHRylyCjTNgr53bUbjrXWjmEnear90rO0QhAVjLB1a4iEbQ==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.36", @@ -571,7 +493,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.36.tgz", "integrity": "sha512-b5AEDjjhOLR4q47Hbzf65zYE+7U7JgCgrUb13RU4HMIGoMb1q4DXaJw1UH8VVHCZulevl2QBjpCyrntecMqqCQ==", - "dev": true, "requires": { "bn.js": "4.11.6", "web3-utils": "1.0.0-beta.36" @@ -581,7 +502,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.36.tgz", "integrity": "sha512-+oxvhojeWh4C/XtnlYURWRR3F5Cg7bQQNjtN1ZGnouKAZyBLoYDVVJ6OaPiveNtfC9RKnzLikn9/Uqc0xz410A==", - "dev": true, "requires": { "web3-core": "1.0.0-beta.36", "web3-core-helpers": "1.0.0-beta.36", @@ -594,7 +514,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.36.tgz", "integrity": "sha512-BriXK0Pjr6Hc/VDq1Vn8vyOum4JB//wpCjgeGziFD6jC7Of8YaWC7AJYXje89OckzfcqX1aJyJlBwDpasNkAzQ==", - "dev": true, "requires": { "web3-core": "1.0.0-beta.36", "web3-core-method": "1.0.0-beta.36", @@ -605,7 +524,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.36.tgz", "integrity": "sha512-KLSqMS59nRdpet9B0B64MKgtM3n9wAHTcAHJ03hv79avQNTjHxtjZm0ttcjcFUPpWDgTCtcYCa7tqaYo9Pbeog==", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.36", "xhr2-cookies": "1.1.0" @@ -615,7 +533,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.36.tgz", "integrity": "sha512-iEUrmdd2CzoWgp+75/ydom/1IaoLw95qkAzsgwjjZp1waDncHP/cvVGX74+fbUx4hRaPdchyzxCQfNpgLDmNjQ==", - "dev": true, "requires": { "oboe": "2.1.3", "underscore": "1.8.3", @@ -626,7 +543,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.36.tgz", "integrity": "sha512-wAnENuZx75T5ZSrT2De2LOaUuPf2yRjq1VfcbD7+Zd79F3DZZLBJcPyCNVQ1U0fAXt0wfgCKl7sVw5pffqR9Bw==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.36", @@ -637,7 +553,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.36.tgz", "integrity": "sha512-bREGHS/WprYFSvGUhyIk8RSpT2Z5SvJOKGBrsUW2nDIMWO6z0Op8E7fzC6GXY2HZfZliAqq6LirbXLgcLRWuPw==", - "dev": true, "requires": { "web3-core": "1.0.0-beta.36", "web3-core-method": "1.0.0-beta.36", @@ -649,7 +564,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.36.tgz", "integrity": "sha512-7ri74lG5fS2Th0fhYvTtiEHMB1Pmf2p7dQx1COQ3OHNI/CHNEMjzoNMEbBU6FAENrywfoFur40K4m0AOmEUq5A==", - "dev": true, "requires": { "bn.js": "4.11.6", "eth-lib": "0.1.27", @@ -663,14 +577,12 @@ "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 + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "yargs": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", @@ -690,7 +602,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -700,14 +611,12 @@ "@aragon/core": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@aragon/core/-/core-2.0.1.tgz", - "integrity": "sha512-o2SPNW2H5HlWxgVK+jJ5cpMBjXUwZHbFytjJqySSJkX1mYX+6+9tgH3HAwCXWk7nc7yo/fE22NM60IcDPUZnfA==", - "dev": true + "integrity": "sha512-o2SPNW2H5HlWxgVK+jJ5cpMBjXUwZHbFytjJqySSJkX1mYX+6+9tgH3HAwCXWk7nc7yo/fE22NM60IcDPUZnfA==" }, "@aragon/messenger": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@aragon/messenger/-/messenger-1.0.0.tgz", "integrity": "sha512-2YX3gSipHbDTuRLeVuCi3Lj9o3zpGZXELYKkiUgXmnCmed81oEBX6rmCjC7dGFzidIYD/NtEj2kOmoCFh5lKdw==", - "dev": true, "requires": { "@babel/runtime": "^7.1.2", "rxjs": "^5.5.6", @@ -733,7 +642,6 @@ "version": "1.1.3", "resolved": "http://registry.npmjs.org/@aragon/templates-beta/-/templates-beta-1.1.3.tgz", "integrity": "sha512-RBpvibf3pabIFKPARfu+dZNFesYDoH4R/6EuuBtqQGVrWiR3FbHKg8heyjn8o6s/Sw/DehbHFpA6xro3aKzb6g==", - "dev": true, "requires": { "@aragon/apps-finance": "^1.0.0", "@aragon/apps-token-manager": "^1.0.0", @@ -746,7 +654,6 @@ "version": "1.0.1", "resolved": "http://registry.npmjs.org/@aragon/apps-finance/-/apps-finance-1.0.1.tgz", "integrity": "sha512-8h+LExLnNQyEtImHtdcJo4howKI4tE4zU6+Fppw0u5nJIkXYIjRmtXPnXVZGKR7V5KYw9ujUOWgOm7a3BcpCPw==", - "dev": true, "requires": { "@aragon/apps-vault": "^2.0.0", "@aragon/os": "^3.1.1" @@ -756,7 +663,6 @@ "version": "2.0.1", "resolved": "http://registry.npmjs.org/@aragon/apps-vault/-/apps-vault-2.0.1.tgz", "integrity": "sha512-SRUNbLrS+fEf7FhNb1Gt5x1lQieIsWUggwcsDyI+sy+XQ2e8J83vjgqUWPUSwQvXK3e2S7QJ/j/czZ9NrFtWxA==", - "dev": true, "requires": { "@aragon/os": "^3.1.1" } @@ -767,7 +673,6 @@ "version": "1.0.0", "resolved": "http://registry.npmjs.org/@aragon/apps-vault/-/apps-vault-1.0.0.tgz", "integrity": "sha512-XJPT399unNjxnr+F8uZTmMzp/KP+Y5vTjjEUBmfHN1TyD4VuBPZ+bbGixKkK8E4WjMmVlo4gfsuYkCpJJ/G8cQ==", - "dev": true, "requires": { "@aragon/os": "^3.0.8" } @@ -776,7 +681,6 @@ "version": "3.1.12", "resolved": "https://registry.npmjs.org/@aragon/os/-/os-3.1.12.tgz", "integrity": "sha512-q5RwUgs8YDrV7tT4WMCdW1qLSmx4w7yZ4oWWQ7owKasffM+WwPu4/e3yOWSQXCpFRVtg+U6NP4SuSciYjPYafw==", - "dev": true, "requires": { "homedir": "^0.6.0", "truffle-hdwallet-provider": "0.0.3", @@ -785,17 +689,10 @@ } } }, - "@aragon/test-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@aragon/test-helpers/-/test-helpers-1.0.1.tgz", - "integrity": "sha512-CaROSFATybF2sr8jnmrhp9Br5RfLStFW3HAZ8CUFA4SSc9AlW2NfC30hIZM1L3X65tePzKVyF9uMT+WGaKw09g==", - "dev": true - }, "@aragon/wrapper": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@aragon/wrapper/-/wrapper-2.0.1.tgz", "integrity": "sha512-YP1yKhDITTBbM9i5QL8hBlHZy3YmlYj8uSIEN7MIW+1TPBlMPL253Pa7IHOHJWbg1VnbmPSQuYJafz0g/YXJaA==", - "dev": true, "requires": { "@aragon/apm": "^2.0.0", "@aragon/messenger": "^1.0.0", @@ -821,7 +718,6 @@ "version": "1.0.0-beta.33", "resolved": "http://registry.npmjs.org/web3/-/web3-1.0.0-beta.33.tgz", "integrity": "sha1-xgIbV2mSdyY3HBhLhoRFMRsTkpU=", - "dev": true, "requires": { "web3-bzz": "1.0.0-beta.33", "web3-core": "1.0.0-beta.33", @@ -838,7 +734,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", - "dev": true, "requires": { "regenerator-runtime": "^0.12.0" }, @@ -846,8 +741,7 @@ "regenerator-runtime": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" } } }, @@ -855,7 +749,6 @@ "version": "1.6.0", "resolved": "http://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-OU2+C7X+5Gs42JZzXoto7yOQ0A0=", - "dev": true, "requires": { "@types/node": "*" } @@ -864,7 +757,6 @@ "version": "0.0.33", "resolved": "http://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", - "dev": true, "requires": { "@types/node": "*" } @@ -872,26 +764,22 @@ "@types/node": { "version": "10.12.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz", - "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==", - "dev": true + "integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==" }, "@types/qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q==", - "dev": true + "integrity": "sha512-mNhVdZHdtKHMMxbqzNK3RzkBcN1cux3AvuCYGTvjEIQT2uheH3eCAyYsbMbh2Bq8nXkeOWs1kyDiF7geWRFQ4Q==" }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" }, "abi-decoder": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.2.0.tgz", "integrity": "sha512-y2OKSEW4gf2838Eavc56vQY9V46zaXkf3Jl1WpTfUBbzAVrXSr4JRZAAWv55Tv9s5WNz1rVgBgz5d2aJIL1QCg==", - "dev": true, "requires": { "web3": "^0.18.4" } @@ -908,7 +796,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -934,14 +821,12 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, "optional": true }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, "ansi-regex": { "version": "2.1.1", @@ -956,20 +841,17 @@ "any-observable": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", - "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", - "dev": true + "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=" }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true + "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.1.5", "normalize-path": "^2.0.0" @@ -979,7 +861,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" }, @@ -987,8 +868,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" } } }, @@ -996,7 +876,6 @@ "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.0.1" } @@ -1004,32 +883,27 @@ "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 + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "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 + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { "version": "0.2.4", @@ -1043,7 +917,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.0.1.tgz", "integrity": "sha512-aO8EaEgbgqq77IEw+1jfx5c9zTbzvkfuRBuZsSsPnTHMkmd5AI4J6OtITLZFa381jReeaQL67J0GBTUu0+ZTVw==", - "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -1058,8 +931,7 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "async": { "version": "2.6.1", @@ -1072,8 +944,7 @@ "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "async-eventemitter": { "version": "0.2.4", @@ -1086,8 +957,7 @@ "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==", - "dev": true + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", @@ -1097,8 +967,7 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "aws-sign2": { "version": "0.7.0", @@ -1114,7 +983,6 @@ "version": "0.18.0", "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", - "dev": true, "requires": { "follow-redirects": "^1.3.0", "is-buffer": "^1.1.5" @@ -1587,7 +1455,6 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, "requires": { "babel-runtime": "^6.26.0", "core-js": "^2.5.0", @@ -1597,8 +1464,7 @@ "regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" } } }, @@ -1724,7 +1590,6 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -1739,7 +1604,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -1748,7 +1612,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1757,7 +1620,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1766,7 +1628,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1776,14 +1637,12 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -1798,8 +1657,7 @@ "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -1813,7 +1671,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.1.tgz", "integrity": "sha512-k8S+ioyE06BcIcS29R3M7YbbmmcGh0DWfMY6JnZ3n4hhEv/lIRS2qRPCqUoHiGIXlrrRBKJtTbw8Fwp92bGOZA==", - "dev": true, "requires": { "opencollective": "^1.0.3" } @@ -1826,7 +1683,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, "requires": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" @@ -1835,8 +1691,7 @@ "binary-extensions": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", - "dev": true + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" }, "bindings": { "version": "1.3.0", @@ -1867,7 +1722,6 @@ "version": "1.2.2", "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -1876,14 +1730,12 @@ "blakejs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", - "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=", - "dev": true + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" }, "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=", - "dev": true, "requires": { "inherits": "~2.0.0" } @@ -1891,8 +1743,7 @@ "bluebird": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", - "dev": true + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==" }, "bn.js": { "version": "4.11.8", @@ -1903,7 +1754,6 @@ "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -1921,7 +1771,6 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -1932,7 +1781,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/borc/-/borc-2.0.3.tgz", "integrity": "sha512-2mfipKUXn7yLgwn8D5jZkJqd2ZyzqmYZQX/9d4On33oGNDLwxj5qQMst+nkKyEdaujQRFfrZCId+k8wehQVANg==", - "dev": true, "requires": { "bignumber.js": "^6.0.0", "commander": "^2.15.0", @@ -1943,14 +1791,12 @@ "bignumber.js": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-6.0.0.tgz", - "integrity": "sha512-x247jIuy60/+FtMRvscqfxtVHQf8AGx2hm9c6btkgC0x/hp9yt+teISNhvF8WlwRkCc5yF2fDECH8SIMe8j+GA==", - "dev": true + "integrity": "sha512-x247jIuy60/+FtMRvscqfxtVHQf8AGx2hm9c6btkgC0x/hp9yt+teISNhvF8WlwRkCc5yF2fDECH8SIMe8j+GA==" }, "commander": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" } } }, @@ -1967,7 +1813,6 @@ "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.1", "preserve": "^0.2.0", @@ -1982,8 +1827,7 @@ "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, "browserify-aes": { "version": "1.2.0", @@ -2002,7 +1846,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -2013,7 +1856,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -2025,7 +1867,6 @@ "version": "4.0.1", "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" @@ -2035,7 +1876,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", - "dev": true, "requires": { "js-sha3": "^0.3.1" }, @@ -2043,8 +1883,7 @@ "js-sha3": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=", - "dev": true + "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" } } }, @@ -2052,7 +1891,6 @@ "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.1.1", "browserify-rsa": "^4.0.0", @@ -2067,7 +1905,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, "requires": { "pako": "~0.2.0" }, @@ -2075,8 +1912,7 @@ "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" } } }, @@ -2111,7 +1947,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" @@ -2121,7 +1956,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -2130,38 +1964,32 @@ "buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-loader": { "version": "0.0.1", "resolved": "http://registry.npmjs.org/buffer-loader/-/buffer-loader-0.0.1.tgz", - "integrity": "sha1-TWd8qS3YiTEIeLAqL7z6txICTPI=", - "dev": true + "integrity": "sha1-TWd8qS3YiTEIeLAqL7z6txICTPI=" }, "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=", - "dev": true + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" }, "buffer-xor": { "version": "1.0.3", @@ -2171,8 +1999,7 @@ "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, "builtin-modules": { "version": "1.1.1", @@ -2182,20 +2009,17 @@ "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 + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -2211,8 +2035,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -2235,7 +2058,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, "requires": { "traverse": ">=0.3.0 <0.4" } @@ -2255,14 +2077,12 @@ "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, "checkpoint-store": { "version": "1.1.0", @@ -2276,7 +2096,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, "requires": { "anymatch": "^1.3.0", "async-each": "^1.0.0", @@ -2292,14 +2111,12 @@ "chownr": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, "cids": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/cids/-/cids-0.5.5.tgz", "integrity": "sha512-oU8v+N8rViFBcj5KcsXK0gbPiMFHpP/VGlGoWQXZguJsA8ZW0X47fKt0ZPIu03U8CL1Fy+R56tO79urY6MLaSw==", - "dev": true, "requires": { "class-is": "^1.1.0", "multibase": "~0.5.0", @@ -2319,14 +2136,12 @@ "class-is": { "version": "1.1.0", "resolved": "http://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "dev": true + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -2338,7 +2153,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -2346,8 +2160,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -2355,7 +2168,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -2363,14 +2175,12 @@ "cli-spinners": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=" }, "cli-table": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, "requires": { "colors": "1.0.3" }, @@ -2378,8 +2188,7 @@ "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" } } }, @@ -2387,7 +2196,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, "requires": { "colors": "^1.1.2", "object-assign": "^4.1.0", @@ -2397,20 +2205,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "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 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "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" @@ -2420,7 +2225,6 @@ "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" } @@ -2431,7 +2235,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, "requires": { "slice-ansi": "0.0.4", "string-width": "^1.0.1" @@ -2440,8 +2243,7 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "cliui": { "version": "3.2.0", @@ -2488,7 +2290,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -2498,7 +2299,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -2506,14 +2306,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "colors": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", - "dev": true + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==" }, "combined-stream": { "version": "1.0.7", @@ -2527,7 +2325,6 @@ "version": "2.8.1", "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, "requires": { "graceful-readlink": ">= 1.0.0" } @@ -2535,8 +2332,7 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "concat-map": { "version": "0.0.1", @@ -2547,7 +2343,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -2558,14 +2353,12 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "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==", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { "version": "1.6.0", @@ -2578,14 +2371,12 @@ "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { "version": "2.1.2", @@ -2595,8 +2386,7 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { "version": "2.5.7", @@ -2612,7 +2402,6 @@ "version": "2.8.4", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", - "dev": true, "requires": { "object-assign": "^4", "vary": "^1" @@ -2622,7 +2411,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" @@ -2657,7 +2445,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -2669,22 +2456,19 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" } } }, "crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" }, "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.0", @@ -2715,14 +2499,12 @@ "date-fns": { "version": "2.0.0-alpha.22", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.0.0-alpha.22.tgz", - "integrity": "sha512-ovlz0I0OFhyn9bgTfqFAUvJvo8VS9mUuOxZ6cwKwBjSx42lMpXPGolcINYZoTNAG2M4YJ3QoApiQQljQEuy/Uw==", - "dev": true + "integrity": "sha512-ovlz0I0OFhyn9bgTfqFAUvJvo8VS9mUuOxZ6cwKwBjSx42lMpXPGolcINYZoTNAG2M4YJ3QoApiQQljQEuy/Uw==" }, "death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=", - "dev": true + "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=" }, "debug": { "version": "2.6.9", @@ -2740,14 +2522,12 @@ "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=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "dev": true, "requires": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", @@ -2763,7 +2543,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -2772,7 +2551,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, "requires": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -2783,7 +2561,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, "requires": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", @@ -2795,8 +2572,7 @@ "file-type": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" } } }, @@ -2804,7 +2580,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, "requires": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", @@ -2815,7 +2590,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, "requires": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -2826,14 +2600,12 @@ "file-type": { "version": "3.9.0", "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" }, "get-stream": { "version": "2.3.1", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, "requires": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -2849,8 +2621,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deferred-leveldown": { "version": "1.2.2", @@ -2879,7 +2650,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -2889,7 +2659,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2898,7 +2667,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -2907,7 +2675,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -2917,14 +2684,12 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -2941,20 +2706,17 @@ "delimit-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=", - "dev": true + "integrity": "sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs=" }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "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" @@ -2963,8 +2725,7 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", @@ -2977,26 +2738,22 @@ "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" }, "dev-null": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", - "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=", - "dev": true + "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=" }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, "diffie-hellman": { "version": "5.0.3", "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -3012,7 +2769,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, "requires": { "is-obj": "^1.0.0" } @@ -3030,14 +2786,12 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "duplexify": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -3057,8 +2811,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { "version": "1.3.79", @@ -3068,8 +2821,7 @@ "elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" }, "elliptic": { "version": "6.4.1", @@ -3088,8 +2840,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", @@ -3103,7 +2854,6 @@ "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==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -3111,8 +2861,7 @@ "eol": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", - "dev": true + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "errno": { "version": "0.1.7", @@ -3155,8 +2904,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -3167,7 +2915,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, "requires": { "esprima": "^2.7.1", "estraverse": "^1.9.1", @@ -3180,7 +2927,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, "optional": true, "requires": { "amdefine": ">=0.0.4" @@ -3191,14 +2937,12 @@ "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" }, "estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" }, "esutils": { "version": "2.0.2", @@ -3208,8 +2952,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eth-block-tracker": { "version": "2.3.1", @@ -3239,7 +2982,6 @@ "version": "2.0.8", "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", - "dev": true, "requires": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -3248,8 +2990,7 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" } } }, @@ -3257,7 +2998,6 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.1.12.tgz", "integrity": "sha512-Ao5uiXSA5Ep5fi/YvGCsFJMelMKj0fMJkAvWYzPVe1h3Mg9Z7X3Rs51ovG9izFZH7wSqnqydiC6SKDhZWpxK2g==", - "dev": true, "requires": { "abi-decoder": "^1.0.8", "cli-table3": "^0.5.0", @@ -3277,7 +3017,6 @@ "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==", - "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -3315,7 +3054,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.7.4.tgz", "integrity": "sha512-oY3vFgr/ZUGJwB2xCjDhe/97Ir3GNVBdELIlz0fHz2tPYprATgoXck7kcW1cZfAE3XQfoojmxUQG6yOT/trjfg==", - "dev": true, "requires": { "bluebird": "^3.4.7", "eth-ens-namehash": "^2.0.0", @@ -3329,26 +3067,22 @@ "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==", - "dev": true + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" }, "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" }, "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", - "dev": true + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" }, "web3": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/web3/-/web3-0.19.1.tgz", "integrity": "sha1-52PVsRB8S8JKvU+MvuG6Nlnm6zE=", - "dev": true, "requires": { "bignumber.js": "^4.0.2", "crypto-js": "^3.1.4", @@ -3362,8 +3096,7 @@ "ethereum-ens-network-map": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ethereum-ens-network-map/-/ethereum-ens-network-map-1.0.0.tgz", - "integrity": "sha1-Q812ac6VCnieFRABEY1NZfIQ7rc=", - "dev": true + "integrity": "sha1-Q812ac6VCnieFRABEY1NZfIQ7rc=" }, "ethereumjs-abi": { "version": "0.6.5", @@ -3404,7 +3137,6 @@ "version": "6.1.6", "resolved": "https://registry.npmjs.org/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-6.1.6.tgz", "integrity": "sha512-iv2qiGBFgk9mn5Nq2enX8dG5WQ7Lk+FCqpnxfPfH4Ns8KLPwttmNOy264nh3SXDJJvcQwz/XnlLteDQVILotbg==", - "dev": true, "requires": { "source-map-support": "^0.5.3" }, @@ -3412,14 +3144,12 @@ "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 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3494,7 +3224,6 @@ "version": "4.0.0-beta.1", "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.1.tgz", "integrity": "sha512-SoYhktEbLxf+fiux5SfCEwdzWENMvgIbMZD90I62s4GZD9nEjgEWy8ZboI3hck193Vs0bDoTohDISx84f2H2tw==", - "dev": true, "requires": { "@types/node": "^10.3.2", "aes-js": "3.0.0", @@ -3511,14 +3240,12 @@ "aes-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=", - "dev": true + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" }, "elliptic": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", - "dev": true, "requires": { "bn.js": "^4.4.0", "brorand": "^1.0.1", @@ -3530,7 +3257,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" @@ -3539,20 +3265,17 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" }, "setimmediate": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=", - "dev": true + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" }, "uuid": { "version": "2.0.1", "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" } } }, @@ -3560,7 +3283,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.2.0.tgz", "integrity": "sha1-0+LCIQEVIPxJm3FoIDbBT8wvWyU=", - "dev": true, "requires": { "bn.js": "4.11.6", "js-sha3": "0.5.5", @@ -3570,14 +3292,12 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "js-sha3": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=", - "dev": true + "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" } } }, @@ -3585,7 +3305,6 @@ "version": "0.1.9", "resolved": "https://registry.npmjs.org/ethjs-contract/-/ethjs-contract-0.1.9.tgz", "integrity": "sha1-HCdmiWpW1H7B1tZhgpxJzDilUgo=", - "dev": true, "requires": { "ethjs-abi": "0.2.0", "ethjs-filter": "0.1.5", @@ -3597,7 +3316,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -3606,8 +3324,7 @@ "js-sha3": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", - "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=", - "dev": true + "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" } } }, @@ -3615,7 +3332,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ethjs-ens/-/ethjs-ens-2.0.1.tgz", "integrity": "sha1-7aCiGqy9rC9gxKAQNN8hxIpaMls=", - "dev": true, "requires": { "eth-ens-namehash": "^1.0.2", "ethereum-ens-network-map": "^1.0.0", @@ -3627,7 +3343,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-1.0.2.tgz", "integrity": "sha1-Bezda6wtf9e8XKhKmTxrrZ2k7bk=", - "dev": true, "requires": { "idna-uts46": "^1.0.1", "js-sha3": "^0.5.7" @@ -3636,22 +3351,19 @@ "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", - "dev": true + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" } } }, "ethjs-filter": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/ethjs-filter/-/ethjs-filter-0.1.5.tgz", - "integrity": "sha1-ARKvYBfCRnfjK4/esg5hlgGbdZg=", - "dev": true + "integrity": "sha1-ARKvYBfCRnfjK4/esg5hlgGbdZg=" }, "ethjs-format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/ethjs-format/-/ethjs-format-0.2.2.tgz", "integrity": "sha1-1zs6YFwuElcHn3B3/VRI6ZjOD80=", - "dev": true, "requires": { "bn.js": "4.11.6", "ethjs-schema": "0.1.5", @@ -3664,14 +3376,12 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "ethjs-util": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.3.tgz", "integrity": "sha1-39XqSkANxeQhqInK9H4IGtp4u1U=", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -3683,7 +3393,6 @@ "version": "0.2.9", "resolved": "https://registry.npmjs.org/ethjs-query/-/ethjs-query-0.2.9.tgz", "integrity": "sha1-om5rTzhpnpLzSyGE51x4lDKcQvE=", - "dev": true, "requires": { "ethjs-format": "0.2.2", "ethjs-rpc": "0.1.5" @@ -3692,20 +3401,17 @@ "ethjs-rpc": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/ethjs-rpc/-/ethjs-rpc-0.1.5.tgz", - "integrity": "sha1-CZ4i8n3EwYtpeKSF/DaxsPeWkIA=", - "dev": true + "integrity": "sha1-CZ4i8n3EwYtpeKSF/DaxsPeWkIA=" }, "ethjs-schema": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/ethjs-schema/-/ethjs-schema-0.1.5.tgz", - "integrity": "sha1-WXQOOzl3vNu5sRvDBoIB6Kzquw0=", - "dev": true + "integrity": "sha1-WXQOOzl3vNu5sRvDBoIB6Kzquw0=" }, "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "dev": true, "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -3714,8 +3420,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" } } }, @@ -3731,8 +3436,7 @@ "eventemitter3": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", - "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=", - "dev": true + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" }, "events": { "version": "3.0.0", @@ -3752,7 +3456,6 @@ "version": "0.10.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^3.0.0", @@ -3766,14 +3469,12 @@ "exit-hook": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" }, "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.0" } @@ -3782,7 +3483,6 @@ "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.1.0" } @@ -3791,7 +3491,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, "requires": { "homedir-polyfill": "^1.0.1" } @@ -3800,7 +3499,6 @@ "version": "4.16.4", "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", @@ -3837,8 +3535,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, @@ -3851,7 +3548,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -3861,7 +3557,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -3872,7 +3567,6 @@ "version": "2.2.0", "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, "requires": { "chardet": "^0.4.0", "iconv-lite": "^0.4.17", @@ -3883,7 +3577,6 @@ "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" } @@ -3914,14 +3607,12 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, "requires": { "pend": "~1.2.0" } @@ -3938,7 +3629,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -3946,20 +3636,17 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true + "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 + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", @@ -3972,7 +3659,6 @@ "version": "1.1.1", "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -3986,8 +3672,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, @@ -4003,14 +3688,12 @@ "flatmap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/flatmap/-/flatmap-0.0.3.tgz", - "integrity": "sha1-Hxik2TgVLUlZZfnJWNkjqy3WabQ=", - "dev": true + "integrity": "sha1-Hxik2TgVLUlZZfnJWNkjqy3WabQ=" }, "follow-redirects": { "version": "1.5.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", - "dev": true, "requires": { "debug": "=3.1.0" }, @@ -4019,7 +3702,6 @@ "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" } @@ -4037,14 +3719,12 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "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.1" } @@ -4067,14 +3747,12 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -4082,14 +3760,12 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { "version": "0.30.0", @@ -4107,7 +3783,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", - "dev": true, "requires": { "any-promise": "^1.3.0", "fs-extra": "^2.0.0", @@ -4119,7 +3794,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0" @@ -4136,7 +3810,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, "optional": true, "requires": { "nan": "^2.9.2", @@ -4146,24 +3819,20 @@ "abbrev": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "aproba": { "version": "1.2.0", "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", @@ -4172,13 +3841,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4187,34 +3854,28 @@ "chownr": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "debug": { "version": "2.6.9", "bundled": true, - "dev": true, "optional": true, "requires": { "ms": "2.0.0" @@ -4223,25 +3884,21 @@ "deep-extend": { "version": "0.5.1", "bundled": true, - "dev": true, "optional": true }, "delegates": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", "bundled": true, - "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", "bundled": true, - "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -4250,13 +3907,11 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "gauge": { "version": "2.7.4", "bundled": true, - "dev": true, "optional": true, "requires": { "aproba": "^1.0.3", @@ -4272,7 +3927,6 @@ "glob": { "version": "7.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "fs.realpath": "^1.0.0", @@ -4286,13 +3940,11 @@ "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.21", "bundled": true, - "dev": true, "optional": true, "requires": { "safer-buffer": "^2.1.0" @@ -4301,7 +3953,6 @@ "ignore-walk": { "version": "3.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "minimatch": "^3.0.4" @@ -4310,7 +3961,6 @@ "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, "optional": true, "requires": { "once": "^1.3.0", @@ -4319,19 +3969,16 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "ini": { "version": "1.3.5", "bundled": true, - "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4339,26 +3986,22 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "minipass": { "version": "2.2.4", "bundled": true, - "dev": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -4367,7 +4010,6 @@ "minizlib": { "version": "1.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { "minipass": "^2.2.1" @@ -4376,7 +4018,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } @@ -4384,13 +4025,11 @@ "ms": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "needle": { "version": "2.2.0", "bundled": true, - "dev": true, "optional": true, "requires": { "debug": "^2.1.2", @@ -4401,7 +4040,6 @@ "node-pre-gyp": { "version": "0.10.0", "bundled": true, - "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -4419,7 +4057,6 @@ "nopt": { "version": "4.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "abbrev": "1", @@ -4429,13 +4066,11 @@ "npm-bundled": { "version": "1.0.3", "bundled": true, - "dev": true, "optional": true }, "npm-packlist": { "version": "1.1.10", "bundled": true, - "dev": true, "optional": true, "requires": { "ignore-walk": "^3.0.1", @@ -4445,7 +4080,6 @@ "npmlog": { "version": "4.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -4456,19 +4090,16 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": 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" } @@ -4476,19 +4107,16 @@ "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.5", "bundled": true, - "dev": true, "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -4498,19 +4126,16 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "rc": { "version": "1.2.7", "bundled": true, - "dev": true, "optional": true, "requires": { "deep-extend": "^0.5.1", @@ -4522,7 +4147,6 @@ "minimist": { "version": "1.2.0", "bundled": true, - "dev": true, "optional": true } } @@ -4530,7 +4154,6 @@ "readable-stream": { "version": "2.3.6", "bundled": true, - "dev": true, "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -4545,7 +4168,6 @@ "rimraf": { "version": "2.6.2", "bundled": true, - "dev": true, "optional": true, "requires": { "glob": "^7.0.5" @@ -4553,43 +4175,36 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, - "dev": true + "bundled": true }, "safer-buffer": { "version": "2.1.2", "bundled": true, - "dev": true, "optional": true }, "sax": { "version": "1.2.4", "bundled": true, - "dev": true, "optional": true }, "semver": { "version": "5.5.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 }, "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4599,7 +4214,6 @@ "string_decoder": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true, "requires": { "safe-buffer": "~5.1.0" @@ -4608,7 +4222,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4616,13 +4229,11 @@ "strip-json-comments": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "tar": { "version": "4.4.1", "bundled": true, - "dev": true, "optional": true, "requires": { "chownr": "^1.0.1", @@ -4637,13 +4248,11 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "wide-align": { "version": "1.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "string-width": "^1.0.2" @@ -4651,13 +4260,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "yallist": { "version": "3.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, @@ -4665,7 +4272,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4687,7 +4293,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.2.1.tgz", "integrity": "sha512-JMLZj7CKxtC5M0qceQYn8FLOx+CZyfISpSRfGdwnKy3juXO8siSAodjq8hviqUY1J0tEdEGqvNm16wSUxtiRjQ==", - "dev": true, "requires": { "abstract-leveldown": "^3.0.0", "async": "^2.5.0", @@ -4730,7 +4335,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz", "integrity": "sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==", - "dev": true, "requires": { "xtend": "~4.0.0" } @@ -4739,7 +4343,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -4748,14 +4351,12 @@ "aes-js": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-0.2.4.tgz", - "integrity": "sha1-lLiBq3FyhtAV+iGeCPtmcJ3aWj0=", - "dev": true + "integrity": "sha1-lLiBq3FyhtAV+iGeCPtmcJ3aWj0=" }, "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", @@ -4766,44 +4367,37 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, "argsarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", - "integrity": "sha1-bnIHtOzbObCviDA/pa4ivajfYcs=", - "dev": true + "integrity": "sha1-bnIHtOzbObCviDA/pa4ivajfYcs=" }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -4832,20 +4426,17 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "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 + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, "requires": { "lodash": "^4.17.10" } @@ -4854,7 +4445,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, "requires": { "async": "^2.4.0" } @@ -4862,32 +4452,27 @@ "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==", - "dev": true + "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=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", - "dev": true + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" }, "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", @@ -4898,7 +4483,6 @@ "version": "6.26.3", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, "requires": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", @@ -4925,7 +4509,6 @@ "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", @@ -4940,8 +4523,7 @@ "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" } } }, @@ -4949,7 +4531,6 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, "requires": { "babel-helper-explode-assignable-expression": "^6.24.1", "babel-runtime": "^6.22.0", @@ -4960,7 +4541,6 @@ "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.22.0", @@ -4972,7 +4552,6 @@ "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", @@ -4984,7 +4563,6 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, "requires": { "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", @@ -4995,7 +4573,6 @@ "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.22.0", @@ -5008,7 +4585,6 @@ "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.22.0", "babel-types": "^6.24.1" @@ -5018,7 +4594,6 @@ "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.22.0", "babel-types": "^6.24.1" @@ -5028,7 +4603,6 @@ "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.22.0", "babel-types": "^6.24.1" @@ -5038,7 +4612,6 @@ "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", @@ -5049,7 +4622,6 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, "requires": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", @@ -5062,7 +4634,6 @@ "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", @@ -5076,7 +4647,6 @@ "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.22.0", "babel-template": "^6.24.1" @@ -5086,7 +4656,6 @@ "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.22.0" } @@ -5095,7 +4664,6 @@ "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.22.0" } @@ -5103,26 +4671,22 @@ "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" }, "babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, "requires": { "babel-helper-remap-async-to-generator": "^6.24.1", "babel-plugin-syntax-async-functions": "^6.8.0", @@ -5133,7 +4697,6 @@ "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.22.0" } @@ -5142,7 +4705,6 @@ "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.22.0" } @@ -5151,7 +4713,6 @@ "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", @@ -5164,7 +4725,6 @@ "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.24.1", "babel-helper-function-name": "^6.24.1", @@ -5181,7 +4741,6 @@ "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.22.0", "babel-template": "^6.24.1" @@ -5191,7 +4750,6 @@ "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.22.0" } @@ -5200,7 +4758,6 @@ "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.22.0", "babel-types": "^6.24.1" @@ -5210,7 +4767,6 @@ "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.22.0" } @@ -5219,7 +4775,6 @@ "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.22.0", @@ -5230,7 +4785,6 @@ "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.22.0" } @@ -5239,7 +4793,6 @@ "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.24.1", "babel-runtime": "^6.22.0", @@ -5250,7 +4803,6 @@ "version": "6.26.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, "requires": { "babel-plugin-transform-strict-mode": "^6.24.1", "babel-runtime": "^6.26.0", @@ -5262,7 +4814,6 @@ "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.22.0", @@ -5273,7 +4824,6 @@ "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.22.0", @@ -5284,7 +4834,6 @@ "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.22.0" @@ -5294,7 +4843,6 @@ "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", @@ -5308,7 +4856,6 @@ "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.22.0", "babel-types": "^6.24.1" @@ -5318,7 +4865,6 @@ "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.22.0" } @@ -5327,7 +4873,6 @@ "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.24.1", "babel-runtime": "^6.22.0", @@ -5338,7 +4883,6 @@ "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.22.0" } @@ -5347,7 +4891,6 @@ "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.22.0" } @@ -5356,7 +4899,6 @@ "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.24.1", "babel-runtime": "^6.22.0", @@ -5367,7 +4909,6 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, "requires": { "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", "babel-plugin-syntax-exponentiation-operator": "^6.8.0", @@ -5378,7 +4919,6 @@ "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.0" } @@ -5387,7 +4927,6 @@ "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.22.0", "babel-types": "^6.24.1" @@ -5397,7 +4936,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, "requires": { "babel-plugin-check-es2015-constants": "^6.22.0", "babel-plugin-syntax-trailing-function-commas": "^6.22.0", @@ -5435,7 +4973,6 @@ "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", @@ -5459,7 +4996,6 @@ "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", @@ -5472,7 +5008,6 @@ "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", @@ -5489,7 +5024,6 @@ "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", @@ -5501,7 +5035,6 @@ "version": "7.3.0", "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "dev": true, "requires": { "babel-core": "^6.0.14", "object-assign": "^4.0.0" @@ -5510,14 +5043,12 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "backoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "dev": true, "requires": { "precond": "0.2" } @@ -5530,20 +5061,17 @@ "base-x": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-1.1.0.tgz", - "integrity": "sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w=", - "dev": true + "integrity": "sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w=" }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -5552,14 +5080,12 @@ "bindings": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", - "dev": true + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" }, "bip39": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.4.0.tgz", "integrity": "sha512-1++HywqIyPtWDo7gm4v0ylYbwkLvHkuwVSKbBlZBbTCP/mnkyrlARBny906VLAwxJbC5xw9EvuJasHFIZaIFMQ==", - "dev": true, "requires": { "create-hash": "^1.1.0", "pbkdf2": "^3.0.9", @@ -5572,7 +5098,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -5581,7 +5106,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", - "dev": true, "requires": { "readable-stream": "~1.0.26" }, @@ -5590,7 +5114,6 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -5604,7 +5127,6 @@ "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, "requires": { "inherits": "~2.0.0" } @@ -5612,20 +5134,17 @@ "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "body-parser": { "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -5651,8 +5170,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.1", @@ -5663,7 +5181,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -5677,7 +5194,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -5688,7 +5204,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -5699,7 +5214,6 @@ "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.1.0", "randombytes": "^2.0.1" @@ -5709,7 +5223,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", - "dev": true, "requires": { "js-sha3": "^0.3.1" } @@ -5718,7 +5231,6 @@ "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.1.1", "browserify-rsa": "^4.0.0", @@ -5733,7 +5245,6 @@ "version": "3.2.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30000844", "electron-to-chromium": "^1.3.47" @@ -5743,7 +5254,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-3.1.0.tgz", "integrity": "sha1-1MJjiL9IBMrHFBQbGUWqR+XrJI4=", - "dev": true, "requires": { "base-x": "^1.1.0" } @@ -5752,7 +5262,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-1.3.4.tgz", "integrity": "sha1-xSVABzdJEXcU+gQsMEfrj5FRy/g=", - "dev": true, "requires": { "bs58": "^3.1.0", "create-hash": "^1.1.0" @@ -5762,7 +5271,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", - "dev": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" @@ -5772,7 +5280,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz", "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=", - "dev": true, "requires": { "buffer-alloc-unsafe": "^0.1.0", "buffer-fill": "^0.1.0" @@ -5781,56 +5288,47 @@ "buffer-alloc-unsafe": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz", - "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=", - "dev": true + "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=" }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, "buffer-fill": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-0.1.1.tgz", - "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==", - "dev": true + "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==" }, "buffer-from": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==", - "dev": true + "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==" }, "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=", - "dev": true + "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=", - "dev": true + "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 + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "bytewise": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=", - "dev": true, "requires": { "bytewise-core": "^1.2.2", "typewise": "^1.0.3" @@ -5840,7 +5338,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=", - "dev": true, "requires": { "typewise-core": "^1.2" } @@ -5849,7 +5346,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz", "integrity": "sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=", - "dev": true, "requires": { "abstract-leveldown": "^2.4.1", "lru-cache": "^3.2.0" @@ -5859,7 +5355,6 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dev": true, "requires": { "xtend": "~4.0.0" } @@ -5869,26 +5364,22 @@ "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "caniuse-lite": { "version": "1.0.30000850", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000850.tgz", - "integrity": "sha512-iHK48UR/InydhpPAzgSmsJXRAR925T0kwJhZ1wk0xRatpGMvi2f06LABg6HXfV4WW4P2wChzlcFa/TEmbTyXQA==", - "dev": true + "integrity": "sha512-iHK48UR/InydhpPAzgSmsJXRAR925T0kwJhZ1wk0xRatpGMvi2f06LABg6HXfV4WW4P2wChzlcFa/TEmbTyXQA==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "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.0.1", "deep-eql": "^0.1.3", @@ -5899,7 +5390,6 @@ "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.2", @@ -5912,7 +5402,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", - "dev": true, "requires": { "functional-red-black-tree": "^1.0.1" } @@ -5921,7 +5410,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.0.1" @@ -5931,7 +5419,6 @@ "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.1", "strip-ansi": "^3.0.1", @@ -5941,26 +5428,22 @@ "clone": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" }, "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", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "coinstring": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", - "dev": true, "requires": { "bs58": "^2.0.1", "create-hash": "^1.1.1" @@ -5969,8 +5452,7 @@ "bs58": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=", - "dev": true + "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" } } }, @@ -5978,7 +5460,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -5987,7 +5468,6 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, "requires": { "graceful-readlink": ">= 1.0.0" } @@ -6001,7 +5481,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -6012,40 +5491,34 @@ "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" } } }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "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==", - "dev": true + "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 + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-js": { "version": "2.5.6", @@ -6055,14 +5528,12 @@ "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=", - "dev": true, "requires": { "object-assign": "^4", "vary": "^1" @@ -6072,7 +5543,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" @@ -6082,7 +5552,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6095,7 +5564,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6109,7 +5577,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.1.tgz", "integrity": "sha1-lshZEE113vyWf7XbYkdOdUJrArA=", - "dev": true, "requires": { "node-fetch": "2.1.2", "whatwg-fetch": "2.0.4" @@ -6119,7 +5586,6 @@ "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.0", @@ -6137,14 +5603,12 @@ "d64": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d64/-/d64-1.0.0.tgz", - "integrity": "sha1-QAKofoUMv8n52XBrYPymE6MzbpA=", - "dev": true + "integrity": "sha1-QAKofoUMv8n52XBrYPymE6MzbpA=" }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -6153,7 +5617,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" } @@ -6161,20 +5624,17 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "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=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "dev": true, "requires": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", @@ -6189,8 +5649,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -6198,7 +5657,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -6207,7 +5665,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, "requires": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -6218,7 +5675,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, "requires": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", @@ -6230,8 +5686,7 @@ "file-type": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" } } }, @@ -6239,7 +5694,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, "requires": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", @@ -6250,7 +5704,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, "requires": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -6261,14 +5714,12 @@ "file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true + "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=", - "dev": true, "requires": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -6277,8 +5728,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -6286,7 +5736,6 @@ "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" }, @@ -6294,22 +5743,19 @@ "type-detect": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", - "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", - "dev": true + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" } } }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" }, "deferred-leveldown": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dev": true, "requires": { "abstract-leveldown": "~2.6.0" }, @@ -6318,7 +5764,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "dev": true, "requires": { "xtend": "~4.0.0" } @@ -6329,7 +5774,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, "requires": { "foreach": "^2.0.5", "object-keys": "^1.0.8" @@ -6338,34 +5782,29 @@ "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" } } }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "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" @@ -6374,14 +5813,12 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "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.0" } @@ -6395,7 +5832,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -6405,14 +5841,12 @@ "dom-walk": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" }, "drbg.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "dev": true, "requires": { "browserify-aes": "^1.0.6", "create-hash": "^1.1.2", @@ -6422,14 +5856,12 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "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=", - "dev": true, "optional": true, "requires": { "jsbn": "~0.1.0" @@ -6438,20 +5870,17 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { "version": "1.3.47", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.47.tgz", - "integrity": "sha1-dk6IfKkQTQGgrI6r7n38DizhQQQ=", - "dev": true + "integrity": "sha1-dk6IfKkQTQGgrI6r7n38DizhQQQ=" }, "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.4.0", "brorand": "^1.0.1", @@ -6465,14 +5894,12 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, "requires": { "iconv-lite": "~0.4.13" } @@ -6481,7 +5908,6 @@ "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==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -6490,7 +5916,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, "requires": { "prr": "~1.0.1" } @@ -6499,7 +5924,6 @@ "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" } @@ -6508,7 +5932,6 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, "requires": { "es-to-primitive": "^1.1.1", "function-bind": "^1.1.1", @@ -6530,8 +5953,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -6541,20 +5963,17 @@ "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eth-block-tracker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", - "dev": true, "requires": { "eth-query": "^2.1.0", "ethereumjs-tx": "^1.3.3", @@ -6568,8 +5987,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -6577,7 +5995,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.1.2.tgz", "integrity": "sha512-IuK5Iowfs6taluA/3Okmu6EfZcFMq6MQuyrUL1PrCoJstuuBr3TvVeSy3keDyxfbrjFB34nCo538I8G+qMtsbw==", - "dev": true, "requires": { "cross-fetch": "^2.1.1", "eth-json-rpc-middleware": "^1.5.0", @@ -6590,7 +6007,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "dev": true, "requires": { "async": "^2.5.0", "eth-query": "^2.1.2", @@ -6610,14 +6026,12 @@ "ethereum-common": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", - "dev": true + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" }, "ethereumjs-block": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "dev": true, "requires": { "async": "^2.0.1", "ethereum-common": "0.2.0", @@ -6632,7 +6046,6 @@ "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==", - "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -6647,7 +6060,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", - "dev": true, "requires": { "json-rpc-random-id": "^1.0.0", "xtend": "^4.0.1" @@ -6657,7 +6069,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.0.2.tgz", "integrity": "sha512-tB6E8jf/aZQ943bo3+iojl8xRe3Jzcl+9OT6v8K7kWis6PdIX19SB2vYvN849cB9G9m/XLjYFK381SgdbsnpTA==", - "dev": true, "requires": { "ethereumjs-abi": "0.6.5", "ethereumjs-util": "^5.1.1" @@ -6667,7 +6078,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.3.tgz", "integrity": "sha512-1gZpA5fKarJOVSb5OUlPnhDQuIazqAkI61zlVvf5LdG47nEgw+/qhyZnuj3CUdE/TLTKuRzPLeyXLjaB4qWTRQ==", - "dev": true, "requires": { "async": "^2.1.2", "bn.js": "^4.11.8", @@ -6687,7 +6097,6 @@ "async-eventemitter": { "version": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", "from": "async-eventemitter@github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "dev": true, "requires": { "async": "^2.4.0" } @@ -6695,14 +6104,12 @@ "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==" }, "eth-block-tracker": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-2.3.1.tgz", "integrity": "sha512-NamWuMBIl8kmkJFVj8WzGatySTzQPQag4Xr677yFxdVtIxACFbL/dQowk0MzEqIKk93U1TwY3MjVU6mOcwZnKA==", - "dev": true, "requires": { "async-eventemitter": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", "eth-query": "^2.1.0", @@ -6718,7 +6125,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "dev": true, "requires": { "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7", "ethereumjs-util": "^5.1.1" @@ -6727,13 +6133,11 @@ "ethereum-common": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", - "dev": true + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" }, "ethereumjs-abi": { "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7", "from": "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7", - "dev": true, "requires": { "bn.js": "^4.10.0", "ethereumjs-util": "^5.0.0" @@ -6743,7 +6147,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "dev": true, "requires": { "async": "^2.0.1", "ethereum-common": "0.2.0", @@ -6756,7 +6159,6 @@ "version": "2.3.4", "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.3.4.tgz", "integrity": "sha512-Y4SlzNDqxrCO58jhp98HdnZVdjOqB+HC0hoU+N/DEp1aU+hFkRX/nru5F7/HkQRPIlA6aJlQp/xIA6xZs1kspw==", - "dev": true, "requires": { "async": "^2.1.2", "async-eventemitter": "^0.2.2", @@ -6774,14 +6176,12 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "web3-provider-engine": { "version": "13.8.0", "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz", "integrity": "sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ==", - "dev": true, "requires": { "async": "^2.5.0", "clone": "^2.0.0", @@ -6809,14 +6209,12 @@ "ethereum-common": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.16.tgz", - "integrity": "sha1-mh4Wnq00q3XgifUMpRK/0PvRJlU=", - "dev": true + "integrity": "sha1-mh4Wnq00q3XgifUMpRK/0PvRJlU=" }, "ethereumjs-abi": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", - "dev": true, "requires": { "bn.js": "^4.10.0", "ethereumjs-util": "^4.3.0" @@ -6826,7 +6224,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, "requires": { "bn.js": "^4.8.0", "create-hash": "^1.1.2", @@ -6841,7 +6238,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "dev": true, "requires": { "ethereumjs-util": "^5.0.0", "rlp": "^2.0.0", @@ -6852,7 +6248,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.2.2.tgz", "integrity": "sha1-LsdTSlkCG47JuDww5JaQxuuu3aE=", - "dev": true, "requires": { "async": "^1.5.2", "ethereum-common": "0.0.16", @@ -6864,14 +6259,12 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "ethereumjs-util": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, "requires": { "bn.js": "^4.8.0", "create-hash": "^1.1.2", @@ -6886,7 +6279,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.4.tgz", "integrity": "sha512-kOgUd5jC+0tgV7t52UDECMMz9Uf+Lro+6fSpCvzWemtXfMEcwI3EOxf5mVPMRbTFkMMhuERokNNVF3jItAjidg==", - "dev": true, "requires": { "ethereum-common": "^0.0.18", "ethereumjs-util": "^5.0.0" @@ -6895,8 +6287,7 @@ "ethereum-common": { "version": "0.0.18", "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=", - "dev": true + "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" } } }, @@ -6904,7 +6295,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "dev": true, "requires": { "bn.js": "^4.11.0", "create-hash": "^1.1.2", @@ -6919,7 +6309,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.3.5.tgz", "integrity": "sha512-AJ7x44+xqyE5+UO3Nns19WkTdZfyqFZ+sEjIEpvme7Ipbe3iBU1uwCcHEdiu/yY9bdhr3IfSa/NfIKNeXPaRVQ==", - "dev": true, "requires": { "async": "^2.1.2", "async-eventemitter": "^0.2.2", @@ -6937,14 +6326,12 @@ "ethereum-common": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==", - "dev": true + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" }, "ethereumjs-block": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "dev": true, "requires": { "async": "^2.0.1", "ethereum-common": "0.2.0", @@ -6959,7 +6346,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.0.tgz", "integrity": "sha1-gnY7Fpfuenlr5xVdqd+0my+Yz9s=", - "dev": true, "requires": { "aes-js": "^0.2.3", "bs58check": "^1.0.8", @@ -6974,7 +6360,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, "requires": { "bn.js": "^4.8.0", "create-hash": "^1.1.2", @@ -6989,7 +6374,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "dev": true, "requires": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -6999,7 +6383,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.4.tgz", "integrity": "sha1-HItoeSV0RO9NPz+7rC3tEs2ZfZM=", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -7008,14 +6391,12 @@ "eventemitter3": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", - "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=", - "dev": true + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" }, "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==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -7025,7 +6406,6 @@ "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, "requires": { "accepts": "~1.3.5", "array-flatten": "1.1.1", @@ -7063,7 +6443,6 @@ "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, "requires": { "bytes": "3.0.0", "content-type": "~1.0.4", @@ -7080,20 +6459,17 @@ "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==", - "dev": true + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "raw-body": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.2", @@ -7104,14 +6480,12 @@ "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" }, "http-errors": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, "requires": { "depd": "1.1.1", "inherits": "2.0.3", @@ -7122,42 +6496,36 @@ "setprototypeof": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" } } }, "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==" }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fake-merkle-patricia-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", "integrity": "sha1-S4w6z7Ugr635hgsfFM2M40As3dM=", - "dev": true, "requires": { "checkpoint-store": "^1.1.0" } @@ -7165,20 +6533,17 @@ "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "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=", - "dev": true, "requires": { "pend": "~1.2.0" } @@ -7187,7 +6552,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", - "dev": true, "requires": { "node-fetch": "~1.7.1" }, @@ -7196,7 +6560,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" @@ -7207,14 +6570,12 @@ "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" }, "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -7228,8 +6589,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, @@ -7237,7 +6597,6 @@ "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.0.0", "pinkie-promise": "^2.0.0" @@ -7247,7 +6606,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", - "dev": true, "requires": { "is-function": "~1.0.0" } @@ -7255,20 +6613,17 @@ "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -7278,26 +6633,22 @@ "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "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.2", "jsonfile": "^2.1.0", @@ -7310,7 +6661,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", - "dev": true, "requires": { "any-promise": "^1.3.0", "fs-extra": "^2.0.0", @@ -7322,7 +6672,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0" @@ -7339,7 +6688,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -7350,38 +6698,32 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "generic-pool": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.0.4.tgz", - "integrity": "sha1-+XGN7agvoSXtXEPjQcmiFadm2aM=", - "dev": true + "integrity": "sha1-+XGN7agvoSXtXEPjQcmiFadm2aM=" }, "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 + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "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=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -7403,7 +6745,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "dev": true, "requires": { "min-document": "^2.19.0", "process": "~0.5.1" @@ -7412,14 +6753,12 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, "requires": { "decompress-response": "^3.2.0", "duplexer3": "^0.1.4", @@ -7440,14 +6779,12 @@ "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.10.3", @@ -7457,14 +6794,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "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=", - "dev": true, "requires": { "ajv": "^5.1.0", "har-schema": "^2.0.0" @@ -7474,7 +6809,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -7483,7 +6817,6 @@ "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.0.0" } @@ -7496,20 +6829,17 @@ "has-localstorage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-localstorage/-/has-localstorage-1.0.1.tgz", - "integrity": "sha1-/mJAbEdn+9bXhNrGkFkoEIuClxs=", - "dev": true + "integrity": "sha1-/mJAbEdn+9bXhNrGkFkoEIuClxs=" }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" }, "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==", - "dev": true, "requires": { "has-symbol-support-x": "^1.4.1" } @@ -7518,7 +6848,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.0.1" @@ -7528,7 +6857,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" @@ -7538,7 +6866,6 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.7.1.tgz", "integrity": "sha1-yu5L6BqneSHpCbjSKN0PKayu5jI=", - "dev": true, "requires": { "coinstring": "^2.0.0", "secp256k1": "^3.0.1" @@ -7552,14 +6879,12 @@ "heap": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true + "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=" }, "hmac-drbg": { "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.0.3", "minimalistic-assert": "^1.0.0", @@ -7570,7 +6895,6 @@ "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.0", "os-tmpdir": "^1.0.1" @@ -7579,14 +6903,12 @@ "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -7597,14 +6919,12 @@ "http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", - "dev": true + "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=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -7615,7 +6935,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/humble-localstorage/-/humble-localstorage-1.4.2.tgz", "integrity": "sha1-0Fqw1SbE7b3b98amDfb/WAUoNGk=", - "dev": true, "requires": { "has-localstorage": "^1.0.1", "localstorage-memory": "^1.0.1" @@ -7625,7 +6944,6 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -7633,14 +6951,12 @@ "ieee754": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", - "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", - "dev": true + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==" }, "immediate": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", - "dev": true + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" }, "inflight": { "version": "1.0.6", @@ -7660,7 +6976,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -7668,26 +6983,22 @@ "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 + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ipaddr.js": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "dev": true + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "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.0.0" } @@ -7706,7 +7017,6 @@ "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.0" } @@ -7714,14 +7024,12 @@ "is-fn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=", - "dev": true + "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=" }, "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.0" } @@ -7729,38 +7037,32 @@ "is-function": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" }, "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=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, "requires": { "has": "^1.0.1" } @@ -7768,14 +7070,12 @@ "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=", - "dev": true + "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-symbol": { "version": "1.0.1", @@ -7785,32 +7085,27 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "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 + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "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==", - "dev": true, "requires": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" @@ -7820,7 +7115,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/js-scrypt/-/js-scrypt-0.2.0.tgz", "integrity": "sha1-emK3AbRhbnCtDN5URiequ5nX/jk=", - "dev": true, "requires": { "generic-pool": "~2.0.4" } @@ -7828,33 +7122,28 @@ "js-sha3": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=", - "dev": true + "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 + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, "optional": true }, "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, "json-rpc-engine": { "version": "3.7.3", "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.7.3.tgz", "integrity": "sha512-+FO3UWu/wafh/+MZ6BXy0HZU+f5plwUn82FgxpC0scJkEh5snOjFrAAtqCITPDfvfLHRUFOG5pQDUx2pspfERQ==", - "dev": true, "requires": { "async": "^2.0.1", "babel-preset-env": "^1.3.2", @@ -7868,7 +7157,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", - "dev": true, "requires": { "inherits": "^2.0.1" } @@ -7876,26 +7164,22 @@ "json-rpc-random-id": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=", - "dev": true + "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=" }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "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", "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" } @@ -7903,20 +7187,17 @@ "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=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonfile": { "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.6" } @@ -7924,14 +7205,12 @@ "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -7943,7 +7222,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "dev": true, "requires": { "bindings": "^1.2.1", "inherits": "^2.0.3", @@ -7955,7 +7233,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", - "dev": true, "requires": { "browserify-sha3": "^0.0.1", "sha3": "^1.1.0" @@ -7965,7 +7242,6 @@ "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.9" } @@ -7974,7 +7250,6 @@ "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" } @@ -7982,14 +7257,12 @@ "level-codec": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==", - "dev": true + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" }, "level-errors": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "dev": true, "requires": { "errno": "~0.1.1" } @@ -7998,7 +7271,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", - "dev": true, "requires": { "inherits": "^2.0.1", "level-errors": "^1.0.3", @@ -8010,7 +7282,6 @@ "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -8024,7 +7295,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", - "dev": true, "requires": { "ltgt": "^2.1.2" } @@ -8033,7 +7303,6 @@ "version": "6.6.2", "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.2.tgz", "integrity": "sha512-+hptqmFYPKFju9QG4F6scvx3ZXkhrSmmhYui+hPzRn/jiC3DJ6VNZRKsIhGMpeajVBWfRV7XiysUThrJ/7PgXQ==", - "dev": true, "requires": { "bytewise": "~1.1.0", "levelup": "~0.19.0", @@ -8049,7 +7318,6 @@ "version": "0.12.4", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "dev": true, "requires": { "xtend": "~3.0.0" }, @@ -8057,8 +7325,7 @@ "xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" } } }, @@ -8066,7 +7333,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", - "dev": true, "requires": { "abstract-leveldown": "~0.12.1" } @@ -8075,7 +7341,6 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.19.1.tgz", "integrity": "sha1-86anIFJyxLXzXkEv8ASgOgrt9Qs=", - "dev": true, "requires": { "bl": "~0.8.1", "deferred-leveldown": "~0.2.0", @@ -8089,28 +7354,24 @@ "xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" } } }, "ltgt": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz", - "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=", - "dev": true + "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=" }, "prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -8121,8 +7382,7 @@ "semver": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.1.tgz", - "integrity": "sha1-oykqNz5vPgeY2gsgZBuanFvEfhk=", - "dev": true + "integrity": "sha1-oykqNz5vPgeY2gsgZBuanFvEfhk=" } } }, @@ -8130,7 +7390,6 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", - "dev": true, "requires": { "readable-stream": "~1.0.15", "xtend": "~2.1.1" @@ -8140,7 +7399,6 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -8152,7 +7410,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, "requires": { "object-keys": "~0.4.0" } @@ -8163,7 +7420,6 @@ "version": "1.3.9", "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dev": true, "requires": { "deferred-leveldown": "~1.2.1", "level-codec": "~7.0.0", @@ -8178,7 +7434,6 @@ "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.2", "parse-json": "^2.2.0", @@ -8190,8 +7445,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -8199,7 +7453,6 @@ "version": "0.6.7", "resolved": "https://registry.npmjs.org/localstorage-down/-/localstorage-down-0.6.7.tgz", "integrity": "sha1-0Hmak7MebF+lGI7AYkLrHM6dbRU=", - "dev": true, "requires": { "abstract-leveldown": "0.12.3", "argsarray": "0.0.1", @@ -8214,7 +7467,6 @@ "version": "0.12.3", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.3.tgz", "integrity": "sha1-EWsexcdxDvei1XBnaLvbREC+EHA=", - "dev": true, "requires": { "xtend": "~3.0.0" } @@ -8222,28 +7474,24 @@ "xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" } } }, "localstorage-memory": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/localstorage-memory/-/localstorage-memory-1.0.2.tgz", - "integrity": "sha1-zUqPIQ5V3VGckp9LTMgoKbWPmlE=", - "dev": true + "integrity": "sha1-zUqPIQ5V3VGckp9LTMgoKbWPmlE=" }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" }, "lodash.merge": { "version": "4.6.1", @@ -8253,14 +7501,12 @@ "looper": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", - "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=", - "dev": true + "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=" }, "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.0" } @@ -8268,14 +7514,12 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "dev": true, "requires": { "pseudomap": "^1.0.1" } @@ -8283,14 +7527,12 @@ "ltgt": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", - "dev": true + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, "requires": { "pify": "^3.0.0" } @@ -8299,7 +7541,6 @@ "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.0", "inherits": "^2.0.1" @@ -8308,14 +7549,12 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memdown": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", - "dev": true, "requires": { "abstract-leveldown": "~2.7.1", "functional-red-black-tree": "^1.0.1", @@ -8329,7 +7568,6 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dev": true, "requires": { "xtend": "~4.0.0" } @@ -8339,20 +7577,17 @@ "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merkle-patricia-tree": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz", "integrity": "sha512-Qp9Mpb3xazznXzzGQBqHbqCpT2AR9joUOHYYPiQjYCarrdCPCnLWXo4BFv77y4xN26KR224xoU1n/qYY7RYYgw==", - "dev": true, "requires": { "async": "^1.4.2", "ethereumjs-util": "^5.0.0", @@ -8367,22 +7602,19 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "miller-rabin": { "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.0.0", "brorand": "^1.0.1" @@ -8391,20 +7623,17 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-types": { "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, "requires": { "mime-db": "~1.33.0" } @@ -8412,14 +7641,12 @@ "mimic-response": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", - "dev": true + "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=", - "dev": true, "requires": { "dom-walk": "^0.1.0" } @@ -8427,14 +7654,12 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "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", @@ -8461,7 +7686,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, "requires": { "mkdirp": "*" } @@ -8510,14 +7734,12 @@ "mock-fs": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.5.0.tgz", - "integrity": "sha512-qqudNfOX7ZmX9vm1WIAU+gWlmxVNAnwY6UG3RkFutNywmRCUGP83tujP6IxX2DS1TmcaEZBOhYwDuYEmJYE+3w==", - "dev": true + "integrity": "sha512-qqudNfOX7ZmX9vm1WIAU+gWlmxVNAnwY6UG3RkFutNywmRCUGP83tujP6IxX2DS1TmcaEZBOhYwDuYEmJYE+3w==" }, "mout": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=", - "dev": true + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" }, "ms": { "version": "2.0.0", @@ -8528,7 +7750,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "requires": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -8538,32 +7759,27 @@ "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" }, "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=", - "dev": true + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "node-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", - "dev": true + "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" }, "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.1.4", "is-builtin-module": "^1.0.0", @@ -8574,14 +7790,12 @@ "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 + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "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=", - "dev": true, "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -8590,32 +7804,27 @@ "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true + "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": "1.5.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.5.0.tgz", - "integrity": "sha512-UmOFbHbwvv+XHj7BerrhVq+knjceBdkvU5AriwLMvhv2qi+e7DJzxfBeFpILEjVzCp+xA+W/pIf06RGPWlZNfw==", - "dev": true + "integrity": "sha512-UmOFbHbwvv+XHj7BerrhVq+knjceBdkvU5AriwLMvhv2qi+e7DJzxfBeFpILEjVzCp+xA+W/pIf06RGPWlZNfw==" }, "object-keys": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" }, "oboe": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", - "dev": true, "requires": { "http-https": "^1.0.0" } @@ -8624,7 +7833,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -8640,14 +7848,12 @@ "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 + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "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" } @@ -8655,26 +7861,22 @@ "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 + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "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==", - "dev": true + "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-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, "requires": { "p-finally": "^1.0.0" } @@ -8683,7 +7885,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -8696,7 +7897,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", - "dev": true, "requires": { "for-each": "^0.3.2", "trim": "0.0.1" @@ -8706,7 +7906,6 @@ "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.2.0" } @@ -8714,14 +7913,12 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "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.0" } @@ -8734,20 +7931,17 @@ "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 + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "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=", - "dev": true + "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.2", "pify": "^2.0.0", @@ -8757,8 +7951,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -8766,7 +7959,6 @@ "version": "3.0.16", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -8778,32 +7970,27 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "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.0" } @@ -8811,14 +7998,12 @@ "precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "dev": true + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" }, "prepend-file": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/prepend-file/-/prepend-file-1.3.1.tgz", "integrity": "sha1-g7FuC0rBkB/OiNvZRaIvTMgd9Xk=", - "dev": true, "requires": { "tmp": "0.0.31" } @@ -8826,32 +8011,27 @@ "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "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 + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "promise-to-callback": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", - "dev": true, "requires": { "is-fn": "^1.0.0", "set-immediate-shim": "^1.0.1" @@ -8861,7 +8041,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "dev": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" @@ -8870,20 +8049,17 @@ "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", - "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -8895,20 +8071,17 @@ "pull-cat": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", - "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=", - "dev": true + "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=" }, "pull-defer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.2.tgz", - "integrity": "sha1-CIew/7MK8ypW2+z6csFnInHwexM=", - "dev": true + "integrity": "sha1-CIew/7MK8ypW2+z6csFnInHwexM=" }, "pull-level": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", - "dev": true, "requires": { "level-post": "^1.0.7", "pull-cat": "^1.1.9", @@ -8923,7 +8096,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", - "dev": true, "requires": { "pull-cat": "^1.1.9", "pull-stream": "^3.4.0" @@ -8932,20 +8104,17 @@ "pull-pushable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", - "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=", - "dev": true + "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=" }, "pull-stream": { "version": "3.6.8", "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.8.tgz", - "integrity": "sha512-wQUIptQBcM0rFsUhZoEpOT3vUn73DtTGVq3NQ86c4T7iMOSprDzeKWYq2ksXnbwiuExTKvt+8G9fzNLFQuiO+A==", - "dev": true + "integrity": "sha512-wQUIptQBcM0rFsUhZoEpOT3vUn73DtTGVq3NQ86c4T7iMOSprDzeKWYq2ksXnbwiuExTKvt+8G9fzNLFQuiO+A==" }, "pull-window": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", - "dev": true, "requires": { "looper": "^2.0.0" } @@ -8953,20 +8122,17 @@ "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.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, "requires": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -8977,7 +8143,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.0" } @@ -8986,7 +8151,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -8995,20 +8159,17 @@ "randomhex": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.3", @@ -9020,7 +8181,6 @@ "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.0.0", "normalize-package-data": "^2.3.2", @@ -9031,7 +8191,6 @@ "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.0.0", "read-pkg": "^1.0.0" @@ -9041,7 +8200,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9055,14 +8213,12 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -9072,8 +8228,7 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, "regenerator-runtime": { "version": "0.11.1", @@ -9084,7 +8239,6 @@ "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.18.0", "babel-types": "^6.19.0", @@ -9095,7 +8249,6 @@ "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.2.1", "regjsgen": "^0.2.0", @@ -9105,14 +8258,12 @@ "regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" }, "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" } @@ -9121,7 +8272,6 @@ "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.0" } @@ -9130,7 +8280,6 @@ "version": "2.87.0", "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.6.0", @@ -9157,34 +8306,29 @@ "uuid": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" } } }, "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 + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "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 + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=" }, "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 + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "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" } @@ -9193,7 +8337,6 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "dev": true, "requires": { "through": "~2.3.4" } @@ -9202,7 +8345,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.0.5" } @@ -9211,7 +8353,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -9220,32 +8361,27 @@ "rlp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", - "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=", - "dev": true + "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=" }, "rustbn.js": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.1.2.tgz", - "integrity": "sha512-bAkNqSHYdJdFsBC7Z11JgzYktL31HIpB2o70jZcGiL1U1TVtPyvaVhDrGWwS8uZtaqwW2k6NOPGZCqW/Dgh5Lg==", - "dev": true + "integrity": "sha512-bAkNqSHYdJdFsBC7Z11JgzYktL31HIpB2o70jZcGiL1U1TVtPyvaVhDrGWwS8uZtaqwW2k6NOPGZCqW/Dgh5Lg==" }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "scrypt": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "dev": true, "requires": { "nan": "^2.0.8" } @@ -9254,7 +8390,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", - "dev": true, "requires": { "scrypt": "^6.0.2", "scryptsy": "^1.2.1" @@ -9264,7 +8399,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "dev": true, "requires": { "pbkdf2": "^3.0.3" } @@ -9273,7 +8407,6 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.5.0.tgz", "integrity": "sha512-e5QIJl8W7Y4tT6LHffVcZAxJjvpgE5Owawv6/XCYPQljE9aP2NFFddQ8OYMKhdLshNu88FfL3qCN3/xYkXGRsA==", - "dev": true, "requires": { "bindings": "^1.2.1", "bip66": "^1.1.3", @@ -9288,14 +8421,12 @@ "seedrandom": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", - "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=", - "dev": true + "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" }, "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=", - "dev": true, "requires": { "commander": "~2.8.1" } @@ -9303,20 +8434,17 @@ "semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", - "dev": true + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -9336,8 +8464,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, @@ -9345,7 +8472,6 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -9357,7 +8483,6 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dev": true, "requires": { "body-parser": "^1.16.0", "cors": "^2.8.1", @@ -9369,32 +8494,27 @@ "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 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "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 + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "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.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -9404,7 +8524,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.2.tgz", "integrity": "sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=", - "dev": true, "requires": { "nan": "2.10.0" } @@ -9412,20 +8531,17 @@ "shebang-loader": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/shebang-loader/-/shebang-loader-0.0.1.tgz", - "integrity": "sha1-pAAEldRMzu++xjQ157FphWn6Uuw=", - "dev": true + "integrity": "sha1-pAAEldRMzu++xjQ157FphWn6Uuw=" }, "simple-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" }, "simple-get": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "dev": true, "requires": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -9435,14 +8551,12 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "solc": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", - "dev": true, "requires": { "fs-extra": "^0.30.0", "memorystream": "^0.3.1", @@ -9455,7 +8569,6 @@ "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.1.1", @@ -9478,14 +8591,12 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "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.6" } @@ -9494,7 +8605,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -9503,14 +8613,12 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -9519,14 +8627,12 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "sshpk": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -9542,14 +8648,12 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stream-to-pull-stream": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.2.tgz", "integrity": "sha1-dXYJrhzr0zx0MtSvvjH/eGULnd4=", - "dev": true, "requires": { "looper": "^3.0.0", "pull-stream": "^3.2.3" @@ -9558,22 +8662,19 @@ "looper": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", - "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=", - "dev": true + "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=" } } }, "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=", - "dev": true + "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.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -9584,7 +8685,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.0", @@ -9594,14 +8694,12 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, "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.0.0" } @@ -9610,7 +8708,6 @@ "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.0" } @@ -9619,7 +8716,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, "requires": { "is-natural-number": "^4.0.1" } @@ -9628,7 +8724,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "dev": true, "requires": { "is-hex-prefixed": "1.0.0" } @@ -9636,14 +8731,12 @@ "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 + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "swarm-js": { "version": "0.1.37", "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", - "dev": true, "requires": { "bluebird": "^3.5.0", "buffer": "^5.0.5", @@ -9664,7 +8757,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0" @@ -9676,7 +8768,6 @@ "version": "4.9.0", "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.0.tgz", "integrity": "sha512-j0jO9BiScfqtPBb9QmPLL0qvxXMz98xjkMb7x8lKipFlJZwNJkqkWPou+NU4V6T9RnVh1kuSthLE8gLrN8bBfw==", - "dev": true, "requires": { "deep-equal": "~1.0.1", "defined": "~1.0.0", @@ -9696,8 +8787,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -9705,7 +8795,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -9716,7 +8805,6 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", - "dev": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.1.0", @@ -9731,7 +8819,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -9743,7 +8830,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", - "dev": true, "requires": { "bluebird": "^2.9.34", "commander": "^2.8.1", @@ -9755,8 +8841,7 @@ "bluebird": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" } } }, @@ -9764,7 +8849,6 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, "requires": { "os-tmpdir": "^1.0.0", "rimraf": "~2.2.6" @@ -9773,8 +8857,7 @@ "rimraf": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" } } }, @@ -9782,7 +8865,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "dev": true, "requires": { "any-promise": "^1.0.0" } @@ -9791,7 +8873,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" } @@ -9799,14 +8880,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -9815,20 +8894,17 @@ "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=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "tiny-queue": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.0.tgz", - "integrity": "sha1-xJ/LXIdVW+G0pd9+uHEB1beLydw=", - "dev": true + "integrity": "sha1-xJ/LXIdVW+G0pd9+uHEB1beLydw=" }, "tmp": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, "requires": { "os-tmpdir": "~1.0.1" } @@ -9836,20 +8912,17 @@ "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, "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 + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "tough-cookie": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, "requires": { "punycode": "^1.4.1" } @@ -9857,26 +8930,22 @@ "treeify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true + "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 + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -9885,20 +8954,17 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, "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 + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -9907,14 +8973,12 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "requires": { "is-typedarray": "^1.0.0" } @@ -9923,7 +8987,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=", - "dev": true, "requires": { "typewise-core": "^1.2.0" } @@ -9931,26 +8994,22 @@ "typewise-core": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", - "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=", - "dev": true + "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=" }, "typewiselite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", - "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=", - "dev": true + "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=" }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "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==", - "dev": true, "requires": { "buffer": "^3.0.1", "through": "^2.3.6" @@ -9959,14 +9018,12 @@ "base64-js": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" }, "buffer": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, "requires": { "base64-js": "0.0.8", "ieee754": "^1.1.4", @@ -9976,34 +9033,29 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "unorm": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=", - "dev": true + "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "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=", - "dev": true, "requires": { "prepend-http": "^1.0.1" } @@ -10011,20 +9063,17 @@ "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=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, "utf8": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", - "dev": true + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" }, "util": { "version": "0.10.3", @@ -10044,26 +9093,22 @@ "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=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" }, "validate-npm-package-license": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -10072,14 +9117,12 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -10090,7 +9133,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.34.tgz", "integrity": "sha1-NH5WG3hAmMtVYzFfSQR5odkfKrE=", - "dev": true, "requires": { "web3-bzz": "1.0.0-beta.34", "web3-core": "1.0.0-beta.34", @@ -10105,7 +9147,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.34.tgz", "integrity": "sha1-Bo03d3q2Xlxg+OyLmlDP5FJ3kpw=", - "dev": true, "requires": { "got": "7.1.0", "swarm-js": "0.1.37", @@ -10116,7 +9157,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.34.tgz", "integrity": "sha1-EhvoVV6fsA0sXQXd0zgdDJ5GmH4=", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.34", "web3-core-method": "1.0.0-beta.34", @@ -10128,7 +9168,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz", "integrity": "sha1-sWjaANPhnhVrwVriAyA91N/uLQM=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-eth-iban": "1.0.0-beta.34", @@ -10139,7 +9178,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.34.tgz", "integrity": "sha1-7BY8iixJD6AqfsFVWfpzB/x8xt0=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.34", @@ -10152,7 +9190,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.34.tgz", "integrity": "sha1-pPT6Z4S7KT6CxglgrltWqUzQPtw=", - "dev": true, "requires": { "any-promise": "1.3.0", "eventemitter3": "1.1.1" @@ -10162,7 +9199,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.34.tgz", "integrity": "sha1-Afj2zyrmtvC3DDi64e90G1urIVw=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.34", @@ -10175,7 +9211,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.34.tgz", "integrity": "sha1-n+0UQDPyIcPPIQYDAv/a9e8t4t4=", - "dev": true, "requires": { "eventemitter3": "1.1.1", "underscore": "1.8.3", @@ -10186,7 +9221,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.34.tgz", "integrity": "sha1-dAhgAIUMb+b1Ne9Jg31tS7YRMmg=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.34", @@ -10206,7 +9240,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz", "integrity": "sha1-A0Uz46ovfln/MXk+rqaFwO1a9no=", - "dev": true, "requires": { "bn.js": "4.11.6", "underscore": "1.8.3", @@ -10218,7 +9251,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.34.tgz", "integrity": "sha1-4JFC7uzHl6w0WbdemyOUbTaV8zM=", - "dev": true, "requires": { "any-promise": "1.3.0", "crypto-browserify": "3.12.0", @@ -10236,7 +9268,6 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -10246,8 +9277,7 @@ "uuid": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" } } }, @@ -10255,7 +9285,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.34.tgz", "integrity": "sha1-nbs4+udkOoCEJ6IBgEcOx0FckeY=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.34", @@ -10271,7 +9300,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz", "integrity": "sha1-mvRYYFhnzPdOqXmq8yazi6alugw=", - "dev": true, "requires": { "bn.js": "4.11.6", "web3-utils": "1.0.0-beta.34" @@ -10281,7 +9309,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.34.tgz", "integrity": "sha1-mvuhZzQuveVCC81YlcP2w0OI8gU=", - "dev": true, "requires": { "web3-core": "1.0.0-beta.34", "web3-core-helpers": "1.0.0-beta.34", @@ -10294,7 +9321,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.34.tgz", "integrity": "sha1-QnzqL0MYgUScjjjVIykPFz+f9j0=", - "dev": true, "requires": { "web3-core": "1.0.0-beta.34", "web3-core-method": "1.0.0-beta.34", @@ -10305,7 +9331,6 @@ "version": "14.0.6", "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz", "integrity": "sha512-tr5cGSyxfSC/JqiUpBlJtfZpwQf1yAA8L/zy1C6fDFm0ntR974pobJ4v4676atpZne4Ze5VFy3kPPahHe9gQiQ==", - "dev": true, "requires": { "async": "^2.5.0", "backoff": "^2.5.0", @@ -10334,7 +9359,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "dev": true, "requires": { "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7", "ethereumjs-util": "^5.1.1" @@ -10343,7 +9367,6 @@ "ethereumjs-abi": { "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7", "from": "ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7", - "dev": true, "requires": { "bn.js": "^4.10.0", "ethereumjs-util": "^5.0.0" @@ -10353,7 +9376,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.0.tgz", "integrity": "sha512-c18dMeW+PEQdDFzkhDsnBAlS4Z8KGStBQQUcQ5mf7Nf689jyGk0594L+i9RaQuf4gog6SvWLJorz2NfSaqxZ7w==", - "dev": true, "requires": { "async-limiter": "~1.0.0" } @@ -10364,7 +9386,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.34.tgz", "integrity": "sha1-5WG1K7tDdmKCAH1AKFv+NVDCfno=", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.34", "xhr2": "0.1.4" @@ -10374,7 +9395,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.34.tgz", "integrity": "sha1-obd/GjBtc2SanAOQUuQMtxMo0Ao=", - "dev": true, "requires": { "oboe": "2.1.3", "underscore": "1.8.3", @@ -10385,7 +9405,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.34.tgz", "integrity": "sha1-fecPG4Py3jZHZ3IVa+z+9uNRbrM=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.34", @@ -10395,7 +9414,6 @@ "websocket": { "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", "from": "websocket@git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "dev": true, "requires": { "debug": "^2.2.0", "nan": "^2.3.3", @@ -10409,7 +9427,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.34.tgz", "integrity": "sha1-l1Bh1x6uxCzO5Xb3vY9w8DhEr+A=", - "dev": true, "requires": { "web3-core": "1.0.0-beta.34", "web3-core-method": "1.0.0-beta.34", @@ -10421,7 +9438,6 @@ "version": "1.0.0-beta.34", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.34.tgz", "integrity": "sha1-lBH8OarvOcpOBhafdiKX2f8CCXA=", - "dev": true, "requires": { "bn.js": "4.11.6", "eth-lib": "0.1.27", @@ -10435,8 +9451,7 @@ "utf8": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", - "dev": true + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" } } }, @@ -10444,7 +9459,6 @@ "version": "1.0.26", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.26.tgz", "integrity": "sha512-fjcrYDPIQxpTnqFQ9JjxUQcdvR89MFAOjPBlF+vjOt49w/XW4fJknUoMz/mDIn2eK1AdslVojcaOxOqyZZV8rw==", - "dev": true, "requires": { "debug": "^2.2.0", "nan": "^2.3.3", @@ -10455,26 +9469,22 @@ "whatwg-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, "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 + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, "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 + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" }, "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.1", "strip-ansi": "^3.0.1" @@ -10489,7 +9499,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, "requires": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -10500,7 +9509,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "dev": true, "requires": { "global": "~4.3.0", "is-function": "^1.0.1", @@ -10512,7 +9520,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, "requires": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -10527,7 +9534,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "dev": true, "requires": { "xhr-request": "^1.0.1" } @@ -10535,32 +9541,27 @@ "xhr2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=", - "dev": true + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" }, "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", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "dev": true + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, "requires": { "camelcase": "^3.0.0", "cliui": "^3.2.0", @@ -10581,7 +9582,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, "requires": { "camelcase": "^3.0.0" } @@ -10592,7 +9592,6 @@ "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.0.6" @@ -10602,7 +9601,6 @@ "version": "2.9.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "dev": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.0.1" @@ -10619,7 +9617,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-4.0.8.tgz", "integrity": "sha512-PmANK1xElIHlHH2tXfOoTnSDUjX1X3GvKK6ZyLbUnSCCn1pADwu67eVWttuPzJWrXDDT2MfO6uAaKILOFfitmA==", - "dev": true, "requires": { "global-modules": "1.0.0" } @@ -10627,20 +9624,17 @@ "get-port": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", - "dev": true + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" }, "get-stream": { "version": "3.0.0", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", @@ -10653,8 +9647,7 @@ "git-clone": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz", - "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=", - "dev": true + "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=" }, "glob": { "version": "7.1.3", @@ -10673,7 +9666,6 @@ "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.0" @@ -10683,7 +9675,6 @@ "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.0" } @@ -10701,7 +9692,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, "requires": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -10711,14 +9701,12 @@ "global-modules-path": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", - "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", - "dev": true + "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==" }, "global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, "requires": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -10736,7 +9724,6 @@ "version": "0.4.17", "resolved": "https://registry.npmjs.org/go-ipfs/-/go-ipfs-0.4.17.tgz", "integrity": "sha512-5/YLMMq+/1fmeMMwDjX+nPPsUpN3BtpHWNhrx0l7q69lvgr1y8sF+j7RVbMU5YkDW5cP5swd+9OZ2lhOxLhlEA==", - "dev": true, "requires": { "go-ipfs-dep": "0.4.17", "go-platform": "^1.0.0", @@ -10750,7 +9737,6 @@ "version": "0.4.17", "resolved": "https://registry.npmjs.org/go-ipfs-dep/-/go-ipfs-dep-0.4.17.tgz", "integrity": "sha512-zEYDcU2uFmWTQ3iph8vbq3dkob+rGJ/yJcSX3aYovl2mNeBeTF/dEoXGh9IdJA7tCAEfRQVWhLVuRIYwGZxdVQ==", - "dev": true, "requires": { "go-platform": "^1.0.0", "gunzip-maybe": "^1.4.1", @@ -10762,14 +9748,12 @@ "go-platform": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/go-platform/-/go-platform-1.0.0.tgz", - "integrity": "sha1-sF/2uSdAB9JGsWQjXwP39qWWJsc=", - "dev": true + "integrity": "sha1-sF/2uSdAB9JGsWQjXwP39qWWJsc=" }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, "requires": { "decompress-response": "^3.2.0", "duplexer3": "^0.1.4", @@ -10795,20 +9779,17 @@ "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.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" }, "gunzip-maybe": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz", "integrity": "sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g==", - "dev": true, "requires": { "browserify-zlib": "^0.1.4", "is-deflate": "^1.0.0", @@ -10822,7 +9803,6 @@ "version": "4.0.12", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", - "dev": true, "requires": { "async": "^2.5.0", "optimist": "^0.6.1", @@ -10833,14 +9813,12 @@ "minimist": { "version": "0.0.10", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" @@ -10849,8 +9827,7 @@ "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 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -10887,14 +9864,12 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" }, "has-symbols": { "version": "1.0.0", @@ -10905,7 +9880,6 @@ "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==", - "dev": true, "requires": { "has-symbol-support-x": "^1.4.1" } @@ -10914,7 +9888,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -10924,8 +9897,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -10933,7 +9905,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -10943,7 +9914,6 @@ "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.0.2" }, @@ -10952,7 +9922,6 @@ "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.5" } @@ -10963,7 +9932,6 @@ "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.5" } @@ -11001,8 +9969,7 @@ "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "hmac-drbg": { "version": "1.0.1", @@ -11032,7 +9999,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, "requires": { "parse-passwd": "^1.0.0" } @@ -11046,7 +10012,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-7.0.0.tgz", "integrity": "sha1-gvClBr6UJzLsje6+6A50bvVzbbo=", - "dev": true, "requires": { "@types/concat-stream": "^1.6.0", "@types/node": "^9.4.1", @@ -11059,8 +10024,7 @@ "@types/node": { "version": "9.6.35", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.35.tgz", - "integrity": "sha512-h5zvHS8wXHGa+Gcqs9K8vqCgOtqjr0+NqG/DDJmQIX1wpR9HivAfgV8bjcD3mGM4bPfQw5Aneb2Pn8355L83jA==", - "dev": true + "integrity": "sha512-h5zvHS8wXHGa+Gcqs9K8vqCgOtqjr0+NqG/DDJmQIX1wpR9HivAfgV8bjcD3mGM4bPfQw5Aneb2Pn8355L83jA==" } } }, @@ -11068,7 +10032,6 @@ "version": "1.6.3", "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -11079,14 +10042,12 @@ "http-https": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", - "dev": true + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" }, "http-response-object": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.1.tgz", "integrity": "sha512-6L0Fkd6TozA8kFSfh9Widst0wfza3U1Ex2RjJ6zNDK0vR1U1auUR6jY4Nn2Xl7CCy0ikFmxW1XcspVpb9RvwTg==", - "dev": true, "requires": { "@types/node": "^9.3.0" }, @@ -11094,8 +10055,7 @@ "@types/node": { "version": "9.6.35", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.35.tgz", - "integrity": "sha512-h5zvHS8wXHGa+Gcqs9K8vqCgOtqjr0+NqG/DDJmQIX1wpR9HivAfgV8bjcD3mGM4bPfQw5Aneb2Pn8355L83jA==", - "dev": true + "integrity": "sha512-h5zvHS8wXHGa+Gcqs9K8vqCgOtqjr0+NqG/DDJmQIX1wpR9HivAfgV8bjcD3mGM4bPfQw5Aneb2Pn8355L83jA==" } } }, @@ -11121,7 +10081,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/idna-uts46/-/idna-uts46-1.1.0.tgz", "integrity": "sha1-vgmLK3wcq/vvh6i4D2JvrDc2auo=", - "dev": true, "requires": { "punycode": "^2.1.0" }, @@ -11129,8 +10088,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" } } }, @@ -11138,7 +10096,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dev": true, "requires": { "punycode": "2.1.0" }, @@ -11146,22 +10103,19 @@ "punycode": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" } } }, "ieee754": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, "ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, "immediate": { "version": "3.2.3", @@ -11172,7 +10126,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, "requires": { "repeating": "^2.0.0" } @@ -11194,14 +10147,12 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", - "dev": true, "requires": { "ansi-escapes": "^1.1.0", "chalk": "^1.0.0", @@ -11221,20 +10172,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "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 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "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" @@ -11244,7 +10192,6 @@ "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" } @@ -11256,8 +10203,7 @@ "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, "invariant": { "version": "2.2.4", @@ -11275,14 +10221,12 @@ "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ip-address": { "version": "5.8.9", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-5.8.9.tgz", "integrity": "sha512-7ay355oMN34iXhET1BmCJVsHjOTSItEEIIpOs38qUC23AIhOy+xIPnkrTuEFjeLMrTJ7m8KMXWgWfy/2Vn9sDw==", - "dev": true, "requires": { "jsbn": "1.1.0", "lodash.find": "^4.6.0", @@ -11296,22 +10240,19 @@ "jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=", - "dev": true + "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" } } }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, "ipfs-api": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/ipfs-api/-/ipfs-api-21.0.0.tgz", "integrity": "sha512-6K9703/C0ipjeuIA288Ee0MbBHVSkt0bvAvcqPVhPzkgVKBgyMdj/K7fIPppyFG7coUX+FpgCNl91CqUURzxwQ==", - "dev": true, "requires": { "async": "^2.6.0", "big.js": "^5.0.3", @@ -11354,7 +10295,6 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/ipfs-block/-/ipfs-block-0.7.1.tgz", "integrity": "sha512-ABZS9J/+OaDwc10zu6pIVdxWnOD/rkPEravk7FRVuRep7/zKSjffNhO/WuHN7Ex+MOBMz7mty0e+i6xjGnRsRQ==", - "dev": true, "requires": { "cids": "^0.5.3", "class-is": "^1.1.0" @@ -11364,7 +10304,6 @@ "version": "0.14.10", "resolved": "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.14.10.tgz", "integrity": "sha512-wtdZzLN21fg8JPYzu2gM4bNUDX65G9exXqsMAwnkeJUIeeA8Ot2BxB0ZY0wo5N26IudXNJnb4rAJKmZlsOykuw==", - "dev": true, "requires": { "async": "^2.6.1", "bs58": "^4.0.1", @@ -11382,7 +10321,6 @@ "version": "0.4.7", "resolved": "https://registry.npmjs.org/is-ipfs/-/is-ipfs-0.4.7.tgz", "integrity": "sha512-u+LzRRA5s2XMJnQ65R60SvRKb8R04ZITbbRMWBESLyLPlJ+J78zaXZzNZBIf4SQ0pnWioMNCpiIV4hw098MgOQ==", - "dev": true, "requires": { "bs58": "4.0.1", "cids": "~0.5.5", @@ -11396,7 +10334,6 @@ "version": "0.13.0", "resolved": "http://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.13.0.tgz", "integrity": "sha512-i3r1TBec/xYmC5bcpPiIs3OyUAU3iy53OdRdxqawKoWTQPjYB+TyQ4w+otT66Y0sMcw70O0wH3GFAfPmQgFn+g==", - "dev": true, "requires": { "asn1.js": "^5.0.0", "async": "^2.6.0", @@ -11417,7 +10354,6 @@ "version": "0.4.8", "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-0.4.8.tgz", "integrity": "sha512-LCc4lfxmTJOHKIjZjFNgvmfB6nXS/ErLInT9uwU8udFrRm2PH+aTPk3mfCREKmCiSHOlCWiv2O8rlnBx+OjlMw==", - "dev": true, "requires": { "async": "^2.6.0", "blakejs": "^1.1.0", @@ -11433,7 +10369,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-5.0.0.tgz", "integrity": "sha512-IMEo+iCv53MT8c/6SQWbJpJUEENTYr6qp7o635BKJLQG2nkxOIO9LSEFhF5e56Az+DkmI6HGAAjp69AT7Sjulw==", - "dev": true, "requires": { "bs58": "^4.0.1", "class-is": "^1.1.0", @@ -11449,7 +10384,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.4.0.tgz", "integrity": "sha512-fnYvZJWDn3eSJ7EeWvS8zbOpRwuyPHpDggSnqGXkQMvYED5NdO9nyqnZboGvAT+r/60J8KZ09tW8YJHkS22sFw==", - "dev": true, "requires": { "base-x": "3.0.4" } @@ -11458,7 +10392,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-0.5.1.tgz", "integrity": "sha512-Ft5lQNcJCfsns1QN1TDXqPZrrNwBYqIokprYJR2h2Jj01x0GFcYmJYAqHvme6vJoyI3XptEcmZpdr9g5Oy7q3Q==", - "dev": true, "requires": { "async": "^2.6.1", "blakejs": "^1.1.0", @@ -11472,7 +10405,6 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/peer-info/-/peer-info-0.14.1.tgz", "integrity": "sha512-I9K+q7sisU0gg5ej6ekbhgolwlcm1tc2wDtLmumptoLYx0DkIT8WVHtgoTnupYwRRqcYADtwddFdiXfb8QFqzg==", - "dev": true, "requires": { "lodash.uniqby": "^4.7.0", "mafmt": "^6.0.0", @@ -11484,7 +10416,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-4.0.0.tgz", "integrity": "sha512-zUatrOCfBd/tJNOSoJ10d2EI2FDXB9PyPZhqUMdXE9mOyR3C+HLuOjga2Ga/eChwvEHIpTYRMoIKF2Nv7af2qQ==", - "dev": true, "requires": { "bs58": "^4.0.1", "class-is": "^1.1.0", @@ -11502,7 +10433,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -11511,8 +10441,7 @@ "tweetnacl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.0.tgz", - "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=", - "dev": true + "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=" } } }, @@ -11520,7 +10449,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/ipfs-block/-/ipfs-block-0.6.1.tgz", "integrity": "sha512-28dgGsb2YsYnFs+To4cVBX8e/lTCb8eWDzGhN5csj3a/sHMOYrHeK8+Ez0IV67CI3lqKGuG/ZD01Cmd6JUvKrQ==", - "dev": true, "requires": { "cids": "^0.5.2" } @@ -11529,7 +10457,6 @@ "version": "0.1.15", "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-0.1.15.tgz", "integrity": "sha512-fjtwBDsIlNags4btHIdAJtE02K4KqEMOhV9GEFVv1M2JO2STS23v2LAtX5qb1EOU5VrjtKlm/JIBH3XDRdAyGQ==", - "dev": true, "requires": { "protons": "^1.0.0" } @@ -11538,7 +10465,6 @@ "version": "0.12.1", "resolved": "https://registry.npmjs.org/ipld-dag-cbor/-/ipld-dag-cbor-0.12.1.tgz", "integrity": "sha512-m0BR/zR9sKIuY/PydppkpwO0S9w7+ob0as7RN3jQmMIpW9m8HW7hLznvtp1xpYZknH7efUhIaMHgaQP43E5IWQ==", - "dev": true, "requires": { "async": "^2.6.0", "borc": "^2.0.2", @@ -11554,7 +10480,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-0.5.1.tgz", "integrity": "sha512-Ft5lQNcJCfsns1QN1TDXqPZrrNwBYqIokprYJR2h2Jj01x0GFcYmJYAqHvme6vJoyI3XptEcmZpdr9g5Oy7q3Q==", - "dev": true, "requires": { "async": "^2.6.1", "blakejs": "^1.1.0", @@ -11567,8 +10492,7 @@ "traverse": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" } } }, @@ -11576,7 +10500,6 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/ipld-dag-pb/-/ipld-dag-pb-0.11.4.tgz", "integrity": "sha512-A514Bt4z44bxhPQVzmBFMJsV3res92eBaDX0snzVsLLasBPNh4Z7He8N2mwSeAX9bJNywRBlJbHMQPwC45rqXw==", - "dev": true, "requires": { "async": "^2.6.0", "bs58": "^4.0.1", @@ -11596,7 +10519,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -11610,7 +10532,6 @@ "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.0.0" } @@ -11618,8 +10539,7 @@ "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 + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", @@ -11637,14 +10557,12 @@ "is-circular": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-circular/-/is-circular-1.0.2.tgz", - "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==", - "dev": true + "integrity": "sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==" }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -11657,14 +10575,12 @@ "is-deflate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=", - "dev": true + "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=" }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -11674,22 +10590,19 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, "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 + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "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" } @@ -11697,14 +10610,12 @@ "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 + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "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 + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-finite": { "version": "1.0.2", @@ -11736,7 +10647,6 @@ "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" } @@ -11744,8 +10654,7 @@ "is-gzip": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", - "dev": true + "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=" }, "is-hex-prefixed": { "version": "1.0.0", @@ -11756,7 +10665,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-ipfs/-/is-ipfs-0.3.2.tgz", "integrity": "sha512-82V1j4LMkYy7H4seQQzOWqo7FiW3I64/1/ryo3dhtWKfOvm7ZolLMRQQfGKs4OXWauh5rAkPnamVcRISHwhmpQ==", - "dev": true, "requires": { "bs58": "^4.0.1", "cids": "~0.5.1", @@ -11766,14 +10674,12 @@ "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=", - "dev": true + "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.0.2" } @@ -11781,20 +10687,17 @@ "is-obj": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, "is-observable": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "dev": true, "requires": { "symbol-observable": "^0.2.2" }, @@ -11802,22 +10705,19 @@ "symbol-observable": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", - "dev": true + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=" } } }, "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=", - "dev": true + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" }, @@ -11825,34 +10725,29 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, "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 + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", - "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=", - "dev": true + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" }, "is-pull-stream": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/is-pull-stream/-/is-pull-stream-0.0.0.tgz", - "integrity": "sha1-o7w9HG0wVRUcRr3m85nv7SFEDKk=", - "dev": true + "integrity": "sha1-o7w9HG0wVRUcRr3m85nv7SFEDKk=" }, "is-regex": { "version": "1.0.4", @@ -11865,8 +10760,7 @@ "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=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", @@ -11894,14 +10788,12 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "0.0.1", @@ -11911,14 +10803,12 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "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" }, @@ -11926,8 +10816,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=" } } }, @@ -11949,7 +10838,6 @@ "version": "0.4.5", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, "requires": { "abbrev": "1.0.x", "async": "1.x", @@ -11970,14 +10858,12 @@ "async": { "version": "1.5.2", "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -11989,20 +10875,17 @@ "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 + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" }, "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" } @@ -12010,8 +10893,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" } } }, @@ -12019,7 +10901,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, "requires": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" @@ -12028,14 +10909,12 @@ "js-sha3": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.7.0.tgz", - "integrity": "sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA==", - "dev": true + "integrity": "sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA==" }, "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" }, "js-tokens": { "version": "3.0.2", @@ -12046,7 +10925,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -12055,8 +10933,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" } } }, @@ -12123,7 +11000,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", "integrity": "sha1-py8hfcSvxGKf/1/rME3BvVGi89I=", - "dev": true, "requires": { "delimit-stream": "0.1.0" } @@ -12172,7 +11048,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", - "dev": true, "requires": { "browserify-sha3": "^0.0.1", "sha3": "^1.1.0" @@ -12181,14 +11056,12 @@ "keypair": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/keypair/-/keypair-1.0.1.tgz", - "integrity": "sha1-dgNxknCvtlZO04oiCHoG/Jqk6hs=", - "dev": true + "integrity": "sha1-dgNxknCvtlZO04oiCHoG/Jqk6hs=" }, "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.5" } @@ -12294,7 +11167,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -12304,7 +11176,6 @@ "version": "0.12.1", "resolved": "http://registry.npmjs.org/libp2p-crypto/-/libp2p-crypto-0.12.1.tgz", "integrity": "sha512-1/z8rxZ0DcQNreZhEsl7PnLr7DWOioSvYbKBLGkRwNRiNh1JJLgh0PdTySBb44wkrOGT+TxcGRd7iq3/X6Wxwg==", - "dev": true, "requires": { "asn1.js": "^5.0.0", "async": "^2.6.0", @@ -12324,8 +11195,7 @@ "tweetnacl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.0.tgz", - "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=", - "dev": true + "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=" } } }, @@ -12333,7 +11203,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/libp2p-crypto-secp256k1/-/libp2p-crypto-secp256k1-0.2.2.tgz", "integrity": "sha1-DdUh8Yq8TjahUuJOmzYwewrpzwU=", - "dev": true, "requires": { "async": "^2.5.0", "multihashing-async": "~0.4.6", @@ -12346,7 +11215,6 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "dev": true, "requires": { "chalk": "^1.1.3", "cli-truncate": "^0.2.1", @@ -12371,7 +11239,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" @@ -12380,8 +11247,7 @@ "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" } } }, @@ -12389,7 +11255,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/listr-input/-/listr-input-0.1.3.tgz", "integrity": "sha512-dvjSD1MrWGXxxPixpMQlSBmkyqhJrPxGo30un25k/vlvFOWZj70AauU+YkEh7CA8vmpkE6Wde37DJDmqYqF39g==", - "dev": true, "requires": { "inquirer": "^3.3.0", "rxjs": "^5.5.2", @@ -12399,20 +11264,17 @@ "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -12421,7 +11283,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -12432,7 +11293,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -12453,14 +11313,12 @@ "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 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "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" @@ -12470,7 +11328,6 @@ "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" } @@ -12479,7 +11336,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -12489,14 +11345,12 @@ "listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=" }, "listr-update-renderer": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", - "dev": true, "requires": { "chalk": "^1.1.3", "cli-truncate": "^0.2.1", @@ -12512,7 +11366,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" @@ -12521,8 +11374,7 @@ "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" } } }, @@ -12530,7 +11382,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", - "dev": true, "requires": { "chalk": "^1.1.3", "cli-cursor": "^1.0.2", @@ -12542,7 +11393,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, "requires": { "restore-cursor": "^1.0.1" } @@ -12550,14 +11400,12 @@ "date-fns": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==" }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" @@ -12566,14 +11414,12 @@ "onetime": { "version": "1.1.0", "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, "requires": { "exit-hook": "^1.0.0", "onetime": "^1.0.0" @@ -12597,7 +11443,6 @@ "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" @@ -12606,8 +11451,7 @@ "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 + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, @@ -12624,56 +11468,47 @@ "lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", - "dev": true + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" }, "lodash.find": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", - "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", - "dev": true + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=" }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", - "dev": true + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" }, "lodash.max": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.max/-/lodash.max-4.0.1.tgz", - "integrity": "sha1-hzVWbGGLNan3YFILSHrnllivE2o=", - "dev": true + "integrity": "sha1-hzVWbGGLNan3YFILSHrnllivE2o=" }, "lodash.merge": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "dev": true + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" }, "lodash.padstart": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", - "dev": true + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" }, "lodash.repeat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-4.1.0.tgz", - "integrity": "sha1-/H3oEx2MisB+S0n3T/6CnR8r7EQ=", - "dev": true + "integrity": "sha1-/H3oEx2MisB+S0n3T/6CnR8r7EQ=" }, "lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", - "dev": true + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=" }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, "requires": { "chalk": "^1.0.0" } @@ -12682,7 +11517,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, "requires": { "ansi-escapes": "^1.0.0", "cli-cursor": "^1.0.2" @@ -12692,7 +11526,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, "requires": { "restore-cursor": "^1.0.1" } @@ -12700,14 +11533,12 @@ "onetime": { "version": "1.1.0", "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, "requires": { "exit-hook": "^1.0.0", "onetime": "^1.0.0" @@ -12718,8 +11549,7 @@ "looper": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", - "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=", - "dev": true + "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=" }, "loose-envify": { "version": "1.4.0", @@ -12733,7 +11563,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.3", "is-promise": "^2.1.0", @@ -12745,28 +11574,24 @@ "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -12781,7 +11606,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/mafmt/-/mafmt-6.0.2.tgz", "integrity": "sha512-+ydrVDp/bo2GPTNN0378AFX66IJBlbrIBY0RaILWC9AICr9kviX5fonHeKsZiesEuuYetQeRhnZPL/J2k8vHAA==", - "dev": true, "requires": { "multiaddr": "^5.0.0" }, @@ -12790,7 +11614,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-5.0.0.tgz", "integrity": "sha512-IMEo+iCv53MT8c/6SQWbJpJUEENTYr6qp7o635BKJLQG2nkxOIO9LSEFhF5e56Az+DkmI6HGAAjp69AT7Sjulw==", - "dev": true, "requires": { "bs58": "^4.0.1", "class-is": "^1.1.0", @@ -12808,7 +11631,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, "requires": { "pify": "^3.0.0" }, @@ -12816,22 +11638,19 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, "requires": { "object-visit": "^1.0.0" } @@ -12840,7 +11659,6 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", - "dev": true, "requires": { "buffers": "~0.1.1", "readable-stream": "~1.0.0" @@ -12850,7 +11668,6 @@ "version": "1.0.34", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -12863,8 +11680,7 @@ "math-random": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" }, "md5.js": { "version": "1.3.5", @@ -12879,14 +11695,12 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "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.0.0" } @@ -12922,8 +11736,7 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merkle-patricia-tree": { "version": "2.3.2", @@ -12950,14 +11763,12 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "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", @@ -12978,7 +11789,6 @@ "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.0.0", "brorand": "^1.0.1" @@ -12987,8 +11797,7 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "mime-db": { "version": "1.36.0", @@ -13006,14 +11815,12 @@ "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 + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "min-document": { "version": "2.19.0", @@ -13050,7 +11857,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -13060,7 +11866,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -13086,7 +11891,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, "requires": { "mkdirp": "*" } @@ -13095,7 +11899,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, "requires": { "browser-stdout": "1.3.0", "commander": "2.11.0", @@ -13112,14 +11915,12 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "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" } @@ -13128,7 +11929,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13141,14 +11941,12 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "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" } @@ -13158,14 +11956,12 @@ "mock-fs": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz", - "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA==", - "dev": true + "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA==" }, "mout": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=", - "dev": true + "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=" }, "ms": { "version": "2.0.0", @@ -13176,7 +11972,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/multiaddr/-/multiaddr-3.1.0.tgz", "integrity": "sha512-QhmsD/TufS5KB7brd1rkzLz2sJqybQlDT9prroiWacaw61DtHoe2X/vcAnOu8mZc7s7ZzevFPvY5tzv3yjBXlQ==", - "dev": true, "requires": { "bs58": "^4.0.1", "ip": "^1.1.5", @@ -13190,7 +11985,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.5.0.tgz", "integrity": "sha512-7epKiK8/UBzraYZvOuZa8FH/00hMfTnzTy1OQol1YBU2csAYA7rwWh+iue9plXRmVFBGvmVKMuo0oq5sD47kvw==", - "dev": true, "requires": { "base-x": "3.0.4" } @@ -13199,7 +11993,6 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.2.7.tgz", "integrity": "sha512-96xc9zs7bsclMW0Po9ERnRFqcsWHY8OZ8JW/I8DeHG58YYJZy3cBGI00Ze7hz9Ix56DNHMTSxEj9cgoZByruMg==", - "dev": true, "requires": { "varint": "^5.0.0" } @@ -13208,7 +12001,6 @@ "version": "0.4.14", "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.14.tgz", "integrity": "sha512-V/g/EIN6nALXfS/xHUAgtfPP3mn3sPIF/i9beuGKf25QXS2QZYCpeVJbDPEannkz32B2fihzCe2D/KMrbcmefg==", - "dev": true, "requires": { "bs58": "^4.0.1", "varint": "^5.0.0" @@ -13218,7 +12010,6 @@ "version": "0.4.8", "resolved": "https://registry.npmjs.org/multihashing-async/-/multihashing-async-0.4.8.tgz", "integrity": "sha512-LCc4lfxmTJOHKIjZjFNgvmfB6nXS/ErLInT9uwU8udFrRm2PH+aTPk3mfCREKmCiSHOlCWiv2O8rlnBx+OjlMw==", - "dev": true, "requires": { "async": "^2.6.0", "blakejs": "^1.1.0", @@ -13231,20 +12022,17 @@ "murmurhash3js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/murmurhash3js/-/murmurhash3js-3.0.1.tgz", - "integrity": "sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg=", - "dev": true + "integrity": "sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg=" }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "requires": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -13259,14 +12047,12 @@ "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=", - "dev": true + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -13284,40 +12070,34 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, "natives": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", - "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", - "dev": true + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" }, "ncp": { "version": "2.0.0", "resolved": "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" }, "ndjson": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=", - "dev": true, "requires": { "json-stringify-safe": "^5.0.1", "minimist": "^1.2.0", @@ -13328,14 +12108,12 @@ "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-fetch": { "version": "1.7.3", @@ -13349,14 +12127,12 @@ "node-forge": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", - "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==", - "dev": true + "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==" }, "nodeify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/nodeify/-/nodeify-1.0.1.tgz", "integrity": "sha1-ZKtpp7268DzhB7TwM1yHwLnpGx0=", - "dev": true, "requires": { "is-promise": "~1.0.0", "promise": "~1.3.0" @@ -13366,7 +12142,6 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, "requires": { "abbrev": "1" } @@ -13386,7 +12161,6 @@ "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.0.1" } @@ -13395,7 +12169,6 @@ "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.0" } @@ -13409,7 +12182,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "dev": true, "requires": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -13418,8 +12190,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" } } }, @@ -13437,7 +12208,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -13448,7 +12218,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -13469,7 +12238,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, "requires": { "isobject": "^3.0.0" }, @@ -13477,8 +12245,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -13486,7 +12253,6 @@ "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.4", "is-extendable": "^0.1.1" @@ -13496,7 +12262,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "requires": { "isobject": "^3.0.1" }, @@ -13504,8 +12269,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -13513,7 +12277,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", - "dev": true, "requires": { "http-https": "^1.0.0" } @@ -13522,7 +12285,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -13539,7 +12301,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -13548,7 +12309,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", - "dev": true, "requires": { "babel-polyfill": "6.23.0", "chalk": "1.1.3", @@ -13562,7 +12322,6 @@ "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "dev": true, "requires": { "babel-runtime": "^6.22.0", "core-js": "^2.4.0", @@ -13573,7 +12332,6 @@ "version": "1.6.3", "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", - "dev": true, "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" @@ -13583,7 +12341,6 @@ "version": "4.0.2", "resolved": "http://registry.npmjs.org/opn/-/opn-4.0.2.tgz", "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "dev": true, "requires": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -13592,8 +12349,7 @@ "regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" } } }, @@ -13601,7 +12357,6 @@ "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", - "dev": true, "requires": { "is-wsl": "^1.1.0" } @@ -13610,7 +12365,6 @@ "version": "0.3.7", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "dev": true, "requires": { "wordwrap": "~0.0.2" } @@ -13619,7 +12373,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", @@ -13632,8 +12385,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" } } }, @@ -13641,7 +12393,6 @@ "version": "0.2.3", "resolved": "http://registry.npmjs.org/ora/-/ora-0.2.3.tgz", "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true, "requires": { "chalk": "^1.1.1", "cli-cursor": "^1.0.2", @@ -13653,7 +12404,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, "requires": { "restore-cursor": "^1.0.1" } @@ -13661,14 +12411,12 @@ "onetime": { "version": "1.1.0", "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, "requires": { "exit-hook": "^1.0.0", "onetime": "^1.0.0" @@ -13679,8 +12427,7 @@ "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 + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=" }, "os-homedir": { "version": "1.0.2", @@ -13703,26 +12450,22 @@ "over": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", - "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=", - "dev": true + "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=" }, "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==", - "dev": true + "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.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -13731,7 +12474,6 @@ "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.1.0" } @@ -13739,14 +12481,12 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" }, "p-timeout": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, "requires": { "p-finally": "^1.0.0" } @@ -13754,20 +12494,17 @@ "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 + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "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 + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" }, "parse-asn1": { "version": "5.1.1", "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", @@ -13780,7 +12517,6 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -13792,14 +12528,12 @@ "parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", - "dev": true + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" }, "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.0", @@ -13827,20 +12561,17 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-exists": { "version": "2.1.0", @@ -13858,8 +12589,7 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", @@ -13869,8 +12599,7 @@ "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=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "1.1.0", @@ -13898,7 +12627,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "duplexify": "^3.5.0", @@ -13909,7 +12637,6 @@ "version": "0.10.7", "resolved": "https://registry.npmjs.org/peer-id/-/peer-id-0.10.7.tgz", "integrity": "sha512-VEpMFcL9q0NQijmR0jsj38OGbY4yzaWMEareVkDahopmlNT+Cpsot8btPgsgBBApP9NiZj2Enwvh8rZN30ocQw==", - "dev": true, "requires": { "async": "^2.6.0", "libp2p-crypto": "~0.12.1", @@ -13921,7 +12648,6 @@ "version": "0.11.6", "resolved": "https://registry.npmjs.org/peer-info/-/peer-info-0.11.6.tgz", "integrity": "sha512-xrVNiAF1IhVJNGEg5P2UQN+subaEkszT8YkC3zdy06MK0vTH3cMHB+HH+ZURkoSLssc3HbK58ecXeKpQ/4zq5w==", - "dev": true, "requires": { "lodash.uniqby": "^4.7.0", "multiaddr": "^3.0.2", @@ -13931,14 +12657,12 @@ "pegjs": { "version": "0.10.0", "resolved": "http://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", - "dev": true + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" }, "pem-jwk": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pem-jwk/-/pem-jwk-1.5.1.tgz", "integrity": "sha1-eoY3/S9nqCflfAxC4cI8P9Us+wE=", - "dev": true, "requires": { "asn1.js": "1.0.3" }, @@ -13947,7 +12671,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-1.0.3.tgz", "integrity": "sha1-KBuj7B8kSP52X5Kk7s+IP+E2S1Q=", - "dev": true, "requires": { "bn.js": "^1.0.0", "inherits": "^2.0.1", @@ -13958,7 +12681,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-1.3.0.tgz", "integrity": "sha1-DbTL+W+PI7dC9by50ap6mZSgXoM=", - "dev": true, "optional": true } } @@ -13966,8 +12688,7 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "performance-now": { "version": "2.1.0", @@ -13995,26 +12716,22 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "private": { "version": "0.1.8", @@ -14035,7 +12752,6 @@ "version": "1.3.0", "resolved": "http://registry.npmjs.org/promise/-/promise-1.3.0.tgz", "integrity": "sha1-5cyaTIJ45GZP/twBx9qEhCsEAXU=", - "dev": true, "requires": { "is-promise": "~1" } @@ -14052,20 +12768,17 @@ "promisify-es6": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/promisify-es6/-/promisify-es6-1.0.3.tgz", - "integrity": "sha512-N9iVG+CGJsI4b4ZGazjwLnxErD2d9Pe4DPvvXSxYA9tFNu8ymXME4Qs5HIQ0LMJpNM7zj+m0NlNnNeqFpKzqnA==", - "dev": true + "integrity": "sha512-N9iVG+CGJsI4b4ZGazjwLnxErD2d9Pe4DPvvXSxYA9tFNu8ymXME4Qs5HIQ0LMJpNM7zj+m0NlNnNeqFpKzqnA==" }, "protocol-buffers-schema": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz", - "integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w==", - "dev": true + "integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w==" }, "protons": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/protons/-/protons-1.0.1.tgz", "integrity": "sha512-+0ZKnfVs+4c43tbAQ5j0Mck8wPcLnlxUYzKQoB4iDW4ocdXGnN4P+0dDbgX1FTpoY9+7P2Tn2scJyHHqj+S/lQ==", - "dev": true, "requires": { "protocol-buffers-schema": "^3.3.1", "safe-buffer": "^5.1.1", @@ -14077,7 +12790,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.8.0" @@ -14091,8 +12803,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.29", @@ -14103,7 +12814,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -14116,38 +12826,32 @@ "pull-defer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz", - "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==", - "dev": true + "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==" }, "pull-pushable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", - "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=", - "dev": true + "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=" }, "pull-stream": { "version": "3.6.9", "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.9.tgz", - "integrity": "sha512-hJn4POeBrkttshdNl0AoSCVjMVSuBwuHocMerUdoZ2+oIUzrWHFTwJMlbHND7OiKLVgvz6TFj8ZUVywUMXccbw==", - "dev": true + "integrity": "sha512-hJn4POeBrkttshdNl0AoSCVjMVSuBwuHocMerUdoZ2+oIUzrWHFTwJMlbHND7OiKLVgvz6TFj8ZUVywUMXccbw==" }, "pull-stream-to-stream": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/pull-stream-to-stream/-/pull-stream-to-stream-1.3.4.tgz", - "integrity": "sha1-P4HYIWvRjSv9GhmBkEcRgOJzg5k=", - "dev": true + "integrity": "sha1-P4HYIWvRjSv9GhmBkEcRgOJzg5k=" }, "pull-traverse": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pull-traverse/-/pull-traverse-1.0.3.tgz", - "integrity": "sha1-dPtde+f6a9enjpeTPhmbeUWGaTg=", - "dev": true + "integrity": "sha1-dPtde+f6a9enjpeTPhmbeUWGaTg=" }, "pullstream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", - "dev": true, "requires": { "over": ">= 0.0.5 < 1", "readable-stream": "~1.0.31", @@ -14159,7 +12863,6 @@ "version": "1.0.34", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -14173,7 +12876,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14183,7 +12885,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -14204,7 +12905,6 @@ "version": "5.1.1", "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, "requires": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -14215,7 +12915,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/radspec/-/radspec-1.0.1.tgz", "integrity": "sha512-+jWaWFylMQpsaf+SYGAP+y2qZTG4asbhKFH5BfCwehiyX1e/8Efnu3OFSMTf1zCJreKH8DWQ/JZY/Ib4W89Slg==", - "dev": true, "requires": { "@babel/runtime": "^7.1.2", "bn.js": "4.11.6", @@ -14228,14 +12927,12 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "web3": { "version": "1.0.0-beta.33", "resolved": "http://registry.npmjs.org/web3/-/web3-1.0.0-beta.33.tgz", "integrity": "sha1-xgIbV2mSdyY3HBhLhoRFMRsTkpU=", - "dev": true, "requires": { "web3-bzz": "1.0.0-beta.33", "web3-core": "1.0.0-beta.33", @@ -14252,7 +12949,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "dev": true, "requires": { "is-number": "^4.0.0", "kind-of": "^6.0.0", @@ -14262,14 +12958,12 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -14285,7 +12979,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -14294,20 +12987,17 @@ "randomhex": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, "requires": { "bytes": "3.0.0", "http-errors": "1.6.3", @@ -14319,7 +13009,6 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -14378,7 +13067,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -14388,20 +13076,17 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -14419,7 +13104,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -14430,7 +13114,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -14445,7 +13128,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -14454,7 +13136,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -14463,7 +13144,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -14472,7 +13152,6 @@ "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.5" } @@ -14483,7 +13162,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -14492,7 +13170,6 @@ "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.5" } @@ -14503,7 +13180,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -14513,8 +13189,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -14522,7 +13197,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -14538,7 +13212,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -14547,7 +13220,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -14558,7 +13230,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -14570,7 +13241,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -14581,7 +13251,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -14590,7 +13259,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -14599,7 +13267,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -14610,7 +13277,6 @@ "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.0.2" }, @@ -14619,7 +13285,6 @@ "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.5" } @@ -14629,20 +13294,17 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -14665,7 +13327,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, "requires": { "resolve": "^1.1.6" } @@ -14694,7 +13355,6 @@ "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" } @@ -14703,7 +13363,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -14735,20 +13394,17 @@ "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 + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "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 + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", @@ -14762,7 +13418,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", "integrity": "sha1-1AgrTURZgDZkD7c93qAe1T20nrw=", - "dev": true, "requires": { "req-from": "^2.0.0" } @@ -14771,7 +13426,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", "integrity": "sha1-10GI5H+TeW9Kpx327jWuaJ8+DnA=", - "dev": true, "requires": { "resolve-from": "^3.0.0" } @@ -14807,7 +13461,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "dev": true, "requires": { "lodash": "^4.13.1" } @@ -14816,7 +13469,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", - "dev": true, "requires": { "request-promise-core": "1.1.1", "stealthy-require": "^1.1.0", @@ -14850,7 +13502,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -14859,20 +13510,17 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -14889,8 +13537,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "rimraf": { "version": "2.6.2", @@ -14921,7 +13568,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/rsa-pem-to-jwk/-/rsa-pem-to-jwk-1.1.3.tgz", "integrity": "sha1-JF52vbfnI0z+58oDLTG1TDj6uY4=", - "dev": true, "requires": { "object-assign": "^2.0.0", "rsa-unpack": "0.0.6" @@ -14930,8 +13576,7 @@ "object-assign": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" } } }, @@ -14939,7 +13584,6 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/rsa-unpack/-/rsa-unpack-0.0.6.tgz", "integrity": "sha1-9Q69VqYoN45jHylxYQJs6atO3bo=", - "dev": true, "requires": { "optimist": "~0.3.5" } @@ -14948,7 +13592,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "^2.1.0" }, @@ -14956,8 +13599,7 @@ "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" } } }, @@ -14969,20 +13611,17 @@ "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, "requires": { "rx-lite": "*" } @@ -14991,7 +13630,6 @@ "version": "5.5.12", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, "requires": { "symbol-observable": "1.0.1" } @@ -15013,7 +13651,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, "requires": { "ret": "~0.1.10" } @@ -15034,8 +13671,7 @@ "scrypt-js": { "version": "2.0.3", "resolved": "http://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", - "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=", - "dev": true + "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" }, "scrypt.js": { "version": "0.2.0", @@ -15073,7 +13709,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, "requires": { "commander": "~2.8.1" } @@ -15092,7 +13727,6 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -15112,8 +13746,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, @@ -15121,7 +13754,6 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -15133,7 +13765,6 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dev": true, "requires": { "body-parser": "^1.16.0", "cors": "^2.8.1", @@ -15156,7 +13787,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -15168,7 +13798,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -15178,14 +13807,12 @@ "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.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.4.11", @@ -15200,7 +13827,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=", - "dev": true, "requires": { "charenc": ">= 0.0.1", "crypt": ">= 0.0.1" @@ -15210,7 +13836,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.2.tgz", "integrity": "sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=", - "dev": true, "requires": { "nan": "2.10.0" }, @@ -15218,8 +13843,7 @@ "nan": { "version": "2.10.0", "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" } } }, @@ -15227,7 +13851,6 @@ "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" } @@ -15235,14 +13858,12 @@ "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 + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, "requires": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -15252,14 +13873,12 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "signed-varint": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", - "dev": true, "requires": { "varint": "~5.0.0" } @@ -15267,14 +13886,12 @@ "simple-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" }, "simple-get": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "dev": true, "requires": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -15289,14 +13906,12 @@ "slice-ansi": { "version": "0.0.4", "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" }, "slice-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", - "dev": true, "requires": { "readable-stream": "~1.0.31" }, @@ -15305,7 +13920,6 @@ "version": "1.0.34", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -15319,7 +13933,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -15335,7 +13948,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -15344,7 +13956,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -15355,7 +13966,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -15366,7 +13976,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -15375,7 +13984,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -15384,7 +13992,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -15393,7 +14000,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -15403,14 +14009,12 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -15418,7 +14022,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "requires": { "kind-of": "^3.2.0" } @@ -15426,14 +14029,12 @@ "sol-digger": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", - "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=", - "dev": true + "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=" }, "sol-explore": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.2.tgz", - "integrity": "sha1-Q66MQZ/TrAVqBfip0fsQIs1B7MI=", - "dev": true + "integrity": "sha1-Q66MQZ/TrAVqBfip0fsQIs1B7MI=" }, "solc": { "version": "0.4.25", @@ -15451,7 +14052,6 @@ "version": "0.5.11", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.5.11.tgz", "integrity": "sha512-qikdsSi6+9XbfvwA0aI7HUVpF9fIFNqRWTw23M89GMDY+b6Gj0wWU9IngJS0fimoZIAdEp3bfChxvpfVcrUesg==", - "dev": true, "requires": { "death": "^1.1.0", "ethereumjs-testrpc-sc": "6.1.6", @@ -15469,7 +14069,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-1.0.1.tgz", "integrity": "sha1-DXOurpJm5penj3l2AZZ352rPD/8=", - "dev": true, "requires": { "req-from": "^1.0.1" } @@ -15478,7 +14077,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/req-from/-/req-from-1.0.1.tgz", "integrity": "sha1-v4HaUUeUfTLRO5R9wSpYrUWHNQ4=", - "dev": true, "requires": { "resolve-from": "^2.0.0" } @@ -15486,22 +14084,19 @@ "resolve-from": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" } } }, "solidity-parser-antlr": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/solidity-parser-antlr/-/solidity-parser-antlr-0.2.15.tgz", - "integrity": "sha512-EzRI8/TR/ljTXkZAyAjb0w4G20wH2XM7pcNf87ifdV825AbUv7DkY7HmiZCTj6NeKtIx8Y1s0NZWPbj+JTp8Zw==", - "dev": true + "integrity": "sha512-EzRI8/TR/ljTXkZAyAjb0w4G20wH2XM7pcNf87ifdV825AbUv7DkY7HmiZCTj6NeKtIx8Y1s0NZWPbj+JTp8Zw==" }, "solidity-parser-sc": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/solidity-parser-sc/-/solidity-parser-sc-0.4.11.tgz", "integrity": "sha512-1kV5iC7m3CtMDfmHaVNwz2saSGQVIuF16rIxU417Al38MVCWHMQQ5vT6cmLsNwDe60S74auobWij9vNawSeOyw==", - "dev": true, "requires": { "mocha": "^4.1.0", "pegjs": "^0.10.0", @@ -15512,7 +14107,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/solium/-/solium-1.1.8.tgz", "integrity": "sha512-fn0lusM6of14CytIDDHK73SGjn6NsVTaCVJjaKCKJyqKhT00rH/hDtvnIeZ2ZTD9z/xaXd4Js2brW3az6AV9RA==", - "dev": true, "requires": { "ajv": "^5.2.2", "chokidar": "^1.6.0", @@ -15531,20 +14125,17 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -15554,14 +14145,12 @@ "commander": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" }, "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.0.1", "shebang-command": "^1.2.0", @@ -15572,7 +14161,6 @@ "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.0.1", "get-stream": "^3.0.0", @@ -15587,7 +14175,6 @@ "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" } @@ -15595,14 +14182,12 @@ "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 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "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", @@ -15612,14 +14197,12 @@ "sol-explore": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz", - "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=", - "dev": true + "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=" }, "solparse": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", - "dev": true, "requires": { "mocha": "^4.0.1", "pegjs": "^0.10.0", @@ -15630,7 +14213,6 @@ "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" @@ -15640,7 +14222,6 @@ "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" } @@ -15648,14 +14229,12 @@ "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 + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "yargs": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", - "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", @@ -15675,7 +14254,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", - "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -15685,8 +14263,7 @@ "solium-plugin-security": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz", - "integrity": "sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==", - "dev": true + "integrity": "sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==" }, "source-map": { "version": "0.5.7", @@ -15697,7 +14274,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -15717,8 +14293,7 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { "version": "3.0.2", @@ -15752,7 +14327,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -15761,7 +14335,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, "requires": { "through2": "^2.0.2" } @@ -15769,8 +14342,7 @@ "sprintf-js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.0.tgz", - "integrity": "sha1-z/yvcC2vZeo5u04PorKZzsGhvkY=", - "dev": true + "integrity": "sha1-z/yvcC2vZeo5u04PorKZzsGhvkY=" }, "sshpk": { "version": "1.15.1", @@ -15791,14 +14363,12 @@ "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -15808,7 +14378,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -15818,20 +14387,17 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, "steno": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", - "dev": true, "requires": { "graceful-fs": "^4.1.3" } @@ -15840,7 +14406,6 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -15852,14 +14417,12 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, "stream-to-observable": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", - "dev": true, "requires": { "any-observable": "^0.2.0" } @@ -15868,7 +14431,6 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.2.tgz", "integrity": "sha1-dXYJrhzr0zx0MtSvvjH/eGULnd4=", - "dev": true, "requires": { "looper": "^3.0.0", "pull-stream": "^3.2.3" @@ -15877,14 +14439,12 @@ "streamifier": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", - "dev": true + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=" }, "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=", - "dev": true + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { "version": "1.0.2", @@ -15931,7 +14491,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, "requires": { "is-natural-number": "^4.0.1" } @@ -15939,8 +14498,7 @@ "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 + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-hex-prefix": { "version": "1.0.0", @@ -15959,7 +14517,6 @@ "version": "0.1.37", "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", - "dev": true, "requires": { "bluebird": "^3.5.0", "buffer": "^5.0.5", @@ -15980,7 +14537,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0" @@ -15991,14 +14547,12 @@ "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" }, "sync-request": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.0.0.tgz", "integrity": "sha512-jGNIAlCi9iU4X3Dm4oQnNQshDD3h0/1A7r79LyqjbjUnj69sX6mShAXlhRXgImsfVKtTcnra1jfzabdZvp+Lmw==", - "dev": true, "requires": { "http-response-object": "^3.0.1", "sync-rpc": "^1.2.1", @@ -16009,7 +14563,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.4.tgz", "integrity": "sha512-Iug+t1ICVFenUcTnDu8WXFnT+k8IVoLKGh8VA3eXUtl2Rt9SjKX3YEv33OenABqpTPL9QEaHv1+CNn2LK8vMow==", - "dev": true, "requires": { "get-port": "^3.1.0" } @@ -16038,7 +14591,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -16049,7 +14601,6 @@ "version": "1.16.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "dev": true, "requires": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", @@ -16061,7 +14612,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -16073,7 +14623,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -16088,7 +14637,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", - "dev": true, "requires": { "bluebird": "^2.9.34", "commander": "^2.8.1", @@ -16100,28 +14648,24 @@ "bluebird": { "version": "2.11.0", "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" } } }, "text-encoding": { "version": "0.6.4", "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "then-request": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.0.tgz", "integrity": "sha512-xA+7uEMc+jsQIoyySJ93Ad08Kuqnik7u6jLS5hR91Z3smAoCfL3M8/MqMlobAa9gzBfO9pA88A/AntfepkkMJQ==", - "dev": true, "requires": { "@types/concat-stream": "^1.6.0", "@types/form-data": "0.0.33", @@ -16139,14 +14683,12 @@ "@types/node": { "version": "8.10.36", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.36.tgz", - "integrity": "sha512-SL6KhfM7PTqiFmbCW3eVNwVBZ+88Mrzbuvn9olPsfv43mbiWaFY+nRcz/TGGku0/lc2FepdMbImdMY1JrQ+zbw==", - "dev": true + "integrity": "sha512-SL6KhfM7PTqiFmbCW3eVNwVBZ+88Mrzbuvn9olPsfv43mbiWaFY+nRcz/TGGku0/lc2FepdMbImdMY1JrQ+zbw==" }, "promise": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", - "dev": true, "requires": { "asap": "~2.0.6" } @@ -16157,7 +14699,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "dev": true, "requires": { "any-promise": "^1.0.0" } @@ -16166,7 +14707,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" } @@ -16180,7 +14720,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -16189,14 +14728,12 @@ "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=", - "dev": true + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -16205,7 +14742,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.0.5.tgz", "integrity": "sha512-hOabTz9Tp49wCozFwuJe5ISrOqkECm6kzw66XTP23DuzNU7QS/KiZq5LC9Y7QSy8f1rPSLy4bKaViP0OwGI1cA==", - "dev": true, "requires": { "bluebird": "^3.5.0", "tmp": "0.0.33" @@ -16214,14 +14750,12 @@ "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 + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, "to-fast-properties": { "version": "1.0.3", @@ -16232,7 +14766,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, "requires": { "kind-of": "^3.0.2" } @@ -16241,7 +14774,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -16253,7 +14785,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -16263,7 +14794,6 @@ "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.0.2" } @@ -16282,14 +14812,12 @@ "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" }, "tree-kill": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", - "dev": true + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==" }, "trim": { "version": "0.0.1", @@ -16305,7 +14833,6 @@ "version": "4.1.14", "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.14.tgz", "integrity": "sha512-e7tTLvKP3bN9dE7MagfWyFjy4ZgoEGbeujECy1me1ENBzbj/aO/+45gs72qsL3+3IkCNNcWNOJjjrm8BYZZNNg==", - "dev": true, "requires": { "mocha": "^4.1.0", "original-require": "1.0.1", @@ -16316,7 +14843,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", - "dev": true, "requires": { "fs-extra": "^0.30.0", "memorystream": "^0.3.1", @@ -16415,7 +14941,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -16424,7 +14949,6 @@ "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.18" @@ -16433,14 +14957,12 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, "requires": { "is-typedarray": "^1.0.0" } @@ -16449,7 +14971,6 @@ "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, "optional": true, "requires": { "commander": "~2.17.1", @@ -16460,14 +14981,12 @@ "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, "optional": true }, "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, "optional": true } } @@ -16475,14 +14994,12 @@ "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "unbzip2-stream": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz", "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==", - "dev": true, "requires": { "buffer": "^3.0.1", "through": "^2.3.6" @@ -16491,14 +15008,12 @@ "base64-js": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" }, "buffer": { "version": "3.6.0", "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, "requires": { "base64-js": "0.0.8", "ieee754": "^1.1.4", @@ -16508,22 +15023,19 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", - "dev": true + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -16535,7 +15047,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -16544,7 +15055,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -16557,8 +15067,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unorm": { "version": "1.4.1", @@ -16568,14 +15077,12 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -16585,7 +15092,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -16596,7 +15102,6 @@ "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" } @@ -16606,20 +15111,17 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" } } }, @@ -16627,7 +15129,6 @@ "version": "0.1.11", "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=", - "dev": true, "requires": { "binary": ">= 0.3.0 < 1", "fstream": ">= 0.1.30 < 1", @@ -16641,7 +15142,6 @@ "version": "0.1.31", "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", - "dev": true, "requires": { "graceful-fs": "~3.0.2", "inherits": "~2.0.0", @@ -16653,7 +15153,6 @@ "version": "3.0.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, "requires": { "natives": "^1.1.0" } @@ -16662,7 +15161,6 @@ "version": "1.0.34", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -16676,7 +15174,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.0.tgz", "integrity": "sha512-NG1h/MdGIX3HzyqMjyj1laBCmlPYhcO4xEy7gEqqzGiSLw7XqDQCnY4nYSn5XSaH8mQ6TFkaujrO8d/PIZN85A==", - "dev": true, "requires": { "binary": "^0.3.0", "mkdirp": "^0.5.1" @@ -16685,14 +15182,12 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "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=", - "dev": true, "requires": { "prepend-http": "^1.0.1" } @@ -16700,20 +15195,17 @@ "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=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "utf8": { "version": "3.0.0", @@ -16728,8 +15220,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "3.3.2", @@ -16748,14 +15239,12 @@ "varint": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", - "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=", - "dev": true + "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "verror": { "version": "1.10.0", @@ -16790,7 +15279,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.33.tgz", "integrity": "sha1-MVAPaZt+cO31FJDFXv+0J7+7OwE=", - "dev": true, "requires": { "got": "7.1.0", "swarm-js": "0.1.37", @@ -16800,8 +15288,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -16809,7 +15296,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.33.tgz", "integrity": "sha1-+C7VJfW2auzale7O08rSvWlfeDk=", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.33", "web3-core-method": "1.0.0-beta.33", @@ -16821,7 +15307,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.33.tgz", "integrity": "sha1-Kvcz5QTbBefDZIwdrPV3sOwV3EM=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-eth-iban": "1.0.0-beta.33", @@ -16831,8 +15316,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -16840,7 +15324,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.33.tgz", "integrity": "sha1-7Y7ExK+rIdwJid41g2hEZlIrboY=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.33", @@ -16852,8 +15335,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -16861,7 +15343,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.33.tgz", "integrity": "sha1-0fXrtgFSfdSWViw2IXblWNly01g=", - "dev": true, "requires": { "any-promise": "1.3.0", "eventemitter3": "1.1.1" @@ -16871,7 +15352,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.33.tgz", "integrity": "sha1-ejbEA1QALfsXnKLb22pgEsn3Ges=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.33", @@ -16883,8 +15363,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -16892,7 +15371,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.33.tgz", "integrity": "sha1-YCh1yfTV9NDhYhRitfwewZs1veM=", - "dev": true, "requires": { "eventemitter3": "1.1.1", "underscore": "1.8.3", @@ -16902,8 +15380,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -16911,7 +15388,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.33.tgz", "integrity": "sha1-hKn5TallUnyS2DitTlcN8CWJhJ8=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.33", @@ -16930,8 +15406,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -16939,7 +15414,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.33.tgz", "integrity": "sha1-IiH3FRZDZgAypN80D2EjSRaMgko=", - "dev": true, "requires": { "bn.js": "4.11.6", "underscore": "1.8.3", @@ -16950,14 +15424,12 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -16965,7 +15437,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.33.tgz", "integrity": "sha1-JajX9OWOHpk7kvBpVILMzckhL5E=", - "dev": true, "requires": { "any-promise": "1.3.0", "crypto-browserify": "3.12.0", @@ -16983,7 +15454,6 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, "requires": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -16993,14 +15463,12 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "uuid": { "version": "2.0.1", "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" } } }, @@ -17008,7 +15476,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.33.tgz", "integrity": "sha1-nlkZ8pF6PGe0+2Vp1JxeMDiSW84=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.33", @@ -17023,8 +15490,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -17032,7 +15498,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.36.tgz", "integrity": "sha512-8ZdD7XoJfSX3jNlZHSLe4G837xQ0v5a8cHCcDcd1IoqoY855X9SrIQ0Xdqia9p4mR1YcH1vgmkXY9/3hsvxS7g==", - "dev": true, "requires": { "eth-ens-namehash": "2.0.8", "underscore": "1.8.3", @@ -17047,26 +15512,22 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "utf8": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", - "dev": true + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" }, "web3-core": { "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.36.tgz", "integrity": "sha512-C2QW9CMMRZdYAiKiLkMrKRSp+gekSqTDgZTNvlxAdN1hXn4d9UmcmWSJXOmIHqr5N2ISbRod+bW+qChODxVE3Q==", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.36", "web3-core-method": "1.0.0-beta.36", @@ -17078,7 +15539,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.36.tgz", "integrity": "sha512-gu74l0htiGWuxLQuMnZqKToFvkSM+UFPE7qUuy1ZosH/h2Jd+VBWg6k4CyNYVYfP0hL5x3CN8SBmB+HMowo55A==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-eth-iban": "1.0.0-beta.36", @@ -17089,7 +15549,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.36.tgz", "integrity": "sha512-dJsP3KkGaqBBSdxfzvLsYPOmVaSs1lR/3oKob/gtUYG7UyTnwquwliAc7OXj+gqRA2E/FHZcM83cWdl31ltdSA==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.36", @@ -17102,7 +15561,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.36.tgz", "integrity": "sha512-RGIL6TjcOeJTullFLMurChPTsg94cPF6LI763y/sPYtXTDol1vVa+J5aGLp/4WW8v+s+1bSQO6zYq2ZtkbmtEQ==", - "dev": true, "requires": { "any-promise": "1.3.0", "eventemitter3": "1.1.1" @@ -17112,7 +15570,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.36.tgz", "integrity": "sha512-/CHuaMbiMDu1v8ANGYI7yFCnh1GaCWx5pKnUPJf+QTk2xAAw+Bvd97yZJIWPOK5AOPUIzxgwx9Ob/5ln6mTmYA==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.36", @@ -17125,7 +15582,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.36.tgz", "integrity": "sha512-/evyLQ8CMEYXC5aUCodDpmEnmGVYQxaIjiEIfA/85f9ifHkfzP1aOwCAjcsLsJWnwrWDagxSpjCYrDtnNabdEw==", - "dev": true, "requires": { "eventemitter3": "1.1.1", "underscore": "1.8.3", @@ -17136,7 +15592,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.36.tgz", "integrity": "sha512-fBfW+7hvA0rxEMV45fO7JU+0R32ayT7aRwG9Cl6NW2/QvhFeME2qVbMIWw0q5MryPZGIN8A6366hKNuWvVidDg==", - "dev": true, "requires": { "ethers": "4.0.0-beta.1", "underscore": "1.8.3", @@ -17147,7 +15602,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.36.tgz", "integrity": "sha512-cywqcIrUsCW4fyqsHdOb24OCC8AnBol8kNiptI+IHRylyCjTNgr53bUbjrXWjmEnear90rO0QhAVjLB1a4iEbQ==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core": "1.0.0-beta.36", @@ -17163,7 +15617,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.36.tgz", "integrity": "sha512-b5AEDjjhOLR4q47Hbzf65zYE+7U7JgCgrUb13RU4HMIGoMb1q4DXaJw1UH8VVHCZulevl2QBjpCyrntecMqqCQ==", - "dev": true, "requires": { "bn.js": "4.11.6", "web3-utils": "1.0.0-beta.36" @@ -17173,7 +15626,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.36.tgz", "integrity": "sha512-KLSqMS59nRdpet9B0B64MKgtM3n9wAHTcAHJ03hv79avQNTjHxtjZm0ttcjcFUPpWDgTCtcYCa7tqaYo9Pbeog==", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.36", "xhr2-cookies": "1.1.0" @@ -17183,7 +15635,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.36.tgz", "integrity": "sha512-iEUrmdd2CzoWgp+75/ydom/1IaoLw95qkAzsgwjjZp1waDncHP/cvVGX74+fbUx4hRaPdchyzxCQfNpgLDmNjQ==", - "dev": true, "requires": { "oboe": "2.1.3", "underscore": "1.8.3", @@ -17194,7 +15645,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.36.tgz", "integrity": "sha512-wAnENuZx75T5ZSrT2De2LOaUuPf2yRjq1VfcbD7+Zd79F3DZZLBJcPyCNVQ1U0fAXt0wfgCKl7sVw5pffqR9Bw==", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.36", @@ -17205,7 +15655,6 @@ "version": "1.0.0-beta.36", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.36.tgz", "integrity": "sha512-7ri74lG5fS2Th0fhYvTtiEHMB1Pmf2p7dQx1COQ3OHNI/CHNEMjzoNMEbBU6FAENrywfoFur40K4m0AOmEUq5A==", - "dev": true, "requires": { "bn.js": "4.11.6", "eth-lib": "0.1.27", @@ -17222,7 +15671,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.33.tgz", "integrity": "sha1-HXPQxSiKRWWxdUp1tfs+oLd6Uy8=", - "dev": true, "requires": { "bn.js": "4.11.6", "web3-utils": "1.0.0-beta.33" @@ -17231,8 +15679,7 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" } } }, @@ -17240,7 +15687,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.33.tgz", "integrity": "sha1-tOSFh8xOfrAY2ib947Tzul+bmO8=", - "dev": true, "requires": { "web3-core": "1.0.0-beta.33", "web3-core-helpers": "1.0.0-beta.33", @@ -17253,7 +15699,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.33.tgz", "integrity": "sha1-tskNGg4WJuquiz2SKsFTZy/VZEU=", - "dev": true, "requires": { "web3-core": "1.0.0-beta.33", "web3-core-method": "1.0.0-beta.33", @@ -17307,7 +15752,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.33.tgz", "integrity": "sha1-OzWuAO599blrSTSWKtSobypVmcE=", - "dev": true, "requires": { "web3-core-helpers": "1.0.0-beta.33", "xhr2": "0.1.4" @@ -17317,7 +15761,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.33.tgz", "integrity": "sha1-Twrcmv6dEsBm5L5cPFNvUHPLB8Y=", - "dev": true, "requires": { "oboe": "2.1.3", "underscore": "1.8.3", @@ -17327,8 +15770,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -17336,7 +15778,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.33.tgz", "integrity": "sha1-j93qQuGbvyUh7IeVRkV6Yjqdye8=", - "dev": true, "requires": { "underscore": "1.8.3", "web3-core-helpers": "1.0.0-beta.33", @@ -17346,8 +15787,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" } } }, @@ -17355,7 +15795,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.33.tgz", "integrity": "sha1-+Z4mVz9uCZMhrw2fK/z+Pe01UKE=", - "dev": true, "requires": { "web3-core": "1.0.0-beta.33", "web3-core-method": "1.0.0-beta.33", @@ -17367,7 +15806,6 @@ "version": "1.0.0-beta.33", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.33.tgz", "integrity": "sha1-4JG3mU8JtxSwGYpAV9OtLrjL4jg=", - "dev": true, "requires": { "bn.js": "4.11.6", "eth-lib": "0.1.27", @@ -17381,32 +15819,27 @@ "bn.js": { "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" }, "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "utf8": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", - "dev": true + "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=" } } }, "webcrypto-shim": { "version": "github:dignifiedquire/webcrypto-shim#190bc9ec341375df6025b17ae12ddb2428ea49c8", - "from": "github:dignifiedquire/webcrypto-shim#master", - "dev": true + "from": "github:dignifiedquire/webcrypto-shim#master" }, "websocket": { "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", "from": "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible", - "dev": true, "requires": { "debug": "^2.2.0", "nan": "^2.3.3", @@ -17423,7 +15856,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -17441,8 +15873,7 @@ "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, "wrap-ansi": { "version": "2.1.0", @@ -17462,7 +15893,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, "requires": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -17484,7 +15914,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, "requires": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -17499,7 +15928,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "dev": true, "requires": { "xhr-request": "^1.0.1" } @@ -17535,14 +15963,12 @@ "yaeti": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "dev": true + "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 + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "4.8.1", @@ -17578,7 +16004,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/package.json b/package.json index d3583ccad8..23fd00fb79 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "license": "(GPL-3.0-or-later OR AGPL-3.0-or-later)", "devDependencies": { "coveralls": "^3.0.1", - "ethereumjs-util": "^6.0.0", "ganache-cli": "^6.1.0", "lcov-result-merger": "^1.2.0", "lerna": "^2.8.0" From 8e40798c145f0ba8a54d5d3f2ec9520b7e62431c Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 4 Feb 2019 12:00:40 +0100 Subject: [PATCH 11/44] Lint --- future-apps/actor/contracts/Actor.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index efe99eeac3..32b6b037a3 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -92,8 +92,9 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { } function supportsInterface(bytes4 interfaceId) external pure returns (bool) { - return interfaceId == ISVALIDSIG_INTERFACE_ID - || interfaceId == EIP165_SUPPORT_INTERFACE_ID; + return + interfaceId == ISVALIDSIG_INTERFACE_ID || + interfaceId == EIP165_SUPPORT_INTERFACE_ID; } function forward(bytes _evmScript) From 2aaf462577f3ecb3452b276153f5ee6d5afd4b9a Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Thu, 7 Feb 2019 14:20:01 +0100 Subject: [PATCH 12/44] test: add comments, cosmetic changes, and more tests --- .../actor/contracts/standards/IERC1271.sol | 8 +- .../actor/contracts/standards/IERC165.sol | 4 +- .../contracts/test/mocks/DesignatedSigner.sol | 56 +++++++------ .../contracts/test/mocks/ExecutionTarget.sol | 12 +-- future-apps/actor/package.json | 2 +- future-apps/actor/test/actor.js | 83 ++++++++++++++----- 6 files changed, 104 insertions(+), 61 deletions(-) diff --git a/future-apps/actor/contracts/standards/IERC1271.sol b/future-apps/actor/contracts/standards/IERC1271.sol index 0a0a410068..1070335a8e 100644 --- a/future-apps/actor/contracts/standards/IERC1271.sol +++ b/future-apps/actor/contracts/standards/IERC1271.sol @@ -2,6 +2,8 @@ pragma solidity 0.4.24; interface IERC1271 { - // TODO: Standard is not finalized, discussion: https://github.com/ethereum/EIPs/issues/1271 - function isValidSignature(bytes32 hash, bytes signature) public view returns (bool); -} \ No newline at end of file + // TODO: Standard is not finalized, discussion: https://github.com/ethereum/EIPs/issues/1271 + // Can't be marked external due to function overload clash with memory and calldata, see: + // https://github.com/ethereum/solidity/issues/4832 + function isValidSignature(bytes32 hash, bytes signature) public view returns (bool); +} diff --git a/future-apps/actor/contracts/standards/IERC165.sol b/future-apps/actor/contracts/standards/IERC165.sol index a239f26120..02b86ec5c9 100644 --- a/future-apps/actor/contracts/standards/IERC165.sol +++ b/future-apps/actor/contracts/standards/IERC165.sol @@ -2,5 +2,5 @@ pragma solidity 0.4.24; interface IERC165 { - function supportsInterface(bytes4 interfaceId) external pure returns (bool); -} \ No newline at end of file + function supportsInterface(bytes4 interfaceId) external pure returns (bool); +} diff --git a/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol b/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol index bb1865c052..00b371119d 100644 --- a/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol +++ b/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol @@ -4,30 +4,32 @@ import "../../standards/IERC165.sol"; import "../../standards/IERC1271.sol"; -contract DesignatedSigner is /*IERC165,*/ IERC1271 { - bool isInterface; - bool isValid; - bool isValidRevert; - bool modifyState; - - constructor (bool _isInterface, bool _isValid, bool _isValidRevert, bool _modifyState) { - isInterface = _isInterface; - isValid = _isValid; - isValidRevert = _isValidRevert; - modifyState = _modifyState; - } - - function supportsInterface(bytes4 interfaceId) external view returns (bool) { - return isInterface; - } - - function isValidSignature(bytes32 hash, bytes signature) public view returns (bool) { - require(!isValidRevert); - - if (modifyState) { - modifyState = false; - } - - return isValid; - } -} \ No newline at end of file +contract DesignatedSigner /* is IERC165, IERC1271 */ { + bool isInterface; + bool isValid; + bool isValidRevert; + bool modifyState; + + constructor (bool _isInterface, bool _isValid, bool _isValidRevert, bool _modifyState) public { + isInterface = _isInterface; + isValid = _isValid; + isValidRevert = _isValidRevert; + modifyState = _modifyState; + } + + // Can't be ERC165-compliant since this potentially modifies state + function supportsInterface(bytes4 interfaceId) external view returns (bool) { + return isInterface; + } + + // Can't be ERC1271-compliant since this potentially modifies state + function isValidSignature(bytes32 hash, bytes signature) external returns (bool) { + require(!isValidRevert); + + if (modifyState) { + modifyState = false; + } + + return isValid; + } +} diff --git a/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol b/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol index 5937f108cc..de86d168da 100644 --- a/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol +++ b/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol @@ -5,21 +5,23 @@ contract ExecutionTarget { uint public counter; string constant public REASON = "FUNDS_ARE_NOT_SAFU"; - function execute() payable public returns (uint256) { + function execute() public payable returns (uint256) { counter += 1; emit Executed(counter); return counter; } - function setCounter(uint x) payable public { + function setCounter(uint x) external payable { counter = x; } - function fail() public { - revert(REASON); + function fail() external { + revert(REASON); } - function () payable {} + function () external payable { + execute(); + } event Executed(uint x); } diff --git a/future-apps/actor/package.json b/future-apps/actor/package.json index 29ef93be90..fd71ab0366 100644 --- a/future-apps/actor/package.json +++ b/future-apps/actor/package.json @@ -53,4 +53,4 @@ "@aragon/apps-vault": "4.0.0", "@aragon/os": "4.0.1" } -} \ No newline at end of file +} diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index 56d5a9dd91..f2d4fee643 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -25,9 +25,10 @@ const ExecutionTarget = artifacts.require('ExecutionTarget') const DesignatedSigner = artifacts.require('DesignatedSigner') const NULL_ADDRESS = '0x00' +const NO_SIG = '0x' -const EIP165_SUPPORT_INTERFACE_ID = '0x01ffc9a7' -const EIP165_SUPPORT_INVALID_ID = '0xffffffff' +const ERC165_SUPPORT_INTERFACE_ID = '0x01ffc9a7' +const ERC165_SUPPORT_INVALID_ID = '0xffffffff' contract('Actor app', (accounts) => { let daoFact, actorBase, acl, actor, actorId @@ -67,7 +68,7 @@ contract('Actor app', (accounts) => { await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) // actor - actorAppId = namehash('actor.aragonpm.test') + const actorAppId = namehash('actor.aragonpm.test') const actorReceipt = await dao.newAppInstance(actorAppId, actorBase.address, '0x', false) const actorProxyAddress = getEvent(actorReceipt, 'NewAppProxy', 'proxy') @@ -77,7 +78,7 @@ contract('Actor app', (accounts) => { }) context('executing actions', () => { - const [nonExecutor, executor] = accounts + const [_, nonExecutor, executor] = accounts let executionTarget beforeEach(async () => { @@ -98,6 +99,17 @@ contract('Actor app', (accounts) => { assertEvent(receipt, 'Execute') }) + it('can execute actions without data', async () => { + assert.equal(await executionTarget.counter(), 0) + + const noData = '0x' + const receipt = await actor.execute(executionTarget.address, 0, noData, { from: executor }) + + // Fallback just runs ExecutionTarget.execute() + assert.equal(await executionTarget.counter(), 1) + assertEvent(receipt, 'Execute') + }) + it('fails to execute without permissions', async () => { const { to, data } = encodeFunctionCall(executionTarget, 'execute') @@ -121,14 +133,16 @@ contract('Actor app', (accounts) => { }) it('execution forwards success return data', async () => { + assert.equal(await executionTarget.counter(), 0) + const { to, data } = encodeFunctionCall(executionTarget, 'execute') // We make a call to easily get what data could be gotten inside the EVM // Contract -> Actor.execute -> Target.func (would allow Contract to have access to this data) - assert.equal(await executionTarget.counter(), 0) const call = encodeFunctionCall(actor, 'execute', to, 0, data, { from: executor }) const returnData = await web3Call(call) + // ExecutionTarget.execute() increments the counter by 1 assert.equal(ethABI.decodeParameter('uint256', returnData), 1) }) @@ -183,7 +197,7 @@ contract('Actor app', (accounts) => { context('running scripts', () => { let executionTarget, script - const [nonScriptRunner, scriptRunner] = accounts + const [_, nonScriptRunner, scriptRunner] = accounts beforeEach(async () => { executionTarget = await ExecutionTarget.new() @@ -200,41 +214,41 @@ contract('Actor app', (accounts) => { const receipt = await actor.forward(script, { from: scriptRunner }) + // Should execute ExecutionTarget.execute() twice assert.equal(await executionTarget.counter(), 2) assertEvent(receipt, 'ScriptResult') }) it('fails to run script without permissions', async () => { assert.isFalse(await actor.canForward(nonScriptRunner, script)) + assert.equal(await executionTarget.counter(), 0) await assertRevert(() => actor.forward(script, { from: nonScriptRunner }) ) + assert.equal(await executionTarget.counter(), 0) }) }) context('signing messages', () => { - const [nobody, presigner, signerDesignator] = accounts - let HASH - const NO_SIG = '0x' + const [_, nobody, presigner, signerDesignator] = accounts + const HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing beforeEach(async () => { - HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing - await acl.createPermission(presigner, actor.address, PRESIGN_HASH_ROLE, root, { from: root }) await acl.createPermission(signerDesignator, actor.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) }) - it('complies to EIP165', async () => { - assert.isTrue(await actor.supportsInterface(EIP165_SUPPORT_INTERFACE_ID)) - assert.isFalse(await actor.supportsInterface(EIP165_SUPPORT_INVALID_ID)) + it('complies with ERC165', async () => { + assert.isTrue(await actor.supportsInterface(ERC165_SUPPORT_INTERFACE_ID)) + assert.isFalse(await actor.supportsInterface(ERC165_SUPPORT_INVALID_ID)) }) it('supports ERC1271 interface', async () => { assert.isTrue(await actor.supportsInterface(ISVALIDSIG_INTERFACE_ID)) }) - it('doesnt support any other interface', async () => { + it("doesn't support any other interface", async () => { assert.isFalse(await actor.supportsInterface('0x12345678')) assert.isFalse(await actor.supportsInterface('0x')) }) @@ -249,6 +263,7 @@ contract('Actor app', (accounts) => { await assertRevert(() => actor.presignHash(HASH, { from: nobody }) ) + assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) }) context('designated signer: EOAs', () => { @@ -266,7 +281,7 @@ contract('Actor app', (accounts) => { v = ethutil.toBuffer(2) // force set an invalid v } - let signature = '0x' + Buffer.concat([mode, v, r, s]).toString('hex') + const signature = '0x' + Buffer.concat([mode, v, r, s]).toString('hex') return signature } @@ -285,7 +300,7 @@ contract('Actor app', (accounts) => { }) it('isValidSignature returns false to an invalid signature', async () => { - const badSignature = (await sign(HASH, signer)).substring(0, 132) // drop last byte + const badSignature = (await sign(HASH, signer)).slice(0, -2) // drop last byte assert.isFalse(await actor.isValidSignature(HASH, badSignature)) }) @@ -300,7 +315,10 @@ contract('Actor app', (accounts) => { }) it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { - const badSignature = (await sign(HASH, signer)).substring(0, 132) // drop last byte + const badSignature = (await sign(HASH, signer)).substring(0, -2) // drop last byte + assert.isFalse(await actor.isValidSignature(HASH, badSignature)) + + // Now presign it await actor.presignHash(HASH, { from: presigner }) assert.isTrue(await actor.isValidSignature(HASH, badSignature)) }) @@ -313,37 +331,56 @@ contract('Actor app', (accounts) => { } it('isValidSignature returns true if designated signer returns true', async () => { - // interface compliance, sig is valid, doesn't revert and doesn't modify state + // true - ERC165 interface compliant + // true - any sigs are valid + // false - doesn't revert on checking sig + // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, true, false, false) assert.isTrue(await actor.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer returns false', async () => { - // interface compliance, sig is invalid, doesn't revert and doesn't modify state + // true - ERC165 interface compliant + // false - sigs are invalid + // false - doesn't revert on checking sig + // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, false, false, false) + // Signature fails check assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer doesnt support the interface', async () => { - // no interface compliance, sig is valid, doesn't revert and doesn't modify state + // false - not ERC165 interface compliant + // true - any sigs are valid + // false - doesn't revert on checking sig + // false - doesn't modify state on checking sig await setDesignatedSignerContract(false, true, false, false) + // Requires ERC165 compliance before checking isValidSignature assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer reverts', async () => { - // no interface compliance, sig is valid, reverts and doesn't modify state + // true - ERC165 interface compliant + // true - any sigs are valid + // true - reverts on checking sig + // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, true, true, false) + // Reverts on checking assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer attempts to modify state', async () => { - // no interface compliance, sig is valid, doesn't revert and modifies state + // true - ERC165 interface compliant + // true - any sigs are valid + // false - doesn't revert on checking sig + // true - modifies state on checking sig await setDesignatedSignerContract(true, true, false, true) + // Checking costs too much gas assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) }) }) From c73d99912d98d943fd47892ac5d667f3f3307304 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Thu, 7 Feb 2019 14:20:16 +0100 Subject: [PATCH 13/44] SignatureValidator: fix compile warnings --- future-apps/actor/contracts/SignatureValidator.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/future-apps/actor/contracts/SignatureValidator.sol b/future-apps/actor/contracts/SignatureValidator.sol index 825bfafbd0..3779857913 100644 --- a/future-apps/actor/contracts/SignatureValidator.sol +++ b/future-apps/actor/contracts/SignatureValidator.sol @@ -42,9 +42,9 @@ library SignatureValidator { } if (mode == SignatureMode.GETH) { - hash = keccak256("\x19Ethereum Signed Message:\n32", hash); + hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } else if (mode == SignatureMode.TREZOR) { - hash = keccak256("\x19Ethereum Signed Message:\n\x20", hash); + hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n\x20", hash)); } return ecrecover(hash, v, r, s) == signer; From 5f1291faf6030bf015b776326827ad1d120043ef Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Thu, 7 Feb 2019 15:07:36 +0100 Subject: [PATCH 14/44] test: add context headers --- future-apps/actor/test/actor.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index f2d4fee643..e93e772d10 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -77,7 +77,7 @@ contract('Actor app', (accounts) => { await actor.initialize() }) - context('executing actions', () => { + context('> Executing actions', () => { const [_, nonExecutor, executor] = accounts let executionTarget @@ -157,7 +157,7 @@ contract('Actor app', (accounts) => { ) }) - context('with ETH:', () => { + context('> With ETH:', () => { const depositValue = 3 let to, data @@ -195,7 +195,7 @@ contract('Actor app', (accounts) => { }) }) - context('running scripts', () => { + context('> Running scripts', () => { let executionTarget, script const [_, nonScriptRunner, scriptRunner] = accounts @@ -230,7 +230,7 @@ contract('Actor app', (accounts) => { }) }) - context('signing messages', () => { + context('> Signing messages', () => { const [_, nobody, presigner, signerDesignator] = accounts const HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing @@ -266,7 +266,7 @@ contract('Actor app', (accounts) => { assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) }) - context('designated signer: EOAs', () => { + context('> Designated signer: EOAs', () => { let signer = accounts[7] const sign = async (hash, signer, useLegacySig = false, useInvalidV = false) => { @@ -324,7 +324,7 @@ contract('Actor app', (accounts) => { }) }) - context('designated signer: contracts', () => { + context('> Designated signer: contracts', () => { const setDesignatedSignerContract = async (...params) => { const designatedSigner = await DesignatedSigner.new(...params) return actor.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) From f17a0f5e9db4cbcdc11ba30ba2521a427fe9f22a Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 11 Feb 2019 11:05:02 +0100 Subject: [PATCH 15/44] Metadata: add roles to arapp, remove webapp artifacts --- future-apps/actor/arapp.json | 33 +++++++++++++++++++++++++++++++-- future-apps/actor/manifest.json | 14 +++++++------- future-apps/actor/package.json | 1 - 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/future-apps/actor/arapp.json b/future-apps/actor/arapp.json index 730668f10e..0a44a77b10 100644 --- a/future-apps/actor/arapp.json +++ b/future-apps/actor/arapp.json @@ -27,7 +27,36 @@ } }, "roles": [ - TODO + { + "name": "Execute actions", + "id": "EXECUTE_ROLE", + "params": [ + "Target address", + "ETH value", + "Signature" + ] + }, + { + "name": "Designate signer", + "id": "DESIGNATE_SIGNER_ROLE", + "params": [ + "Designated signer address" + ] + }, + { + "name": "Presign hash", + "id": "PRESIGN_HASH_ROLE", + "params": [ + "Hash" + ] + }, + { + "name": "Run EVM Script", + "id": "RUN_SCRIPT_ROLE", + "params": [ + "EVM Script" + ] + } ], "path": "contracts/Actor.sol" -} +} \ No newline at end of file diff --git a/future-apps/actor/manifest.json b/future-apps/actor/manifest.json index b8f9d16aae..30b49a0193 100644 --- a/future-apps/actor/manifest.json +++ b/future-apps/actor/manifest.json @@ -1,10 +1,10 @@ { "name": "Actor", "description": "Hold assets and perform actions from DAOs", - "icons": [{ - "src": "images/icon.svg", - "sizes": "192x192" - }], - "script": "/script.js", - "start_url": "/index.html" -} + "icons": [ + { + "src": "images/icon.svg", + "sizes": "192x192" + } + ] +} \ No newline at end of file diff --git a/future-apps/actor/package.json b/future-apps/actor/package.json index fd71ab0366..b8e9687663 100644 --- a/future-apps/actor/package.json +++ b/future-apps/actor/package.json @@ -4,7 +4,6 @@ "main": "index.js", "scripts": { "compile": "truffle compile", - "build": "cd app && npm run build", "deploy:rpc": "truffle exec scripts/deploy.js --network rpc", "deploy:rinkeby": "truffle exec scripts/deploy.js --network rinkeby", "deploy:devnet": "truffle exec scripts/deploy.js --network devnet", From f6f66f7963c7c740c62182bf4338e13c8ac576b1 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 11 Feb 2019 11:09:23 +0100 Subject: [PATCH 16/44] Radspec strings --- future-apps/actor/contracts/Actor.sol | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 32b6b037a3..61e83c90b7 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -35,9 +35,8 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { event PresignHash(address indexed sender, bytes32 indexed hash); event SetDesignatedSigner(address indexed sender, address indexed oldSigner, address indexed newSigner); - // TODO: requires the @decodeData helper to be implemented in radspec /** - * @notice Execute `@decodeData(target, data)` on `target` `ethValue == 0 ? '' : '(Sending' + @formatToken(ethValue, ETH) + ')'`. + * @notice Execute `@radspec(target, data)` on `target` `ethValue == 0 ? '' : '(Sending' + @tokenAmount(ethValue, ETH) + ')'`. * @param _target Address where the action is being executed * @param _ethValue Amount of ETH from the contract that is sent with the action * @param _data Calldata for the action @@ -68,6 +67,10 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { } } + /** + * @notice Set `_designatedSigner` as the designated signer of the app, which will be able to sign messages on behalf of the app + * @param _designatedSigner Address that will be able to sign messages on behalf of the app + */ function setDesignatedSigner(address _designatedSigner) external authP(DESIGNATE_SIGNER_ROLE, arr(_designatedSigner)) @@ -78,6 +81,10 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { emit SetDesignatedSigner(msg.sender, oldDesignatedSigner, _designatedSigner); } + /** + * @notice Pre-sign hash `_hash` + * @param _hash Hash that will be considered signed regardless of the signature checked with 'isValidSignature()' + */ function presignHash(bytes32 _hash) external authP(PRESIGN_HASH_ROLE, arr(_hash)) @@ -97,6 +104,11 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { interfaceId == EIP165_SUPPORT_INTERFACE_ID; } + /** + * @notice Execute the script as the Actor app + * @dev IForwarder interface conformance. Forwards any token holder action. + * @param _evmScript Script being executed + */ function forward(bytes _evmScript) public authP(RUN_SCRIPT_ROLE, arr(getScriptACLParam(_evmScript))) From eb95db8ee7ffb0f36a05d11f49843019f13d0f45 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 11 Feb 2019 11:13:20 +0100 Subject: [PATCH 17/44] Travis: allow actor coverage to fail, tracking fix in #658 --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index abfc2dd528..3879293642 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,9 @@ env: - TASK=test:shared matrix: allow_failures: - - env: TASK=coverage:finance + - env: + - TASK=coverage:finance + - TASK=coverage:actor install: - travis_wait 60 npm install before_script: From abf1c91fa8fcfa67e44cc8a10f3b6fc9f2544d89 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 11 Feb 2019 13:20:18 +0100 Subject: [PATCH 18/44] Prevent infinite loop by prohibiting setting itself as the designated signer --- future-apps/actor/contracts/Actor.sol | 8 ++++++++ future-apps/actor/test/actor.js | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 61e83c90b7..472c6c70c2 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -24,6 +24,7 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { string private constant ERROR_EXECUTE_ETH_NO_DATA = "ACTOR_EXECUTE_ETH_NO_DATA"; string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "ACTOR_EXECUTE_TARGET_NOT_CONTRACT"; + string private constant ERROR_DESIGNATED_TO_SELF = "ACTOR_DESIGNATED_TO_SELF"; uint256 internal constant ISVALIDSIG_MAX_GAS = 50000; uint256 internal constant EIP165_MAX_GAS = 30000; @@ -75,6 +76,13 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { external authP(DESIGNATE_SIGNER_ROLE, arr(_designatedSigner)) { + // Prevent an infinite loop by setting the app itself as its designated signer. + // An undetectable loop can be created by setting a different contract as the + // designated signer which calls back into `isValidSignature`. + // Given that `isValidSignature` is always called with just 50k gas, the max + // damage of the loop is wasting 50k gas. + require(_designatedSigner != address(this), ERROR_DESIGNATED_TO_SELF); + address oldDesignatedSigner = designatedSigner; designatedSigner = _designatedSigner; diff --git a/future-apps/actor/test/actor.js b/future-apps/actor/test/actor.js index e93e772d10..8e9e3da91b 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/actor/test/actor.js @@ -289,6 +289,12 @@ contract('Actor app', (accounts) => { await actor.setDesignatedSigner(signer, { from: signerDesignator }) }) + it('fails if setting itself as the designated signer', async () => { + await assertRevert(async () => + await actor.setDesignatedSigner(actor.address, { from: signerDesignator }) + ) + }) + it('isValidSignature returns true to a valid signature', async () => { const signature = await sign(HASH, signer) assert.isTrue(await actor.isValidSignature(HASH, signature)) From a10c62c01e653258fbf8e04f2ff2238883ca9921 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 11 Feb 2019 19:49:02 +0100 Subject: [PATCH 19/44] Radspec --- future-apps/actor/contracts/Actor.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/actor/contracts/Actor.sol index 472c6c70c2..2b02d777cc 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/actor/contracts/Actor.sol @@ -37,7 +37,7 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { event SetDesignatedSigner(address indexed sender, address indexed oldSigner, address indexed newSigner); /** - * @notice Execute `@radspec(target, data)` on `target` `ethValue == 0 ? '' : '(Sending' + @tokenAmount(ethValue, ETH) + ')'`. + * @notice Execute '`@radspec(_target, _data)`' on `_target``_ethValue == 0 ? '' : ' (Sending' + @tokenAmount(_ethValue, 0x00) + ')'` * @param _target Address where the action is being executed * @param _ethValue Amount of ETH from the contract that is sent with the action * @param _data Calldata for the action From cc21b6723512e0dd959af9544e701779a7aea960 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Mon, 11 Feb 2019 20:03:04 +0100 Subject: [PATCH 20/44] Actor -> Agent rename --- .travis.yml | 8 +- future-apps/{actor => agent}/.solcover.js | 0 future-apps/{actor => agent}/.soliumignore | 0 future-apps/{actor => agent}/.soliumrc.json | 0 future-apps/{actor => agent}/arapp.json | 12 +- .../{actor => agent}/contracts/.npmignore | 0 .../Actor.sol => agent/contracts/Agent.sol} | 12 +- .../contracts/SignatureValidator.sol | 0 .../contracts/standards/IERC1271.sol | 0 .../contracts/standards/IERC165.sol | 0 .../contracts/test/TestImports.sol | 0 .../contracts/test/mocks/DesignatedSigner.sol | 0 .../contracts/test/mocks/DestinationMock.sol | 0 .../test/mocks/EtherTokenConstantMock.sol | 0 .../contracts/test/mocks/ExecutionTarget.sol | 0 .../contracts/test/mocks/ForceSendETH.sol | 0 .../test/mocks/KernelDepositableMock.sol | 0 .../contracts/test/mocks/SimpleERC20.sol | 0 future-apps/{actor => agent}/manifest.json | 2 +- .../migrations/1_initial_migration.js | 0 future-apps/{actor => agent}/package.json | 4 +- .../{actor => agent}/scripts/deploy.js | 0 .../test/actor.js => agent/test/agent.js} | 126 +++++++++--------- future-apps/{actor => agent}/test/vault.js | 6 +- future-apps/{actor => agent}/truffle.js | 0 package.json | 6 +- 26 files changed, 89 insertions(+), 87 deletions(-) rename future-apps/{actor => agent}/.solcover.js (100%) rename future-apps/{actor => agent}/.soliumignore (100%) rename future-apps/{actor => agent}/.soliumrc.json (100%) rename future-apps/{actor => agent}/arapp.json (83%) rename future-apps/{actor => agent}/contracts/.npmignore (100%) rename future-apps/{actor/contracts/Actor.sol => agent/contracts/Agent.sol} (96%) rename future-apps/{actor => agent}/contracts/SignatureValidator.sol (100%) rename future-apps/{actor => agent}/contracts/standards/IERC1271.sol (100%) rename future-apps/{actor => agent}/contracts/standards/IERC165.sol (100%) rename future-apps/{actor => agent}/contracts/test/TestImports.sol (100%) rename future-apps/{actor => agent}/contracts/test/mocks/DesignatedSigner.sol (100%) rename future-apps/{actor => agent}/contracts/test/mocks/DestinationMock.sol (100%) rename future-apps/{actor => agent}/contracts/test/mocks/EtherTokenConstantMock.sol (100%) rename future-apps/{actor => agent}/contracts/test/mocks/ExecutionTarget.sol (100%) rename future-apps/{actor => agent}/contracts/test/mocks/ForceSendETH.sol (100%) rename future-apps/{actor => agent}/contracts/test/mocks/KernelDepositableMock.sol (100%) rename future-apps/{actor => agent}/contracts/test/mocks/SimpleERC20.sol (100%) rename future-apps/{actor => agent}/manifest.json (88%) rename future-apps/{actor => agent}/migrations/1_initial_migration.js (100%) rename future-apps/{actor => agent}/package.json (98%) rename future-apps/{actor => agent}/scripts/deploy.js (100%) rename future-apps/{actor/test/actor.js => agent/test/agent.js} (75%) rename future-apps/{actor => agent}/test/vault.js (97%) rename future-apps/{actor => agent}/truffle.js (100%) diff --git a/.travis.yml b/.travis.yml index 3879293642..3e9486cfc2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,8 @@ cache: - apps/vault/node_modules - apps/voting/node_modules - apps/voting/app/node_modules + - future-apps/agent/node_modules + - future-apps/payroll/node_modules - shared/migrations/node_modules - shared/minime/node_modules - shared/test-helpers/node_modules @@ -27,19 +29,19 @@ env: - TASK=test:token-manager:app - TASK=test:vault - TASK=test:voting - - TASK=test:actor + - TASK=test:agent - TASK=coverage:finance - TASK=coverage:survey - TASK=coverage:token-manager - TASK=coverage:vault - TASK=coverage:voting - - TASK=coverage:actor + - TASK=coverage:agent - TASK=test:shared matrix: allow_failures: - env: - TASK=coverage:finance - - TASK=coverage:actor + - TASK=coverage:agent install: - travis_wait 60 npm install before_script: diff --git a/future-apps/actor/.solcover.js b/future-apps/agent/.solcover.js similarity index 100% rename from future-apps/actor/.solcover.js rename to future-apps/agent/.solcover.js diff --git a/future-apps/actor/.soliumignore b/future-apps/agent/.soliumignore similarity index 100% rename from future-apps/actor/.soliumignore rename to future-apps/agent/.soliumignore diff --git a/future-apps/actor/.soliumrc.json b/future-apps/agent/.soliumrc.json similarity index 100% rename from future-apps/actor/.soliumrc.json rename to future-apps/agent/.soliumrc.json diff --git a/future-apps/actor/arapp.json b/future-apps/agent/arapp.json similarity index 83% rename from future-apps/actor/arapp.json rename to future-apps/agent/arapp.json index 0a44a77b10..c42c599080 100644 --- a/future-apps/actor/arapp.json +++ b/future-apps/agent/arapp.json @@ -2,27 +2,27 @@ "environments": { "default": { "registry": "0x5f6f7e8cc7346a11ca2def8f827b7a0b612c56a1", - "appName": "actor.aragonpm.eth", + "appName": "agent.aragonpm.eth", "network": "rpc" }, "rinkeby": { "registry": "0x98Df287B6C145399Aaa709692c8D308357bC085D", - "appName": "actor.aragonpm.eth", + "appName": "agent.aragonpm.eth", "network": "rinkeby" }, "staging": { "registry": "0xfe03625ea880a8cba336f9b5ad6e15b0a3b5a939", - "appName": "actor.aragonpm.eth", + "appName": "agent.aragonpm.eth", "network": "rinkeby" }, "mainnet": { "registry": "0x314159265dd8dbb310642f98f50c066173c1259b", - "appName": "actor.aragonpm.eth", + "appName": "agent.aragonpm.eth", "network": "mainnet" }, "rinkeby-old": { "registry": "0xfbae32d1cde62858bc45f51efc8cc4fa1415447e", - "appName": "actor.aragonpm.eth", + "appName": "agent.aragonpm.eth", "network": "rinkeby" } }, @@ -58,5 +58,5 @@ ] } ], - "path": "contracts/Actor.sol" + "path": "contracts/Agent.sol" } \ No newline at end of file diff --git a/future-apps/actor/contracts/.npmignore b/future-apps/agent/contracts/.npmignore similarity index 100% rename from future-apps/actor/contracts/.npmignore rename to future-apps/agent/contracts/.npmignore diff --git a/future-apps/actor/contracts/Actor.sol b/future-apps/agent/contracts/Agent.sol similarity index 96% rename from future-apps/actor/contracts/Actor.sol rename to future-apps/agent/contracts/Agent.sol index 2b02d777cc..28d184020d 100644 --- a/future-apps/actor/contracts/Actor.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -13,7 +13,7 @@ import "@aragon/apps-vault/contracts/Vault.sol"; import "@aragon/os/contracts/common/IForwarder.sol"; -contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { +contract Agent is IERC165, IERC1271, IForwarder, IsContract, Vault { bytes32 public constant EXECUTE_ROLE = keccak256("EXECUTE_ROLE"); bytes32 public constant RUN_SCRIPT_ROLE = keccak256("RUN_SCRIPT_ROLE"); bytes32 public constant PRESIGN_HASH_ROLE = keccak256("PRESIGN_HASH_ROLE"); @@ -22,9 +22,9 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { bytes4 private constant EIP165_SUPPORT_INTERFACE_ID = 0x01ffc9a7; bytes4 public constant ISVALIDSIG_INTERFACE_ID = 0xabababab; // TODO: Add actual interfaceId - string private constant ERROR_EXECUTE_ETH_NO_DATA = "ACTOR_EXECUTE_ETH_NO_DATA"; - string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "ACTOR_EXECUTE_TARGET_NOT_CONTRACT"; - string private constant ERROR_DESIGNATED_TO_SELF = "ACTOR_DESIGNATED_TO_SELF"; + string private constant ERROR_EXECUTE_ETH_NO_DATA = "AGENT_EXECUTE_ETH_NO_DATA"; + string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "AGENT_EXECUTE_TARGET_NOT_CONTRACT"; + string private constant ERROR_DESIGNATED_TO_SELF = "AGENT_DESIGNATED_TO_SELF"; uint256 internal constant ISVALIDSIG_MAX_GAS = 50000; uint256 internal constant EIP165_MAX_GAS = 30000; @@ -44,7 +44,7 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { * @return Exits call frame forwarding the return data of the executed call (either error or success data) */ function execute(address _target, uint256 _ethValue, bytes _data) - external // This function MUST always be external as the function performs a low level return, exiting the Actor app execution context + external // This function MUST always be external as the function performs a low level return, exiting the Agent app execution context authP(EXECUTE_ROLE, arr(_target, _ethValue, uint256(getSig(_data)))) // TODO: Test that sig bytes are the least significant bytes { require(_ethValue == 0 || _data.length > 0, ERROR_EXECUTE_ETH_NO_DATA); // if ETH value is sent, there must be data @@ -113,7 +113,7 @@ contract Actor is IERC165, IERC1271, IForwarder, IsContract, Vault { } /** - * @notice Execute the script as the Actor app + * @notice Execute the script as the Agent app * @dev IForwarder interface conformance. Forwards any token holder action. * @param _evmScript Script being executed */ diff --git a/future-apps/actor/contracts/SignatureValidator.sol b/future-apps/agent/contracts/SignatureValidator.sol similarity index 100% rename from future-apps/actor/contracts/SignatureValidator.sol rename to future-apps/agent/contracts/SignatureValidator.sol diff --git a/future-apps/actor/contracts/standards/IERC1271.sol b/future-apps/agent/contracts/standards/IERC1271.sol similarity index 100% rename from future-apps/actor/contracts/standards/IERC1271.sol rename to future-apps/agent/contracts/standards/IERC1271.sol diff --git a/future-apps/actor/contracts/standards/IERC165.sol b/future-apps/agent/contracts/standards/IERC165.sol similarity index 100% rename from future-apps/actor/contracts/standards/IERC165.sol rename to future-apps/agent/contracts/standards/IERC165.sol diff --git a/future-apps/actor/contracts/test/TestImports.sol b/future-apps/agent/contracts/test/TestImports.sol similarity index 100% rename from future-apps/actor/contracts/test/TestImports.sol rename to future-apps/agent/contracts/test/TestImports.sol diff --git a/future-apps/actor/contracts/test/mocks/DesignatedSigner.sol b/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol similarity index 100% rename from future-apps/actor/contracts/test/mocks/DesignatedSigner.sol rename to future-apps/agent/contracts/test/mocks/DesignatedSigner.sol diff --git a/future-apps/actor/contracts/test/mocks/DestinationMock.sol b/future-apps/agent/contracts/test/mocks/DestinationMock.sol similarity index 100% rename from future-apps/actor/contracts/test/mocks/DestinationMock.sol rename to future-apps/agent/contracts/test/mocks/DestinationMock.sol diff --git a/future-apps/actor/contracts/test/mocks/EtherTokenConstantMock.sol b/future-apps/agent/contracts/test/mocks/EtherTokenConstantMock.sol similarity index 100% rename from future-apps/actor/contracts/test/mocks/EtherTokenConstantMock.sol rename to future-apps/agent/contracts/test/mocks/EtherTokenConstantMock.sol diff --git a/future-apps/actor/contracts/test/mocks/ExecutionTarget.sol b/future-apps/agent/contracts/test/mocks/ExecutionTarget.sol similarity index 100% rename from future-apps/actor/contracts/test/mocks/ExecutionTarget.sol rename to future-apps/agent/contracts/test/mocks/ExecutionTarget.sol diff --git a/future-apps/actor/contracts/test/mocks/ForceSendETH.sol b/future-apps/agent/contracts/test/mocks/ForceSendETH.sol similarity index 100% rename from future-apps/actor/contracts/test/mocks/ForceSendETH.sol rename to future-apps/agent/contracts/test/mocks/ForceSendETH.sol diff --git a/future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol b/future-apps/agent/contracts/test/mocks/KernelDepositableMock.sol similarity index 100% rename from future-apps/actor/contracts/test/mocks/KernelDepositableMock.sol rename to future-apps/agent/contracts/test/mocks/KernelDepositableMock.sol diff --git a/future-apps/actor/contracts/test/mocks/SimpleERC20.sol b/future-apps/agent/contracts/test/mocks/SimpleERC20.sol similarity index 100% rename from future-apps/actor/contracts/test/mocks/SimpleERC20.sol rename to future-apps/agent/contracts/test/mocks/SimpleERC20.sol diff --git a/future-apps/actor/manifest.json b/future-apps/agent/manifest.json similarity index 88% rename from future-apps/actor/manifest.json rename to future-apps/agent/manifest.json index 30b49a0193..7082ae3666 100644 --- a/future-apps/actor/manifest.json +++ b/future-apps/agent/manifest.json @@ -1,5 +1,5 @@ { - "name": "Actor", + "name": "Agent", "description": "Hold assets and perform actions from DAOs", "icons": [ { diff --git a/future-apps/actor/migrations/1_initial_migration.js b/future-apps/agent/migrations/1_initial_migration.js similarity index 100% rename from future-apps/actor/migrations/1_initial_migration.js rename to future-apps/agent/migrations/1_initial_migration.js diff --git a/future-apps/actor/package.json b/future-apps/agent/package.json similarity index 98% rename from future-apps/actor/package.json rename to future-apps/agent/package.json index b8e9687663..a83799f75d 100644 --- a/future-apps/actor/package.json +++ b/future-apps/agent/package.json @@ -1,5 +1,5 @@ { - "name": "@aragon/apps-actor", + "name": "@aragon/apps-agent", "version": "1.0.0", "main": "index.js", "scripts": { @@ -52,4 +52,4 @@ "@aragon/apps-vault": "4.0.0", "@aragon/os": "4.0.1" } -} +} \ No newline at end of file diff --git a/future-apps/actor/scripts/deploy.js b/future-apps/agent/scripts/deploy.js similarity index 100% rename from future-apps/actor/scripts/deploy.js rename to future-apps/agent/scripts/deploy.js diff --git a/future-apps/actor/test/actor.js b/future-apps/agent/test/agent.js similarity index 75% rename from future-apps/actor/test/actor.js rename to future-apps/agent/test/agent.js index 8e9e3da91b..11f27a5661 100644 --- a/future-apps/actor/test/actor.js +++ b/future-apps/agent/test/agent.js @@ -1,4 +1,4 @@ -const Actor = artifacts.require('Actor') +const Agent = artifacts.require('Agent') const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') const { hash: namehash } = require('eth-ens-namehash') @@ -30,8 +30,8 @@ const NO_SIG = '0x' const ERC165_SUPPORT_INTERFACE_ID = '0x01ffc9a7' const ERC165_SUPPORT_INVALID_ID = '0xffffffff' -contract('Actor app', (accounts) => { - let daoFact, actorBase, acl, actor, actorId +contract('Agent app', (accounts) => { + let daoFact, agentBase, acl, agent, agentId let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE, PRESIGN_HASH_ROLE, DESIGNATE_SIGNER_ROLE, ISVALIDSIG_INTERFACE_ID @@ -45,16 +45,16 @@ contract('Actor app', (accounts) => { const aclBase = await ACL.new() const regFact = await EVMScriptRegistryFactory.new() daoFact = await DAOFactory.new(kernelBase.address, aclBase.address, regFact.address) - actorBase = await Actor.new() + agentBase = await Agent.new() // Setup constants ANY_ENTITY = await aclBase.ANY_ENTITY() APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() - EXECUTE_ROLE = await actorBase.EXECUTE_ROLE() - RUN_SCRIPT_ROLE = await actorBase.RUN_SCRIPT_ROLE() - PRESIGN_HASH_ROLE = await actorBase.PRESIGN_HASH_ROLE() - DESIGNATE_SIGNER_ROLE = await actorBase.DESIGNATE_SIGNER_ROLE() - ISVALIDSIG_INTERFACE_ID = await actorBase.ISVALIDSIG_INTERFACE_ID() + EXECUTE_ROLE = await agentBase.EXECUTE_ROLE() + RUN_SCRIPT_ROLE = await agentBase.RUN_SCRIPT_ROLE() + PRESIGN_HASH_ROLE = await agentBase.PRESIGN_HASH_ROLE() + DESIGNATE_SIGNER_ROLE = await agentBase.DESIGNATE_SIGNER_ROLE() + ISVALIDSIG_INTERFACE_ID = await agentBase.ISVALIDSIG_INTERFACE_ID() const ethConstant = await EtherTokenConstantMock.new() ETH = await ethConstant.getETHConstant() @@ -67,14 +67,14 @@ contract('Actor app', (accounts) => { await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) - // actor - const actorAppId = namehash('actor.aragonpm.test') + // agent + const agentAppId = namehash('agent.aragonpm.test') - const actorReceipt = await dao.newAppInstance(actorAppId, actorBase.address, '0x', false) - const actorProxyAddress = getEvent(actorReceipt, 'NewAppProxy', 'proxy') - actor = Actor.at(actorProxyAddress) + const agentReceipt = await dao.newAppInstance(agentAppId, agentBase.address, '0x', false) + const agentProxyAddress = getEvent(agentReceipt, 'NewAppProxy', 'proxy') + agent = Agent.at(agentProxyAddress) - await actor.initialize() + await agent.initialize() }) context('> Executing actions', () => { @@ -82,7 +82,7 @@ contract('Actor app', (accounts) => { let executionTarget beforeEach(async () => { - await acl.createPermission(executor, actor.address, EXECUTE_ROLE, root, { from: root }) + await acl.createPermission(executor, agent.address, EXECUTE_ROLE, root, { from: root }) executionTarget = await ExecutionTarget.new() }) @@ -93,7 +93,7 @@ contract('Actor app', (accounts) => { assert.equal(await executionTarget.counter(), 0) const { to, data } = encodeFunctionCall(executionTarget, 'setCounter', N) - const receipt = await actor.execute(to, 0, data, { from: executor }) + const receipt = await agent.execute(to, 0, data, { from: executor }) assert.equal(await executionTarget.counter(), N) assertEvent(receipt, 'Execute') @@ -103,7 +103,7 @@ contract('Actor app', (accounts) => { assert.equal(await executionTarget.counter(), 0) const noData = '0x' - const receipt = await actor.execute(executionTarget.address, 0, noData, { from: executor }) + const receipt = await agent.execute(executionTarget.address, 0, noData, { from: executor }) // Fallback just runs ExecutionTarget.execute() assert.equal(await executionTarget.counter(), 1) @@ -114,7 +114,7 @@ contract('Actor app', (accounts) => { const { to, data } = encodeFunctionCall(executionTarget, 'execute') await assertRevert(() => - actor.execute(to, 0, data, { from: nonExecutor }) + agent.execute(to, 0, data, { from: nonExecutor }) ) }) @@ -124,11 +124,11 @@ contract('Actor app', (accounts) => { const noData = '0x' await assertRevert(() => - actor.execute(nonContract, 0, randomData, { from: executor }) + agent.execute(nonContract, 0, randomData, { from: executor }) ) await assertRevert(() => - actor.execute(nonContract, 0, noData, { from: executor }) + agent.execute(nonContract, 0, noData, { from: executor }) ) }) @@ -138,8 +138,8 @@ contract('Actor app', (accounts) => { const { to, data } = encodeFunctionCall(executionTarget, 'execute') // We make a call to easily get what data could be gotten inside the EVM - // Contract -> Actor.execute -> Target.func (would allow Contract to have access to this data) - const call = encodeFunctionCall(actor, 'execute', to, 0, data, { from: executor }) + // Contract -> Agent.execute -> Target.func (would allow Contract to have access to this data) + const call = encodeFunctionCall(agent, 'execute', to, 0, data, { from: executor }) const returnData = await web3Call(call) // ExecutionTarget.execute() increments the counter by 1 @@ -153,7 +153,7 @@ contract('Actor app', (accounts) => { const { to, data } = encodeFunctionCall(executionTarget, 'fail') await assertRevert(() => - actor.execute(to, 0, data, { from: executor }) + agent.execute(to, 0, data, { from: executor }) ) }) @@ -162,7 +162,7 @@ contract('Actor app', (accounts) => { let to, data beforeEach(async () => { - await actor.deposit(ETH, depositValue, { value: depositValue }) + await agent.deposit(ETH, depositValue, { value: depositValue }) const call = encodeFunctionCall(executionTarget, 'execute') to = call.to @@ -170,26 +170,26 @@ contract('Actor app', (accounts) => { assert.equal(await executionTarget.counter(), 0) assert.equal(await getBalance(executionTarget.address), 0) - assert.equal(await getBalance(actor.address), depositValue) + assert.equal(await getBalance(agent.address), depositValue) }) it('can execute actions with ETH', async () => { - await actor.execute(to, depositValue, data, { from: executor }) + await agent.execute(to, depositValue, data, { from: executor }) assert.equal(await executionTarget.counter(), 1) assert.equal(await getBalance(executionTarget.address), depositValue) - assert.equal(await getBalance(actor.address), 0) + assert.equal(await getBalance(agent.address), 0) }) - it('fails to execute actions with more ETH than the actor owns', async () => { + it('fails to execute actions with more ETH than the agent owns', async () => { await assertRevert(() => - actor.execute(to, depositValue + 1, data, { from: executor }) + agent.execute(to, depositValue + 1, data, { from: executor }) ) }) it('fails to execute when sending ETH and no data', async () => { await assertRevert(() => - actor.execute(to, depositValue, '0x', { from: executor }) + agent.execute(to, depositValue, '0x', { from: executor }) ) }) }) @@ -205,14 +205,14 @@ contract('Actor app', (accounts) => { const action = { to: executionTarget.address, calldata: executionTarget.contract.execute.getData() } script = encodeCallScript([action, action]) // perform action twice - await acl.createPermission(scriptRunner, actor.address, RUN_SCRIPT_ROLE, root, { from: root }) + await acl.createPermission(scriptRunner, agent.address, RUN_SCRIPT_ROLE, root, { from: root }) }) it('runs script', async () => { - assert.isTrue(await actor.canForward(scriptRunner, script)) + assert.isTrue(await agent.canForward(scriptRunner, script)) assert.equal(await executionTarget.counter(), 0) - const receipt = await actor.forward(script, { from: scriptRunner }) + const receipt = await agent.forward(script, { from: scriptRunner }) // Should execute ExecutionTarget.execute() twice assert.equal(await executionTarget.counter(), 2) @@ -220,11 +220,11 @@ contract('Actor app', (accounts) => { }) it('fails to run script without permissions', async () => { - assert.isFalse(await actor.canForward(nonScriptRunner, script)) + assert.isFalse(await agent.canForward(nonScriptRunner, script)) assert.equal(await executionTarget.counter(), 0) await assertRevert(() => - actor.forward(script, { from: nonScriptRunner }) + agent.forward(script, { from: nonScriptRunner }) ) assert.equal(await executionTarget.counter(), 0) }) @@ -235,35 +235,35 @@ contract('Actor app', (accounts) => { const HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing beforeEach(async () => { - await acl.createPermission(presigner, actor.address, PRESIGN_HASH_ROLE, root, { from: root }) - await acl.createPermission(signerDesignator, actor.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) + await acl.createPermission(presigner, agent.address, PRESIGN_HASH_ROLE, root, { from: root }) + await acl.createPermission(signerDesignator, agent.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) }) it('complies with ERC165', async () => { - assert.isTrue(await actor.supportsInterface(ERC165_SUPPORT_INTERFACE_ID)) - assert.isFalse(await actor.supportsInterface(ERC165_SUPPORT_INVALID_ID)) + assert.isTrue(await agent.supportsInterface(ERC165_SUPPORT_INTERFACE_ID)) + assert.isFalse(await agent.supportsInterface(ERC165_SUPPORT_INVALID_ID)) }) it('supports ERC1271 interface', async () => { - assert.isTrue(await actor.supportsInterface(ISVALIDSIG_INTERFACE_ID)) + assert.isTrue(await agent.supportsInterface(ISVALIDSIG_INTERFACE_ID)) }) it("doesn't support any other interface", async () => { - assert.isFalse(await actor.supportsInterface('0x12345678')) - assert.isFalse(await actor.supportsInterface('0x')) + assert.isFalse(await agent.supportsInterface('0x12345678')) + assert.isFalse(await agent.supportsInterface('0x')) }) it('presigns a hash', async () => { - await actor.presignHash(HASH, { from: presigner }) + await agent.presignHash(HASH, { from: presigner }) - assert.isTrue(await actor.isValidSignature(HASH, NO_SIG)) + assert.isTrue(await agent.isValidSignature(HASH, NO_SIG)) }) it('fails to presign a hash if not authorized', async () => { await assertRevert(() => - actor.presignHash(HASH, { from: nobody }) + agent.presignHash(HASH, { from: nobody }) ) - assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) }) context('> Designated signer: EOAs', () => { @@ -286,54 +286,54 @@ contract('Actor app', (accounts) => { } beforeEach(async () => { - await actor.setDesignatedSigner(signer, { from: signerDesignator }) + await agent.setDesignatedSigner(signer, { from: signerDesignator }) }) it('fails if setting itself as the designated signer', async () => { await assertRevert(async () => - await actor.setDesignatedSigner(actor.address, { from: signerDesignator }) + await agent.setDesignatedSigner(agent.address, { from: signerDesignator }) ) }) it('isValidSignature returns true to a valid signature', async () => { const signature = await sign(HASH, signer) - assert.isTrue(await actor.isValidSignature(HASH, signature)) + assert.isTrue(await agent.isValidSignature(HASH, signature)) }) it('isValidSignature returns true to a valid signature with legacy version', async () => { const legacyVersionSignature = await sign(HASH, signer, true) - assert.isTrue(await actor.isValidSignature(HASH, legacyVersionSignature)) + assert.isTrue(await agent.isValidSignature(HASH, legacyVersionSignature)) }) it('isValidSignature returns false to an invalid signature', async () => { const badSignature = (await sign(HASH, signer)).slice(0, -2) // drop last byte - assert.isFalse(await actor.isValidSignature(HASH, badSignature)) + assert.isFalse(await agent.isValidSignature(HASH, badSignature)) }) it('isValidSignature returns false to a signature with an invalid v', async () => { const invalidVersionSignature = await sign(HASH, signer, false, true) - assert.isFalse(await actor.isValidSignature(HASH, invalidVersionSignature)) + assert.isFalse(await agent.isValidSignature(HASH, invalidVersionSignature)) }) it('isValidSignature returns false to an unauthorized signer', async () => { const otherSignature = await sign(HASH, nobody) - assert.isFalse(await actor.isValidSignature(HASH, otherSignature)) + assert.isFalse(await agent.isValidSignature(HASH, otherSignature)) }) it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { const badSignature = (await sign(HASH, signer)).substring(0, -2) // drop last byte - assert.isFalse(await actor.isValidSignature(HASH, badSignature)) + assert.isFalse(await agent.isValidSignature(HASH, badSignature)) // Now presign it - await actor.presignHash(HASH, { from: presigner }) - assert.isTrue(await actor.isValidSignature(HASH, badSignature)) + await agent.presignHash(HASH, { from: presigner }) + assert.isTrue(await agent.isValidSignature(HASH, badSignature)) }) }) context('> Designated signer: contracts', () => { const setDesignatedSignerContract = async (...params) => { const designatedSigner = await DesignatedSigner.new(...params) - return actor.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) + return agent.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) } it('isValidSignature returns true if designated signer returns true', async () => { @@ -343,7 +343,7 @@ contract('Actor app', (accounts) => { // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, true, false, false) - assert.isTrue(await actor.isValidSignature(HASH, NO_SIG)) + assert.isTrue(await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer returns false', async () => { @@ -354,7 +354,7 @@ contract('Actor app', (accounts) => { await setDesignatedSignerContract(true, false, false, false) // Signature fails check - assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer doesnt support the interface', async () => { @@ -365,7 +365,7 @@ contract('Actor app', (accounts) => { await setDesignatedSignerContract(false, true, false, false) // Requires ERC165 compliance before checking isValidSignature - assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer reverts', async () => { @@ -376,7 +376,7 @@ contract('Actor app', (accounts) => { await setDesignatedSignerContract(true, true, true, false) // Reverts on checking - assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer attempts to modify state', async () => { @@ -387,7 +387,7 @@ contract('Actor app', (accounts) => { await setDesignatedSignerContract(true, true, false, true) // Checking costs too much gas - assert.isFalse(await actor.isValidSignature(HASH, NO_SIG)) + assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) }) }) }) diff --git a/future-apps/actor/test/vault.js b/future-apps/agent/test/vault.js similarity index 97% rename from future-apps/actor/test/vault.js rename to future-apps/agent/test/vault.js index 3644b05e28..1739dad026 100644 --- a/future-apps/actor/test/vault.js +++ b/future-apps/agent/test/vault.js @@ -1,5 +1,5 @@ -// Test that Actor is a fully functioning Vault by running the same tests against the Actor app -const Vault = artifacts.require('Actor') +// Test that Agent is a fully functioning Vault by running the same tests against the Agent app +const Vault = artifacts.require('Agent') const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') const { hash } = require('eth-ens-namehash') @@ -22,7 +22,7 @@ const DestinationMock = artifacts.require('DestinationMock') const NULL_ADDRESS = '0x00' -contract('Actor app (Vault compatibility)', (accounts) => { +contract('Agent app (Vault compatibility)', (accounts) => { let daoFact, vaultBase, vault, vaultId let ETH, ANY_ENTITY, APP_MANAGER_ROLE, TRANSFER_ROLE diff --git a/future-apps/actor/truffle.js b/future-apps/agent/truffle.js similarity index 100% rename from future-apps/actor/truffle.js rename to future-apps/agent/truffle.js diff --git a/package.json b/package.json index 23fd00fb79..3e46386502 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "test:token-manager:app": "npm test --prefix apps/token-manager/app", "test:vault": "lerna run --scope=@aragon/apps-vault --stream test", "test:voting": "lerna run --scope=@aragon/apps-voting --stream test", - "test:actor": "lerna run --scope=@aragon/apps-actor --stream test", + "test:agent": "lerna run --scope=@aragon/apps-agent --stream test", "test:future": "lerna run --scope=@aragon/future-apps-* --concurrency=1 --stream test", "test:shared": "lerna run --scope=@aragon/apps-shared-* --concurrency=1 --stream test", "coverage": "npm run coverage:all", @@ -39,7 +39,7 @@ "coverage:token-manager": "lerna run --scope=@aragon/apps-token-manager --concurrency=1 --stream coverage", "coverage:vault": "lerna run --scope=@aragon/apps-vault --concurrency=1 --stream coverage", "coverage:voting": "lerna run --scope=@aragon/apps-voting --concurrency=1 --stream coverage", - "coverage:actor": "lerna run --scope=@aragon/apps-actor --concurrency=1 --stream coverage", + "coverage:agent": "lerna run --scope=@aragon/apps-agent --concurrency=1 --stream coverage", "lint": "lerna run --scope=@aragon/apps-* lint", "link:os": "lerna exec --scope '@aragon/apps-*' 'npm link @aragon/os'", "ganache-cli:test": "shared/test-helpers/ganache-cli.sh", @@ -47,4 +47,4 @@ "publish:rpc": "lerna run --scope=@aragon/apps-* --concurrency=1 --stream publish:rpc", "publish:rinkeby": "lerna run --scope=@aragon/apps-* --concurrency=1 --stream publish:rinkeby" } -} +} \ No newline at end of file From 139ad8a11060c3cd56375357f35e5d24dde19226 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 11:59:57 +0100 Subject: [PATCH 21/44] Add status to arapp and rename constants --- future-apps/agent/arapp.json | 3 ++- future-apps/agent/contracts/Agent.sol | 8 ++++---- future-apps/agent/test/agent.js | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/future-apps/agent/arapp.json b/future-apps/agent/arapp.json index c42c599080..098dd619fb 100644 --- a/future-apps/agent/arapp.json +++ b/future-apps/agent/arapp.json @@ -1,4 +1,5 @@ { + "status": "experimental", "environments": { "default": { "registry": "0x5f6f7e8cc7346a11ca2def8f827b7a0b612c56a1", @@ -45,7 +46,7 @@ }, { "name": "Presign hash", - "id": "PRESIGN_HASH_ROLE", + "id": "ADD_PRESIGNED_HASH_ROLE", "params": [ "Hash" ] diff --git a/future-apps/agent/contracts/Agent.sol b/future-apps/agent/contracts/Agent.sol index 28d184020d..4c946eb873 100644 --- a/future-apps/agent/contracts/Agent.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -16,14 +16,14 @@ import "@aragon/os/contracts/common/IForwarder.sol"; contract Agent is IERC165, IERC1271, IForwarder, IsContract, Vault { bytes32 public constant EXECUTE_ROLE = keccak256("EXECUTE_ROLE"); bytes32 public constant RUN_SCRIPT_ROLE = keccak256("RUN_SCRIPT_ROLE"); - bytes32 public constant PRESIGN_HASH_ROLE = keccak256("PRESIGN_HASH_ROLE"); + bytes32 public constant ADD_PRESIGNED_HASH_ROLE = keccak256("ADD_PRESIGNED_HASH_ROLE"); bytes32 public constant DESIGNATE_SIGNER_ROLE = keccak256("DESIGNATE_SIGNER_ROLE"); bytes4 private constant EIP165_SUPPORT_INTERFACE_ID = 0x01ffc9a7; bytes4 public constant ISVALIDSIG_INTERFACE_ID = 0xabababab; // TODO: Add actual interfaceId - string private constant ERROR_EXECUTE_ETH_NO_DATA = "AGENT_EXECUTE_ETH_NO_DATA"; - string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "AGENT_EXECUTE_TARGET_NOT_CONTRACT"; + string private constant ERROR_EXECUTE_ETH_NO_DATA = "AGENT_EXEC_ETH_NO_DATA"; + string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "AGENT_EXEC_TARGET_NO_CONTRACT"; string private constant ERROR_DESIGNATED_TO_SELF = "AGENT_DESIGNATED_TO_SELF"; uint256 internal constant ISVALIDSIG_MAX_GAS = 50000; @@ -95,7 +95,7 @@ contract Agent is IERC165, IERC1271, IForwarder, IsContract, Vault { */ function presignHash(bytes32 _hash) external - authP(PRESIGN_HASH_ROLE, arr(_hash)) + authP(ADD_PRESIGNED_HASH_ROLE, arr(_hash)) { isPresigned[_hash] = true; diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index 11f27a5661..ac49d43934 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -33,7 +33,7 @@ const ERC165_SUPPORT_INVALID_ID = '0xffffffff' contract('Agent app', (accounts) => { let daoFact, agentBase, acl, agent, agentId - let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE, PRESIGN_HASH_ROLE, DESIGNATE_SIGNER_ROLE, ISVALIDSIG_INTERFACE_ID + let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE, ADD_PRESIGNED_HASH_ROLE, DESIGNATE_SIGNER_ROLE, ISVALIDSIG_INTERFACE_ID const root = accounts[0] @@ -52,7 +52,7 @@ contract('Agent app', (accounts) => { APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() EXECUTE_ROLE = await agentBase.EXECUTE_ROLE() RUN_SCRIPT_ROLE = await agentBase.RUN_SCRIPT_ROLE() - PRESIGN_HASH_ROLE = await agentBase.PRESIGN_HASH_ROLE() + ADD_PRESIGNED_HASH_ROLE = await agentBase.ADD_PRESIGNED_HASH_ROLE() DESIGNATE_SIGNER_ROLE = await agentBase.DESIGNATE_SIGNER_ROLE() ISVALIDSIG_INTERFACE_ID = await agentBase.ISVALIDSIG_INTERFACE_ID() @@ -235,7 +235,7 @@ contract('Agent app', (accounts) => { const HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing beforeEach(async () => { - await acl.createPermission(presigner, agent.address, PRESIGN_HASH_ROLE, root, { from: root }) + await acl.createPermission(presigner, agent.address, ADD_PRESIGNED_HASH_ROLE, root, { from: root }) await acl.createPermission(signerDesignator, agent.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) }) From fe86092ed206453f66337082874ebb46fe33fb28 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 17:06:41 +0100 Subject: [PATCH 22/44] Update ERC1271 implementation --- future-apps/agent/contracts/Agent.sol | 20 ++++----- .../agent/contracts/standards/ERC1271.sol | 41 +++++++++++++++++++ .../agent/contracts/standards/IERC1271.sol | 9 ---- .../contracts/test/mocks/DesignatedSigner.sol | 6 +-- future-apps/agent/test/agent.js | 40 +++++++++++------- 5 files changed, 78 insertions(+), 38 deletions(-) create mode 100644 future-apps/agent/contracts/standards/ERC1271.sol delete mode 100644 future-apps/agent/contracts/standards/IERC1271.sol diff --git a/future-apps/agent/contracts/Agent.sol b/future-apps/agent/contracts/Agent.sol index 4c946eb873..cdfeb322bf 100644 --- a/future-apps/agent/contracts/Agent.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -6,14 +6,14 @@ pragma solidity 0.4.24; import "./SignatureValidator.sol"; import "./standards/IERC165.sol"; -import "./standards/IERC1271.sol"; +import "./standards/ERC1271.sol"; import "@aragon/apps-vault/contracts/Vault.sol"; import "@aragon/os/contracts/common/IForwarder.sol"; -contract Agent is IERC165, IERC1271, IForwarder, IsContract, Vault { +contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { bytes32 public constant EXECUTE_ROLE = keccak256("EXECUTE_ROLE"); bytes32 public constant RUN_SCRIPT_ROLE = keccak256("RUN_SCRIPT_ROLE"); bytes32 public constant ADD_PRESIGNED_HASH_ROLE = keccak256("ADD_PRESIGNED_HASH_ROLE"); @@ -26,7 +26,7 @@ contract Agent is IERC165, IERC1271, IForwarder, IsContract, Vault { string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "AGENT_EXEC_TARGET_NO_CONTRACT"; string private constant ERROR_DESIGNATED_TO_SELF = "AGENT_DESIGNATED_TO_SELF"; - uint256 internal constant ISVALIDSIG_MAX_GAS = 50000; + uint256 internal constant ISVALIDSIG_MAX_GAS = 250000; uint256 internal constant EIP165_MAX_GAS = 30000; mapping (bytes32 => bool) public isPresigned; @@ -127,30 +127,26 @@ contract Agent is IERC165, IERC1271, IForwarder, IsContract, Vault { // We don't need to emit an event here as EVMScriptRunner will emit ScriptResult if successful } - function isValidSignature(bytes data, bytes signature) public view returns (bool) { - return isValidSignature(keccak256(data), signature); - } - - function isValidSignature(bytes32 hash, bytes signature) public view returns (bool) { + function isValidSignature(bytes32 hash, bytes signature) public view returns (bytes4) { // Short-circuit in case the hash was presigned. Optimization as performing calls // and ecrecover is more expensive than an SLOAD. if (isPresigned[hash]) { - return true; + return ERC1271_RETURN_VALID_SIGNATURE; } // Checks if designatedSigner is a contract, and if it supports the isValidSignature interface if (safeSupportsInterface(IERC165(designatedSigner), ISVALIDSIG_INTERFACE_ID)) { // designatedSigner.isValidSignature(hash, signature) as a staticall - IERC1271 signerContract = IERC1271(designatedSigner); + ERC1271 signerContract = ERC1271(designatedSigner); bytes memory calldata = abi.encodeWithSelector(signerContract.isValidSignature.selector, hash, signature); - return safeBoolStaticCall(signerContract, calldata, ISVALIDSIG_MAX_GAS); + return isValidSignatureReturn(safeBoolStaticCall(signerContract, calldata, ISVALIDSIG_MAX_GAS)); } // `safeSupportsInterface` returns false if designatedSigner is a contract but it // doesn't support the interface. Here we check the validity of the ECDSA sig // which will always fail if designatedSigner is not an EOA - return SignatureValidator.isValidSignature(hash, designatedSigner, signature); + return isValidSignatureReturn(SignatureValidator.isValidSignature(hash, designatedSigner, signature)); } function canForward(address sender, bytes evmScript) public view returns (bool) { diff --git a/future-apps/agent/contracts/standards/ERC1271.sol b/future-apps/agent/contracts/standards/ERC1271.sol new file mode 100644 index 0000000000..782e5524ed --- /dev/null +++ b/future-apps/agent/contracts/standards/ERC1271.sol @@ -0,0 +1,41 @@ +pragma solidity 0.4.24; + + +// ERC1271 on Feb 12th, 2019: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md +// Using `isValidSignature(bytes32,bytes)` even though the standard still hasn't been modified +// Rationale: https://github.com/ethereum/EIPs/issues/1271#issuecomment-462719728 +contract ERC1271 { + // bytes4(keccak256("isValidSignature(bytes,bytes)") + bytes4 constant internal ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; + bytes4 constant internal ERC1271_RETURN_INVALID_SIGNATURE = 0x00000000; + + /** + * @dev Function must be implemented by deriving contract + * @param _hash Arbitrary length data signed on the behalf of address(this) + * @param _signature Signature byte array associated with _data + * @return A bytes4 magic value 0x20c13b0b if the signature check passes, 0x00000000 if not + * + * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) + * MUST allow external calls + */ + function isValidSignature(bytes32 _hash, bytes memory _signature) public view returns (bytes4); + + function isValidSignatureReturn(bool isValid) internal pure returns (bytes4) { + return isValid ? ERC1271_RETURN_VALID_SIGNATURE : ERC1271_RETURN_INVALID_SIGNATURE; + } +} + +contract ERC1271Bytes is ERC1271 { + /** + * @dev Default behavior of `isValidSignature(bytes,bytes)`, can be overloaded for custom validation + * @param _data Arbitrary length data signed on the behalf of address(this) + * @param _signature Signature byte array associated with _data + * @return A bytes4 magic value 0x20c13b0b if the signature check passes, 0x00000000 if not + * + * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) + * MUST allow external calls + */ + function isValidSignature(bytes _data, bytes _signature) public view returns (bytes4) { + return isValidSignature(keccak256(_data), _signature); + } +} \ No newline at end of file diff --git a/future-apps/agent/contracts/standards/IERC1271.sol b/future-apps/agent/contracts/standards/IERC1271.sol deleted file mode 100644 index 1070335a8e..0000000000 --- a/future-apps/agent/contracts/standards/IERC1271.sol +++ /dev/null @@ -1,9 +0,0 @@ -pragma solidity 0.4.24; - - -interface IERC1271 { - // TODO: Standard is not finalized, discussion: https://github.com/ethereum/EIPs/issues/1271 - // Can't be marked external due to function overload clash with memory and calldata, see: - // https://github.com/ethereum/solidity/issues/4832 - function isValidSignature(bytes32 hash, bytes signature) public view returns (bool); -} diff --git a/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol b/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol index 00b371119d..23c7aadbbe 100644 --- a/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol +++ b/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol @@ -1,10 +1,10 @@ pragma solidity 0.4.24; import "../../standards/IERC165.sol"; -import "../../standards/IERC1271.sol"; +import "../../standards/ERC1271.sol"; -contract DesignatedSigner /* is IERC165, IERC1271 */ { +contract DesignatedSigner /* is IERC165, ERC1271 */ { bool isInterface; bool isValid; bool isValidRevert; @@ -23,7 +23,7 @@ contract DesignatedSigner /* is IERC165, IERC1271 */ { } // Can't be ERC1271-compliant since this potentially modifies state - function isValidSignature(bytes32 hash, bytes signature) external returns (bool) { + function isValidSignature(bytes32, bytes) external returns (bool) { require(!isValidRevert); if (modifyState) { diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index ac49d43934..c7cb132e03 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -234,6 +234,18 @@ contract('Agent app', (accounts) => { const [_, nobody, presigner, signerDesignator] = accounts const HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing + const ERC1271_RETURN_VALID_SIGNATURE = '0x20c13b0b' + const ERC1271_RETURN_INVALID_SIGNATURE = '0x00000000' + + const assertIsValidSignature = (isValid, erc1271Return) => { + const expectedReturn = + isValid + ? ERC1271_RETURN_VALID_SIGNATURE + : ERC1271_RETURN_INVALID_SIGNATURE + + assert.equal(expectedReturn, erc1271Return, `Expected signature to be ${isValid ? '' : 'in'}valid (returned ${erc1271Return})`) + } + beforeEach(async () => { await acl.createPermission(presigner, agent.address, ADD_PRESIGNED_HASH_ROLE, root, { from: root }) await acl.createPermission(signerDesignator, agent.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) @@ -256,14 +268,14 @@ contract('Agent app', (accounts) => { it('presigns a hash', async () => { await agent.presignHash(HASH, { from: presigner }) - assert.isTrue(await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(true, await agent.isValidSignature(HASH, NO_SIG)) }) it('fails to presign a hash if not authorized', async () => { await assertRevert(() => agent.presignHash(HASH, { from: nobody }) ) - assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) context('> Designated signer: EOAs', () => { @@ -297,36 +309,36 @@ contract('Agent app', (accounts) => { it('isValidSignature returns true to a valid signature', async () => { const signature = await sign(HASH, signer) - assert.isTrue(await agent.isValidSignature(HASH, signature)) + assertIsValidSignature(true, await agent.isValidSignature(HASH, signature)) }) it('isValidSignature returns true to a valid signature with legacy version', async () => { const legacyVersionSignature = await sign(HASH, signer, true) - assert.isTrue(await agent.isValidSignature(HASH, legacyVersionSignature)) + assertIsValidSignature(true, await agent.isValidSignature(HASH, legacyVersionSignature)) }) it('isValidSignature returns false to an invalid signature', async () => { const badSignature = (await sign(HASH, signer)).slice(0, -2) // drop last byte - assert.isFalse(await agent.isValidSignature(HASH, badSignature)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) }) it('isValidSignature returns false to a signature with an invalid v', async () => { const invalidVersionSignature = await sign(HASH, signer, false, true) - assert.isFalse(await agent.isValidSignature(HASH, invalidVersionSignature)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidVersionSignature)) }) it('isValidSignature returns false to an unauthorized signer', async () => { const otherSignature = await sign(HASH, nobody) - assert.isFalse(await agent.isValidSignature(HASH, otherSignature)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, otherSignature)) }) it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { const badSignature = (await sign(HASH, signer)).substring(0, -2) // drop last byte - assert.isFalse(await agent.isValidSignature(HASH, badSignature)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) // Now presign it await agent.presignHash(HASH, { from: presigner }) - assert.isTrue(await agent.isValidSignature(HASH, badSignature)) + assertIsValidSignature(true, await agent.isValidSignature(HASH, badSignature)) }) }) @@ -343,7 +355,7 @@ contract('Agent app', (accounts) => { // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, true, false, false) - assert.isTrue(await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(true, await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer returns false', async () => { @@ -354,7 +366,7 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(true, false, false, false) // Signature fails check - assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer doesnt support the interface', async () => { @@ -365,7 +377,7 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(false, true, false, false) // Requires ERC165 compliance before checking isValidSignature - assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer reverts', async () => { @@ -376,7 +388,7 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(true, true, true, false) // Reverts on checking - assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) it('isValidSignature returns false if designated signer attempts to modify state', async () => { @@ -387,7 +399,7 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(true, true, false, true) // Checking costs too much gas - assert.isFalse(await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) }) }) From 1849286e981d983d5830a0b583d8d3385d281ed4 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 17:09:06 +0100 Subject: [PATCH 23/44] Add ERC1271 interfaceId --- future-apps/agent/contracts/Agent.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/future-apps/agent/contracts/Agent.sol b/future-apps/agent/contracts/Agent.sol index cdfeb322bf..647ed4d416 100644 --- a/future-apps/agent/contracts/Agent.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -20,7 +20,7 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { bytes32 public constant DESIGNATE_SIGNER_ROLE = keccak256("DESIGNATE_SIGNER_ROLE"); bytes4 private constant EIP165_SUPPORT_INTERFACE_ID = 0x01ffc9a7; - bytes4 public constant ISVALIDSIG_INTERFACE_ID = 0xabababab; // TODO: Add actual interfaceId + bytes4 public constant ISVALIDSIG_INTERFACE_ID = ERC1271(0).isValidSignature.selector; string private constant ERROR_EXECUTE_ETH_NO_DATA = "AGENT_EXEC_ETH_NO_DATA"; string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "AGENT_EXEC_TARGET_NO_CONTRACT"; From 1b7b735acc31fe927db9fc9a88058b30c243dfd9 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 17:24:09 +0100 Subject: [PATCH 24/44] Rename constants --- future-apps/agent/contracts/Agent.sol | 11 +++++------ future-apps/agent/contracts/standards/ERC1271.sol | 7 ++++--- future-apps/agent/test/agent.js | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/future-apps/agent/contracts/Agent.sol b/future-apps/agent/contracts/Agent.sol index 647ed4d416..0e0c4100ba 100644 --- a/future-apps/agent/contracts/Agent.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -19,8 +19,7 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { bytes32 public constant ADD_PRESIGNED_HASH_ROLE = keccak256("ADD_PRESIGNED_HASH_ROLE"); bytes32 public constant DESIGNATE_SIGNER_ROLE = keccak256("DESIGNATE_SIGNER_ROLE"); - bytes4 private constant EIP165_SUPPORT_INTERFACE_ID = 0x01ffc9a7; - bytes4 public constant ISVALIDSIG_INTERFACE_ID = ERC1271(0).isValidSignature.selector; + bytes4 private constant ERC165_INTERFACE_ID = 0x01ffc9a7; string private constant ERROR_EXECUTE_ETH_NO_DATA = "AGENT_EXEC_ETH_NO_DATA"; string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "AGENT_EXEC_TARGET_NO_CONTRACT"; @@ -108,8 +107,8 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { function supportsInterface(bytes4 interfaceId) external pure returns (bool) { return - interfaceId == ISVALIDSIG_INTERFACE_ID || - interfaceId == EIP165_SUPPORT_INTERFACE_ID; + interfaceId == ERC1271_INTERFACE_ID || + interfaceId == ERC165_INTERFACE_ID; } /** @@ -131,11 +130,11 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { // Short-circuit in case the hash was presigned. Optimization as performing calls // and ecrecover is more expensive than an SLOAD. if (isPresigned[hash]) { - return ERC1271_RETURN_VALID_SIGNATURE; + return isValidSignatureReturn(true); } // Checks if designatedSigner is a contract, and if it supports the isValidSignature interface - if (safeSupportsInterface(IERC165(designatedSigner), ISVALIDSIG_INTERFACE_ID)) { + if (safeSupportsInterface(IERC165(designatedSigner), ERC1271_INTERFACE_ID)) { // designatedSigner.isValidSignature(hash, signature) as a staticall ERC1271 signerContract = ERC1271(designatedSigner); bytes memory calldata = abi.encodeWithSelector(signerContract.isValidSignature.selector, hash, signature); diff --git a/future-apps/agent/contracts/standards/ERC1271.sol b/future-apps/agent/contracts/standards/ERC1271.sol index 782e5524ed..dece1dab83 100644 --- a/future-apps/agent/contracts/standards/ERC1271.sol +++ b/future-apps/agent/contracts/standards/ERC1271.sol @@ -5,9 +5,10 @@ pragma solidity 0.4.24; // Using `isValidSignature(bytes32,bytes)` even though the standard still hasn't been modified // Rationale: https://github.com/ethereum/EIPs/issues/1271#issuecomment-462719728 contract ERC1271 { - // bytes4(keccak256("isValidSignature(bytes,bytes)") - bytes4 constant internal ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; - bytes4 constant internal ERC1271_RETURN_INVALID_SIGNATURE = 0x00000000; + bytes4 constant public ERC1271_INTERFACE_ID = this.isValidSignature.selector; + + bytes4 constant public ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; // TODO: Likely needs to be updated + bytes4 constant public ERC1271_RETURN_INVALID_SIGNATURE = 0x00000000; /** * @dev Function must be implemented by deriving contract diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index c7cb132e03..7625dae5c4 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -33,7 +33,7 @@ const ERC165_SUPPORT_INVALID_ID = '0xffffffff' contract('Agent app', (accounts) => { let daoFact, agentBase, acl, agent, agentId - let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE, ADD_PRESIGNED_HASH_ROLE, DESIGNATE_SIGNER_ROLE, ISVALIDSIG_INTERFACE_ID + let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE, ADD_PRESIGNED_HASH_ROLE, DESIGNATE_SIGNER_ROLE, ERC1271_INTERFACE_ID const root = accounts[0] @@ -54,7 +54,7 @@ contract('Agent app', (accounts) => { RUN_SCRIPT_ROLE = await agentBase.RUN_SCRIPT_ROLE() ADD_PRESIGNED_HASH_ROLE = await agentBase.ADD_PRESIGNED_HASH_ROLE() DESIGNATE_SIGNER_ROLE = await agentBase.DESIGNATE_SIGNER_ROLE() - ISVALIDSIG_INTERFACE_ID = await agentBase.ISVALIDSIG_INTERFACE_ID() + ERC1271_INTERFACE_ID = await agentBase.ERC1271_INTERFACE_ID() const ethConstant = await EtherTokenConstantMock.new() ETH = await ethConstant.getETHConstant() @@ -257,7 +257,7 @@ contract('Agent app', (accounts) => { }) it('supports ERC1271 interface', async () => { - assert.isTrue(await agent.supportsInterface(ISVALIDSIG_INTERFACE_ID)) + assert.isTrue(await agent.supportsInterface(ERC1271_INTERFACE_ID)) }) it("doesn't support any other interface", async () => { From d960fee09f2a70c7840c4a6a8b5a35c93e3eb119 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 17:39:29 +0100 Subject: [PATCH 25/44] Rename calldata --- future-apps/agent/contracts/Agent.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/future-apps/agent/contracts/Agent.sol b/future-apps/agent/contracts/Agent.sol index 0e0c4100ba..8d95717233 100644 --- a/future-apps/agent/contracts/Agent.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -137,8 +137,8 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { if (safeSupportsInterface(IERC165(designatedSigner), ERC1271_INTERFACE_ID)) { // designatedSigner.isValidSignature(hash, signature) as a staticall ERC1271 signerContract = ERC1271(designatedSigner); - bytes memory calldata = abi.encodeWithSelector(signerContract.isValidSignature.selector, hash, signature); - return isValidSignatureReturn(safeBoolStaticCall(signerContract, calldata, ISVALIDSIG_MAX_GAS)); + bytes memory data = abi.encodeWithSelector(signerContract.isValidSignature.selector, hash, signature); + return isValidSignatureReturn(safeBoolStaticCall(signerContract, data, ISVALIDSIG_MAX_GAS)); } // `safeSupportsInterface` returns false if designatedSigner is a contract but it @@ -159,17 +159,17 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { return false; } - bytes memory calldata = abi.encodeWithSelector(target.supportsInterface.selector, interfaceId); - return safeBoolStaticCall(target, calldata, EIP165_MAX_GAS); + bytes memory data = abi.encodeWithSelector(target.supportsInterface.selector, interfaceId); + return safeBoolStaticCall(target, data, EIP165_MAX_GAS); } - function safeBoolStaticCall(address target, bytes calldata, uint256 maxGas) internal view returns (bool) { + function safeBoolStaticCall(address target, bytes data, uint256 maxGas) internal view returns (bool) { uint256 gasLeft = gasleft(); uint256 callGas = gasLeft > maxGas ? maxGas : gasLeft; bool ok; assembly { - ok := staticcall(callGas, target, add(calldata, 0x20), mload(calldata), 0, 0) + ok := staticcall(callGas, target, add(data, 0x20), mload(data), 0, 0) } if (!ok) { From 39b6b7e9374846c32caeb3f1adf3c534c8645c42 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 18:04:23 +0100 Subject: [PATCH 26/44] Refactor SignatureValidator.sol --- .../agent/contracts/SignatureValidator.sol | 35 ++++---- future-apps/agent/test/agent.js | 84 ++++++++++--------- 2 files changed, 66 insertions(+), 53 deletions(-) diff --git a/future-apps/agent/contracts/SignatureValidator.sol b/future-apps/agent/contracts/SignatureValidator.sol index 3779857913..8aa1ef80e0 100644 --- a/future-apps/agent/contracts/SignatureValidator.sol +++ b/future-apps/agent/contracts/SignatureValidator.sol @@ -1,35 +1,39 @@ pragma solidity 0.4.24; // From github.com/DexyProject/protocol +// + https://github.com/0xProject/0x-monorepo/blob/master/packages/contracts/contracts/protocol/Exchange/MixinSignatureValidator.sol // This should probably be moved into aOS: https://github.com/aragon/aragonOS/pull/442 library SignatureValidator { - // Maybe use 0x's IDs enum SignatureMode { + Invalid, EIP712, - GETH, - TREZOR + EthSign } /// @dev Validates that a hash was signed by a specified signer. /// @param hash Hash which was signed. /// @param signer Address of the signer. - /// @param signature ECDSA signature along with the mode (0 = EIP712, 1 = Geth, 2 = Trezor) {mode}{v}{r}{s}. + /// @param signature ECDSA signature along with the mode (0 = Invalid, 1 = EIP712, 2 = EthSign) {mode}{r}{s}{v}. /// @return Returns whether signature is from a specified user. function isValidSignature(bytes32 hash, address signer, bytes signature) internal pure returns (bool) { - if (signature.length != 66) { + SignatureMode mode = SignatureMode(uint8(signature[0])); + + if (mode == SignatureMode.Invalid) { return false; } - SignatureMode mode = SignatureMode(uint8(signature[0])); + if (signature.length != 66) { + return false; + } - uint8 v = uint8(signature[1]); + uint8 v = uint8(signature[65]); bytes32 r; bytes32 s; assembly { - r := mload(add(signature, 34)) - s := mload(add(signature, 66)) + r := mload(add(signature, 33)) + s := mload(add(signature, 65)) } // Allow signature version to be 0 or 1 @@ -41,12 +45,15 @@ library SignatureValidator { return false; } - if (mode == SignatureMode.GETH) { - hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); - } else if (mode == SignatureMode.TREZOR) { - hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n\x20", hash)); + bytes32 signedHash; + if (mode == SignatureMode.EthSign) { + signedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); + } else if (mode == SignatureMode.EIP712) { + signedHash = hash; + } else { + assert(false); } - return ecrecover(hash, v, r, s) == signer; + return ecrecover(signedHash, v, r, s) == signer; } } diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index 7625dae5c4..d477c63e46 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -278,67 +278,73 @@ contract('Agent app', (accounts) => { assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) - context('> Designated signer: EOAs', () => { + context.only('> Designated signer: EOAs', () => { let signer = accounts[7] - const sign = async (hash, signer, useLegacySig = false, useInvalidV = false) => { + beforeEach(async () => { + await agent.setDesignatedSigner(signer, { from: signerDesignator }) + }) + + it('fails if setting itself as the designated signer', async () => { + await assertRevert(async () => + await agent.setDesignatedSigner(agent.address, { from: signerDesignator }) + ) + }) + + it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { + const invalidSignature = "0x00" + assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidSignature)) + + // Now presign it + await agent.presignHash(HASH, { from: presigner }) + assertIsValidSignature(true, await agent.isValidSignature(HASH, invalidSignature)) + }) + + const ethSign = async (hash, signer, useLegacySig = false, useInvalidV = false) => { let sig = (await web3Sign(signer, hash)).slice(2) let r = ethutil.toBuffer('0x' + sig.substring(0, 64)) let s = ethutil.toBuffer('0x' + sig.substring(64, 128)) let v = ethutil.toBuffer((useLegacySig ? 0 : 27) + parseInt(sig.substring(128, 130), 16)) - let mode = ethutil.toBuffer(1) + let mode = ethutil.toBuffer(2) if (useInvalidV) { v = ethutil.toBuffer(2) // force set an invalid v } - const signature = '0x' + Buffer.concat([mode, v, r, s]).toString('hex') + const signature = '0x' + Buffer.concat([mode, r, s, v]).toString('hex') return signature } - beforeEach(async () => { - await agent.setDesignatedSigner(signer, { from: signerDesignator }) - }) - - it('fails if setting itself as the designated signer', async () => { - await assertRevert(async () => - await agent.setDesignatedSigner(agent.address, { from: signerDesignator }) - ) - }) - it('isValidSignature returns true to a valid signature', async () => { - const signature = await sign(HASH, signer) - assertIsValidSignature(true, await agent.isValidSignature(HASH, signature)) - }) + // TODO: Test EIP712 signatures - it('isValidSignature returns true to a valid signature with legacy version', async () => { - const legacyVersionSignature = await sign(HASH, signer, true) - assertIsValidSignature(true, await agent.isValidSignature(HASH, legacyVersionSignature)) - }) - it('isValidSignature returns false to an invalid signature', async () => { - const badSignature = (await sign(HASH, signer)).slice(0, -2) // drop last byte - assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) - }) + context('> EthSign', () => { + it('isValidSignature returns true to a valid signature', async () => { + const signature = await ethSign(HASH, signer) + assertIsValidSignature(true, await agent.isValidSignature(HASH, signature)) + }) - it('isValidSignature returns false to a signature with an invalid v', async () => { - const invalidVersionSignature = await sign(HASH, signer, false, true) - assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidVersionSignature)) - }) + it('isValidSignature returns true to a valid signature with legacy version', async () => { + const legacyVersionSignature = await ethSign(HASH, signer, true) + assertIsValidSignature(true, await agent.isValidSignature(HASH, legacyVersionSignature)) + }) - it('isValidSignature returns false to an unauthorized signer', async () => { - const otherSignature = await sign(HASH, nobody) - assertIsValidSignature(false, await agent.isValidSignature(HASH, otherSignature)) - }) + it('isValidSignature returns false to an invalid signature', async () => { + const badSignature = (await ethSign(HASH, signer)).slice(0, -2) // drop last byte + assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) + }) - it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { - const badSignature = (await sign(HASH, signer)).substring(0, -2) // drop last byte - assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) + it('isValidSignature returns false to a signature with an invalid v', async () => { + const invalidVersionSignature = await ethSign(HASH, signer, false, true) + assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidVersionSignature)) + }) - // Now presign it - await agent.presignHash(HASH, { from: presigner }) - assertIsValidSignature(true, await agent.isValidSignature(HASH, badSignature)) + it('isValidSignature returns false to an unauthorized signer', async () => { + const otherSignature = await ethSign(HASH, nobody) + assertIsValidSignature(false, await agent.isValidSignature(HASH, otherSignature)) + }) }) }) From de9d4a6825f701fd91540830689496a6135b3b06 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 20:34:38 +0100 Subject: [PATCH 27/44] Refactor signature validation tests and test EIP712 signatures --- .../agent/contracts/SignatureValidator.sol | 6 +- future-apps/agent/package.json | 4 +- future-apps/agent/test/agent.js | 147 +++++++++++------- 3 files changed, 94 insertions(+), 63 deletions(-) diff --git a/future-apps/agent/contracts/SignatureValidator.sol b/future-apps/agent/contracts/SignatureValidator.sol index 8aa1ef80e0..f2d10e65ac 100644 --- a/future-apps/agent/contracts/SignatureValidator.sol +++ b/future-apps/agent/contracts/SignatureValidator.sol @@ -20,11 +20,7 @@ library SignatureValidator { function isValidSignature(bytes32 hash, address signer, bytes signature) internal pure returns (bool) { SignatureMode mode = SignatureMode(uint8(signature[0])); - if (mode == SignatureMode.Invalid) { - return false; - } - - if (signature.length != 66) { + if (mode == SignatureMode.Invalid || signature.length != 66) { return false; } diff --git a/future-apps/agent/package.json b/future-apps/agent/package.json index a83799f75d..b14ad89e20 100644 --- a/future-apps/agent/package.json +++ b/future-apps/agent/package.json @@ -39,7 +39,7 @@ "@aragon/cli": "^5.2.0-beta.1", "@aragon/test-helpers": "^1.0.1", "eth-gas-reporter": "^0.1.1", - "ethereumjs-util": "^6.0.0", + "ethereumjs-util": "^6.1.0", "ganache-cli": "^6.0.3", "solidity-coverage": "0.5.11", "solium": "^1.0.4", @@ -52,4 +52,4 @@ "@aragon/apps-vault": "4.0.0", "@aragon/os": "4.0.1" } -} \ No newline at end of file +} diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index d477c63e46..8e4dcf53c2 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -2,7 +2,7 @@ const Agent = artifacts.require('Agent') const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') const { hash: namehash } = require('eth-ens-namehash') -const ethutil = require('ethereumjs-util') +const ethUtil = require('ethereumjs-util') const getBalance = require('@aragon/test-helpers/balance')(web3) const web3Call = require('@aragon/test-helpers/call')(web3) const web3Sign = require('@aragon/test-helpers/sign')(web3) @@ -243,7 +243,7 @@ contract('Agent app', (accounts) => { ? ERC1271_RETURN_VALID_SIGNATURE : ERC1271_RETURN_INVALID_SIGNATURE - assert.equal(expectedReturn, erc1271Return, `Expected signature to be ${isValid ? '' : 'in'}valid (returned ${erc1271Return})`) + assert.equal(erc1271Return, expectedReturn, `Expected signature to be ${isValid ? '' : 'in'}valid (returned ${erc1271Return})`) } beforeEach(async () => { @@ -278,72 +278,107 @@ contract('Agent app', (accounts) => { assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) - context.only('> Designated signer: EOAs', () => { - let signer = accounts[7] - - beforeEach(async () => { - await agent.setDesignatedSigner(signer, { from: signerDesignator }) - }) - - it('fails if setting itself as the designated signer', async () => { - await assertRevert(async () => - await agent.setDesignatedSigner(agent.address, { from: signerDesignator }) + context('> Designated signer: EOAs', () => { + const eip712Sign = async (hash, key) => + ethUtil.ecsign( + Buffer.from(hash.slice(2), 'hex'), + Buffer.from(key, 'hex') ) - }) - it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { - const invalidSignature = "0x00" - assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidSignature)) + const ethSign = async (hash, signer) => { + const packedSig = await web3Sign(signer, hash) - // Now presign it - await agent.presignHash(HASH, { from: presigner }) - assertIsValidSignature(true, await agent.isValidSignature(HASH, invalidSignature)) - }) - - const ethSign = async (hash, signer, useLegacySig = false, useInvalidV = false) => { - let sig = (await web3Sign(signer, hash)).slice(2) - - let r = ethutil.toBuffer('0x' + sig.substring(0, 64)) - let s = ethutil.toBuffer('0x' + sig.substring(64, 128)) - let v = ethutil.toBuffer((useLegacySig ? 0 : 27) + parseInt(sig.substring(128, 130), 16)) - let mode = ethutil.toBuffer(2) - - if (useInvalidV) { - v = ethutil.toBuffer(2) // force set an invalid v + return { + r: ethUtil.toBuffer('0x' + packedSig.substring(2, 66)), + s: ethUtil.toBuffer('0x' + packedSig.substring(66, 130)), + v: parseInt(packedSig.substring(130, 132), 16) + 27 } - - const signature = '0x' + Buffer.concat([mode, r, s, v]).toString('hex') - return signature } + + const signFunctionGenerator = (signFunction, modeId) => ( + async (hash, signerOrKey, useLegacySig = false, useInvalidV = false) => { + const sig = await signFunction(hash, signerOrKey) + + // console.log(modeId, sig) + + const mode = ethUtil.toBuffer(modeId) + const v = + useInvalidV + ? ethUtil.toBuffer(2) // force set an invalid v + : ethUtil.toBuffer(sig.v - (useLegacySig ? 0 : 27)) + + return '0x' + Buffer.concat([mode, sig.r, sig.s, v]).toString('hex') + } + ) - - // TODO: Test EIP712 signatures - - - context('> EthSign', () => { - it('isValidSignature returns true to a valid signature', async () => { - const signature = await ethSign(HASH, signer) - assertIsValidSignature(true, await agent.isValidSignature(HASH, signature)) + const signatureTests = [ + { + name: 'EIP712', + mode: 1, + signFunction: eip712Sign, + signer: '0x93070b307c373D7f9344859E909e3EEeF6E4Fd5a', + signerOrKey: '11bc31e7fef59610dfd6f95d2f78d2396c7b5477e4a9a54d72d9c1b76930e5c1', + notSignerOrKey: '7224b5bc510e01f75b10e3b6d6c903861ca91adb95a26406d1603e2d28a29e7f', + }, + { + name: 'EthSign', + mode: 2, + signFunction: ethSign, + signer: accounts[7], + signerOrKey: accounts[7], + notSignerOrKey: accounts[8] + } + ] + + for (let { name, mode, signFunction, signer, signerOrKey, notSignerOrKey } of signatureTests) { + const sign = signFunctionGenerator(signFunction, mode) + + context(`> Signature mode: ${name}`, () => { + beforeEach(async () => { + await agent.setDesignatedSigner(signer, { from: signerDesignator }) + }) + + it('isValidSignature returns true to a valid signature', async () => { + const signature = await sign(HASH, signerOrKey) + assertIsValidSignature(true, await agent.isValidSignature(HASH, signature)) + }) + + it('isValidSignature returns true to a valid signature with legacy version', async () => { + const legacyVersionSignature = await sign(HASH, signerOrKey, true) + assertIsValidSignature(true, await agent.isValidSignature(HASH, legacyVersionSignature)) + }) + + it('isValidSignature returns false to an invalid signature', async () => { + const badSignature = (await sign(HASH, signerOrKey)).slice(0, -2) // drop last byte + assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) + }) + + it('isValidSignature returns false to a signature with an invalid v', async () => { + const invalidVersionSignature = await sign(HASH, signerOrKey, false, true) + assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidVersionSignature)) + }) + + it('isValidSignature returns false to an unauthorized signer', async () => { + const otherSignature = await sign(HASH, notSignerOrKey) + assertIsValidSignature(false, await agent.isValidSignature(HASH, otherSignature)) + }) }) + } - it('isValidSignature returns true to a valid signature with legacy version', async () => { - const legacyVersionSignature = await ethSign(HASH, signer, true) - assertIsValidSignature(true, await agent.isValidSignature(HASH, legacyVersionSignature)) - }) + context(`> Signature mode: Invalid`, () => { + const randomAccount = accounts[9] - it('isValidSignature returns false to an invalid signature', async () => { - const badSignature = (await ethSign(HASH, signer)).slice(0, -2) // drop last byte - assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) + beforeEach(async () => { + await agent.setDesignatedSigner(randomAccount, { from: signerDesignator }) }) - it('isValidSignature returns false to a signature with an invalid v', async () => { - const invalidVersionSignature = await ethSign(HASH, signer, false, true) - assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidVersionSignature)) - }) + it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { + const invalidSignature = "0x00" + assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidSignature)) - it('isValidSignature returns false to an unauthorized signer', async () => { - const otherSignature = await ethSign(HASH, nobody) - assertIsValidSignature(false, await agent.isValidSignature(HASH, otherSignature)) + // Now presign it + await agent.presignHash(HASH, { from: presigner }) + assertIsValidSignature(true, await agent.isValidSignature(HASH, invalidSignature)) }) }) }) From 474f0c1b63deea0366dda1690886cfac15847f79 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Tue, 12 Feb 2019 20:37:29 +0100 Subject: [PATCH 28/44] Handle empty signatures and undefined signature modes --- future-apps/agent/contracts/SignatureValidator.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/future-apps/agent/contracts/SignatureValidator.sol b/future-apps/agent/contracts/SignatureValidator.sol index f2d10e65ac..937393de9e 100644 --- a/future-apps/agent/contracts/SignatureValidator.sol +++ b/future-apps/agent/contracts/SignatureValidator.sol @@ -18,6 +18,10 @@ library SignatureValidator { /// @param signature ECDSA signature along with the mode (0 = Invalid, 1 = EIP712, 2 = EthSign) {mode}{r}{s}{v}. /// @return Returns whether signature is from a specified user. function isValidSignature(bytes32 hash, address signer, bytes signature) internal pure returns (bool) { + if (signature.length == 0) { + return false; + } + SignatureMode mode = SignatureMode(uint8(signature[0])); if (mode == SignatureMode.Invalid || signature.length != 66) { @@ -47,7 +51,7 @@ library SignatureValidator { } else if (mode == SignatureMode.EIP712) { signedHash = hash; } else { - assert(false); + return false; } return ecrecover(signedHash, v, r, s) == signer; From 345a9d8aa4f411df6d2b5044a801b2cb7d9ca6ee Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Wed, 13 Feb 2019 10:26:23 +0100 Subject: [PATCH 29/44] Refactor SignatureValidator: handle ERC1271 checks in library --- future-apps/agent/contracts/Agent.sol | 58 +-------- .../agent/contracts/SignatureValidator.sol | 120 +++++++++++++++--- .../agent/contracts/standards/ERC1271.sol | 2 +- .../contracts/test/mocks/DesignatedSigner.sol | 8 +- future-apps/agent/test/agent.js | 42 ++++-- 5 files changed, 139 insertions(+), 91 deletions(-) diff --git a/future-apps/agent/contracts/Agent.sol b/future-apps/agent/contracts/Agent.sol index 8d95717233..cbadeadc97 100644 --- a/future-apps/agent/contracts/Agent.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -25,9 +25,6 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { string private constant ERROR_EXECUTE_TARGET_NOT_CONTRACT = "AGENT_EXEC_TARGET_NO_CONTRACT"; string private constant ERROR_DESIGNATED_TO_SELF = "AGENT_DESIGNATED_TO_SELF"; - uint256 internal constant ISVALIDSIG_MAX_GAS = 250000; - uint256 internal constant EIP165_MAX_GAS = 30000; - mapping (bytes32 => bool) public isPresigned; address public designatedSigner; @@ -130,22 +127,11 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { // Short-circuit in case the hash was presigned. Optimization as performing calls // and ecrecover is more expensive than an SLOAD. if (isPresigned[hash]) { - return isValidSignatureReturn(true); - } - - // Checks if designatedSigner is a contract, and if it supports the isValidSignature interface - if (safeSupportsInterface(IERC165(designatedSigner), ERC1271_INTERFACE_ID)) { - // designatedSigner.isValidSignature(hash, signature) as a staticall - ERC1271 signerContract = ERC1271(designatedSigner); - bytes memory data = abi.encodeWithSelector(signerContract.isValidSignature.selector, hash, signature); - return isValidSignatureReturn(safeBoolStaticCall(signerContract, data, ISVALIDSIG_MAX_GAS)); + return returnIsValidSignatureMagicNumber(true); } - // `safeSupportsInterface` returns false if designatedSigner is a contract but it - // doesn't support the interface. Here we check the validity of the ECDSA sig - // which will always fail if designatedSigner is not an EOA - - return isValidSignatureReturn(SignatureValidator.isValidSignature(hash, designatedSigner, signature)); + bool isValid = SignatureValidator.isValidSignature(hash, designatedSigner, signature); + return returnIsValidSignatureMagicNumber(isValid); } function canForward(address sender, bytes evmScript) public view returns (bool) { @@ -154,44 +140,6 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { return canPerform(sender, RUN_SCRIPT_ROLE, params); } - function safeSupportsInterface(IERC165 target, bytes4 interfaceId) internal view returns (bool) { - if (!isContract(target)) { - return false; - } - - bytes memory data = abi.encodeWithSelector(target.supportsInterface.selector, interfaceId); - return safeBoolStaticCall(target, data, EIP165_MAX_GAS); - } - - function safeBoolStaticCall(address target, bytes data, uint256 maxGas) internal view returns (bool) { - uint256 gasLeft = gasleft(); - - uint256 callGas = gasLeft > maxGas ? maxGas : gasLeft; - bool ok; - assembly { - ok := staticcall(callGas, target, add(data, 0x20), mload(data), 0, 0) - } - - if (!ok) { - return false; - } - - uint256 size; - assembly { size := returndatasize } - if (size != 32) { - return false; - } - - bool result; - assembly { - let ptr := mload(0x40) // get next free memory ptr - returndatacopy(ptr, 0, size) // copy return from above `staticcall` - result := mload(ptr) // read data at ptr and set it to result - } - - return result; - } - function getScriptACLParam(bytes evmScript) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(evmScript))); } diff --git a/future-apps/agent/contracts/SignatureValidator.sol b/future-apps/agent/contracts/SignatureValidator.sol index 937393de9e..0c92a2fbb8 100644 --- a/future-apps/agent/contracts/SignatureValidator.sol +++ b/future-apps/agent/contracts/SignatureValidator.sol @@ -1,36 +1,74 @@ pragma solidity 0.4.24; -// From github.com/DexyProject/protocol -// + https://github.com/0xProject/0x-monorepo/blob/master/packages/contracts/contracts/protocol/Exchange/MixinSignatureValidator.sol +// Inspired in https://github.com/horizon-games/multi-token-standard/blob/master/contracts/utils/SignatureValidator.sol // This should probably be moved into aOS: https://github.com/aragon/aragonOS/pull/442 +import "./standards/ERC1271.sol"; + library SignatureValidator { enum SignatureMode { - Invalid, - EIP712, - EthSign + Invalid, // 0x00 + EIP712, // 0x01 + EthSign, // 0x02 + ERC1271, // 0x03 + NMode // 0x04, to check if mode is specified, leave at the end } + // bytes4(keccak256("isValidSignature(bytes,bytes)") + bytes4 constant public ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; + uint256 internal constant ERC1271_ISVALIDSIG_MAX_GAS = 250000; + /// @dev Validates that a hash was signed by a specified signer. /// @param hash Hash which was signed. /// @param signer Address of the signer. - /// @param signature ECDSA signature along with the mode (0 = Invalid, 1 = EIP712, 2 = EthSign) {mode}{r}{s}{v}. + /// @param signature ECDSA signature along with the mode (0 = Invalid, 1 = EIP712, 2 = EthSign, 3 = ERC1271) {mode}{r}{s}{v}. /// @return Returns whether signature is from a specified user. - function isValidSignature(bytes32 hash, address signer, bytes signature) internal pure returns (bool) { + function isValidSignature(bytes32 hash, address signer, bytes signature) internal view returns (bool) { if (signature.length == 0) { return false; } - SignatureMode mode = SignatureMode(uint8(signature[0])); + uint8 modeByte = uint8(signature[0]); + if (modeByte >= uint8(SignatureMode.NMode)) { + return false; + } + SignatureMode mode = SignatureMode(modeByte); - if (mode == SignatureMode.Invalid || signature.length != 66) { + if (mode == SignatureMode.EIP712) { + return ecVerify(hash, signer, signature); + } else if (mode == SignatureMode.EthSign) { + return ecVerify( + keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), + signer, + signature + ); + } else if (mode == SignatureMode.ERC1271) { + // Pop the mode byte before sending it down the validation chain + (bytes memory newSig,) = popFirstByte(signature); // `signature` IS CORRUPTED AFTER EXECUTING THIS + return safeIsValidSignature(signer, hash, signature); + } else { return false; } + } + + function ecVerify(bytes32 hash, address signer, bytes memory signature) internal pure returns (bool) { + (bool badSig, bytes32 r, bytes32 s, uint8 v) = unpackEcSig(signature); - uint8 v = uint8(signature[65]); - bytes32 r; - bytes32 s; + if (badSig) { + return false; + } + + return signer == ecrecover(hash, v, r, s); + } + + function unpackEcSig(bytes memory signature) internal pure returns (bool badSig, bytes32 r, bytes32 s, uint8 v) { + if (signature.length != 66) { + badSig = true; + return; + } + + v = uint8(signature[65]); assembly { r := mload(add(signature, 33)) s := mload(add(signature, 65)) @@ -42,18 +80,58 @@ library SignatureValidator { } if (v != 27 && v != 28) { - return false; + badSig = true; } + } - bytes32 signedHash; - if (mode == SignatureMode.EthSign) { - signedHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); - } else if (mode == SignatureMode.EIP712) { - signedHash = hash; - } else { - return false; + /** + * @dev DANGEROUS FUNCTION: Modifies input in place, making it invalid after using this function + * Memory layout: bytes in parenthesis are returned + * L = l - 1 + * Input: ([l1][l2]....[l32][b1][b2]....[bn]) + * Output: [00]([L1][L2]....[L32][b2]....[bn]) + */ + function popFirstByte(bytes memory input) internal pure returns (bytes memory output, byte firstByte) { + assembly { + let length := mload(input) + firstByte := mload(add(input, 0x20)) + output := add(input, 0x01) + mstore8(input, 0x00) // Probably safe to remove, as it will most already likely be 0 + mstore(output, sub(length, 0x01)) + } + } + + function safeIsValidSignature(address validator, bytes32 hash, bytes memory signature) internal view returns (bool) { + bytes memory data = abi.encodeWithSelector(ERC1271(validator).isValidSignature.selector, hash, signature); + bytes4 erc1271Return = safeBytes4StaticCall(validator, data, ERC1271_ISVALIDSIG_MAX_GAS); + return erc1271Return == ERC1271_RETURN_VALID_SIGNATURE; + } + + function safeBytes4StaticCall(address target, bytes data, uint256 maxGas) internal view returns (bytes4 ret) { + uint256 gasLeft = gasleft(); + + uint256 callGas = gasLeft > maxGas ? maxGas : gasLeft; + bool ok; + assembly { + ok := staticcall(callGas, target, add(data, 0x20), mload(data), 0, 0) + } + + if (!ok) { + return; + } + + uint256 size; + assembly { size := returndatasize } + if (size != 32) { + return; + } + + assembly { + let ptr := mload(0x40) // get next free memory ptr + returndatacopy(ptr, 0, size) // copy return from above `staticcall` + ret := mload(ptr) // read data at ptr and set it to be returned } - return ecrecover(signedHash, v, r, s) == signer; + return ret; } } diff --git a/future-apps/agent/contracts/standards/ERC1271.sol b/future-apps/agent/contracts/standards/ERC1271.sol index dece1dab83..3b72b387f5 100644 --- a/future-apps/agent/contracts/standards/ERC1271.sol +++ b/future-apps/agent/contracts/standards/ERC1271.sol @@ -21,7 +21,7 @@ contract ERC1271 { */ function isValidSignature(bytes32 _hash, bytes memory _signature) public view returns (bytes4); - function isValidSignatureReturn(bool isValid) internal pure returns (bytes4) { + function returnIsValidSignatureMagicNumber(bool isValid) internal pure returns (bytes4) { return isValid ? ERC1271_RETURN_VALID_SIGNATURE : ERC1271_RETURN_INVALID_SIGNATURE; } } diff --git a/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol b/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol index 23c7aadbbe..46edfdc887 100644 --- a/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol +++ b/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol @@ -10,6 +10,10 @@ contract DesignatedSigner /* is IERC165, ERC1271 */ { bool isValidRevert; bool modifyState; + // bytes4(keccak256("isValidSignature(bytes,bytes)") + bytes4 constant public ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; // TODO: Likely needs to be updated + bytes4 constant public ERC1271_RETURN_INVALID_SIGNATURE = 0x00000000; + constructor (bool _isInterface, bool _isValid, bool _isValidRevert, bool _modifyState) public { isInterface = _isInterface; isValid = _isValid; @@ -23,13 +27,13 @@ contract DesignatedSigner /* is IERC165, ERC1271 */ { } // Can't be ERC1271-compliant since this potentially modifies state - function isValidSignature(bytes32, bytes) external returns (bool) { + function isValidSignature(bytes32, bytes) external returns (bytes4) { require(!isValidRevert); if (modifyState) { modifyState = false; } - return isValid; + return isValid ? ERC1271_RETURN_VALID_SIGNATURE : ERC1271_RETURN_INVALID_SIGNATURE; } } diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index 8e4dcf53c2..e079abf294 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -234,6 +234,14 @@ contract('Agent app', (accounts) => { const [_, nobody, presigner, signerDesignator] = accounts const HASH = web3.sha3('hash') // careful as it may encode the data in the same way as solidity before hashing + const SIGNATURE_MODES = { + Invalid: '0x00', + EIP712: '0x01', + EthSign: '0x02', + ERC1271: '0x03', + NMode: '0x04', + } + const ERC1271_RETURN_VALID_SIGNATURE = '0x20c13b0b' const ERC1271_RETURN_INVALID_SIGNATURE = '0x00000000' @@ -314,7 +322,6 @@ contract('Agent app', (accounts) => { const signatureTests = [ { name: 'EIP712', - mode: 1, signFunction: eip712Sign, signer: '0x93070b307c373D7f9344859E909e3EEeF6E4Fd5a', signerOrKey: '11bc31e7fef59610dfd6f95d2f78d2396c7b5477e4a9a54d72d9c1b76930e5c1', @@ -322,7 +329,6 @@ contract('Agent app', (accounts) => { }, { name: 'EthSign', - mode: 2, signFunction: ethSign, signer: accounts[7], signerOrKey: accounts[7], @@ -330,8 +336,8 @@ contract('Agent app', (accounts) => { } ] - for (let { name, mode, signFunction, signer, signerOrKey, notSignerOrKey } of signatureTests) { - const sign = signFunctionGenerator(signFunction, mode) + for (let { name, signFunction, signer, signerOrKey, notSignerOrKey } of signatureTests) { + const sign = signFunctionGenerator(signFunction, SIGNATURE_MODES[name]) context(`> Signature mode: ${name}`, () => { beforeEach(async () => { @@ -365,15 +371,25 @@ contract('Agent app', (accounts) => { }) } - context(`> Signature mode: Invalid`, () => { + context(`> Signature mode: invalid modes`, () => { const randomAccount = accounts[9] beforeEach(async () => { await agent.setDesignatedSigner(randomAccount, { from: signerDesignator }) }) + it('isValidSignature returns false to an invalid mode signature', async () => { + const invalidSignature = SIGNATURE_MODES.Invalid + assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidSignature)) + }) + + it('isValidSignature returns false to an unspecified mode signature', async () => { + const unspecifiedSignature = SIGNATURE_MODES.NMode + assertIsValidSignature(false, await agent.isValidSignature(HASH, unspecifiedSignature)) + }) + it('isValidSignature returns true to an invalid signature iff the hash was presigned', async () => { - const invalidSignature = "0x00" + const invalidSignature = SIGNATURE_MODES.Invalid assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidSignature)) // Now presign it @@ -384,6 +400,8 @@ contract('Agent app', (accounts) => { }) context('> Designated signer: contracts', () => { + const ERC1271_SIG = SIGNATURE_MODES.ERC1271 + const setDesignatedSignerContract = async (...params) => { const designatedSigner = await DesignatedSigner.new(...params) return agent.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) @@ -396,7 +414,7 @@ contract('Agent app', (accounts) => { // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, true, false, false) - assertIsValidSignature(true, await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) }) it('isValidSignature returns false if designated signer returns false', async () => { @@ -407,10 +425,10 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(true, false, false, false) // Signature fails check - assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) }) - it('isValidSignature returns false if designated signer doesnt support the interface', async () => { + it('isValidSignature returns true even if the designated signer doesnt support the interface', async () => { // false - not ERC165 interface compliant // true - any sigs are valid // false - doesn't revert on checking sig @@ -418,7 +436,7 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(false, true, false, false) // Requires ERC165 compliance before checking isValidSignature - assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) }) it('isValidSignature returns false if designated signer reverts', async () => { @@ -429,7 +447,7 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(true, true, true, false) // Reverts on checking - assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) }) it('isValidSignature returns false if designated signer attempts to modify state', async () => { @@ -440,7 +458,7 @@ contract('Agent app', (accounts) => { await setDesignatedSignerContract(true, true, false, true) // Checking costs too much gas - assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) + assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) }) }) }) From 499cdcbd139a5e483f504e8ae33a804a93c2579c Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Wed, 13 Feb 2019 11:07:10 +0100 Subject: [PATCH 30/44] Test ERC1271 signature wrapping --- .../agent/contracts/SignatureValidator.sol | 2 +- future-apps/agent/test/agent.js | 210 +++++++++++------- 2 files changed, 125 insertions(+), 87 deletions(-) diff --git a/future-apps/agent/contracts/SignatureValidator.sol b/future-apps/agent/contracts/SignatureValidator.sol index 0c92a2fbb8..f25f82a2a4 100644 --- a/future-apps/agent/contracts/SignatureValidator.sol +++ b/future-apps/agent/contracts/SignatureValidator.sol @@ -46,7 +46,7 @@ library SignatureValidator { } else if (mode == SignatureMode.ERC1271) { // Pop the mode byte before sending it down the validation chain (bytes memory newSig,) = popFirstByte(signature); // `signature` IS CORRUPTED AFTER EXECUTING THIS - return safeIsValidSignature(signer, hash, signature); + return safeIsValidSignature(signer, hash, newSig); } else { return false; } diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index e079abf294..59137db3ab 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -31,7 +31,7 @@ const ERC165_SUPPORT_INTERFACE_ID = '0x01ffc9a7' const ERC165_SUPPORT_INVALID_ID = '0xffffffff' contract('Agent app', (accounts) => { - let daoFact, agentBase, acl, agent, agentId + let daoFact, agentBase, dao, acl, agent, agentAppId let ETH, ANY_ENTITY, APP_MANAGER_ROLE, EXECUTE_ROLE, RUN_SCRIPT_ROLE, ADD_PRESIGNED_HASH_ROLE, DESIGNATE_SIGNER_ROLE, ERC1271_INTERFACE_ID @@ -62,13 +62,13 @@ contract('Agent app', (accounts) => { beforeEach(async () => { const r = await daoFact.newDAO(root) - const dao = Kernel.at(getEvent(r, 'DeployDAO', 'dao')) + dao = Kernel.at(getEvent(r, 'DeployDAO', 'dao')) acl = ACL.at(await dao.acl()) await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) // agent - const agentAppId = namehash('agent.aragonpm.test') + agentAppId = namehash('agent.aragonpm.test') const agentReceipt = await dao.newAppInstance(agentAppId, agentBase.address, '0x', false) const agentProxyAddress = getEvent(agentReceipt, 'NewAppProxy', 'proxy') @@ -286,61 +286,94 @@ contract('Agent app', (accounts) => { assertIsValidSignature(false, await agent.isValidSignature(HASH, NO_SIG)) }) - context('> Designated signer: EOAs', () => { - const eip712Sign = async (hash, key) => - ethUtil.ecsign( - Buffer.from(hash.slice(2), 'hex'), - Buffer.from(key, 'hex') - ) - + context('> Designated signer', () => { const ethSign = async (hash, signer) => { const packedSig = await web3Sign(signer, hash) return { r: ethUtil.toBuffer('0x' + packedSig.substring(2, 66)), s: ethUtil.toBuffer('0x' + packedSig.substring(66, 130)), - v: parseInt(packedSig.substring(130, 132), 16) + 27 + v: parseInt(packedSig.substring(130, 132), 16) + 27, + mode: ethUtil.toBuffer(SIGNATURE_MODES.EthSign) } } + + const eip712Sign = async (hash, key) => ({ + mode: ethUtil.toBuffer(SIGNATURE_MODES.EIP712), + ...ethUtil.ecsign( + Buffer.from(hash.slice(2), 'hex'), + Buffer.from(key, 'hex') + ) + }) - const signFunctionGenerator = (signFunction, modeId) => ( + const signFunctionGenerator = (signFunction, signatureModifier) => ( async (hash, signerOrKey, useLegacySig = false, useInvalidV = false) => { const sig = await signFunction(hash, signerOrKey) - - // console.log(modeId, sig) - - const mode = ethUtil.toBuffer(modeId) const v = useInvalidV ? ethUtil.toBuffer(2) // force set an invalid v : ethUtil.toBuffer(sig.v - (useLegacySig ? 0 : 27)) - return '0x' + Buffer.concat([mode, sig.r, sig.s, v]).toString('hex') + const signature = '0x' + Buffer.concat([sig.mode, sig.r, sig.s, v]).toString('hex') + return signatureModifier(signature) } ) - const signatureTests = [ + const addERC1271ModePrefix = (signature) => + `${SIGNATURE_MODES.ERC1271}${signature.slice(2)}` + + const createChildAgentGenerator = (designatedSigner) => + async () => { + const agentReceipt = await dao.newAppInstance(agentAppId, agentBase.address, '0x', false) + const agentProxyAddress = getEvent(agentReceipt, 'NewAppProxy', 'proxy') + const childAgent = Agent.at(agentProxyAddress) + + await childAgent.initialize() + await acl.createPermission(signerDesignator, childAgent.address, DESIGNATE_SIGNER_ROLE, root, { from: root }) + await childAgent.setDesignatedSigner(designatedSigner, { from: signerDesignator }) + + return childAgent.address + } + + const directSignatureTests = [ { name: 'EIP712', signFunction: eip712Sign, - signer: '0x93070b307c373D7f9344859E909e3EEeF6E4Fd5a', + getSigner: () => '0x93070b307c373D7f9344859E909e3EEeF6E4Fd5a', signerOrKey: '11bc31e7fef59610dfd6f95d2f78d2396c7b5477e4a9a54d72d9c1b76930e5c1', notSignerOrKey: '7224b5bc510e01f75b10e3b6d6c903861ca91adb95a26406d1603e2d28a29e7f', }, { name: 'EthSign', signFunction: ethSign, - signer: accounts[7], + getSigner: () => accounts[7], signerOrKey: accounts[7], notSignerOrKey: accounts[8] - } + }, ] - for (let { name, signFunction, signer, signerOrKey, notSignerOrKey } of signatureTests) { - const sign = signFunctionGenerator(signFunction, SIGNATURE_MODES[name]) + const wrappedSignatureTests = directSignatureTests.map(signatureTest => ({ + ...signatureTest, + name: `ERC1271 -> ${signatureTest.name}`, + signatureModifier: addERC1271ModePrefix, + getSigner: createChildAgentGenerator(signatureTest.getSigner()), + })) + + const signatureTests = directSignatureTests.concat(wrappedSignatureTests) + + for (const { + name, + signFunction, + getSigner, + signerOrKey, + notSignerOrKey, + signatureModifier = sig => sig // defaults to identity function (returns input) + } of signatureTests) { + const sign = signFunctionGenerator(signFunction, signatureModifier) context(`> Signature mode: ${name}`, () => { beforeEach(async () => { + const signer = await getSigner() await agent.setDesignatedSigner(signer, { from: signerDesignator }) }) @@ -371,6 +404,69 @@ contract('Agent app', (accounts) => { }) } + context('> Signature mode: ERC1271', () => { + const ERC1271_SIG = SIGNATURE_MODES.ERC1271 + + const setDesignatedSignerContract = async (...params) => { + const designatedSigner = await DesignatedSigner.new(...params) + return agent.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) + } + + it('isValidSignature returns true if designated signer returns true', async () => { + // true - ERC165 interface compliant + // true - any sigs are valid + // false - doesn't revert on checking sig + // false - doesn't modify state on checking sig + await setDesignatedSignerContract(true, true, false, false) + + assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) + }) + + it('isValidSignature returns false if designated signer returns false', async () => { + // true - ERC165 interface compliant + // false - sigs are invalid + // false - doesn't revert on checking sig + // false - doesn't modify state on checking sig + await setDesignatedSignerContract(true, false, false, false) + + // Signature fails check + assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) + }) + + it('isValidSignature returns true even if the designated signer doesnt support the interface', async () => { + // false - not ERC165 interface compliant + // true - any sigs are valid + // false - doesn't revert on checking sig + // false - doesn't modify state on checking sig + await setDesignatedSignerContract(false, true, false, false) + + // Requires ERC165 compliance before checking isValidSignature + assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) + }) + + it('isValidSignature returns false if designated signer reverts', async () => { + // true - ERC165 interface compliant + // true - any sigs are valid + // true - reverts on checking sig + // false - doesn't modify state on checking sig + await setDesignatedSignerContract(true, true, true, false) + + // Reverts on checking + assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) + }) + + it('isValidSignature returns false if designated signer attempts to modify state', async () => { + // true - ERC165 interface compliant + // true - any sigs are valid + // false - doesn't revert on checking sig + // true - modifies state on checking sig + await setDesignatedSignerContract(true, true, false, true) + + // Checking costs too much gas + assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) + }) + }) + context(`> Signature mode: invalid modes`, () => { const randomAccount = accounts[9] @@ -378,6 +474,11 @@ contract('Agent app', (accounts) => { await agent.setDesignatedSigner(randomAccount, { from: signerDesignator }) }) + it('isValidSignature returns false to an empty signature', async () => { + const emptySig = '0x' + assertIsValidSignature(false, await agent.isValidSignature(HASH, emptySig)) + }) + it('isValidSignature returns false to an invalid mode signature', async () => { const invalidSignature = SIGNATURE_MODES.Invalid assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidSignature)) @@ -398,68 +499,5 @@ contract('Agent app', (accounts) => { }) }) }) - - context('> Designated signer: contracts', () => { - const ERC1271_SIG = SIGNATURE_MODES.ERC1271 - - const setDesignatedSignerContract = async (...params) => { - const designatedSigner = await DesignatedSigner.new(...params) - return agent.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) - } - - it('isValidSignature returns true if designated signer returns true', async () => { - // true - ERC165 interface compliant - // true - any sigs are valid - // false - doesn't revert on checking sig - // false - doesn't modify state on checking sig - await setDesignatedSignerContract(true, true, false, false) - - assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) - }) - - it('isValidSignature returns false if designated signer returns false', async () => { - // true - ERC165 interface compliant - // false - sigs are invalid - // false - doesn't revert on checking sig - // false - doesn't modify state on checking sig - await setDesignatedSignerContract(true, false, false, false) - - // Signature fails check - assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) - }) - - it('isValidSignature returns true even if the designated signer doesnt support the interface', async () => { - // false - not ERC165 interface compliant - // true - any sigs are valid - // false - doesn't revert on checking sig - // false - doesn't modify state on checking sig - await setDesignatedSignerContract(false, true, false, false) - - // Requires ERC165 compliance before checking isValidSignature - assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) - }) - - it('isValidSignature returns false if designated signer reverts', async () => { - // true - ERC165 interface compliant - // true - any sigs are valid - // true - reverts on checking sig - // false - doesn't modify state on checking sig - await setDesignatedSignerContract(true, true, true, false) - - // Reverts on checking - assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) - }) - - it('isValidSignature returns false if designated signer attempts to modify state', async () => { - // true - ERC165 interface compliant - // true - any sigs are valid - // false - doesn't revert on checking sig - // true - modifies state on checking sig - await setDesignatedSignerContract(true, true, false, true) - - // Checking costs too much gas - assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) - }) - }) }) }) From 1b76fb9a245154a86ad5181ee1934f5f766799e5 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 15:19:49 +0100 Subject: [PATCH 31/44] cosmetic: fix whitespace --- future-apps/agent/test/agent.js | 36 ++++++++++++++++----------------- package.json | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index 59137db3ab..96dafe883d 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -305,7 +305,7 @@ contract('Agent app', (accounts) => { Buffer.from(key, 'hex') ) }) - + const signFunctionGenerator = (signFunction, signatureModifier) => ( async (hash, signerOrKey, useLegacySig = false, useInvalidV = false) => { const sig = await signFunction(hash, signerOrKey) @@ -313,7 +313,7 @@ contract('Agent app', (accounts) => { useInvalidV ? ethUtil.toBuffer(2) // force set an invalid v : ethUtil.toBuffer(sig.v - (useLegacySig ? 0 : 27)) - + const signature = '0x' + Buffer.concat([sig.mode, sig.r, sig.s, v]).toString('hex') return signatureModifier(signature) } @@ -322,7 +322,7 @@ contract('Agent app', (accounts) => { const addERC1271ModePrefix = (signature) => `${SIGNATURE_MODES.ERC1271}${signature.slice(2)}` - const createChildAgentGenerator = (designatedSigner) => + const createChildAgentGenerator = (designatedSigner) => async () => { const agentReceipt = await dao.newAppInstance(agentAppId, agentBase.address, '0x', false) const agentProxyAddress = getEvent(agentReceipt, 'NewAppProxy', 'proxy') @@ -381,22 +381,22 @@ contract('Agent app', (accounts) => { const signature = await sign(HASH, signerOrKey) assertIsValidSignature(true, await agent.isValidSignature(HASH, signature)) }) - + it('isValidSignature returns true to a valid signature with legacy version', async () => { const legacyVersionSignature = await sign(HASH, signerOrKey, true) assertIsValidSignature(true, await agent.isValidSignature(HASH, legacyVersionSignature)) }) - + it('isValidSignature returns false to an invalid signature', async () => { const badSignature = (await sign(HASH, signerOrKey)).slice(0, -2) // drop last byte assertIsValidSignature(false, await agent.isValidSignature(HASH, badSignature)) }) - + it('isValidSignature returns false to a signature with an invalid v', async () => { const invalidVersionSignature = await sign(HASH, signerOrKey, false, true) assertIsValidSignature(false, await agent.isValidSignature(HASH, invalidVersionSignature)) }) - + it('isValidSignature returns false to an unauthorized signer', async () => { const otherSignature = await sign(HASH, notSignerOrKey) assertIsValidSignature(false, await agent.isValidSignature(HASH, otherSignature)) @@ -406,62 +406,62 @@ contract('Agent app', (accounts) => { context('> Signature mode: ERC1271', () => { const ERC1271_SIG = SIGNATURE_MODES.ERC1271 - + const setDesignatedSignerContract = async (...params) => { const designatedSigner = await DesignatedSigner.new(...params) return agent.setDesignatedSigner(designatedSigner.address, { from: signerDesignator }) } - + it('isValidSignature returns true if designated signer returns true', async () => { // true - ERC165 interface compliant // true - any sigs are valid // false - doesn't revert on checking sig // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, true, false, false) - + assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) }) - + it('isValidSignature returns false if designated signer returns false', async () => { // true - ERC165 interface compliant // false - sigs are invalid // false - doesn't revert on checking sig // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, false, false, false) - + // Signature fails check assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) }) - + it('isValidSignature returns true even if the designated signer doesnt support the interface', async () => { // false - not ERC165 interface compliant // true - any sigs are valid // false - doesn't revert on checking sig // false - doesn't modify state on checking sig await setDesignatedSignerContract(false, true, false, false) - + // Requires ERC165 compliance before checking isValidSignature assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) }) - + it('isValidSignature returns false if designated signer reverts', async () => { // true - ERC165 interface compliant // true - any sigs are valid // true - reverts on checking sig // false - doesn't modify state on checking sig await setDesignatedSignerContract(true, true, true, false) - + // Reverts on checking assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) }) - + it('isValidSignature returns false if designated signer attempts to modify state', async () => { // true - ERC165 interface compliant // true - any sigs are valid // false - doesn't revert on checking sig // true - modifies state on checking sig await setDesignatedSignerContract(true, true, false, true) - + // Checking costs too much gas assertIsValidSignature(false, await agent.isValidSignature(HASH, ERC1271_SIG)) }) diff --git a/package.json b/package.json index 3e46386502..4c7dac6992 100644 --- a/package.json +++ b/package.json @@ -47,4 +47,4 @@ "publish:rpc": "lerna run --scope=@aragon/apps-* --concurrency=1 --stream publish:rpc", "publish:rinkeby": "lerna run --scope=@aragon/apps-* --concurrency=1 --stream publish:rinkeby" } -} \ No newline at end of file +} From a0bddefc8367fd0cf23450b5999e7d99f114c8d3 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 15:49:45 +0100 Subject: [PATCH 32/44] Agent: always allow execute to transfer ETH (#651) --- future-apps/agent/contracts/Agent.sol | 3 - .../contracts/test/mocks/DestinationMock.sol | 13 +- future-apps/agent/test/agent.js | 182 ++++++++++-------- future-apps/agent/test/vault.js | 38 ++-- 4 files changed, 128 insertions(+), 108 deletions(-) diff --git a/future-apps/agent/contracts/Agent.sol b/future-apps/agent/contracts/Agent.sol index cbadeadc97..f778ed2a49 100644 --- a/future-apps/agent/contracts/Agent.sol +++ b/future-apps/agent/contracts/Agent.sol @@ -43,9 +43,6 @@ contract Agent is IERC165, ERC1271Bytes, IForwarder, IsContract, Vault { external // This function MUST always be external as the function performs a low level return, exiting the Agent app execution context authP(EXECUTE_ROLE, arr(_target, _ethValue, uint256(getSig(_data)))) // TODO: Test that sig bytes are the least significant bytes { - require(_ethValue == 0 || _data.length > 0, ERROR_EXECUTE_ETH_NO_DATA); // if ETH value is sent, there must be data - require(isContract(_target), ERROR_EXECUTE_TARGET_NOT_CONTRACT); - bool result = _target.call.value(_ethValue)(_data); if (result) { diff --git a/future-apps/agent/contracts/test/mocks/DestinationMock.sol b/future-apps/agent/contracts/test/mocks/DestinationMock.sol index 665fcbf3cf..0890b6e736 100644 --- a/future-apps/agent/contracts/test/mocks/DestinationMock.sol +++ b/future-apps/agent/contracts/test/mocks/DestinationMock.sol @@ -2,9 +2,18 @@ pragma solidity 0.4.24; contract DestinationMock { - uint256 test; + bool public expensiveFallback; + uint256 public counter; + + constructor(bool _expensiveFallback) public { + expensiveFallback = _expensiveFallback; + } function () external payable { - test = test + 1; + // If expensiveFallback is used, this breaks the 2300 gas stipend given by + // .send() and .transfer() + if (expensiveFallback) { + counter = counter + 1; + } } } diff --git a/future-apps/agent/test/agent.js b/future-apps/agent/test/agent.js index 96dafe883d..1e1f7b8b51 100644 --- a/future-apps/agent/test/agent.js +++ b/future-apps/agent/test/agent.js @@ -19,6 +19,7 @@ const Kernel = artifacts.require('Kernel') const KernelProxy = artifacts.require('KernelProxy') const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') +const DestinationMock = artifacts.require('DestinationMock') const KernelDepositableMock = artifacts.require('KernelDepositableMock') const ExecutionTarget = artifacts.require('ExecutionTarget') @@ -81,118 +82,131 @@ contract('Agent app', (accounts) => { const [_, nonExecutor, executor] = accounts let executionTarget - beforeEach(async () => { - await acl.createPermission(executor, agent.address, EXECUTE_ROLE, root, { from: root }) - - executionTarget = await ExecutionTarget.new() - }) + for (const depositAmount of [0, 3]) { + context(depositAmount ? '> With ETH' : '> Without ETH', () => { + beforeEach(async () => { + await acl.createPermission(executor, agent.address, EXECUTE_ROLE, root, { from: root }) - it('can execute actions', async () => { - const N = 1102 + executionTarget = await ExecutionTarget.new() + assert.equal(await executionTarget.counter(), 0, 'expected starting counter of execution target to be be 0') + assert.equal((await getBalance(executionTarget.address)).toString(), 0, 'expected starting balance of execution target to be be 0') - assert.equal(await executionTarget.counter(), 0) + if (depositAmount) { + await agent.deposit(ETH, depositAmount, { value: depositAmount }) + } + assert.equal((await getBalance(agent.address)).toString(), depositAmount, `expected starting balance of agent to be ${depositAmount}`) + }) - const { to, data } = encodeFunctionCall(executionTarget, 'setCounter', N) - const receipt = await agent.execute(to, 0, data, { from: executor }) + it('can execute actions', async () => { + const N = 1102 - assert.equal(await executionTarget.counter(), N) - assertEvent(receipt, 'Execute') - }) + const data = executionTarget.contract.setCounter.getData(N) + const receipt = await agent.execute(executionTarget.address, depositAmount, data, { from: executor }) - it('can execute actions without data', async () => { - assert.equal(await executionTarget.counter(), 0) + assertEvent(receipt, 'Execute') + assert.equal(await executionTarget.counter(), N, `expected counter to be ${N}`) + assert.equal((await getBalance(executionTarget.address)).toString(), depositAmount, 'expected ending balance of execution target to be correct') + assert.equal((await getBalance(agent.address)).toString(), 0, 'expected ending balance of agent at end to be 0') + }) - const noData = '0x' - const receipt = await agent.execute(executionTarget.address, 0, noData, { from: executor }) + it('can execute actions without data', async () => { + const noData = '0x' + const receipt = await agent.execute(executionTarget.address, depositAmount, noData, { from: executor }) - // Fallback just runs ExecutionTarget.execute() - assert.equal(await executionTarget.counter(), 1) - assertEvent(receipt, 'Execute') - }) + assertEvent(receipt, 'Execute') + // Fallback just runs ExecutionTarget.execute() + assert.equal(await executionTarget.counter(), 1, 'expected counter to be 1') + assert.equal((await getBalance(executionTarget.address)).toString(), depositAmount, 'expected ending balance of execution target to be correct') + assert.equal((await getBalance(agent.address)).toString(), 0, 'expected ending balance of agent at end to be 0') + }) - it('fails to execute without permissions', async () => { - const { to, data } = encodeFunctionCall(executionTarget, 'execute') + it('can execute cheap fallback actions', async () => { + const cheapFallbackTarget = await DestinationMock.new(false) + const noData = '0x' + const receipt = await agent.execute(cheapFallbackTarget.address, depositAmount, noData, { from: executor }) - await assertRevert(() => - agent.execute(to, 0, data, { from: nonExecutor }) - ) - }) + assertEvent(receipt, 'Execute') + assert.equal((await getBalance(cheapFallbackTarget.address)).toString(), depositAmount, 'expected ending balance of execution target to be correct') + assert.equal((await getBalance(agent.address)).toString(), 0, 'expected ending balance of agent at end to be 0') + }) - it('fails to execute when target is not a contract', async () => { - const nonContract = accounts[8] // random account - const randomData = '0x12345678' - const noData = '0x' + it('can execute expensive fallback actions', async () => { + const expensiveFallbackTarget = await DestinationMock.new(true) + assert.equal(await expensiveFallbackTarget.counter(), 0) - await assertRevert(() => - agent.execute(nonContract, 0, randomData, { from: executor }) - ) + const noData = '0x' + const receipt = await agent.execute(expensiveFallbackTarget.address, depositAmount, noData, { from: executor }) - await assertRevert(() => - agent.execute(nonContract, 0, noData, { from: executor }) - ) - }) + assertEvent(receipt, 'Execute') + // Fallback increments counter + assert.equal(await expensiveFallbackTarget.counter(), 1) + assert.equal((await getBalance(expensiveFallbackTarget.address)).toString(), depositAmount, 'expected ending balance of execution target to be correct') + assert.equal((await getBalance(agent.address)).toString(), 0, 'expected ending balance of agent at end to be 0') + }) - it('execution forwards success return data', async () => { - assert.equal(await executionTarget.counter(), 0) + it('can execute with data when target is not a contract', async () => { + const nonContract = accounts[8] // random account + const nonContractBalance = await getBalance(nonContract) + const randomData = '0x12345678' - const { to, data } = encodeFunctionCall(executionTarget, 'execute') + const receipt = await agent.execute(nonContract, depositAmount, randomData, { from: executor }) - // We make a call to easily get what data could be gotten inside the EVM - // Contract -> Agent.execute -> Target.func (would allow Contract to have access to this data) - const call = encodeFunctionCall(agent, 'execute', to, 0, data, { from: executor }) - const returnData = await web3Call(call) + assertEvent(receipt, 'Execute') + assert.equal((await getBalance(nonContract)).toString(), nonContractBalance.add(depositAmount).toString(), 'expected ending balance of non-contract to be correct') + assert.equal((await getBalance(agent.address)).toString(), 0, 'expected ending balance of agent at end to be 0') + }) - // ExecutionTarget.execute() increments the counter by 1 - assert.equal(ethABI.decodeParameter('uint256', returnData), 1) - }) + it('can execute without data when target is not a contract', async () => { + const nonContract = accounts[8] // random account + const nonContractBalance = await getBalance(nonContract) + const noData = '0x' - it('it reverts if executed action reverts', async () => { - // TODO: Check revert data was correctly forwarded - // ganache currently doesn't support fetching this data + const receipt = await agent.execute(nonContract, depositAmount, noData, { from: executor }) - const { to, data } = encodeFunctionCall(executionTarget, 'fail') + assertEvent(receipt, 'Execute') + assert.equal((await getBalance(nonContract)).toString(), nonContractBalance.add(depositAmount).toString(), 'expected ending balance of non-contract to be correct') + assert.equal((await getBalance(agent.address)).toString(), 0, 'expected ending balance of agent at end to be 0') + }) - await assertRevert(() => - agent.execute(to, 0, data, { from: executor }) - ) - }) + it('fails to execute without permissions', async () => { + const data = executionTarget.contract.execute.getData() - context('> With ETH:', () => { - const depositValue = 3 - let to, data + await assertRevert(() => + agent.execute(executionTarget.address, depositAmount, data, { from: nonExecutor }) + ) + }) - beforeEach(async () => { - await agent.deposit(ETH, depositValue, { value: depositValue }) + it('fails to execute actions with more ETH than the agent owns', async () => { + const data = executionTarget.contract.execute.getData() - const call = encodeFunctionCall(executionTarget, 'execute') - to = call.to - data = call.data + await assertRevert(() => + agent.execute(executionTarget.address, depositAmount + 1, data, { from: executor }) + ) + }) - assert.equal(await executionTarget.counter(), 0) - assert.equal(await getBalance(executionTarget.address), 0) - assert.equal(await getBalance(agent.address), depositValue) - }) + it('execution forwards success return data', async () => { + const { to, data } = encodeFunctionCall(executionTarget, 'execute') - it('can execute actions with ETH', async () => { - await agent.execute(to, depositValue, data, { from: executor }) + // We make a call to easily get what data could be gotten inside the EVM + // Contract -> agent.execute -> Target.func (would allow Contract to have access to this data) + const call = encodeFunctionCall(agent, 'execute', to, depositAmount, data, { from: executor }) + const returnData = await web3Call(call) - assert.equal(await executionTarget.counter(), 1) - assert.equal(await getBalance(executionTarget.address), depositValue) - assert.equal(await getBalance(agent.address), 0) - }) + // ExecutionTarget.execute() increments the counter by 1 + assert.equal(ethABI.decodeParameter('uint256', returnData), 1) + }) - it('fails to execute actions with more ETH than the agent owns', async () => { - await assertRevert(() => - agent.execute(to, depositValue + 1, data, { from: executor }) - ) - }) + it('it reverts if executed action reverts', async () => { + // TODO: Check revert data was correctly forwarded + // ganache currently doesn't support fetching this data - it('fails to execute when sending ETH and no data', async () => { - await assertRevert(() => - agent.execute(to, depositValue, '0x', { from: executor }) - ) + const data = executionTarget.contract.fail.getData() + await assertRevert(() => + agent.execute(executionTarget.address, depositAmount, data, { from: executor }) + ) + }) }) - }) + } }) context('> Running scripts', () => { diff --git a/future-apps/agent/test/vault.js b/future-apps/agent/test/vault.js index 1739dad026..2262aa011a 100644 --- a/future-apps/agent/test/vault.js +++ b/future-apps/agent/test/vault.js @@ -76,17 +76,10 @@ contract('Agent app (Vault compatibility)', (accounts) => { it('deposits ETH', async () => { const value = 1 - // Deposit without data param + // Deposit await vault.deposit(ETH, value, { value: value, from: accounts[0] }) assert.equal((await getBalance(vault.address)).toString(), value, `should hold ${value} wei`) assert.equal((await vault.balance(ETH)).toString(), value, `should return ${value} wei balance`) - - // Deposit with data param - /* Waiting for truffle to get overloading... - await vault.deposit(ETH, accounts[0], value, [0], { value }) - assert.equal((await getBalance(vault.address)).toString(), value * 2, `should hold ${value * 2} wei`) - assert.equal((await vault.balance(ETH)).toString(), value * 2, `should return ${value * 2} wei balance`) - */ }) it('deposits ETH through callback', async () => { @@ -94,7 +87,7 @@ contract('Agent app (Vault compatibility)', (accounts) => { assert.equal((await getBalance(vault.address)).toString(), 1, "should hold 1 wei") }) - it('transfers ETH', async () => { + it('transfers ETH to EOA', async () => { const depositValue = 100 const transferValue = 10 @@ -109,10 +102,25 @@ contract('Agent app (Vault compatibility)', (accounts) => { assert.equal((await getBalance(vault.address)).toString(), depositValue - transferValue, "should have remaining balance") }) + it('transfers ETH to contract', async () => { + const depositValue = 100 + const transferValue = 10 + + const destination = await DestinationMock.new(false) + await vault.sendTransaction( { value: depositValue }) + const initialBalance = await getBalance(destination.address) + + // Transfer + await vault.transfer(ETH, destination.address, transferValue) + + assert.equal((await getBalance(destination.address)).toString(), initialBalance.add(transferValue).toString(), "should have sent eth") + assert.equal((await getBalance(vault.address)).toString(), depositValue - transferValue, "should have remaining balance") + }) + it('fails transfering ETH if uses more than 2.3k gas', async () => { const transferValue = 10 - const destination = await DestinationMock.new() + const destination = await DestinationMock.new(true) await vault.sendTransaction( { value: transferValue }) // Transfer @@ -140,19 +148,11 @@ contract('Agent app (Vault compatibility)', (accounts) => { it('deposits ERC20s', async () => { await token.approve(vault.address, 10) - // Deposit half without data param + // Deposit half await vault.deposit(token.address, 5, { from: accounts[0] }) assert.equal(await token.balanceOf(vault.address), 5, "token accounting should be correct") assert.equal(await vault.balance(token.address), 5, "vault should know its balance") - - // Deposit half with data param - /* Waiting for truffle to get overloading... - await vault.deposit(token.address, accounts[0], 5, '') - - assert.equal(await token.balanceOf(vault.address), 10, "token accounting should be correct") - assert.equal(await vault.balance(token.address), 10, "vault should know its balance") - */ }) it('transfers tokens', async () => { From e8eb268d7c901ee6a2d152e55274ee03aaf0f5ce Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 18:08:15 +0100 Subject: [PATCH 33/44] cosmetic: fix whitespace and add EIPs hash --- future-apps/agent/contracts/SignatureValidator.sol | 2 +- future-apps/agent/contracts/standards/ERC1271.sol | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/future-apps/agent/contracts/SignatureValidator.sol b/future-apps/agent/contracts/SignatureValidator.sol index f25f82a2a4..9092cb294f 100644 --- a/future-apps/agent/contracts/SignatureValidator.sol +++ b/future-apps/agent/contracts/SignatureValidator.sol @@ -16,7 +16,7 @@ library SignatureValidator { } // bytes4(keccak256("isValidSignature(bytes,bytes)") - bytes4 constant public ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; + bytes4 public constant ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; uint256 internal constant ERC1271_ISVALIDSIG_MAX_GAS = 250000; /// @dev Validates that a hash was signed by a specified signer. diff --git a/future-apps/agent/contracts/standards/ERC1271.sol b/future-apps/agent/contracts/standards/ERC1271.sol index 3b72b387f5..2bda68f220 100644 --- a/future-apps/agent/contracts/standards/ERC1271.sol +++ b/future-apps/agent/contracts/standards/ERC1271.sol @@ -1,9 +1,9 @@ pragma solidity 0.4.24; - -// ERC1271 on Feb 12th, 2019: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md +// ERC1271 on Feb 12th, 2019: https://github.com/ethereum/EIPs/blob/a97dc434930d0ccc4461c97d8c7a920dc585adf2/EIPS/eip-1271.md // Using `isValidSignature(bytes32,bytes)` even though the standard still hasn't been modified // Rationale: https://github.com/ethereum/EIPs/issues/1271#issuecomment-462719728 + contract ERC1271 { bytes4 constant public ERC1271_INTERFACE_ID = this.isValidSignature.selector; @@ -18,7 +18,7 @@ contract ERC1271 { * * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) * MUST allow external calls - */ + */ function isValidSignature(bytes32 _hash, bytes memory _signature) public view returns (bytes4); function returnIsValidSignatureMagicNumber(bool isValid) internal pure returns (bytes4) { @@ -35,8 +35,8 @@ contract ERC1271Bytes is ERC1271 { * * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) * MUST allow external calls - */ + */ function isValidSignature(bytes _data, bytes _signature) public view returns (bytes4) { return isValidSignature(keccak256(_data), _signature); } -} \ No newline at end of file +} From 22254089f34cf4b9f6a24f9b0765b098e4579de1 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 18:08:34 +0100 Subject: [PATCH 34/44] chore: upgrade aragonOS and use test-helper's contracts --- future-apps/agent/contracts/test/TestImports.sol | 1 + .../agent/contracts/test/mocks/EtherTokenConstantMock.sol | 8 -------- future-apps/agent/package.json | 2 +- 3 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 future-apps/agent/contracts/test/mocks/EtherTokenConstantMock.sol diff --git a/future-apps/agent/contracts/test/TestImports.sol b/future-apps/agent/contracts/test/TestImports.sol index 025289c578..2253edfa66 100644 --- a/future-apps/agent/contracts/test/TestImports.sol +++ b/future-apps/agent/contracts/test/TestImports.sol @@ -7,6 +7,7 @@ import "@aragon/os/contracts/kernel/Kernel.sol"; import "@aragon/os/contracts/kernel/KernelProxy.sol"; import "@aragon/apps-shared-migrations/contracts/Migrations.sol"; +import "@aragon/test-helpers/contracts/EtherTokenConstantMock.sol"; // You might think this file is a bit odd, but let me explain. // We only use some contracts in our tests, which means Truffle diff --git a/future-apps/agent/contracts/test/mocks/EtherTokenConstantMock.sol b/future-apps/agent/contracts/test/mocks/EtherTokenConstantMock.sol deleted file mode 100644 index 048457da69..0000000000 --- a/future-apps/agent/contracts/test/mocks/EtherTokenConstantMock.sol +++ /dev/null @@ -1,8 +0,0 @@ -pragma solidity 0.4.24; - -import "@aragon/os/contracts/common/EtherTokenConstant.sol"; - - -contract EtherTokenConstantMock is EtherTokenConstant { - function getETHConstant() external pure returns (address) { return ETH; } -} diff --git a/future-apps/agent/package.json b/future-apps/agent/package.json index b14ad89e20..240f106f4f 100644 --- a/future-apps/agent/package.json +++ b/future-apps/agent/package.json @@ -50,6 +50,6 @@ }, "dependencies": { "@aragon/apps-vault": "4.0.0", - "@aragon/os": "4.0.1" + "@aragon/os": "4.1.0-rc.1" } } From 2ed4a2a6354c49e83bd654ad9e4cc1bbbe5a4bd7 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 18:55:24 +0100 Subject: [PATCH 35/44] cosmetic: fix compile errors --- future-apps/agent/contracts/standards/ERC1271.sol | 2 +- future-apps/agent/contracts/test/mocks/DesignatedSigner.sol | 2 +- future-apps/agent/contracts/test/mocks/ExecutionTarget.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/future-apps/agent/contracts/standards/ERC1271.sol b/future-apps/agent/contracts/standards/ERC1271.sol index 2bda68f220..a50e606fc1 100644 --- a/future-apps/agent/contracts/standards/ERC1271.sol +++ b/future-apps/agent/contracts/standards/ERC1271.sol @@ -5,7 +5,7 @@ pragma solidity 0.4.24; // Rationale: https://github.com/ethereum/EIPs/issues/1271#issuecomment-462719728 contract ERC1271 { - bytes4 constant public ERC1271_INTERFACE_ID = this.isValidSignature.selector; + bytes4 constant public ERC1271_INTERFACE_ID = 0xfb855dc9; // this.isValidSignature.selector bytes4 constant public ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; // TODO: Likely needs to be updated bytes4 constant public ERC1271_RETURN_INVALID_SIGNATURE = 0x00000000; diff --git a/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol b/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol index 46edfdc887..c02c964e3b 100644 --- a/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol +++ b/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol @@ -22,7 +22,7 @@ contract DesignatedSigner /* is IERC165, ERC1271 */ { } // Can't be ERC165-compliant since this potentially modifies state - function supportsInterface(bytes4 interfaceId) external view returns (bool) { + function supportsInterface(bytes4) external view returns (bool) { return isInterface; } diff --git a/future-apps/agent/contracts/test/mocks/ExecutionTarget.sol b/future-apps/agent/contracts/test/mocks/ExecutionTarget.sol index de86d168da..fd04b8611c 100644 --- a/future-apps/agent/contracts/test/mocks/ExecutionTarget.sol +++ b/future-apps/agent/contracts/test/mocks/ExecutionTarget.sol @@ -15,7 +15,7 @@ contract ExecutionTarget { counter = x; } - function fail() external { + function fail() external pure { revert(REASON); } From c48298185154329737b16dd1f610b38eac439596 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 21:19:46 +0100 Subject: [PATCH 36/44] cosmetic: fix linter --- future-apps/agent/contracts/standards/ERC1271.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/future-apps/agent/contracts/standards/ERC1271.sol b/future-apps/agent/contracts/standards/ERC1271.sol index a50e606fc1..dad5e84ef8 100644 --- a/future-apps/agent/contracts/standards/ERC1271.sol +++ b/future-apps/agent/contracts/standards/ERC1271.sol @@ -4,6 +4,7 @@ pragma solidity 0.4.24; // Using `isValidSignature(bytes32,bytes)` even though the standard still hasn't been modified // Rationale: https://github.com/ethereum/EIPs/issues/1271#issuecomment-462719728 + contract ERC1271 { bytes4 constant public ERC1271_INTERFACE_ID = 0xfb855dc9; // this.isValidSignature.selector @@ -26,6 +27,7 @@ contract ERC1271 { } } + contract ERC1271Bytes is ERC1271 { /** * @dev Default behavior of `isValidSignature(bytes,bytes)`, can be overloaded for custom validation From cd9614b332b0c82261a6b8aca49b37fcf2d0faa8 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 21:35:39 +0100 Subject: [PATCH 37/44] chore: fix travis allowed to fail matrix --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f1e86f8c95..51996c42c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,9 +42,8 @@ env: - TASK=test:shared matrix: allow_failures: - - env: - - TASK=coverage:agent - - TASK=coverage:finance + - env: TASK=coverage:agent + - env: TASK=coverage:finance install: - travis_wait 60 npm install before_script: From 970431aa47a7a967855d907940d16062dc3f63d3 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Wed, 13 Feb 2019 23:19:37 +0100 Subject: [PATCH 38/44] test: ignore all test contracts from coverage --- future-apps/agent/.solcover.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/future-apps/agent/.solcover.js b/future-apps/agent/.solcover.js index 2f9a331fdc..a4dd7966c6 100644 --- a/future-apps/agent/.solcover.js +++ b/future-apps/agent/.solcover.js @@ -2,8 +2,6 @@ module.exports = { norpc: true, copyPackages: ['@aragon/os', '@aragon/apps-vault'], skipFiles: [ - 'test/TestImports.sol', - 'test/mocks/ExecutionTarget.sol', - 'test/mocks/FinanceMock.sol', + 'test' ] } From cff0689da1463c1b6db0db2c97548f49a2ed4322 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Thu, 14 Feb 2019 20:00:04 +0100 Subject: [PATCH 39/44] Actor: reuse Vault tests (#668) The Vault now exports its tests via a sharable utility. See f41519a for the changes made to the original tests to make them sharable. --- .../contracts/test/mocks/DestinationMock.sol | 13 +- apps/vault/test/vault.js | 266 +--------------- apps/vault/test/vault_shared.js | 294 ++++++++++++++++++ .../agent/contracts/test/TestImports.sol | 3 + future-apps/agent/test/vault.js | 236 +------------- 5 files changed, 313 insertions(+), 499 deletions(-) create mode 100644 apps/vault/test/vault_shared.js diff --git a/apps/vault/contracts/test/mocks/DestinationMock.sol b/apps/vault/contracts/test/mocks/DestinationMock.sol index 665fcbf3cf..0890b6e736 100644 --- a/apps/vault/contracts/test/mocks/DestinationMock.sol +++ b/apps/vault/contracts/test/mocks/DestinationMock.sol @@ -2,9 +2,18 @@ pragma solidity 0.4.24; contract DestinationMock { - uint256 test; + bool public expensiveFallback; + uint256 public counter; + + constructor(bool _expensiveFallback) public { + expensiveFallback = _expensiveFallback; + } function () external payable { - test = test + 1; + // If expensiveFallback is used, this breaks the 2300 gas stipend given by + // .send() and .transfer() + if (expensiveFallback) { + counter = counter + 1; + } } } diff --git a/apps/vault/test/vault.js b/apps/vault/test/vault.js index ffdc07d4d6..cdb4cdd5a6 100644 --- a/apps/vault/test/vault.js +++ b/apps/vault/test/vault.js @@ -1,265 +1,5 @@ -const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') -const { hash } = require('eth-ens-namehash') -const getBalance = require('@aragon/test-helpers/balance')(web3) -const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } +const runSharedVaultTests = require('./vault_shared.js') -const ACL = artifacts.require('ACL') -const AppProxyUpgradeable = artifacts.require('AppProxyUpgradeable') -const EVMScriptRegistryFactory = artifacts.require('EVMScriptRegistryFactory') -const DAOFactory = artifacts.require('DAOFactory') -const Kernel = artifacts.require('Kernel') -const KernelProxy = artifacts.require('KernelProxy') - -const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') -const KernelDepositableMock = artifacts.require('KernelDepositableMock') - -const Vault = artifacts.require('Vault') - -const TokenMock = artifacts.require('TokenMock') -const TokenReturnFalseMock = artifacts.require('TokenReturnFalseMock') -const TokenReturnMissingMock = artifacts.require('TokenReturnMissingMock') - -const DestinationMock = artifacts.require('DestinationMock') - -const NULL_ADDRESS = '0x00' - -contract('Vault app', (accounts) => { - let daoFact, vaultBase, vault, vaultId - - let ETH, ANY_ENTITY, APP_MANAGER_ROLE, TRANSFER_ROLE - - const root = accounts[0] - - before(async () => { - const kernelBase = await Kernel.new(true) // petrify immediately - const aclBase = await ACL.new() - const regFact = await EVMScriptRegistryFactory.new() - daoFact = await DAOFactory.new(kernelBase.address, aclBase.address, regFact.address) - vaultBase = await Vault.new() - - // Setup constants - ANY_ENTITY = await aclBase.ANY_ENTITY() - APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() - TRANSFER_ROLE = await vaultBase.TRANSFER_ROLE() - - const ethConstant = await EtherTokenConstantMock.new() - ETH = await ethConstant.getETHConstant() - }) - - beforeEach(async () => { - const r = await daoFact.newDAO(root) - const dao = Kernel.at(getEvent(r, 'DeployDAO', 'dao')) - const acl = ACL.at(await dao.acl()) - - await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) - - // vault - vaultId = hash('vault.aragonpm.test') - - const vaultReceipt = await dao.newAppInstance(vaultId, vaultBase.address, '0x', false) - const vaultProxyAddress = getEvent(vaultReceipt, 'NewAppProxy', 'proxy') - vault = Vault.at(vaultProxyAddress) - - await acl.createPermission(ANY_ENTITY, vault.address, TRANSFER_ROLE, root, { from: root }) - - await vault.initialize() - }) - - context('ETH:', () => { - it('cannot initialize base app', async () => { - const newVault = await Vault.new() - assert.isTrue(await newVault.isPetrified()) - return assertRevert(async () => { - await newVault.initialize() - }) - }) - - it('deposits ETH', async () => { - const value = 1 - - await vault.deposit(ETH, value, { value: value }) - - const vaultBalance = (await getBalance(vault.address)).valueOf() - assert.equal(vaultBalance, value, `vault should hold ${value} wei`) - assert.equal(await vault.balance(ETH), vaultBalance, "vault should know its balance") - }) - - it('deposits ETH through callback', async () => { - await vault.sendTransaction( { value: 1 }) - assert.equal((await getBalance(vault.address)).valueOf(), 1, "should hold 1 wei") - }) - - it('transfers ETH', async () => { - const depositValue = 100 - const transferValue = 10 - - await vault.sendTransaction( { value: depositValue }) - const testAccount = '0xbeef000000000000000000000000000000000000' - const initialBalance = await getBalance(testAccount) - - // Transfer - await vault.transfer(ETH, testAccount, transferValue) - - assert.equal((await getBalance(testAccount)).valueOf(), initialBalance.add(transferValue), "should have sent eth") - assert.equal((await getBalance(vault.address)).valueOf(), depositValue - transferValue, "should have remaining balance") - }) - - it('fails transfering ETH if uses more than 2.3k gas', async () => { - const transferValue = 10 - - const destination = await DestinationMock.new() - await vault.sendTransaction( { value: transferValue }) - - // Transfer - return assertRevert(async () => { - await vault.transfer(ETH, destination.address, transferValue) - }) - }) - - it('fails if depositing a different amount of ETH than sent', async () => { - const value = 1 - - return assertRevert(async () => { - await vault.deposit(ETH, value, { value: value * 2 }) - }) - }) - }) - - // Tests for different token interfaces - const tokenTestGroups = [ - { - title: 'standards compliant, reverting token', - tokenContract: TokenMock, - }, - { - title: 'standards compliant, non-reverting token', - tokenContract: TokenReturnFalseMock, - }, - { - title: 'non-standards compliant, missing return token', - tokenContract: TokenReturnMissingMock, - }, - ] - for ({ title, tokenContract} of tokenTestGroups) { - context(`ERC20 (${title}):`, () => { - let token - - beforeEach(async () => { - token = await tokenContract.new(accounts[0], 10000) - }) - - it('deposits ERC20s', async () => { - await token.approve(vault.address, 10) - - await vault.deposit(token.address, 5) - - const vaultBalance = (await token.balanceOf(vault.address)).valueOf() - assert.equal(vaultBalance, 5, "token accounting should be correct") - assert.equal(await vault.balance(token.address), vaultBalance, "vault should know its balance") - }) - - it('transfers tokens', async () => { - const tokenReceiver = accounts[2] - await token.transfer(vault.address, 10) - - // Transfer half - await vault.transfer(token.address, tokenReceiver, 5) - - assert.equal(await token.balanceOf(tokenReceiver), 5, "receiver should have correct token balance") - }) - - it('fails if not sufficient token balance available', async () => { - const approvedAmount = 10 - await token.approve(vault.address, approvedAmount) - - return assertRevert(async () => { - await vault.deposit(token.address, approvedAmount * 2) - }) - assert.equal(await token.balanceOf(vault.address), 0, "vault should have initial token balance") - }) - - it('fails deposits if token transfer fails', async () => { - await token.approve(vault.address, 10) - - // Disable transfers - await token.setAllowTransfer(false) - - // Attempt to deposit - await assertRevert(() => - vault.deposit(token.address, 5) - ) - assert.equal(await token.balanceOf(vault.address), 0, "vault should have initial token balance") - }) - - it('fails transfers if token transfer fails', async () => { - const tokenReceiver = accounts[2] - await token.transfer(vault.address, 10) - - // Disable transfers - await token.setAllowTransfer(false) - - // Attempt to transfer - await assertRevert(() => - vault.transfer(token.address, tokenReceiver, 5) - ) - assert.equal(await token.balanceOf(tokenReceiver), 0, "receiver should have initial token balance") - assert.equal(await token.balanceOf(vault.address), 10, "vault should have initial token balance") - }) - }) - } - - context('recovering assets', () => { - let kernel, defaultVault, token - - beforeEach(async () => { - const kernelBase = await KernelDepositableMock.new(true) // petrify immediately - const kernelProxy = await KernelProxy.new(kernelBase.address) - const aclBase = await ACL.new() - kernel = KernelDepositableMock.at(kernelProxy.address) - await kernel.initialize(aclBase.address, root) - await kernel.enableDepositable() - const acl = ACL.at(await kernel.acl()) - await acl.createPermission(root, kernel.address, APP_MANAGER_ROLE, root, { from: root }) - - // Create a new vault and set that vault as the default vault in the kernel - const defaultVaultReceipt = await kernel.newAppInstance(vaultId, vaultBase.address, '0x', true) - const defaultVaultAddress = getEvent(defaultVaultReceipt, 'NewAppProxy', 'proxy') - defaultVault = Vault.at(defaultVaultAddress) - await defaultVault.initialize() - - await kernel.setRecoveryVaultAppId(vaultId) - - token = await TokenMock.new(accounts[0], 10000) - }) - - it('set up the default vault correctly to recover ETH from the kernel', async () => { - await kernel.sendTransaction({ value: 1, gas: 31000 }) - assert.equal((await getBalance(kernel.address)).valueOf(), 1, 'kernel should have 1 balance') - - await kernel.transferToVault(ETH) - assert.equal((await getBalance(kernel.address)).valueOf(), 0, 'kernel should have 0 balance') - assert.equal((await getBalance(defaultVault.address)).valueOf(), 1, 'default value should have 1 balance') - }) - - it('set up the default vault correctly to recover tokens from the kernel', async () => { - await token.transfer(kernel.address, 10) - assert.equal((await token.balanceOf(kernel.address)), 10, 'kernel should have 10 balance') - - await kernel.transferToVault(token.address) - assert.equal((await token.balanceOf(kernel.address)), 0, 'kernel should have 0 balance') - assert.equal((await token.balanceOf(defaultVault.address)), 10, 'default value should have 10 balance') - }) - - it('fails when attempting to recover ETH out of the vault', async () => { - await vault.sendTransaction({ value: 1, gas: 31000 }) - assert.equal((await getBalance(vault.address)).valueOf(), 1, 'vault should have 1 balance') - await assertRevert(() => vault.transferToVault(ETH)) - }) - - it('fails when attempting to recover tokens out of the vault', async () => { - await token.transfer(vault.address, 10) - assert.equal((await token.balanceOf(vault.address)), 10, 'vault should have 10 balance') - await assertRevert(() => vault.transferToVault(token.address)) - }) - }) +contract('Vault', (accounts) => { + runSharedVaultTests('Vault', { accounts, artifacts, web3 }) }) diff --git a/apps/vault/test/vault_shared.js b/apps/vault/test/vault_shared.js new file mode 100644 index 0000000000..f4e3d46350 --- /dev/null +++ b/apps/vault/test/vault_shared.js @@ -0,0 +1,294 @@ +const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') +const { hash } = require('eth-ens-namehash') +const getBalanceFn = require('@aragon/test-helpers/balance') + +// Allow for sharing this test across other vault implementations and subclasses +module.exports = ( + vaultName, + { + accounts, + artifacts, + web3 + } +) => { + const getBalance = getBalanceFn(web3) + const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } + + const ACL = artifacts.require('ACL') + const AppProxyUpgradeable = artifacts.require('AppProxyUpgradeable') + const EVMScriptRegistryFactory = artifacts.require('EVMScriptRegistryFactory') + const DAOFactory = artifacts.require('DAOFactory') + const Kernel = artifacts.require('Kernel') + const KernelProxy = artifacts.require('KernelProxy') + + const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') + const KernelDepositableMock = artifacts.require('KernelDepositableMock') + + const TokenMock = artifacts.require('TokenMock') + const TokenReturnFalseMock = artifacts.require('TokenReturnFalseMock') + const TokenReturnMissingMock = artifacts.require('TokenReturnMissingMock') + + const DestinationMock = artifacts.require('DestinationMock') + + // Vault-like instance we're testing + const VaultLike = artifacts.require(vaultName) + + const root = accounts[0] + const NULL_ADDRESS = '0x00' + + context(`> Shared tests for Vault-like apps`, () => { + let daoFact, vaultBase, vault, vaultId + let ETH, ANY_ENTITY, APP_MANAGER_ROLE, TRANSFER_ROLE + + before(async () => { + const kernelBase = await Kernel.new(true) // petrify immediately + const aclBase = await ACL.new() + const regFact = await EVMScriptRegistryFactory.new() + daoFact = await DAOFactory.new(kernelBase.address, aclBase.address, regFact.address) + vaultBase = await VaultLike.new() + + // Setup constants + ANY_ENTITY = await aclBase.ANY_ENTITY() + APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() + TRANSFER_ROLE = await vaultBase.TRANSFER_ROLE() + + const ethConstant = await EtherTokenConstantMock.new() + ETH = await ethConstant.getETHConstant() + }) + + beforeEach(async () => { + const r = await daoFact.newDAO(root) + const dao = Kernel.at(getEvent(r, 'DeployDAO', 'dao')) + const acl = ACL.at(await dao.acl()) + + await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) + + // vault + vaultId = hash(`${vaultName.toLowerCase()}.aragonpm.test`) + + const vaultReceipt = await dao.newAppInstance(vaultId, vaultBase.address, '0x', false) + const vaultProxyAddress = getEvent(vaultReceipt, 'NewAppProxy', 'proxy') + vault = VaultLike.at(vaultProxyAddress) + + await acl.createPermission(ANY_ENTITY, vault.address, TRANSFER_ROLE, root, { from: root }) + + await vault.initialize() + }) + + it('cannot initialize base app', async () => { + const newVault = await VaultLike.new() + assert.isTrue(await newVault.isPetrified()) + await assertRevert(async () => { + await newVault.initialize() + }) + }) + + context('> ETH', () => { + it('deposits ETH', async () => { + const value = 1 + + await vault.deposit(ETH, value, { value: value }) + + const vaultBalance = (await getBalance(vault.address)).valueOf() + assert.equal(vaultBalance, value, `vault should hold ${value} wei`) + assert.equal(await vault.balance(ETH), vaultBalance, "vault should know its balance") + }) + + it('deposits ETH through callback', async () => { + await vault.sendTransaction( { value: 1 }) + assert.equal((await getBalance(vault.address)).valueOf(), 1, "should hold 1 wei") + }) + + it('transfers ETH to EOA', async () => { + const depositValue = 100 + const transferValue = 10 + + await vault.sendTransaction( { value: depositValue }) + const testAccount = '0xbeef000000000000000000000000000000000000' + const initialBalance = await getBalance(testAccount) + + // Transfer + await vault.transfer(ETH, testAccount, transferValue) + + assert.equal((await getBalance(testAccount)).valueOf(), initialBalance.add(transferValue), "should have sent eth") + assert.equal((await getBalance(vault.address)).valueOf(), depositValue - transferValue, "should have remaining balance") + }) + + it('transfers ETH to contract', async () => { + const depositValue = 100 + const transferValue = 10 + + const destination = await DestinationMock.new(false) + await vault.sendTransaction( { value: depositValue }) + const initialBalance = await getBalance(destination.address) + + // Transfer + await vault.transfer(ETH, destination.address, transferValue) + + assert.equal((await getBalance(destination.address)).toString(), initialBalance.add(transferValue).toString(), "should have sent eth") + assert.equal((await getBalance(vault.address)).toString(), depositValue - transferValue, "should have remaining balance") + }) + + it('fails transfering ETH if uses more than 2.3k gas', async () => { + const transferValue = 10 + + const destination = await DestinationMock.new(true) + await vault.sendTransaction( { value: transferValue }) + + // Transfer + await assertRevert(async () => { + await vault.transfer(ETH, destination.address, transferValue) + }) + }) + + it('fails if depositing a different amount of ETH than sent', async () => { + const value = 1 + + await assertRevert(async () => { + await vault.deposit(ETH, value, { value: value * 2 }) + }) + }) + }) + + // Tests for different token interfaces + const tokenTestGroups = [ + { + title: 'standards compliant, reverting token', + tokenContract: TokenMock, + }, + { + title: 'standards compliant, non-reverting token', + tokenContract: TokenReturnFalseMock, + }, + { + title: 'non-standards compliant, missing return token', + tokenContract: TokenReturnMissingMock, + }, + ] + for ({ title, tokenContract} of tokenTestGroups) { + context(`> ERC20 (${title})`, () => { + let token + + beforeEach(async () => { + token = await tokenContract.new(accounts[0], 10000) + }) + + it('deposits ERC20s', async () => { + await token.approve(vault.address, 10) + + await vault.deposit(token.address, 5) + + const vaultBalance = (await token.balanceOf(vault.address)).valueOf() + assert.equal(vaultBalance, 5, "token accounting should be correct") + assert.equal(await vault.balance(token.address), vaultBalance, "vault should know its balance") + }) + + it('transfers tokens', async () => { + const tokenReceiver = accounts[2] + await token.transfer(vault.address, 10) + + // Transfer half + await vault.transfer(token.address, tokenReceiver, 5) + + assert.equal(await token.balanceOf(tokenReceiver), 5, "receiver should have correct token balance") + }) + + it('fails if not sufficient token balance available', async () => { + const approvedAmount = 10 + await token.approve(vault.address, approvedAmount) + + await assertRevert(async () => { + await vault.deposit(token.address, approvedAmount * 2) + }) + assert.equal(await token.balanceOf(vault.address), 0, "vault should have initial token balance") + }) + + it('fails deposits if token transfer fails', async () => { + await token.approve(vault.address, 10) + + // Disable transfers + await token.setAllowTransfer(false) + + // Attempt to deposit + await assertRevert(() => + vault.deposit(token.address, 5) + ) + assert.equal(await token.balanceOf(vault.address), 0, "vault should have initial token balance") + }) + + it('fails transfers if token transfer fails', async () => { + const tokenReceiver = accounts[2] + await token.transfer(vault.address, 10) + + // Disable transfers + await token.setAllowTransfer(false) + + // Attempt to transfer + await assertRevert(() => + vault.transfer(token.address, tokenReceiver, 5) + ) + assert.equal(await token.balanceOf(tokenReceiver), 0, "receiver should have initial token balance") + assert.equal(await token.balanceOf(vault.address), 10, "vault should have initial token balance") + }) + }) + } + + context('> Recovering assets', () => { + let kernelBase, aclBase, kernel, defaultVault, token + + before(async () => { + kernelBase = await KernelDepositableMock.new(true) // petrify immediately + aclBase = await ACL.new() + }) + + beforeEach(async () => { + const kernelProxy = await KernelProxy.new(kernelBase.address) + kernel = KernelDepositableMock.at(kernelProxy.address) + await kernel.initialize(aclBase.address, root) + await kernel.enableDepositable() + const acl = ACL.at(await kernel.acl()) + await acl.createPermission(root, kernel.address, APP_MANAGER_ROLE, root, { from: root }) + + // Create a new vault and set that vault as the default vault in the kernel + const defaultVaultReceipt = await kernel.newAppInstance(vaultId, vaultBase.address, '0x', true) + const defaultVaultAddress = getEvent(defaultVaultReceipt, 'NewAppProxy', 'proxy') + defaultVault = VaultLike.at(defaultVaultAddress) + await defaultVault.initialize() + + await kernel.setRecoveryVaultAppId(vaultId) + + token = await TokenMock.new(accounts[0], 10000) + }) + + it('set up the default vault correctly to recover ETH from the kernel', async () => { + await kernel.sendTransaction({ value: 1, gas: 31000 }) + assert.equal((await getBalance(kernel.address)).valueOf(), 1, 'kernel should have 1 balance') + + await kernel.transferToVault(ETH) + assert.equal((await getBalance(kernel.address)).valueOf(), 0, 'kernel should have 0 balance') + assert.equal((await getBalance(defaultVault.address)).valueOf(), 1, 'default value should have 1 balance') + }) + + it('set up the default vault correctly to recover tokens from the kernel', async () => { + await token.transfer(kernel.address, 10) + assert.equal((await token.balanceOf(kernel.address)), 10, 'kernel should have 10 balance') + + await kernel.transferToVault(token.address) + assert.equal((await token.balanceOf(kernel.address)), 0, 'kernel should have 0 balance') + assert.equal((await token.balanceOf(defaultVault.address)), 10, 'default value should have 10 balance') + }) + + it('fails when attempting to recover ETH out of the vault', async () => { + await vault.sendTransaction({ value: 1, gas: 31000 }) + assert.equal((await getBalance(vault.address)).valueOf(), 1, 'vault should have 1 balance') + await assertRevert(() => vault.transferToVault(ETH)) + }) + + it('fails when attempting to recover tokens out of the vault', async () => { + await token.transfer(vault.address, 10) + assert.equal((await token.balanceOf(vault.address)), 10, 'vault should have 10 balance') + await assertRevert(() => vault.transferToVault(token.address)) + }) + }) + }) +} diff --git a/future-apps/agent/contracts/test/TestImports.sol b/future-apps/agent/contracts/test/TestImports.sol index 2253edfa66..884fcc2e26 100644 --- a/future-apps/agent/contracts/test/TestImports.sol +++ b/future-apps/agent/contracts/test/TestImports.sol @@ -8,6 +8,9 @@ import "@aragon/os/contracts/kernel/KernelProxy.sol"; import "@aragon/apps-shared-migrations/contracts/Migrations.sol"; import "@aragon/test-helpers/contracts/EtherTokenConstantMock.sol"; +import "@aragon/test-helpers/contracts/TokenMock.sol"; +import "@aragon/test-helpers/contracts/TokenReturnFalseMock.sol"; +import "@aragon/test-helpers/contracts/TokenReturnMissingMock.sol"; // You might think this file is a bit odd, but let me explain. // We only use some contracts in our tests, which means Truffle diff --git a/future-apps/agent/test/vault.js b/future-apps/agent/test/vault.js index 2262aa011a..a326f82abb 100644 --- a/future-apps/agent/test/vault.js +++ b/future-apps/agent/test/vault.js @@ -1,238 +1,6 @@ // Test that Agent is a fully functioning Vault by running the same tests against the Agent app -const Vault = artifacts.require('Agent') - -const { assertRevert, assertInvalidOpcode } = require('@aragon/test-helpers/assertThrow') -const { hash } = require('eth-ens-namehash') -const getBalance = require('@aragon/test-helpers/balance')(web3) -const getEvent = (receipt, event, arg) => { return receipt.logs.filter(l => l.event == event)[0].args[arg] } - -const ACL = artifacts.require('ACL') -const AppProxyUpgradeable = artifacts.require('AppProxyUpgradeable') -const EVMScriptRegistryFactory = artifacts.require('EVMScriptRegistryFactory') -const DAOFactory = artifacts.require('DAOFactory') -const Kernel = artifacts.require('Kernel') -const KernelProxy = artifacts.require('KernelProxy') - -const EtherTokenConstantMock = artifacts.require('EtherTokenConstantMock') -const KernelDepositableMock = artifacts.require('KernelDepositableMock') - -const SimpleERC20 = artifacts.require('tokens/SimpleERC20') - -const DestinationMock = artifacts.require('DestinationMock') - -const NULL_ADDRESS = '0x00' +const runSharedVaultTests = require('@aragon/apps-vault/test/vault_shared.js') contract('Agent app (Vault compatibility)', (accounts) => { - let daoFact, vaultBase, vault, vaultId - - let ETH, ANY_ENTITY, APP_MANAGER_ROLE, TRANSFER_ROLE - - const root = accounts[0] - - before(async () => { - const kernelBase = await Kernel.new(true) // petrify immediately - const aclBase = await ACL.new() - const regFact = await EVMScriptRegistryFactory.new() - daoFact = await DAOFactory.new(kernelBase.address, aclBase.address, regFact.address) - vaultBase = await Vault.new() - - // Setup constants - ANY_ENTITY = await aclBase.ANY_ENTITY() - APP_MANAGER_ROLE = await kernelBase.APP_MANAGER_ROLE() - TRANSFER_ROLE = await vaultBase.TRANSFER_ROLE() - - const ethConstant = await EtherTokenConstantMock.new() - ETH = await ethConstant.getETHConstant() - }) - - beforeEach(async () => { - const r = await daoFact.newDAO(root) - const dao = Kernel.at(getEvent(r, 'DeployDAO', 'dao')) - const acl = ACL.at(await dao.acl()) - - await acl.createPermission(root, dao.address, APP_MANAGER_ROLE, root, { from: root }) - - // vault - vaultId = hash('actor.aragonpm.test') - - const vaultReceipt = await dao.newAppInstance(vaultId, vaultBase.address, '0x', false) - const vaultProxyAddress = getEvent(vaultReceipt, 'NewAppProxy', 'proxy') - vault = Vault.at(vaultProxyAddress) - - await acl.createPermission(ANY_ENTITY, vault.address, TRANSFER_ROLE, root, { from: root }) - - await vault.initialize() - }) - - context('ETH:', async () => { - it('cannot initialize base app', async () => { - const newVault = await Vault.new() - assert.isTrue(await newVault.isPetrified()) - return assertRevert(async () => { - await newVault.initialize() - }) - }) - - it('deposits ETH', async () => { - const value = 1 - - // Deposit - await vault.deposit(ETH, value, { value: value, from: accounts[0] }) - assert.equal((await getBalance(vault.address)).toString(), value, `should hold ${value} wei`) - assert.equal((await vault.balance(ETH)).toString(), value, `should return ${value} wei balance`) - }) - - it('deposits ETH through callback', async () => { - await vault.sendTransaction( { value: 1 }) - assert.equal((await getBalance(vault.address)).toString(), 1, "should hold 1 wei") - }) - - it('transfers ETH to EOA', async () => { - const depositValue = 100 - const transferValue = 10 - - await vault.sendTransaction( { value: depositValue }) - const testAccount = '0xbeef000000000000000000000000000000000000' - const initialBalance = await getBalance(testAccount) - - // Transfer - await vault.transfer(ETH, testAccount, transferValue) - - assert.equal((await getBalance(testAccount)).toString(), initialBalance.add(transferValue).toString(), "should have sent eth") - assert.equal((await getBalance(vault.address)).toString(), depositValue - transferValue, "should have remaining balance") - }) - - it('transfers ETH to contract', async () => { - const depositValue = 100 - const transferValue = 10 - - const destination = await DestinationMock.new(false) - await vault.sendTransaction( { value: depositValue }) - const initialBalance = await getBalance(destination.address) - - // Transfer - await vault.transfer(ETH, destination.address, transferValue) - - assert.equal((await getBalance(destination.address)).toString(), initialBalance.add(transferValue).toString(), "should have sent eth") - assert.equal((await getBalance(vault.address)).toString(), depositValue - transferValue, "should have remaining balance") - }) - - it('fails transfering ETH if uses more than 2.3k gas', async () => { - const transferValue = 10 - - const destination = await DestinationMock.new(true) - await vault.sendTransaction( { value: transferValue }) - - // Transfer - return assertRevert(async () => { - await vault.transfer(ETH, destination.address, transferValue) - }) - }) - - it('fails if depositing a different amount of ETH than sent', async () => { - const value = 1 - - return assertRevert(async () => { - await vault.deposit(ETH, value, { value: value * 2, from: accounts[0] }) - }) - }) - }) - - context('ERC20:', async () => { - let token - - beforeEach(async () => { - token = await SimpleERC20.new() - }) - - it('deposits ERC20s', async () => { - await token.approve(vault.address, 10) - - // Deposit half - await vault.deposit(token.address, 5, { from: accounts[0] }) - - assert.equal(await token.balanceOf(vault.address), 5, "token accounting should be correct") - assert.equal(await vault.balance(token.address), 5, "vault should know its balance") - }) - - it('transfers tokens', async () => { - const tokenReceiver = accounts[2] - await token.transfer(vault.address, 10) - - // Transfer half - await vault.transfer(token.address, tokenReceiver, 5) - - assert.equal(await token.balanceOf(tokenReceiver), 5, "receiver should have correct token balance") - }) - - it('fails if not sufficient token balance available', async () => { - const approvedAmount = 10 - await token.approve(vault.address, approvedAmount) - - return assertRevert(async () => { - await vault.deposit(token.address, approvedAmount * 2, { from: accounts[0] }) - }) - }) - }) - - context('using Vault behind proxy', async () => { - let token - - beforeEach(async () => { - token = await SimpleERC20.new() - }) - - context('disallows recovering assets', async () => { - let kernel, defaultVault - - beforeEach(async () => { - const kernelBase = await KernelDepositableMock.new(true) // petrify immediately - const kernelProxy = await KernelProxy.new(kernelBase.address) - const aclBase = await ACL.new() - kernel = KernelDepositableMock.at(kernelProxy.address) - await kernel.initialize(aclBase.address, root) - await kernel.enableDepositable() - const acl = ACL.at(await kernel.acl()) - await acl.createPermission(root, kernel.address, APP_MANAGER_ROLE, root, { from: root }) - - // Create a new vault and set that vault as the default vault in the kernel - const defaultVaultReceipt = await kernel.newAppInstance(vaultId, vaultBase.address, '0x', true) - const defaultVaultAddress = getEvent(defaultVaultReceipt, 'NewAppProxy', 'proxy') - defaultVault = Vault.at(defaultVaultAddress) - await defaultVault.initialize() - - await kernel.setRecoveryVaultAppId(vaultId) - }) - - it('set up the default vault correctly to recover ETH from the kernel', async () => { - await kernel.sendTransaction({ value: 1, gas: 31000 }) - assert.equal((await getBalance(kernel.address)).valueOf(), 1, 'kernel should have 1 balance') - - await kernel.transferToVault(ETH) - assert.equal((await getBalance(kernel.address)).valueOf(), 0, 'kernel should have 0 balance') - assert.equal((await getBalance(defaultVault.address)).valueOf(), 1, 'default value should have 1 balance') - }) - - it('set up the default vault correctly to recover tokens from the kernel', async () => { - await token.transfer(kernel.address, 10) - assert.equal((await token.balanceOf(kernel.address)), 10, 'kernel should have 10 balance') - - await kernel.transferToVault(token.address) - assert.equal((await token.balanceOf(kernel.address)), 0, 'kernel should have 0 balance') - assert.equal((await token.balanceOf(defaultVault.address)), 10, 'default value should have 10 balance') - }) - - it('fails when attempting to recover ETH out of the vault', async () => { - await vault.sendTransaction({ value: 1, gas: 31000 }) - assert.equal((await getBalance(vault.address)).valueOf(), 1, 'vault should have 1 balance') - await assertRevert(() => vault.transferToVault(ETH)) - }) - - it('fails when attempting to recover tokens out of the vault', async () => { - await token.transfer(vault.address, 10) - assert.equal((await token.balanceOf(vault.address)), 10, 'vault should have 10 balance') - await assertRevert(() => vault.transferToVault(token.address)) - }) - }) - }) + runSharedVaultTests('Agent', { accounts, artifacts, web3 }) }) From 905c32d453925f2f48d0de246578f71344dd9865 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 15 Feb 2019 17:21:50 +0100 Subject: [PATCH 40/44] Move agent from future-apps/ to apps/ --- {future-apps => apps}/agent/.solcover.js | 0 {future-apps => apps}/agent/.soliumignore | 0 {future-apps => apps}/agent/.soliumrc.json | 0 {future-apps => apps}/agent/arapp.json | 0 {future-apps => apps}/agent/contracts/.npmignore | 0 {future-apps => apps}/agent/contracts/Agent.sol | 0 {future-apps => apps}/agent/contracts/SignatureValidator.sol | 0 {future-apps => apps}/agent/contracts/standards/ERC1271.sol | 0 {future-apps => apps}/agent/contracts/standards/IERC165.sol | 0 {future-apps => apps}/agent/contracts/test/TestImports.sol | 0 .../agent/contracts/test/mocks/DesignatedSigner.sol | 0 .../agent/contracts/test/mocks/DestinationMock.sol | 0 .../agent/contracts/test/mocks/ExecutionTarget.sol | 0 {future-apps => apps}/agent/contracts/test/mocks/ForceSendETH.sol | 0 .../agent/contracts/test/mocks/KernelDepositableMock.sol | 0 {future-apps => apps}/agent/contracts/test/mocks/SimpleERC20.sol | 0 {future-apps => apps}/agent/manifest.json | 0 {future-apps => apps}/agent/migrations/1_initial_migration.js | 0 {future-apps => apps}/agent/package.json | 0 {future-apps => apps}/agent/scripts/deploy.js | 0 {future-apps => apps}/agent/test/agent.js | 0 {future-apps => apps}/agent/test/vault.js | 0 {future-apps => apps}/agent/truffle.js | 0 23 files changed, 0 insertions(+), 0 deletions(-) rename {future-apps => apps}/agent/.solcover.js (100%) rename {future-apps => apps}/agent/.soliumignore (100%) rename {future-apps => apps}/agent/.soliumrc.json (100%) rename {future-apps => apps}/agent/arapp.json (100%) rename {future-apps => apps}/agent/contracts/.npmignore (100%) rename {future-apps => apps}/agent/contracts/Agent.sol (100%) rename {future-apps => apps}/agent/contracts/SignatureValidator.sol (100%) rename {future-apps => apps}/agent/contracts/standards/ERC1271.sol (100%) rename {future-apps => apps}/agent/contracts/standards/IERC165.sol (100%) rename {future-apps => apps}/agent/contracts/test/TestImports.sol (100%) rename {future-apps => apps}/agent/contracts/test/mocks/DesignatedSigner.sol (100%) rename {future-apps => apps}/agent/contracts/test/mocks/DestinationMock.sol (100%) rename {future-apps => apps}/agent/contracts/test/mocks/ExecutionTarget.sol (100%) rename {future-apps => apps}/agent/contracts/test/mocks/ForceSendETH.sol (100%) rename {future-apps => apps}/agent/contracts/test/mocks/KernelDepositableMock.sol (100%) rename {future-apps => apps}/agent/contracts/test/mocks/SimpleERC20.sol (100%) rename {future-apps => apps}/agent/manifest.json (100%) rename {future-apps => apps}/agent/migrations/1_initial_migration.js (100%) rename {future-apps => apps}/agent/package.json (100%) rename {future-apps => apps}/agent/scripts/deploy.js (100%) rename {future-apps => apps}/agent/test/agent.js (100%) rename {future-apps => apps}/agent/test/vault.js (100%) rename {future-apps => apps}/agent/truffle.js (100%) diff --git a/future-apps/agent/.solcover.js b/apps/agent/.solcover.js similarity index 100% rename from future-apps/agent/.solcover.js rename to apps/agent/.solcover.js diff --git a/future-apps/agent/.soliumignore b/apps/agent/.soliumignore similarity index 100% rename from future-apps/agent/.soliumignore rename to apps/agent/.soliumignore diff --git a/future-apps/agent/.soliumrc.json b/apps/agent/.soliumrc.json similarity index 100% rename from future-apps/agent/.soliumrc.json rename to apps/agent/.soliumrc.json diff --git a/future-apps/agent/arapp.json b/apps/agent/arapp.json similarity index 100% rename from future-apps/agent/arapp.json rename to apps/agent/arapp.json diff --git a/future-apps/agent/contracts/.npmignore b/apps/agent/contracts/.npmignore similarity index 100% rename from future-apps/agent/contracts/.npmignore rename to apps/agent/contracts/.npmignore diff --git a/future-apps/agent/contracts/Agent.sol b/apps/agent/contracts/Agent.sol similarity index 100% rename from future-apps/agent/contracts/Agent.sol rename to apps/agent/contracts/Agent.sol diff --git a/future-apps/agent/contracts/SignatureValidator.sol b/apps/agent/contracts/SignatureValidator.sol similarity index 100% rename from future-apps/agent/contracts/SignatureValidator.sol rename to apps/agent/contracts/SignatureValidator.sol diff --git a/future-apps/agent/contracts/standards/ERC1271.sol b/apps/agent/contracts/standards/ERC1271.sol similarity index 100% rename from future-apps/agent/contracts/standards/ERC1271.sol rename to apps/agent/contracts/standards/ERC1271.sol diff --git a/future-apps/agent/contracts/standards/IERC165.sol b/apps/agent/contracts/standards/IERC165.sol similarity index 100% rename from future-apps/agent/contracts/standards/IERC165.sol rename to apps/agent/contracts/standards/IERC165.sol diff --git a/future-apps/agent/contracts/test/TestImports.sol b/apps/agent/contracts/test/TestImports.sol similarity index 100% rename from future-apps/agent/contracts/test/TestImports.sol rename to apps/agent/contracts/test/TestImports.sol diff --git a/future-apps/agent/contracts/test/mocks/DesignatedSigner.sol b/apps/agent/contracts/test/mocks/DesignatedSigner.sol similarity index 100% rename from future-apps/agent/contracts/test/mocks/DesignatedSigner.sol rename to apps/agent/contracts/test/mocks/DesignatedSigner.sol diff --git a/future-apps/agent/contracts/test/mocks/DestinationMock.sol b/apps/agent/contracts/test/mocks/DestinationMock.sol similarity index 100% rename from future-apps/agent/contracts/test/mocks/DestinationMock.sol rename to apps/agent/contracts/test/mocks/DestinationMock.sol diff --git a/future-apps/agent/contracts/test/mocks/ExecutionTarget.sol b/apps/agent/contracts/test/mocks/ExecutionTarget.sol similarity index 100% rename from future-apps/agent/contracts/test/mocks/ExecutionTarget.sol rename to apps/agent/contracts/test/mocks/ExecutionTarget.sol diff --git a/future-apps/agent/contracts/test/mocks/ForceSendETH.sol b/apps/agent/contracts/test/mocks/ForceSendETH.sol similarity index 100% rename from future-apps/agent/contracts/test/mocks/ForceSendETH.sol rename to apps/agent/contracts/test/mocks/ForceSendETH.sol diff --git a/future-apps/agent/contracts/test/mocks/KernelDepositableMock.sol b/apps/agent/contracts/test/mocks/KernelDepositableMock.sol similarity index 100% rename from future-apps/agent/contracts/test/mocks/KernelDepositableMock.sol rename to apps/agent/contracts/test/mocks/KernelDepositableMock.sol diff --git a/future-apps/agent/contracts/test/mocks/SimpleERC20.sol b/apps/agent/contracts/test/mocks/SimpleERC20.sol similarity index 100% rename from future-apps/agent/contracts/test/mocks/SimpleERC20.sol rename to apps/agent/contracts/test/mocks/SimpleERC20.sol diff --git a/future-apps/agent/manifest.json b/apps/agent/manifest.json similarity index 100% rename from future-apps/agent/manifest.json rename to apps/agent/manifest.json diff --git a/future-apps/agent/migrations/1_initial_migration.js b/apps/agent/migrations/1_initial_migration.js similarity index 100% rename from future-apps/agent/migrations/1_initial_migration.js rename to apps/agent/migrations/1_initial_migration.js diff --git a/future-apps/agent/package.json b/apps/agent/package.json similarity index 100% rename from future-apps/agent/package.json rename to apps/agent/package.json diff --git a/future-apps/agent/scripts/deploy.js b/apps/agent/scripts/deploy.js similarity index 100% rename from future-apps/agent/scripts/deploy.js rename to apps/agent/scripts/deploy.js diff --git a/future-apps/agent/test/agent.js b/apps/agent/test/agent.js similarity index 100% rename from future-apps/agent/test/agent.js rename to apps/agent/test/agent.js diff --git a/future-apps/agent/test/vault.js b/apps/agent/test/vault.js similarity index 100% rename from future-apps/agent/test/vault.js rename to apps/agent/test/vault.js diff --git a/future-apps/agent/truffle.js b/apps/agent/truffle.js similarity index 100% rename from future-apps/agent/truffle.js rename to apps/agent/truffle.js From 0d3e2ecde4bd86f90dca8959f2e36efa186d4bc2 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 15 Feb 2019 18:02:22 +0100 Subject: [PATCH 41/44] Refactor popFirstByte to copy to a new array --- apps/agent/contracts/SignatureValidator.sol | 55 ++++++++++++++------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/apps/agent/contracts/SignatureValidator.sol b/apps/agent/contracts/SignatureValidator.sol index 9092cb294f..356b4be03b 100644 --- a/apps/agent/contracts/SignatureValidator.sol +++ b/apps/agent/contracts/SignatureValidator.sol @@ -45,14 +45,13 @@ library SignatureValidator { ); } else if (mode == SignatureMode.ERC1271) { // Pop the mode byte before sending it down the validation chain - (bytes memory newSig,) = popFirstByte(signature); // `signature` IS CORRUPTED AFTER EXECUTING THIS - return safeIsValidSignature(signer, hash, newSig); + return safeIsValidSignature(signer, hash, popFirstByte(signature)); } else { return false; } } - function ecVerify(bytes32 hash, address signer, bytes memory signature) internal pure returns (bool) { + function ecVerify(bytes32 hash, address signer, bytes memory signature) private pure returns (bool) { (bool badSig, bytes32 r, bytes32 s, uint8 v) = unpackEcSig(signature); if (badSig) { @@ -62,7 +61,7 @@ library SignatureValidator { return signer == ecrecover(hash, v, r, s); } - function unpackEcSig(bytes memory signature) internal pure returns (bool badSig, bytes32 r, bytes32 s, uint8 v) { + function unpackEcSig(bytes memory signature) private pure returns (bool badSig, bytes32 r, bytes32 s, uint8 v) { if (signature.length != 66) { badSig = true; return; @@ -84,30 +83,28 @@ library SignatureValidator { } } - /** - * @dev DANGEROUS FUNCTION: Modifies input in place, making it invalid after using this function - * Memory layout: bytes in parenthesis are returned - * L = l - 1 - * Input: ([l1][l2]....[l32][b1][b2]....[bn]) - * Output: [00]([L1][L2]....[L32][b2]....[bn]) - */ - function popFirstByte(bytes memory input) internal pure returns (bytes memory output, byte firstByte) { + function popFirstByte(bytes memory input) private pure returns (bytes memory output) { + uint256 inputLength = input.length; + require(inputLength > 0); + + output = new bytes(inputLength - 1); + + uint256 inputPointer; + uint256 outputPointer; assembly { - let length := mload(input) - firstByte := mload(add(input, 0x20)) - output := add(input, 0x01) - mstore8(input, 0x00) // Probably safe to remove, as it will most already likely be 0 - mstore(output, sub(length, 0x01)) + inputPointer := add(input, 0x21) + outputPointer := add(output, 0x20) } + memcpy(outputPointer, inputPointer, inputLength); } - function safeIsValidSignature(address validator, bytes32 hash, bytes memory signature) internal view returns (bool) { + function safeIsValidSignature(address validator, bytes32 hash, bytes memory signature) private view returns (bool) { bytes memory data = abi.encodeWithSelector(ERC1271(validator).isValidSignature.selector, hash, signature); bytes4 erc1271Return = safeBytes4StaticCall(validator, data, ERC1271_ISVALIDSIG_MAX_GAS); return erc1271Return == ERC1271_RETURN_VALID_SIGNATURE; } - function safeBytes4StaticCall(address target, bytes data, uint256 maxGas) internal view returns (bytes4 ret) { + function safeBytes4StaticCall(address target, bytes data, uint256 maxGas) private view returns (bytes4 ret) { uint256 gasLeft = gasleft(); uint256 callGas = gasLeft > maxGas ? maxGas : gasLeft; @@ -134,4 +131,24 @@ library SignatureValidator { return ret; } + + // From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol + function memcpy(uint dest, uint src, uint len) private pure { + // Copy word-length chunks while possible + for(; len >= 32; len -= 32) { + assembly { + mstore(dest, mload(src)) + } + dest += 32; + src += 32; + } + + // Copy remaining bytes + uint mask = 256 ** (32 - len) - 1; + assembly { + let srcpart := and(mload(src), not(mask)) + let destpart := and(mload(dest), mask) + mstore(dest, or(destpart, srcpart)) + } + } } From 5b7a5fe93509105638ddba57af8db8e187546a1f Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 15 Feb 2019 18:09:52 +0100 Subject: [PATCH 42/44] Address last review comments --- apps/agent/contracts/SignatureValidator.sol | 2 +- apps/agent/test/agent.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/agent/contracts/SignatureValidator.sol b/apps/agent/contracts/SignatureValidator.sol index 356b4be03b..f7b0736a70 100644 --- a/apps/agent/contracts/SignatureValidator.sol +++ b/apps/agent/contracts/SignatureValidator.sol @@ -88,7 +88,7 @@ library SignatureValidator { require(inputLength > 0); output = new bytes(inputLength - 1); - + uint256 inputPointer; uint256 outputPointer; assembly { diff --git a/apps/agent/test/agent.js b/apps/agent/test/agent.js index 1e1f7b8b51..2550bdf7d0 100644 --- a/apps/agent/test/agent.js +++ b/apps/agent/test/agent.js @@ -454,7 +454,6 @@ contract('Agent app', (accounts) => { // false - doesn't modify state on checking sig await setDesignatedSignerContract(false, true, false, false) - // Requires ERC165 compliance before checking isValidSignature assertIsValidSignature(true, await agent.isValidSignature(HASH, ERC1271_SIG)) }) From 2a293d1086865eb384e594c47b798d1096c55731 Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 15 Feb 2019 18:36:37 +0100 Subject: [PATCH 43/44] Lint --- apps/agent/contracts/SignatureValidator.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/agent/contracts/SignatureValidator.sol b/apps/agent/contracts/SignatureValidator.sol index f7b0736a70..6ff1d32581 100644 --- a/apps/agent/contracts/SignatureValidator.sol +++ b/apps/agent/contracts/SignatureValidator.sol @@ -135,7 +135,7 @@ library SignatureValidator { // From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible - for(; len >= 32; len -= 32) { + for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } From 687e29d658b5d30724c05d5ae05db9f93de3459e Mon Sep 17 00:00:00 2001 From: Jorge Izquierdo Date: Fri, 15 Feb 2019 21:01:58 +0100 Subject: [PATCH 44/44] Address very last review comments --- apps/agent/contracts/SignatureValidator.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/agent/contracts/SignatureValidator.sol b/apps/agent/contracts/SignatureValidator.sol index 6ff1d32581..cd61420176 100644 --- a/apps/agent/contracts/SignatureValidator.sol +++ b/apps/agent/contracts/SignatureValidator.sol @@ -19,6 +19,8 @@ library SignatureValidator { bytes4 public constant ERC1271_RETURN_VALID_SIGNATURE = 0x20c13b0b; uint256 internal constant ERC1271_ISVALIDSIG_MAX_GAS = 250000; + string private constant ERROR_INVALID_LENGTH_POP_BYTE = "SIGVAL_INVALID_LENGTH_POP_BYTE"; + /// @dev Validates that a hash was signed by a specified signer. /// @param hash Hash which was signed. /// @param signer Address of the signer. @@ -85,7 +87,7 @@ library SignatureValidator { function popFirstByte(bytes memory input) private pure returns (bytes memory output) { uint256 inputLength = input.length; - require(inputLength > 0); + require(inputLength > 0, ERROR_INVALID_LENGTH_POP_BYTE); output = new bytes(inputLength - 1); @@ -133,7 +135,7 @@ library SignatureValidator { } // From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol - function memcpy(uint dest, uint src, uint len) private pure { + function memcpy(uint256 dest, uint256 src, uint256 len) private pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly {