diff --git a/.babelrc b/.babelrc deleted file mode 100644 index ce6eb60be..000000000 --- a/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015", "stage-2", "stage-3"] -} diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100644 index ddde81867..000000000 --- a/.coveralls.yml +++ /dev/null @@ -1 +0,0 @@ -repo_token: w3im2b4XK8VhKdMeLgKqbG90f4I93rgUF \ No newline at end of file diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index c25572a61..000000000 --- a/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -./node_modules/ diff --git a/.gitattribute b/.gitattribute new file mode 100644 index 000000000..52031de51 --- /dev/null +++ b/.gitattribute @@ -0,0 +1 @@ +*.sol linguist-language=Solidity diff --git a/.gitignore b/.gitignore index 8e6522307..976f03cf0 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ coverageEnv/ coverage.json scTopics functions.csv +artifacts/ +allFiredEvents diff --git a/.solcover.js b/.solcover.js index dee9d6553..faab0bf3e 100644 --- a/.solcover.js +++ b/.solcover.js @@ -1,5 +1,12 @@ +// NOTE: Upgrading to solidity-coverage 0.4.x breaks our tests + +const libFiles = require('glob').sync('contracts/lib/**/*.sol').map(n => n.replace('contracts/', '')) +const interfaces = ['common/IForwarder.sol', 'kernel/IKernel.sol', 'evmscript/IEVMScriptExecutor.sol', 'apps/IAppProxy.sol', 'acl/IACL.sol'] + module.exports = { norpc: true, + compileCommand: '../node_modules/.bin/truffle compile', testCommand: 'node --max-old-space-size=4096 ../node_modules/.bin/truffle test --network coverage', - skipFiles: ['network/AragonResolver.sol', 'misc/Migrations.sol'], -} + skipFiles: interfaces.concat(libFiles), + copyNodeModules: true, +} \ No newline at end of file diff --git a/.soliumignore b/.soliumignore index b512c09d4..c17f068b1 100644 --- a/.soliumignore +++ b/.soliumignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +contracts/lib diff --git a/.soliumrc.json b/.soliumrc.json index e7369c41a..eda53bdfe 100644 --- a/.soliumrc.json +++ b/.soliumrc.json @@ -1,21 +1,25 @@ { - "custom-rules-filename": null, - "rules": { - "imports-on-top": true, - "variable-declarations": true, - "array-declarations": true, - "operator-whitespace": true, - "lbrace": true, - "mixedcase": false, - "camelcase": true, - "uppercase": true, - "no-with": true, - "no-empty-blocks": true, - "no-unused-vars": true, - "double-quotes": true, - "indentation": true, - "whitespace": true, - "deprecated-suicide": true, - "pragma-on-top": true - } + "extends": "solium:all", + "plugins": ["security"], + "rules": { + "security/no-low-level-calls": "off", + "security/no-inline-assembly": "off", + "function-order": "off", + "imports-on-top": 1, + "variable-declarations": 1, + "array-declarations": 1, + "operator-whitespace": 1, + "lbrace": 1, + "mixedcase": 0, + "camelcase": 1, + "uppercase": 1, + "no-empty-blocks": 1, + "no-unused-vars": 1, + "quotes": 1, + "indentation": 1, + "arg-overflow": ["error", 8], + "whitespace": 1, + "deprecated-suicide": 1, + "pragma-on-top": 1 + } } diff --git a/.travis.yml b/.travis.yml index 7d9296036..b71d23723 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,16 @@ -language: python -sudo: required -python: - - "3.4" -services: - - docker -script: - - docker-compose run core test -after_script: - - docker-compose run core coveralls +language: node_js +cache: + directories: + - node_modules +notifications: + email: false +node_js: + - '8' +env: + - TASK=lint + - TASK=coverage +before_script: + - npm prune +script: "npm run $TASK" +after_success: + - cat coverage/lcov.info | ./node_modules/.bin/coveralls diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 48b6d9325..000000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM node:boron - -RUN mkdir -p /usr/src/app - -WORKDIR /usr/src/app - - -COPY package.json /usr/src/app - -RUN npm install - -COPY . /usr/src/app - -RUN rm -rf contracts/zeppelin - - -ENTRYPOINT ["bash", "./entrypoint.sh"] -CMD ["bash"] diff --git a/LICENSE b/LICENSE index d2c02dac5..33c8f0375 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Jorge Izquierdo (Aragon Foundation) Copyright (C) 2017 +Aragon Institution MTÜ Copyright (C) 2017 Jordi Baylina (Giveth) Copyright (C) 2017 GNU GENERAL PUBLIC LICENSE diff --git a/contracts/.gitignore b/contracts/.gitignore index b7bc8ec9c..e69de29bb 100644 --- a/contracts/.gitignore +++ b/contracts/.gitignore @@ -1 +0,0 @@ -zeppelin/ diff --git a/contracts/acl/ACL.sol b/contracts/acl/ACL.sol new file mode 100644 index 000000000..dc1ad2e4d --- /dev/null +++ b/contracts/acl/ACL.sol @@ -0,0 +1,346 @@ +pragma solidity 0.4.18; + +import "../apps/AragonApp.sol"; +import "./ACLSyntaxSugar.sol"; +import "./IACL.sol"; + + +interface ACLOracle { + function canPerform(address who, address where, bytes32 what) public view returns (bool); +} + + +contract ACL is IACL, AragonApp, ACLSyntaxSugar { + bytes32 constant public CREATE_PERMISSIONS_ROLE = bytes32(1); + + // whether a certain entity has a permission + mapping (bytes32 => bytes32) permissions; // 0 for no permission, or parameters id + mapping (bytes32 => Param[]) public permissionParams; + + // who is the manager of a permission + mapping (bytes32 => address) permissionManager; + + enum Op { NONE, EQ, NEQ, GT, LT, GTE, LTE, NOT, AND, OR, XOR, IF_ELSE, RET } // op types + + struct Param { + uint8 id; + uint8 op; + uint240 value; // even though value is an uint240 it can store addresses + // in the case of 32 byte hashes losing 2 bytes precision isn't a huge deal + // op and id take less than 1 byte each so it can be kept in 1 sstore + } + + uint8 constant BLOCK_NUMBER_PARAM_ID = 200; + uint8 constant TIMESTAMP_PARAM_ID = 201; + uint8 constant SENDER_PARAM_ID = 202; + uint8 constant ORACLE_PARAM_ID = 203; + uint8 constant LOGIC_OP_PARAM_ID = 204; + uint8 constant PARAM_VALUE_PARAM_ID = 205; + // TODO: Add execution times param type? + + bytes32 constant public EMPTY_PARAM_HASH = keccak256(uint256(0)); + address constant ANY_ENTITY = address(-1); + + modifier onlyPermissionManager(address _app, bytes32 _role) { + require(msg.sender == getPermissionManager(_app, _role)); + _; + } + + event SetPermission(address indexed entity, address indexed app, bytes32 indexed role, bool allowed); + event ChangePermissionManager(address indexed app, bytes32 indexed role, address indexed manager); + + /** + * @dev Initialize can only be called once. It saves the block number in which it was initialized. + * @notice Initializes an ACL instance and sets `_permissionsCreator` as the entity that can create other permissions + * @param _permissionsCreator Entity that will be given permission over createPermission + */ + function initialize(address _permissionsCreator) onlyInit public { + initialized(); + require(msg.sender == address(kernel)); + + _createPermission(_permissionsCreator, this, CREATE_PERMISSIONS_ROLE, _permissionsCreator); + } + + /** + * @dev Creates a permission that wasn't previously set. Access is limited by the ACL. + * If a created permission is removed it is possible to reset it with createPermission. + * @notice Create a new permission granting `_entity` the ability to perform actions of role `_role` on `_app` (setting `_manager` as the permission manager) + * @param _entity Address of the whitelisted entity that will be able to perform the role + * @param _app Address of the app in which the role will be allowed (requires app to depend on kernel for ACL) + * @param _role Identifier for the group of actions in app given access to perform + * @param _manager Address of the entity that will be able to grant and revoke the permission further. + */ + function createPermission(address _entity, address _app, bytes32 _role, address _manager) external { + require(hasPermission(msg.sender, address(this), CREATE_PERMISSIONS_ROLE)); + + _createPermission(_entity, _app, _role, _manager); + } + + /** + * @dev Grants permission if allowed. This requires `msg.sender` to be the permission manager + * @notice Grants `_entity` the ability to perform actions of role `_role` on `_app` + * @param _entity Address of the whitelisted entity that will be able to perform the role + * @param _app Address of the app in which the role will be allowed (requires app to depend on kernel for ACL) + * @param _role Identifier for the group of actions in app given access to perform + */ + function grantPermission(address _entity, address _app, bytes32 _role) + external + { + grantPermissionP(_entity, _app, _role, new uint256[](0)); + } + + /** + * @dev Grants a permission with parameters if allowed. This requires `msg.sender` to be the permission manager + * @notice Grants `_entity` the ability to perform actions of role `_role` on `_app` + * @param _entity Address of the whitelisted entity that will be able to perform the role + * @param _app Address of the app in which the role will be allowed (requires app to depend on kernel for ACL) + * @param _role Identifier for the group of actions in app given access to perform + * @param _params Permission parameters + */ + function grantPermissionP(address _entity, address _app, bytes32 _role, uint256[] _params) + onlyPermissionManager(_app, _role) + public + { + require(!hasPermission(_entity, _app, _role)); + + bytes32 paramsHash = _params.length > 0 ? _saveParams(_params) : EMPTY_PARAM_HASH; + _setPermission(_entity, _app, _role, paramsHash); + } + + /** + * @dev Revokes permission if allowed. This requires `msg.sender` to be the the permission manager + * @notice Revokes `_entity` the ability to perform actions of role `_role` on `_app` + * @param _entity Address of the whitelisted entity to revoke access from + * @param _app Address of the app in which the role will be revoked + * @param _role Identifier for the group of actions in app being revoked + */ + function revokePermission(address _entity, address _app, bytes32 _role) + onlyPermissionManager(_app, _role) + external + { + require(hasPermission(_entity, _app, _role)); + + _setPermission(_entity, _app, _role, bytes32(0)); + } + + /** + * @notice Sets `_newManager` as the manager of the permission `_role` in `_app` + * @param _newManager Address for the new manager + * @param _app Address of the app in which the permission management is being transferred + * @param _role Identifier for the group of actions being transferred + */ + function setPermissionManager(address _newManager, address _app, bytes32 _role) + onlyPermissionManager(_app, _role) + external + { + _setPermissionManager(_newManager, _app, _role); + } + + /** + * @dev Get manager for permission + * @param _app Address of the app + * @param _role Identifier for a group of actions in app + * @return address of the manager for the permission + */ + function getPermissionManager(address _app, bytes32 _role) public view returns (address) { + return permissionManager[roleHash(_app, _role)]; + } + + /** + * @dev Function called by apps to check ACL on kernel or to check permission statu + * @param _who Sender of the original call + * @param _where Address of the app + * @param _where Identifier for a group of actions in app + * @param _how Permission parameters + * @return boolean indicating whether the ACL allows the role or not + */ + function hasPermission(address _who, address _where, bytes32 _what, bytes memory _how) public view returns (bool) { + uint256[] memory how; + uint256 intsLength = _how.length / 32; + assembly { + how := _how // forced casting + mstore(how, intsLength) + } + // _how is invalid from this point fwd + return hasPermission(_who, _where, _what, how); + } + + function hasPermission(address _who, address _where, bytes32 _what, uint256[] memory _how) public view returns (bool) { + bytes32 whoParams = permissions[permissionHash(_who, _where, _what)]; + if (whoParams != bytes32(0) && evalParams(whoParams, _who, _where, _what, _how)) { + return true; + } + + bytes32 anyParams = permissions[permissionHash(ANY_ENTITY, _where, _what)]; + if (anyParams != bytes32(0) && evalParams(anyParams, ANY_ENTITY, _where, _what, _how)) { + return true; + } + + return false; + } + + function hasPermission(address _who, address _where, bytes32 _what) public view returns (bool) { + uint256[] memory empty = new uint256[](0); + return hasPermission(_who, _where, _what, empty); + } + + /** + * @dev Internal createPermission for access inside the kernel (on instantiation) + */ + function _createPermission(address _entity, address _app, bytes32 _role, address _manager) internal { + // only allow permission creation (or re-creation) when there is no manager + require(getPermissionManager(_app, _role) == address(0)); + + _setPermission(_entity, _app, _role, EMPTY_PARAM_HASH); + _setPermissionManager(_manager, _app, _role); + } + + /** + * @dev Internal function called to actually save the permission + */ + function _setPermission(address _entity, address _app, bytes32 _role, bytes32 _paramsHash) internal { + permissions[permissionHash(_entity, _app, _role)] = _paramsHash; + + SetPermission(_entity, _app, _role, _paramsHash != bytes32(0)); + } + + function _saveParams(uint256[] _encodedParams) internal returns (bytes32) { + bytes32 paramHash = keccak256(_encodedParams); + Param[] storage params = permissionParams[paramHash]; + + if (params.length == 0) { // params not saved before + for (uint256 i = 0; i < _encodedParams.length; i++) { + uint256 encodedParam = _encodedParams[i]; + Param memory param = Param(decodeParamId(encodedParam), decodeParamOp(encodedParam), uint240(encodedParam)); + params.push(param); + } + } + + return paramHash; + } + + function evalParams( + bytes32 _paramsHash, + address _who, + address _where, + bytes32 _what, + uint256[] _how + ) internal view returns (bool) + { + if (_paramsHash == EMPTY_PARAM_HASH) { + return true; + } + + return evalParam(_paramsHash, 0, _who, _where, _what, _how); + } + + function evalParam( + bytes32 _paramsHash, + uint32 _paramId, + address _who, + address _where, + bytes32 _what, + uint256[] _how + ) internal view returns (bool) + { + if (_paramId >= permissionParams[_paramsHash].length) { + return false; // out of bounds + } + + Param memory param = permissionParams[_paramsHash][_paramId]; + + if (param.id == LOGIC_OP_PARAM_ID) { + return evalLogic(param, _paramsHash, _who, _where, _what, _how); + } + + uint256 value; + uint256 comparedTo = uint256(param.value); + + // get value + if (param.id == ORACLE_PARAM_ID) { + value = ACLOracle(param.value).canPerform(_who, _where, _what) ? 1 : 0; + comparedTo = 1; + } else if (param.id == BLOCK_NUMBER_PARAM_ID) { + value = blockN(); + } else if (param.id == TIMESTAMP_PARAM_ID) { + value = time(); + } else if (param.id == SENDER_PARAM_ID) { + value = uint256(msg.sender); + } else if (param.id == PARAM_VALUE_PARAM_ID) { + value = uint256(param.value); + } else { + if (param.id >= _how.length) { + return false; + } + value = uint256(uint240(_how[param.id])); // force lost precision + } + + if (Op(param.op) == Op.RET) { + return uint256(value) > 0; + } + + return compare(value, Op(param.op), comparedTo); + } + + function evalLogic(Param _param, bytes32 _paramsHash, address _who, address _where, bytes32 _what, uint256[] _how) internal view returns (bool) { + if (Op(_param.op) == Op.IF_ELSE) { + var (condition, success, failure) = decodeParamsList(uint256(_param.value)); + bool result = evalParam(_paramsHash, condition, _who, _where, _what, _how); + + return evalParam(_paramsHash, result ? success : failure, _who, _where, _what, _how); + } + + var (v1, v2,) = decodeParamsList(uint256(_param.value)); + bool r1 = evalParam(_paramsHash, v1, _who, _where, _what, _how); + + if (Op(_param.op) == Op.NOT) { + return !r1; + } + + if (r1 && Op(_param.op) == Op.OR) { + return true; + } + + if (!r1 && Op(_param.op) == Op.AND) { + return false; + } + + bool r2 = evalParam(_paramsHash, v2, _who, _where, _what, _how); + + if (Op(_param.op) == Op.XOR) { + return (r1 && !r2) || (!r1 && r2); + } + + return r2; // both or and and depend on result of r2 after checks + } + + function compare(uint256 _a, Op _op, uint256 _b) internal pure returns (bool) { + if (_op == Op.EQ) return _a == _b; // solium-disable-line lbrace + if (_op == Op.NEQ) return _a != _b; // solium-disable-line lbrace + if (_op == Op.GT) return _a > _b; // solium-disable-line lbrace + if (_op == Op.LT) return _a < _b; // solium-disable-line lbrace + if (_op == Op.GTE) return _a >= _b; // solium-disable-line lbrace + if (_op == Op.LTE) return _a <= _b; // solium-disable-line lbrace + return false; + } + + /** + * @dev Internal function that sets management + */ + function _setPermissionManager(address _newManager, address _app, bytes32 _role) internal { + permissionManager[roleHash(_app, _role)] = _newManager; + ChangePermissionManager(_app, _role, _newManager); + } + + function roleHash(address _where, bytes32 _what) pure internal returns (bytes32) { + return keccak256(uint256(1), _where, _what); + } + + function permissionHash(address _who, address _where, bytes32 _what) pure internal returns (bytes32) { + return keccak256(uint256(2), _who, _where, _what); + } + + function time() internal view returns (uint64) { return uint64(block.timestamp); } // solium-disable-line security/no-block-members + + function blockN() internal view returns (uint256) { return block.number; } +} \ No newline at end of file diff --git a/contracts/acl/ACLSyntaxSugar.sol b/contracts/acl/ACLSyntaxSugar.sol new file mode 100644 index 000000000..cf35f6b8a --- /dev/null +++ b/contracts/acl/ACLSyntaxSugar.sol @@ -0,0 +1,43 @@ +pragma solidity 0.4.18; + + +contract ACLSyntaxSugar { + function arr() internal pure returns (uint256[] r) {} + + function arr(uint256 _a) internal pure returns (uint256[] r) { + r = new uint256[](1); + r[0] = _a; + } + + function arr(bytes32 _a) internal pure returns (uint256[] r) { + return arr(uint256(_a)); + } + + function arr(bytes32 _a, bytes32 _b) internal pure returns (uint256[] r) { + return arr(uint256(_a), uint256(_b)); + } + + function arr(address _a) internal pure returns (uint256[] r) { + return arr(uint256(_a)); + } + + function arr(uint256 _a, uint256 _b) internal pure returns (uint256[] r) { + r = new uint256[](2); + r[0] = _a; + r[1] = _b; + } + + function decodeParamOp(uint256 _x) internal pure returns (uint8 b) { + return uint8(_x >> (8 * 30)); + } + + function decodeParamId(uint256 _x) internal pure returns (uint8 b) { + return uint8(_x >> (8 * 31)); + } + + function decodeParamsList(uint256 _x) internal pure returns (uint32 a, uint32 b, uint32 c) { + a = uint32(_x); + b = uint32(_x >> (8 * 4)); + c = uint32(_x >> (8 * 8)); + } +} diff --git a/contracts/acl/IACL.sol b/contracts/acl/IACL.sol new file mode 100644 index 000000000..304f75aa0 --- /dev/null +++ b/contracts/acl/IACL.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.4.18; + + +interface IACL { + function initialize(address permissionsCreator) public; + function hasPermission(address who, address where, bytes32 what, bytes how) public view returns (bool); +} diff --git a/contracts/apm/APMRegistry.sol b/contracts/apm/APMRegistry.sol new file mode 100644 index 000000000..c92b6a397 --- /dev/null +++ b/contracts/apm/APMRegistry.sol @@ -0,0 +1,99 @@ +pragma solidity 0.4.18; + +import "../lib/ens/AbstractENS.sol"; +import "../ens/ENSSubdomainRegistrar.sol"; +import "../factory/AppProxyFactory.sol"; +import "../apps/AragonApp.sol"; +import "../acl/ACL.sol"; +import "./Repo.sol"; + + +contract APMRegistryConstants { + // Cant have a regular APM appId because it is used to build APM + bytes32 constant public APM_APP_ID = keccak256("apm.aragon"); + bytes32 constant public REPO_APP_ID = keccak256("repo.aragon"); + bytes32 constant public ENS_SUB_APP_ID = keccak256("enssub.aragon"); +} + + +contract APMRegistry is AragonApp, AppProxyFactory, APMRegistryConstants { + AbstractENS ens; + ENSSubdomainRegistrar public registrar; + + bytes32 constant public CREATE_REPO_ROLE = bytes32(1); + + event NewRepo(bytes32 id, string name, address repo); + + /** + * NEEDS CREATE_NAME_ROLE and POINT_ROOTNODE_ROLE permissions on registrar + * @param _registrar ENSSubdomainRegistrar instance that holds registry root node ownership + */ + function initialize(ENSSubdomainRegistrar _registrar) onlyInit public { + initialized(); + + registrar = _registrar; + ens = registrar.ens(); + + registrar.pointRootNode(this); + + // Check APM has all permissions it needss + ACL acl = ACL(kernel.acl()); + require(acl.hasPermission(this, registrar, registrar.CREATE_NAME_ROLE())); + require(acl.hasPermission(this, acl, acl.CREATE_PERMISSIONS_ROLE())); + } + + /** + * @notice Create new repo in registry with `_name` + * @param _name Repo name, must be ununsed + * @param _dev Address that will be given permission to create versions + */ + function newRepo(string _name, address _dev) auth(CREATE_REPO_ROLE) public returns (Repo) { + return _newRepo(_name, _dev); + } + + /** + * @notice Create new repo in registry with `_name` and first repo version + * @param _name Repo name + * @param _dev Address that will be given permission to create versions + * @param _initialSemanticVersion Semantic version for new repo version + * @param _contractAddress address for smart contract logic for version (if set to 0, it uses last versions' contractAddress) + * @param _contentURI External URI for fetching new version's content + */ + function newRepoWithVersion( + string _name, + address _dev, + uint16[3] _initialSemanticVersion, + address _contractAddress, + bytes _contentURI + ) auth(CREATE_REPO_ROLE) public returns (Repo) + { + Repo repo = _newRepo(_name, this); // need to have permissions to create version + repo.newVersion(_initialSemanticVersion, _contractAddress, _contentURI); + + // Give permissions to _dev + ACL acl = ACL(kernel.acl()); + acl.revokePermission(this, repo, repo.CREATE_VERSION_ROLE()); + acl.setPermissionManager(_dev, repo, repo.CREATE_VERSION_ROLE()); + return repo; + } + + function _newRepo(string _name, address _dev) internal returns (Repo) { + require(bytes(_name).length > 0); + + Repo repo = newClonedRepo(); + + ACL(kernel.acl()).createPermission(_dev, repo, repo.CREATE_VERSION_ROLE(), _dev); + + // Creates [name] subdomain in the rootNode and sets registry as resolver + // This will fail if repo name already exists + bytes32 node = registrar.createNameAndPoint(keccak256(_name), repo); + + NewRepo(node, _name, repo); + + return repo; + } + + function newClonedRepo() internal returns (Repo) { + return Repo(newAppProxy(kernel, REPO_APP_ID)); + } +} \ No newline at end of file diff --git a/contracts/apm/Repo.sol b/contracts/apm/Repo.sol new file mode 100644 index 000000000..6f337d55e --- /dev/null +++ b/contracts/apm/Repo.sol @@ -0,0 +1,100 @@ +pragma solidity ^0.4.15; + +import "../apps/AragonApp.sol"; + + +contract Repo is AragonApp { + struct Version { + uint16[3] semanticVersion; + address contractAddress; + bytes contentURI; + } + + Version[] versions; + mapping (bytes32 => uint256) versionIdForSemantic; + mapping (address => uint256) latestVersionIdForContract; + + bytes32 constant public CREATE_VERSION_ROLE = bytes32(1); + + event NewVersion(uint256 versionId, uint16[3] semanticVersion); + + /** + * @notice Create new version for repo + * @param _newSemanticVersion Semantic version for new repo version + * @param _contractAddress address for smart contract logic for version (if set to 0, it uses last versions' contractAddress) + * @param _contentURI External URI for fetching new version's content + */ + function newVersion( + uint16[3] _newSemanticVersion, + address _contractAddress, + bytes _contentURI + ) auth(CREATE_VERSION_ROLE) public + { + address contractAddress = _contractAddress; + if (versions.length > 0) { + Version storage lastVersion = versions[versions.length - 1]; + require(isValidBump(lastVersion.semanticVersion, _newSemanticVersion)); + if (contractAddress == 0) { + contractAddress = lastVersion.contractAddress; + } + // Only allows smart contract change on major version bumps + require(lastVersion.contractAddress == contractAddress || _newSemanticVersion[0] > lastVersion.semanticVersion[0]); + } else { + versions.length += 1; + uint16[3] memory zeroVersion; + require(isValidBump(zeroVersion, _newSemanticVersion)); + } + + uint versionId = versions.push(Version(_newSemanticVersion, contractAddress, _contentURI)) - 1; + versionIdForSemantic[semanticVersionHash(_newSemanticVersion)] = versionId; + latestVersionIdForContract[contractAddress] = versionId; + + NewVersion(versionId, _newSemanticVersion); + } + + function getLatest() public view returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI) { + return getByVersionId(versions.length - 1); + } + + function getLatestForContractAddress(address _contractAddress) public view returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI) { + return getByVersionId(latestVersionIdForContract[_contractAddress]); + } + + function getBySemanticVersion(uint16[3] _semanticVersion) public view returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI) { + return getByVersionId(versionIdForSemantic[semanticVersionHash(_semanticVersion)]); + } + + function getByVersionId(uint _versionId) public view returns (uint16[3] semanticVersion, address contractAddress, bytes contentURI) { + require(_versionId > 0); + Version storage version = versions[_versionId]; + return (version.semanticVersion, version.contractAddress, version.contentURI); + } + + function getVersionsCount() public view returns (uint256) { + uint256 len = versions.length; + return len > 0 ? len - 1 : 0; + } + + function isValidBump(uint16[3] _oldVersion, uint16[3] _newVersion) public pure returns (bool) { + bool hasBumped; + uint i = 0; + while (i < 3) { + if (hasBumped) { + if (_newVersion[i] != 0) { + return false; + } + } else if (_newVersion[i] != _oldVersion[i]) { + if (_oldVersion[i] > _newVersion[i] || _newVersion[i] - _oldVersion[i] != 1) { + return false; + } + hasBumped = true; + } + i++; + } + return hasBumped; + } + + function semanticVersionHash(uint16[3] version) internal pure returns (bytes32) { + return keccak256(version[0], version[1], version[2]); + } +} diff --git a/contracts/apps/AppProxyBase.sol b/contracts/apps/AppProxyBase.sol new file mode 100644 index 000000000..4ae138551 --- /dev/null +++ b/contracts/apps/AppProxyBase.sol @@ -0,0 +1,44 @@ +pragma solidity 0.4.18; + +import "./IAppProxy.sol"; +import "./AppStorage.sol"; +import "../common/DelegateProxy.sol"; +import "../kernel/KernelStorage.sol"; + + +contract AppProxyBase is IAppProxy, AppStorage, DelegateProxy, KernelConstants { + /** + * @dev Initialize AppProxy + * @param _kernel Reference to organization kernel for the app + * @param _appId Identifier for app + * @param _initializePayload Payload for call to be made after setup to initialize + */ + function AppProxyBase(IKernel _kernel, bytes32 _appId, bytes _initializePayload) public { + kernel = _kernel; + appId = _appId; + + // Implicit check that kernel is actually a Kernel + // The EVM doesn't actually provide a way for us to make sure, but we can force a revert to + // occur if the kernel is set to 0x0 or a non-code address when we try to call a method on + // it. + address appCode = getAppBase(appId); + + // If initialize payload is provided, it will be executed + if (_initializePayload.length > 0) { + require(isContract(appCode)); + // Cannot make delegatecall as a delegateproxy.delegatedFwd as it + // returns ending execution context and halts contract deployment + require(appCode.delegatecall(_initializePayload)); + } + } + + function getAppBase(bytes32 _appId) internal view returns (address) { + return kernel.getApp(keccak256(APP_BASES_NAMESPACE, _appId)); + } + + function () payable public { + address target = getCode(); + require(target != 0); // if app code hasn't been set yet, don't call + delegatedFwd(target, msg.data); + } +} \ No newline at end of file diff --git a/contracts/apps/AppProxyPinned.sol b/contracts/apps/AppProxyPinned.sol new file mode 100644 index 000000000..a37588501 --- /dev/null +++ b/contracts/apps/AppProxyPinned.sol @@ -0,0 +1,31 @@ +pragma solidity 0.4.18; + +import "./AppProxyBase.sol"; + + +contract AppProxyPinned is AppProxyBase { + /** + * @dev Initialize AppProxyPinned (makes it an un-upgradeable Aragon app) + * @param _kernel Reference to organization kernel for the app + * @param _appId Identifier for app + * @param _initializePayload Payload for call to be made after setup to initialize + */ + function AppProxyPinned(IKernel _kernel, bytes32 _appId, bytes _initializePayload) + AppProxyBase(_kernel, _appId, _initializePayload) public + { + pinnedCode = getAppBase(appId); + require(pinnedCode != address(0)); + } + + function getCode() public view returns (address) { + return pinnedCode; + } + + function isUpgradeable() public pure returns (bool) { + return false; + } + + function () payable public { + delegatedFwd(getCode(), msg.data); + } +} \ No newline at end of file diff --git a/contracts/apps/AppProxyUpgradeable.sol b/contracts/apps/AppProxyUpgradeable.sol new file mode 100644 index 000000000..3e880144f --- /dev/null +++ b/contracts/apps/AppProxyUpgradeable.sol @@ -0,0 +1,28 @@ +pragma solidity 0.4.18; + +import "./AppProxyBase.sol"; + + +contract AppProxyUpgradeable is AppProxyBase { + address public pinnedCode; + + /** + * @dev Initialize AppProxyUpgradeable (makes it an upgradeable Aragon app) + * @param _kernel Reference to organization kernel for the app + * @param _appId Identifier for app + * @param _initializePayload Payload for call to be made after setup to initialize + */ + function AppProxyUpgradeable(IKernel _kernel, bytes32 _appId, bytes _initializePayload) + AppProxyBase(_kernel, _appId, _initializePayload) public + { + + } + + function getCode() public view returns (address) { + return getAppBase(appId); + } + + function isUpgradeable() public pure returns (bool) { + return true; + } +} diff --git a/contracts/apps/AppStorage.sol b/contracts/apps/AppStorage.sol new file mode 100644 index 000000000..4b85252b1 --- /dev/null +++ b/contracts/apps/AppStorage.sol @@ -0,0 +1,13 @@ +pragma solidity ^0.4.18; + +import "../kernel/IKernel.sol"; + + +contract AppStorage { + IKernel public kernel; + bytes32 public appId; + address internal pinnedCode; // used by Proxy Pinned + uint256 internal initializationBlock; // used by Initializable + uint256[95] private storageOffset; // forces App storage to start at after 100 slots + uint256 private offset; +} diff --git a/contracts/apps/Application.sol b/contracts/apps/Application.sol deleted file mode 100644 index 83bd5a29c..000000000 --- a/contracts/apps/Application.sol +++ /dev/null @@ -1,33 +0,0 @@ -pragma solidity ^0.4.11; - -import "../organs/IOrgan.sol"; -import "./IApplication.sol"; - -contract Application is IApplication { - address public dao; - - modifier onlyDAO { - require(msg.sender == dao); - _; - } - - function Application(address newDAO) { - setDAO(newDAO); - } - - /** - * @dev setDAO can be called outside of constructor for allowing Forwarder contracts - */ - function setDAO(address newDAO) { - if (newDAO == 0) return; - require(dao == 0); // bypassing of all bylaws can happen if changing dao reference for app - dao = newDAO; - init(); - } - - function init() internal {} - - function getSender() internal returns (address) { - return msg.sender == dao ? dao_msg().sender : msg.sender; - } -} diff --git a/contracts/apps/AragonApp.sol b/contracts/apps/AragonApp.sol new file mode 100644 index 000000000..f891ff29e --- /dev/null +++ b/contracts/apps/AragonApp.sol @@ -0,0 +1,17 @@ +pragma solidity ^0.4.18; + +import "./AppStorage.sol"; +import "../common/Initializable.sol"; +import "../evmscript/EVMScriptRunner.sol"; + + +contract AragonApp is AppStorage, Initializable, EVMScriptRunner { + modifier auth(bytes32 _role) { + require(canPerform(msg.sender, _role)); + _; + } + + function canPerform(address _sender, bytes32 _role) public view returns (bool) { + return address(kernel) == 0 || kernel.hasPermission(_sender, address(this), _role, new bytes(0)); + } +} diff --git a/contracts/apps/IAppProxy.sol b/contracts/apps/IAppProxy.sol new file mode 100644 index 000000000..d483c5347 --- /dev/null +++ b/contracts/apps/IAppProxy.sol @@ -0,0 +1,6 @@ +pragma solidity 0.4.18; + +interface IAppProxy { + function isUpgradeable() public pure returns (bool); + function getCode() public view returns (address); +} diff --git a/contracts/apps/IApplication.sol b/contracts/apps/IApplication.sol deleted file mode 100644 index 3333a02f7..000000000 --- a/contracts/apps/IApplication.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity ^0.4.13; - -import "../misc/DAOMsg.sol"; - -contract IApplication is DAOMsgReader { - function init() internal; -} diff --git a/contracts/apps/basic-governance/IVote.sol b/contracts/apps/basic-governance/IVote.sol deleted file mode 100644 index 164f3d7bd..000000000 --- a/contracts/apps/basic-governance/IVote.sol +++ /dev/null @@ -1,6 +0,0 @@ -pragma solidity ^0.4.13; - -contract IVote { - function wasExecuted() constant public returns (bool); - function execute(); -} diff --git a/contracts/apps/basic-governance/IVotingApp.sol b/contracts/apps/basic-governance/IVotingApp.sol deleted file mode 100644 index ec5f903b9..000000000 --- a/contracts/apps/basic-governance/IVotingApp.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity ^0.4.13; - -contract IVotingOracle { - function isVoteApproved(address _voteAddress, uint256 _supportPct, uint256 _minQuorumPct, uint64 _minDebateTime, uint64 _minVotingTime) constant returns (bool); -} - -contract IVotingApp is IVotingOracle { - event NewVote(uint indexed voteId, address voteAddress); - event CastVote(uint indexed voteId, address voter, bool isYay, uint votes); - event ChangeVoteState(uint indexed voteId, uint oldState, uint newState); - - function createVote(address _voteAddress, uint64 _voteStartsBlock, uint64 _voteEndsBlock) external; - function voteYay(uint _voteId) public; - function voteYayAndExecute(uint voteId) external; - function voteNay(uint voteId) external; - function setValidVoteCode(bytes32 _codeHash, bool _valid) external; - function transitionStateIfChanged(uint voteId) public; - - function getVoteStatus(uint _voteId) constant returns (uint state, address voteCreator, address voteAddress, uint64 voteCreatedBlock, uint64 voteStartsBlock, uint64 voteEndsBlock, uint256 yays, uint256 nays, uint256 totalQuorum, bool validCode); - function isVoteCodeValid(address _addr) constant returns (bool); -} diff --git a/contracts/apps/basic-governance/Vote.sol b/contracts/apps/basic-governance/Vote.sol deleted file mode 100644 index ac6c938fa..000000000 --- a/contracts/apps/basic-governance/Vote.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity ^0.4.13; - -import "./IVote.sol"; - -contract Vote is IVote { - address public dao; - bytes public data; - bool executed; - - function instantiate(address _dao, bytes _data) { - require(dao == 0 && data.length == 0); // dont allow to reinstantiate a vote - require(_dao != 0); - dao = _dao; - data = _data; - } - - function execute() { - require(!executed); - executed = true; - assert(dao.call(data)); - } - - function wasExecuted() constant public returns (bool) { - return executed; - } -} diff --git a/contracts/apps/basic-governance/VotingApp.sol b/contracts/apps/basic-governance/VotingApp.sol deleted file mode 100644 index 76a9d5ff7..000000000 --- a/contracts/apps/basic-governance/VotingApp.sol +++ /dev/null @@ -1,313 +0,0 @@ -pragma solidity ^0.4.13; - -/** -* @author Jorge Izquierdo (Aragon) -* @description VotingApp allows for very simple (binary votes) and light voting. -* It depends on an OwnershipType interface that provides all tokens an organization has -* and requires these tokens to be MiniMe to get token balances at a given block. -*/ - -import "../../tokens/MiniMeToken.sol"; -import "../../kernel/Kernel.sol"; -import "../ownership/OwnershipApp.sol"; -import "../Application.sol"; -import "../../misc/CodeHelper.sol"; - -import "./IVote.sol"; -import "./IVotingApp.sol"; - -contract VotingApp is IVotingApp, Application, CodeHelper { - function VotingApp(address daoAddr) - Application(daoAddr) - { - // init is automatically called by setDAO - } - - function init() internal { - assert(votes.length == 0); // asserts init can only be called once - votes.length++; // index 0 is empty - } - - // hash(bytecode) -> bool. Is the hash of some bytecode approved voting code? - mapping (bytes32 => bool) public validVoteCode; - - // states a certain vote goes through - enum VoteState { - Debate, - Voting, - Closed, - Executed - } - - struct Vote { - VoteState state; - - address voteCreator; - address voteAddress; - uint64 voteCreatedBlock; - uint64 voteStartsBlock; - uint64 voteEndsBlock; - - address[] governanceTokens; - uint128[] votingWeights; - uint256 totalQuorum; - - uint256 yays; - uint256 nays; - mapping (address => uint) voted; // 1 for yay, 2 for nay - } - - Vote[] votes; // array for storage of all votes - mapping (address => uint) voteForAddress; // reverse index to quickly get the voteId for a vote address - - /** - * @notice Create a new vote for `IVote(_voteAddress).data()` - * @param _voteAddress the address of the contract that will be executed on approval - * @param _voteStartsBlock block number in which voting can start (inclusive) - * @param _voteEndsBlock block number in which voting ended (non-inclusive, voting on this block number is not allowed) - */ - function createVote(address _voteAddress, uint64 _voteStartsBlock, uint64 _voteEndsBlock) onlyDAO external { - uint voteId = votes.length; - votes.length++; - - require(getBlockNumber() <= _voteStartsBlock && _voteStartsBlock < _voteEndsBlock); // block number integrity - require(isVoteCodeValid(_voteAddress)); // check vote has allowed bytecode before creating it (it can change during voting) - require(voteForAddress[_voteAddress] == 0); // not allow 2 votings with the same address - - Vote storage vote = votes[voteId]; - vote.voteCreator = dao_msg().sender; - vote.voteAddress = _voteAddress; - vote.voteCreatedBlock = getBlockNumber(); - vote.voteStartsBlock = _voteStartsBlock; - vote.voteEndsBlock = _voteEndsBlock; - voteForAddress[_voteAddress] = voteId; - - NewVote(voteId, _voteAddress); - transitionStateIfChanged(voteId); // vote can start in this block - } - - /** - * @notice Vote positively in voting with id `_voteId` - * @dev Function can be called directly without going through the DAO (save gas and bylaw is not useful for voting) - * @param _voteId id for vote - */ - function voteYay(uint _voteId) public { - vote(_voteId, true, getSender()); - } - - /** - * @notice Vote positively in voting with id `_voteId` and execute the vote result (will fail if not approved) - * @dev Function can be called directly without going through the DAO (save gas and bylaw is not useful for voting) - * @param _voteId id for vote - */ - function voteYayAndExecute(uint _voteId) external { - voteYay(_voteId); - IVote(votes[_voteId].voteAddress).execute(); - transitionStateIfChanged(_voteId); - } - - /** - * @notice Vote negatively in voting with id `_voteId` - * @dev Function can be called directly without going through the DAO (save gas and bylaw is not useful for voting) - * @param _voteId id for vote - */ - function voteNay(uint _voteId) external { - vote(_voteId, false, getSender()); - } - - /** - * @notice Make the hash `_codeHash` as `_valid ? 'valid' : 'invalid'` vote code - * @dev Only voting contracts with accepted code hashes will be allowed (solves voting reentrancy as only trusted vote code that is executed once should be allowed) - * @param _codeHash sha3 hash of the bytecode (stored in the blockchain, not the init_code) - * @param _valid whether to whitelist it the code or not - */ - function setValidVoteCode(bytes32 _codeHash, bool _valid) onlyDAO external { - require(_codeHash > 0); - validVoteCode[_codeHash] = _valid; - } - - /** - * @notice Force a state update for vote id `_voteId` - * @dev Sometimes state transitions for votes have to be triggered from the outside (for closed and executed stages) - * @param _voteId id for vote checked - */ - function transitionStateIfChanged(uint _voteId) public { - Vote storage vote = votes[_voteId]; - - // Multiple state transitions can happen at once - if (vote.state == VoteState.Debate && getBlockNumber() >= vote.voteStartsBlock) { - transitionToVotingState(vote); - ChangeVoteState(_voteId, uint(VoteState.Debate), uint(VoteState.Voting)); - } - - bool voteWasExecuted = IVote(votes[_voteId].voteAddress).wasExecuted(); - - if (vote.state == VoteState.Voting && (voteWasExecuted || getBlockNumber() > vote.voteEndsBlock || vote.governanceTokens.length == 0 || vote.totalQuorum == 0)) { - vote.state = VoteState.Closed; - ChangeVoteState(_voteId, uint(VoteState.Voting), uint(VoteState.Closed)); - } - - if (vote.state == VoteState.Closed && voteWasExecuted) { - vote.state = VoteState.Executed; - ChangeVoteState(_voteId, uint(VoteState.Closed), uint(VoteState.Executed)); - } - } - - /** - * @dev Function called from other components to check whether a vote is approved given certain parameters. All must pass. - * @param _voteAddress the address of the vote being checked - * @param _supportPct was voted positively by this percentage of voting quorum - * @param _minQuorumPct is the quorum at least this percentage - * @param _minDebateTime was there at least this many blocks between creation and voting starting - * @param _minVotingTime was there at least this many blocks between voting starting and closing - */ - function isVoteApproved( - address _voteAddress, - uint256 _supportPct, - uint256 _minQuorumPct, - uint64 _minDebateTime, - uint64 _minVotingTime - ) constant returns (bool) - { - uint voteId = voteForAddress[_voteAddress]; - if (voteId == 0) - return false; - - Vote storage vote = votes[voteId]; - - if (vote.state == VoteState.Debate || vote.totalQuorum == 0) - return false; - if (vote.voteStartsBlock - vote.voteCreatedBlock < _minDebateTime) - return false; - if (vote.voteEndsBlock - vote.voteStartsBlock < _minVotingTime) - return false; - if (!isVoteCodeValid(vote.voteAddress)) - return false; - - // After the vote has ended check whether min quorum was met and voting quorum approved it - if (getBlockNumber() >= vote.voteEndsBlock) { - uint256 quorum = vote.yays + vote.nays; - uint256 yaysQuorumPct = vote.yays * PCT_BASE / quorum; - uint256 quorumPct = quorum * PCT_BASE / vote.totalQuorum; - - return yaysQuorumPct >= _supportPct && quorumPct >= _minQuorumPct; - } else { - // Before the voting has ended, absolute support is needed - // (there is no way that the minSupport isn't met even if all remaining votes are negative) - uint256 yaysTotalPct = vote.yays * PCT_BASE / vote.totalQuorum; - - return yaysTotalPct >= _supportPct; - } - } - - /** - * @dev Gets status for a certain vote - * @param _voteId id of the vote - * @return all voting status - */ - function getVoteStatus(uint _voteId) constant returns (uint state, address voteCreator, address voteAddress, uint64 voteCreatedBlock, uint64 voteStartsBlock, uint64 voteEndsBlock, uint256 yays, uint256 nays, uint256 totalQuorum, bool validCode) { - Vote storage vote = votes[_voteId]; - state = uint(vote.state); - voteCreator = vote.voteCreator; - voteAddress = vote.voteAddress; - voteCreatedBlock = vote.voteCreatedBlock; - voteStartsBlock = vote.voteStartsBlock; - voteEndsBlock = vote.voteEndsBlock; - yays = vote.yays; - nays = vote.nays; - totalQuorum = vote.totalQuorum; - validCode = isVoteCodeValid(vote.voteAddress); - } - - /** - * @dev Getter for whether the contract at `_addr` is valid - * @param _addr contract address being checked - * @return bool whether it is valid or not - */ - function isVoteCodeValid(address _addr) constant returns (bool) { - return validVoteCode[hashForCode(_addr)]; - } - - /** - * @dev low level vote function. Gets the balances at the start block of the vote and adds votes according to weights - * @param _voteId id for vote - * @param _isYay whether to add a possitive or negative vote - * @param _voter address of voter - */ - function vote(uint _voteId, bool _isYay, address _voter) - transitions_state(_voteId) only_state(_voteId, VoteState.Voting) - internal - { - Vote storage vote = votes[_voteId]; - uint tokenLength = vote.governanceTokens.length; - - uint totalStake = 0; - for (uint i = 0; i < tokenLength; i++) { - uint balance = MiniMeToken(vote.governanceTokens[i]).balanceOfAt(_voter, vote.voteStartsBlock); - totalStake += balance * vote.votingWeights[i]; - } - - if (vote.voted[_voter] > 0) { // already voted - bool votedYay = vote.voted[_voter] == 1; - - if (votedYay) - vote.yays -= totalStake; - else - vote.nays -= totalStake; - } - - if (_isYay) - vote.yays += totalStake; - else - vote.nays += totalStake; - - vote.voted[_voter] = _isYay ? 1 : 2; - - CastVote( - _voteId, - _voter, - _isYay, - totalStake - ); - } - - function transitionToVotingState(Vote storage vote) internal { - vote.state = VoteState.Voting; - OwnershipApp ownershipApp = getOwnershipApp(); - - uint count = ownershipApp.getTokenCount(); - for (uint i = 1; i <= count; i++) { - var (tokenAddress, governanceRights,) = ownershipApp.getToken(i); - if (governanceRights > 0) { - vote.governanceTokens.push(tokenAddress); - vote.votingWeights.push(governanceRights); - uint tokenSupply = MiniMeToken(tokenAddress).totalSupplyAt(vote.voteStartsBlock); - vote.totalQuorum += governanceRights * (tokenSupply - MiniMeToken(tokenAddress).balanceOfAt(dao, vote.voteStartsBlock)); - } - } - - assert(vote.votingWeights.length == vote.governanceTokens.length); - } - - function getOwnershipApp() internal returns (OwnershipApp) { - return OwnershipApp(dao); - } - - // @dev just for mocking purposes - function getBlockNumber() internal returns (uint64) { - return uint64(block.number); - } - - modifier transitions_state(uint voteId) { - transitionStateIfChanged(voteId); - _; - transitionStateIfChanged(voteId); - } - - modifier only_state(uint voteId, VoteState state) { - require(votes[voteId].state == state); - _; - } - - uint constant PCT_BASE = 10 ** 18; -} diff --git a/contracts/apps/bylaws/BylawOracle.sol b/contracts/apps/bylaws/BylawOracle.sol deleted file mode 100644 index 57a9e3e63..000000000 --- a/contracts/apps/bylaws/BylawOracle.sol +++ /dev/null @@ -1,12 +0,0 @@ -pragma solidity ^0.4.13; - - -contract BylawOracle { - function canPerformAction( - address sender, - bytes data, - address token, - uint256 value - ) returns (bool ok, uint256 actionId); - -} diff --git a/contracts/apps/bylaws/BylawsApp.sol b/contracts/apps/bylaws/BylawsApp.sol deleted file mode 100644 index e9d2250fa..000000000 --- a/contracts/apps/bylaws/BylawsApp.sol +++ /dev/null @@ -1,440 +0,0 @@ -pragma solidity ^0.4.13; - -/** -* @author Jorge Izquierdo (Aragon) -* @description BylawsApp is a simple permissions oracle for the DAO that supports -* actions integrating with default DAO apps -* It defines 6 bylaw types: -* 1) voting bylaw (depends on an app that implements IVotingOracle) -* 2) status bylaw (depends on an app that implements IStatusOracle) -* 3) token holder bylaw (depends on an app that implements ITokenHolderOracle) -* 4) address bylaw (only x address can perform action) -* 5) oracle bylaw (depends on address x implementing BylawOracle) -* 6) combinator bylaw (combines two bylaws of previous types with a logic operator) -*/ - -import "../Application.sol"; - -import "../status/StatusApp.sol"; -import "../ownership/OwnershipApp.sol"; -import "../basic-governance/IVotingApp.sol"; - -import "./BylawOracle.sol"; -import "./IBylawsApp.sol"; - -contract BylawsApp is IBylawsApp, Application { - enum BylawType { Voting, Status, TokenHolder, Address, Oracle, Combinator } - enum CombinatorType { Or, And, Xor } - - struct Bylaw { - BylawType bylawType; - - bool not; // reverse logic. makes bylaw pass if it was false - bool exists; - - // a bylaw can be one of these types - uint8 status; // For status type - address addr; // For address and oracle types - VotingBylaw voting; - CombinatorBylaw combinator; - } - - struct VotingBylaw { - uint256 supportPct; // 16pct % * 10^16 (pe. 5% = 5 * 10^16) - uint256 minQuorumPct; // 16pct - - uint64 minDebateTime; // in blocks - uint64 minVotingTime; // in blocks - } - - struct CombinatorBylaw { - CombinatorType combinatorType; // if TRUE combinator is AND, if false is an OR combinator - uint256 leftBylawId; - uint256 rightBylawId; - } - - mapping (uint => Bylaw) bylaws; - mapping (bytes4 => uint) public bylawEntrypoint; - - mapping (address => bool) public isTokenWhitelisted; - - uint constant PCT_BASE = 10 ** 18; - - function BylawsApp(address dao) - Application(dao) - { - } - - function init() internal { - Bylaw storage bylaw = bylaws[0]; - - // unassigned bylaws will use bylaw 0 as its own - // by default allow calls from any non-zero address (aka every address) - // TODO: Setup sane default bylaw - bylaw.bylawType = BylawType.Address; - bylaw.addr = 0; - bylaw.not = true; - } - - /** - * @notice Set bylaw `_id` responsible for checking action `_sig` - * @dev Links a signature entrypoint to a bylaw. - * It is the only function that needs to be protected as onlyDAO - * a nice side effect is that multiple actions can share the same bylaw - * @param _sig Function signature being linked - * @param _id Existing bylaw id - */ - function linkBylaw(bytes4 _sig, uint _id) - existing_bylaw(_id) - onlyDAO - external - { - bylawEntrypoint[_sig] = _id; - - ChangeBylaw( - _sig, - getBylawType(_id), - _id, - getSender() - ); - } - - /** - * @notice Change the whitelist status of `_token` to `_whitelist` - * @dev DAO calls made straight from a token can only be trusted if the token is trusted (otherwise it could be use to impersonate senders) - * @param _token The token to change whitelist state - * @param _whitelist Desired status of token whitelist - */ - function setTokenWhitelist(address _token, bool _whitelist) onlyDAO public { - isTokenWhitelisted[_token] = _whitelist; - } - - /** - * @dev Implements Permissions Oracle compatibility so it can be called from Kernel - * @param sender Sender of the action to the DAO - * @param token Token from which the call originated (0 = ether call) - * @param value Amount of tokens sent with the call - * @param data Payload being executed in the call - * @return bool indicates whether bylaws allow action or not - */ - function canPerformAction( - address sender, - address token, - uint256 value, - bytes data - ) constant returns (bool) - { - if (!isTokenWhitelisted[token] && token != 0) - return false; - - - return canPerformAction( - getSig(data), - sender, - data, - token, - value - ); - } - - /** - * @notice Create `_isTokenHolderStatus ? 'token holder' : 'status'` bylaw - * @param _statusNeeded integer representing status in org - * @param _isTokenHolderStatus whether is normal integer status or token holder - * @param _not whether to negate bylaw - * @return uint bylaw id - */ - function setStatusBylaw(uint8 _statusNeeded, bool _isTokenHolderStatus, bool _not) external returns (uint) { - uint id = uint(sha3(msg.sig, _statusNeeded, _isTokenHolderStatus, _not)); - Bylaw storage bylaw = bylaws[id]; - - require(!bylaw.exists); - - bylaw.bylawType = _isTokenHolderStatus ? BylawType.TokenHolder : BylawType.Status; - bylaw.status = _statusNeeded; - bylaw.not = _not; - bylaw.exists = true; - - NewBylaw(id); - - return id; - } - - /** - * @notice Create `_isOracle ? 'oracle' : 'address'` bylaw with `_addr` - * @param _addr address allowed or oracle - * @param _isOracle whether address is allowed or will be asked for permission (oracle) - * @param _not whether to negate bylaw - * @return uint bylaw id - */ - function setAddressBylaw(address _addr, bool _isOracle, bool _not) external returns (uint) { - uint id = uint(sha3(msg.sig, _addr, _isOracle, _not)); - Bylaw storage bylaw = bylaws[id]; - - require(!bylaw.exists); - - bylaw.bylawType = _isOracle ? BylawType.Oracle : BylawType.Address; - bylaw.addr = _addr; - bylaw.not = _not; - bylaw.exists = true; - - NewBylaw(id); - - return id; - } - - /** - * @notice Create voting bylaw with `_supportPct / 10^18 * 100`% - * @param _supportPct voted positively by this percentage of voting quorum - * @param _minQuorumPct is the quorum at least this percentage - * @param _minDebateTime was there at least this many blocks between creation and voting starting - * @param _minVotingTime was there at least this many blocks between voting starting and closing - * @param _not whether to negate bylaw - * @return uint bylaw id - */ - function setVotingBylaw( - uint256 _supportPct, - uint256 _minQuorumPct, - uint64 _minDebateTime, - uint64 _minVotingTime, - bool _not - ) external returns (uint) { - uint id = uint(sha3(msg.sig, _supportPct, _minQuorumPct, _minDebateTime, _minVotingTime, _not)); - Bylaw storage bylaw = bylaws[id]; - - require(!bylaw.exists); - require(_supportPct > 0 && _supportPct <= PCT_BASE); // dont allow weird cases - - bylaw.bylawType = BylawType.Voting; - bylaw.voting.supportPct = _supportPct; - bylaw.voting.minQuorumPct = _minQuorumPct; - bylaw.voting.minDebateTime = _minDebateTime; - bylaw.voting.minVotingTime = _minVotingTime; - bylaw.not = _not; - bylaw.exists = true; - - NewBylaw(id); - - return id; - } - - /** - * @notice Create combinator bylaw of type `_combinatorType` between `_leftBylawId` and `_rightBylawId` - * @param _combinatorType how the underlying bylaws are combined (0 = or, 1 = and, 2 = xor) - * @param _leftBylawId first bylaw being checked - * @param _rightBylawId second bylaw being checked - * @param _not whether to negate bylaw - * @return uint bylaw id - */ - function setCombinatorBylaw( - uint _combinatorType, - uint _leftBylawId, - uint _rightBylawId, - bool _not - ) - existing_bylaw(_leftBylawId) - external returns (uint) - { - uint id = uint(sha3(msg.sig, _combinatorType, _leftBylawId, _rightBylawId, _not)); - Bylaw storage bylaw = bylaws[id]; - require(!bylaw.exists); - require(_leftBylawId != _rightBylawId && _rightBylawId > 0); - - bylaw.bylawType = BylawType.Combinator; - bylaw.combinator.combinatorType = CombinatorType(_combinatorType); - bylaw.combinator.leftBylawId = _leftBylawId; - bylaw.combinator.rightBylawId = _rightBylawId; - bylaw.not = _not; - bylaw.exists = true; - - NewBylaw(id); - - return id; - } - - function getBylawType(uint bylawId) constant returns (uint) { - return uint(bylaws[bylawId].bylawType); - } - - function getBylawNot(uint bylawId) constant returns (bool) { - return bylaws[bylawId].not; - } - - function getStatusBylaw(uint256 bylawId) constant returns (uint) { - return bylaws[bylawId].status; - } - - function getAddressBylaw(uint256 bylawId) constant returns (address) { - return bylaws[bylawId].addr; - } - - function getVotingBylaw(uint256 bylawId) constant returns (uint256 supportPct, uint256 minQuorumPct, uint64 minDebateTime, uint64 minVotingTime) { - Bylaw storage bylaw = bylaws[bylawId]; - - supportPct = bylaw.voting.supportPct; - minQuorumPct = bylaw.voting.minQuorumPct; - minDebateTime = bylaw.voting.minDebateTime; - minVotingTime = bylaw.voting.minVotingTime; - } - - function getCombinatorBylaw(uint256 bylawId) constant returns (uint combinatorType, uint leftBylawId, uint rightBylawId) { - Bylaw storage bylaw = bylaws[bylawId]; - - combinatorType = uint(bylaw.combinator.combinatorType); - leftBylawId = bylaw.combinator.leftBylawId; - rightBylawId = bylaw.combinator.rightBylawId; - } - - function canPerformAction( - bytes4 sig, - address sender, - bytes data, - address token, - uint256 value - ) internal returns (bool) - { - // by default if not linked, bylaw 0 will apply - uint bylawId = bylawEntrypoint[sig]; - - return canPerformAction( - bylawId, - sender, - data, - token, - value - ); - } - - function canPerformAction( - uint bylawId, - address sender, - bytes data, - address token, - uint256 value - ) internal returns (bool) - { - Bylaw storage bylaw = bylaws[bylawId]; - if (bylaw.bylawType == BylawType.TokenHolder) { - return negateIfNeeded(isTokenHolder(sender), bylaw.not); - } - - if (bylaw.bylawType == BylawType.Status) { - return negateIfNeeded(getStatus(sender) >= bylaw.status, bylaw.not); - } - - if (bylaw.bylawType == BylawType.Address) { - return negateIfNeeded(sender == bylaw.addr, bylaw.not); - } - - if (bylaw.bylawType == BylawType.Oracle) { - var (canPerform,) = BylawOracle(bylaw.addr).canPerformAction( - sender, - data, - token, - value - ); - return negateIfNeeded(canPerform, bylaw.not); - } - - if (bylaw.bylawType == BylawType.Voting) { - return negateIfNeeded(checkVoting(bylaw.voting, sender), bylaw.not); - } - - if (bylaw.bylawType == BylawType.Combinator) { - return negateIfNeeded( - computeCombinatorBylaw( - bylaw, - sender, - data, - token, - value - ), - bylaw.not - ); - } - } - - function checkVoting(VotingBylaw votingBylaw, address voteAddress) internal returns (bool) { - return getVotingOracle().isVoteApproved( - voteAddress, - votingBylaw.supportPct, - votingBylaw.minQuorumPct, - votingBylaw.minDebateTime, - votingBylaw.minVotingTime - ); - } - - function computeCombinatorBylaw( - Bylaw storage bylaw, - address sender, - bytes data, - address token, - uint256 value - ) internal returns (bool) - { - bool leftResult = canPerformAction( - bylaw.combinator.leftBylawId, - sender, - data, - token, - value - ); - - // shortcuts - if (leftResult && bylaw.combinator.combinatorType == CombinatorType.Or) - return true; - if (!leftResult && bylaw.combinator.combinatorType == CombinatorType.And) - return false; - - bool rightResult = canPerformAction( - bylaw.combinator.rightBylawId, - sender, - data, - token, - value - ); - - if (bylaw.combinator.combinatorType == CombinatorType.Xor) { - return (leftResult && !rightResult) || (!leftResult && rightResult); - } else { - return rightResult; - } - } - - function isTokenHolder(address entity) internal returns (bool) { - return getTokenHolderOracle().isHolder(entity); - } - - function getStatus(address entity) internal returns (uint8) { - return uint8( - getStatusOracle() - .getEntityStatus(entity) - ); - } - - function negateIfNeeded(bool result, bool negate) internal returns (bool) { - return negate ? !result : result; - } - - function getTokenHolderOracle() internal returns (ITokenHolderOracle) { - return ITokenHolderOracle(dao); - } - - function getVotingOracle() internal returns (IVotingOracle) { - return IVotingOracle(dao); - } - - function getStatusOracle() internal returns (IStatusOracle) { - return IStatusOracle(dao); - } - - function getSig(bytes d) internal returns (bytes4 sig) { - assembly { sig := mload(add(d, 0x20)) } - } - - modifier existing_bylaw(uint bylawId) { - require(bylawId > 0); - require(bylaws[bylawId].exists); - _; - } -} diff --git a/contracts/apps/bylaws/IBylawsApp.sol b/contracts/apps/bylaws/IBylawsApp.sol deleted file mode 100644 index 402b61a82..000000000 --- a/contracts/apps/bylaws/IBylawsApp.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../kernel/IPermissionsOracle.sol"; - -contract IBylawsApp { - event NewBylaw(uint bylawId); - event ChangeBylaw(bytes4 sig, uint bylawType, uint256 bylawId, address changedBy); - - function linkBylaw(bytes4 _sig, uint _id) external; - - function setStatusBylaw(uint8 _statusNeeded, bool _isTokenHolderStatus, bool _not) external returns (uint); - function setAddressBylaw(address _addr, bool _isOracle, bool _not) external returns (uint); - function setVotingBylaw(uint256 _supportPct, uint256 _minQuorumPct, uint64 _minDebateTime, uint64 _minVotingTime, bool _not) external returns (uint); - function setCombinatorBylaw(uint _combinatorType, uint _leftBylawId, uint _rightBylawId, bool _not) external returns (uint); - - function getBylawType(uint bylawId) constant returns (uint); - - function getBylawNot(uint bylawId) constant returns (bool); - function getStatusBylaw(uint256 bylawId) constant returns (uint); - function getAddressBylaw(uint256 bylawId) constant returns (address); - function getVotingBylaw(uint256 bylawId) constant returns (uint256 supportPct, uint256 minQuorumPct, uint64 minDebateTime, uint64 minVotingTime); - function getCombinatorBylaw(uint256 bylawId) constant returns (uint combinatorType, uint leftBylawId, uint rightBylawId); -} diff --git a/contracts/apps/ownership/IOwnershipApp.sol b/contracts/apps/ownership/IOwnershipApp.sol deleted file mode 100644 index ce5bfa960..000000000 --- a/contracts/apps/ownership/IOwnershipApp.sol +++ /dev/null @@ -1,39 +0,0 @@ -pragma solidity ^0.4.11; - -import "../../tokens/MiniMeController.sol"; - -contract ITokenHolderOracle { - function isHolder(address _holder) constant returns (bool); -} - -contract IOwnershipSale { - function sale_mintTokens(address tokenAddress, address recipient, uint amount) external; - function sale_destroyTokens(address tokenAddress, address holder, uint amount) external; - function sale_closeSale() external; -} - -contract IOwnershipApp is ITokenHolderOracle, IOwnershipSale, MiniMeController { - event AddToken(address indexed tokenAddress, uint indexed tokenId); - event RemoveToken(address indexed tokenAddress); - event ChangeTokenId(address indexed tokenAddress, uint indexed oldTokenId, uint indexed newTokenId); - event CreateTokenSale(address indexed saleAddress, uint indexed saleId); - event CloseTokenSale(address indexed saleAddress, uint indexed saleId); - - function addToken(address tokenAddress, uint256 issueAmount, uint128 governanceRights, uint128 economicRights) external; - function removeToken(address tokenAddress) external; - - function issueTokens(address tokenAddress, uint256 amount); - function grantTokens(address tokenAddress, address recipient, uint256 amount) external; - function grantVestedTokens(address tokenAddress, address recipient, uint256 amount, uint64 start, uint64 cliff, uint64 vesting) external; - - function createTokenSale(address saleAddress, address tokenAddress, bool canDestroy) external; - function closeTokenSale(address saleAddress) external; - - function updateIsController(address tokenAddress); - - function getTokenCount() constant returns (uint); - function getToken(uint tokenId) constant returns (address, uint128, uint128, bool); - function getTokenSaleCount() constant returns (uint); - function getTokenSale(uint tokenSaleId) constant returns (address, address, bool, bool); - function getTokenAddress(uint256 i) constant returns (address); -} diff --git a/contracts/apps/ownership/OwnershipApp.sol b/contracts/apps/ownership/OwnershipApp.sol deleted file mode 100644 index 17a2ddade..000000000 --- a/contracts/apps/ownership/OwnershipApp.sol +++ /dev/null @@ -1,312 +0,0 @@ -pragma solidity ^0.4.11; - -/** -* @author Jorge Izquierdo (Aragon) -* @description OwnershipApp requires ActionsOrgan to be installed in DAO -* At the moment OwnershipApp intercepts MiniMe hook events. -*/ - -import "../Application.sol"; -import "../../organs/ActionsOrgan.sol"; -import "../../misc/Requestor.sol"; -import "../../tokens/MiniMeIrrevocableVestedToken.sol"; - -import "zeppelin/token/ERC20.sol"; - -import "./IOwnershipApp.sol"; - -contract OwnershipApp is Application, IOwnershipApp, Requestor { - struct Token { - address tokenAddress; - uint128 governanceRights; - uint128 economicRights; - bool isController; - } - - struct TokenSale { - address saleAddress; - address tokenAddress; - bool canDestroy; - bool closed; - } - - Token[] tokens; - mapping (address => uint) public tokenIdForAddress; - - TokenSale[] tokenSales; - mapping (address => uint) public tokenSaleForAddress; - - uint8 constant MAX_TOKENS = 20; // prevent OOGs when tokens are iterated - uint constant HOLDER_THRESHOLD = 1; // if owns x tokens is considered holder - - function OwnershipApp(address daoAddr) - Application(daoAddr) - { - } - - function init() internal { - assert(tokenSales.length == 0 && tokens.length == 0); // check init can only happen once - tokenSales.length += 1; - tokens.length += 1; - } - - /** - * @notice Add token at `_tokenAddress` as a governance token to the organization - * @dev If added token is not controlled by DAO, it will fail to issue tokens - * @param _tokenAddress Address for the minime token - * @param _issueAmount Tokens to be issued and assigned to the DAO - * @param _governanceRights Factor for governance rights for token - * @param _economicRights Factor for economic rights for token - */ - function addToken( - address _tokenAddress, - uint256 _issueAmount, - uint128 _governanceRights, - uint128 _economicRights - ) - onlyDAO - external - { - uint newLength = tokens.push( - Token( - _tokenAddress, - _governanceRights, - _economicRights, - false - ) - ); - uint256 tokenId = newLength - 1; - tokenIdForAddress[_tokenAddress] = tokenId; - - updateIsController(_tokenAddress); - AddToken(_tokenAddress, tokenId); - - if (_tokenAddress > 0) - issueTokens(_tokenAddress, _issueAmount); - } - - /** - * @notice Remove token at `_tokenAddress` as a governance token to the organization - * @param _tokenAddress token address being removed - */ - function removeToken(address _tokenAddress) onlyDAO external { - uint tokenId = tokenIdForAddress[_tokenAddress]; - require(tokenId > 0); - if (tokens.length > 1) { - tokens[tokenId] = tokens[tokens.length - 1]; - tokenIdForAddress[tokens[tokenId].tokenAddress] = tokenId; - - ChangeTokenId(tokens[tokenId].tokenAddress, tokens.length - 1, tokenId); - } - tokenIdForAddress[tokens[tokens.length - 1].tokenAddress] = 0; - tokens.length--; - - RemoveToken(_tokenAddress); - } - - /** - * @notice Issue `_amount` of `_tokenAddress` tokens for the DAO - * @param _tokenAddress token address being issued - * @param _amount amount of tokens in the smallest unit - */ - function issueTokens(address _tokenAddress, uint256 _amount) onlyDAO { - require(tokenIdForAddress[_tokenAddress] > 0); - // TODO: get rid of this MEGA HACK. - // Requestor should be an external contract, but having trouble because solidity - // doesn't like variable sized types for returns. - // If this contract needed to have another fallback it wouldn"t work. - MiniMeToken(this).generateTokens(dao, _amount); - executeRequestorAction(_tokenAddress); - } - - /** - * @notice Assign `_amount` of `_tokenAddress` tokens to `_recipient` - * @param _tokenAddress token address being issued - * @param _recipient address receiving the tokens - * @param _amount amount of tokens in the smallest unit - */ - function grantTokens(address _tokenAddress, address _recipient, uint256 _amount) onlyDAO external { - require(tokenIdForAddress[_tokenAddress] > 0); - MiniMeToken(this).transfer(_recipient, _amount); - executeRequestorAction(_tokenAddress); - } - - /** - * @notice Assign `_amount` of `_tokenAddress` tokens to `_recipient` with a `_cliff` cliff and `_vesting` starting `_start` - * @param _tokenAddress token address being issued - * @param _recipient address receiving the tokens - * @param _amount amount of tokens in the smallest unit - * @param _start timestamp where vesting calculation starts (can be a past date) - * @param _cliff timestamp in which the proportional amount of tokens are unlocked for the first time - * @param _vesting timestamp in which all tokens are transferable - */ - function grantVestedTokens( - address _tokenAddress, - address _recipient, - uint256 _amount, - uint64 _start, - uint64 _cliff, - uint64 _vesting - ) - onlyDAO - external - { - require(tokenIdForAddress[_tokenAddress] > 0); - MiniMeIrrevocableVestedToken(this).grantVestedTokens( - _recipient, - _amount, - _start, - _cliff, - _vesting - ); - executeRequestorAction(_tokenAddress); - } - - /** - * @notice Create a token sale with sale contract at address `_saleAddress` - * @param _saleAddress contract that handles sale - * @param _tokenAddress address of the token being sold (must be controlled by DAO) - * @param _canDestroy whether the token sale has power to destroy holder's tokens - */ - function createTokenSale( - address _saleAddress, - address _tokenAddress, - bool _canDestroy - ) - onlyDAO only_controlled(_tokenAddress) - external - { - uint salesLength = tokenSales.push( - TokenSale( - _saleAddress, - _tokenAddress, - _canDestroy, - false - ) - ); - uint saleId = salesLength - 1; // last item is newly added sale - tokenSaleForAddress[_saleAddress] = saleId; - - CreateTokenSale(_saleAddress, saleId); - } - - /** - * @notice Forces the close of token sale at address `_saleAddress` - * @param _saleAddress token sale being closed - */ - function closeTokenSale(address _saleAddress) onlyDAO external { - doCloseSale(_saleAddress); - } - - /** - * @dev Updates whether an added token controller state has changed - * can be called by anyone at any time to update its state - */ - function updateIsController(address _tokenAddress) { - Token storage token = tokens[tokenIdForAddress[_tokenAddress]]; - token.isController = MiniMeToken(token.tokenAddress).controller() == dao; - } - - function getTokenCount() constant returns (uint) { - return tokens.length - 1; // index 0 is empty - } - - function getToken(uint tokenId) constant returns (address, uint128, uint128, bool) { - Token storage token = tokens[tokenId]; - return (token.tokenAddress, token.governanceRights, token.economicRights, token.isController); - } - - function getTokenSaleCount() constant returns (uint) { - return tokenSales.length - 1; // index 0 is empty - } - - function getTokenSale(uint tokenSaleId) constant returns (address, address, bool, bool) { - TokenSale storage tokenSale = tokenSales[tokenSaleId]; - return ( - tokenSale.saleAddress, - tokenSale.tokenAddress, - tokenSale.canDestroy, - tokenSale.closed - ); - } - - /** - * @dev Method called by sale to mint tokens - */ - function sale_mintTokens(address _tokenAddress, address recipient, uint amount) only_active_sale(_tokenAddress) external { - MiniMeToken(this).generateTokens(recipient, amount); - executeRequestorAction(_tokenAddress); - } - - /** - * @dev Method called by sale to destroy tokens if allowed to - */ - function sale_destroyTokens(address _tokenAddress, address holder, uint amount) only_active_sale(_tokenAddress) external { - require(tokenSales[tokenSaleForAddress[getSender()]].canDestroy); - MiniMeToken(this).destroyTokens(holder, amount); - executeRequestorAction(_tokenAddress); - } - - /** - * @dev Method called by sale to close itself - */ - function sale_closeSale() external { - doCloseSale(getSender()); - } - - function executeRequestorAction(address to) internal { - ActionsOrgan(dao).performAction(to, getData()); - } - - function getTokenAddress(uint256 i) constant returns (address) { - var (tokenAddr,,) = getToken(i); - return tokenAddr; - } - - function proxyPayment(address _owner) payable returns (bool) { - _owner; // silence unused variable warning - return false; - } - - function onTransfer(address _from, address _to, uint _amount) returns (bool) { - _from; _to; _amount; // silence unused variable warning - return true; - } - - function onApprove(address _owner, address _spender, uint _amount) returns (bool) { - _owner; _spender; _amount; // silence unused variable warning - return true; - } - - function isHolder(address _holder) constant returns (bool) { - uint tokenCount = getTokenCount(); - for (uint i = 1; i <= tokenCount; i++) { - address tknAddr = getTokenAddress(i); - if (ERC20(tknAddr).balanceOf(_holder) >= HOLDER_THRESHOLD) - return true; - } - return false; - } - - function doCloseSale(address _saleAddress) internal { - uint saleId = tokenSaleForAddress[_saleAddress]; - require(saleId > 0); - require(!tokenSales[saleId].closed); - tokenSales[saleId].closed = true; - - CloseTokenSale(tokenSales[saleId].saleAddress, saleId); - } - - modifier only_controlled(address _tokenAddress) { - require(tokens[tokenIdForAddress[_tokenAddress]].isController); - _; - } - - modifier only_active_sale(address _tokenAddress) { - uint saleId = tokenSaleForAddress[getSender()]; - require(saleId > 0); - TokenSale storage sale = tokenSales[saleId]; - require(!sale.closed && sale.tokenAddress == _tokenAddress); - _; - } -} diff --git a/contracts/apps/ownership/sales/IndividualSale.sol b/contracts/apps/ownership/sales/IndividualSale.sol deleted file mode 100644 index df12c88e6..000000000 --- a/contracts/apps/ownership/sales/IndividualSale.sol +++ /dev/null @@ -1,59 +0,0 @@ -pragma solidity ^0.4.13; - -import "./TokenSale.sol"; - - -contract IndividualSale is TokenSale { - address public buyer; - uint public tokensOffered; - uint public buyAmount; - uint64 public expireBlock; - - function instantiate( - address _dao, - OwnershipApp _ownershipApp, - ERC20 _raiseToken, - ERC20 _saleToken, - address _buyer, - uint _buyAmount, - uint _tokensOffered, - uint64 _expireBlock - ) { - super.instantiate( - _dao, - _ownershipApp, - _raiseToken, - _saleToken - ); - - require(buyer == 0 && _buyer != 0); - require(_tokensOffered > 0 && _buyAmount > 0); - require(getBlockNumber() < _expireBlock); - - buyer = _buyer; - tokensOffered = _tokensOffered; - buyAmount = _buyAmount; - expireBlock = _expireBlock; - } - - function buy(address _holder, uint _tokenAmount) internal { - require(getBlockNumber() < expireBlock); - require(_holder == buyer); - require(_tokenAmount == buyAmount); - - mintTokens(_holder, tokensOffered); - closeSale(); - - Buy(_holder, tokensOffered); - } - - function close() { - require(getBlockNumber() >= expireBlock); - closeSale(); - } - - function sell(address _holder, uint _x) internal { - _holder; _x; // silence unused variables warning - revert(); - } -} diff --git a/contracts/apps/ownership/sales/PublicSale.sol b/contracts/apps/ownership/sales/PublicSale.sol deleted file mode 100644 index f60162930..000000000 --- a/contracts/apps/ownership/sales/PublicSale.sol +++ /dev/null @@ -1,50 +0,0 @@ -pragma solidity ^0.4.13; - -import "./VariablePriceSale.sol"; - - -contract PublicSale is VariablePriceSale { - function instantiate( - address _dao, - OwnershipApp _ownershipApp, - ERC20 _raiseToken, - ERC20 _saleToken, - uint _cap, - uint _minBuy, - uint _exchangeRate, - bool _isInverseRate, - uint64 _startBlock, - uint64 _closeBlock - ) { - uint64[] memory finalBlocks = new uint64[](1); - finalBlocks[0] = _closeBlock; - - uint[] memory prices = new uint[](2); - prices[0] = _exchangeRate; - - VariablePriceSale.instantiate( - _dao, - _ownershipApp, - _raiseToken, - _saleToken, - _cap, - _minBuy, - _isInverseRate, - _startBlock, - finalBlocks, - prices - ); - } - - function startBlock() constant returns (uint64) { - return periodStartBlock; - } - - function closeBlock() constant returns (uint64) { - return periods[0].periodEnds; - } - - function exchangeRate() constant returns (uint) { - return periods[0].initialPrice; - } -} diff --git a/contracts/apps/ownership/sales/TokenSale.sol b/contracts/apps/ownership/sales/TokenSale.sol deleted file mode 100644 index 4d59ca9f9..000000000 --- a/contracts/apps/ownership/sales/TokenSale.sol +++ /dev/null @@ -1,125 +0,0 @@ -pragma solidity ^0.4.13; - -import "zeppelin/token/ERC20.sol"; -import "../../../organs/VaultOrgan.sol"; -import "../../../kernel/Kernel.sol"; -import "../../../tokens/EtherToken.sol"; - -import "../OwnershipApp.sol"; - - -contract TokenSale { - address public dao; - OwnershipApp public ownershipApp; - ERC20 public raiseToken; - ERC20 public saleToken; - - event Buy(address indexed buyer, uint amount); - event Sell(address indexed seller, uint amount); - - function buy(address holder, uint256 amount) internal; - function sell(address holder, uint256 amount) internal; - - function instantiate( - address _dao, - OwnershipApp _ownershipApp, - ERC20 _raiseToken, - ERC20 _saleToken - ) internal - { - require(dao == 0 && _dao != 0); - dao = _dao; - ownershipApp = _ownershipApp; - raiseToken = _raiseToken; - saleToken = _saleToken; - } - - function tokenFallback( - address _sender, - address _origin, - uint256 _value, - bytes _data - ) onlyToken returns (bool ok) - { - _origin; _data; // silence unused variables warning - buy(_sender, _value); - return true; - } - - // ApproveAndCall compatible - function receiveApproval( - address _sender, - uint256 _value, - address _token, - bytes _data - ) { - _data; // silence unused variables warning - assert( - ERC20(_token) - .transferFrom( - _sender, - address(this), - _value - ) - ); - buy(_sender, _value); - } - - function buy(address holder) payable { - EtherToken etherToken = getEtherToken(); - require(raiseToken == etherToken); - - etherToken.wrap.value(msg.value)(); - buy(holder, msg.value); - } - - function () payable { - buy(msg.sender); - } - - function mintTokens(address _recipient, uint _amount) internal { - ownershipApp.sale_mintTokens(address(saleToken), _recipient, _amount); - } - - function destroyTokens(address _holder, uint _amount) internal { - ownershipApp.sale_destroyTokens(address(saleToken), _holder, _amount); - } - - function closeSale() internal { - sendFunds(); - ownershipApp.sale_closeSale(); - } - - // @dev make a send that is compatible with any kind of erc20 - function sendFunds() internal { - raiseToken.approve(dao, 0); // jic to avoid contracts that throw for not being 0 before allowance - - uint balance = raiseToken.balanceOf(address(this)); - if (balance == 0) - return; - raiseToken.approve(dao, balance); - Kernel(dao).receiveApproval( - address(this), - balance, - address(raiseToken), - new bytes(0) - ); - } - - function getEtherToken() constant returns (EtherToken) { - return EtherToken( - VaultOrgan(dao) - .getEtherToken() - ); - } - - // @dev just for mocking purposes - function getBlockNumber() internal returns (uint64) { - return uint64(block.number); - } - - modifier onlyToken { - require(msg.sender != address(raiseToken)); - _; - } -} diff --git a/contracts/apps/ownership/sales/VariablePriceSale.sol b/contracts/apps/ownership/sales/VariablePriceSale.sol deleted file mode 100644 index 24d654302..000000000 --- a/contracts/apps/ownership/sales/VariablePriceSale.sol +++ /dev/null @@ -1,136 +0,0 @@ -pragma solidity ^0.4.13; - -import "./TokenSale.sol"; - - -contract VariablePriceSale is TokenSale { - uint public cap; // max tokens sale can get - uint public minBuy; // min amount to process sale - bool public isInverseRate; // divide instead of multiply exchange rate - - uint public totalCollected; - - uint64 public periodStartBlock; // period initial block. if 0, last period ended - struct SalePeriod { - uint64 periodEnds; - uint initialPrice; - uint finalPrice; // If set to 0, price is constant for period - } - - uint constant MAX_PERIODS = 50; - - SalePeriod[] public periods; - uint currentPeriod; - - function instantiate( - address _dao, - OwnershipApp _ownershipApp, - ERC20 _raiseToken, - ERC20 _saleToken, - uint _cap, - uint _minBuy, - bool _isInverseRate, - uint64 _startBlock, - uint64[] _periodEnds, - uint[] _prices - ) { - super.instantiate( - _dao, - _ownershipApp, - _raiseToken, - _saleToken - ); - - require(cap == 0 && _cap != 0); // checking it is the first time instantiate is called - require(getBlockNumber() <= _startBlock); - - cap = _cap; - minBuy = _minBuy; - isInverseRate = _isInverseRate; - periodStartBlock = _startBlock; - - require(_periodEnds.length > 0 && _periodEnds.length <= MAX_PERIODS); - require(_startBlock < _periodEnds[0]); - require(_periodEnds.length * 2 == _prices.length); - - for (uint i = 0; i < _periodEnds.length; i++) { - periods.push(SalePeriod(_periodEnds[i], _prices[2 * i], _prices[2 * i + 1])); - if (i > 0) - require(periods[i - 1].periodEnds < periods[i].periodEnds); - } - } - - function getAcquiredTokens(uint _amount) constant returns (uint) { - SalePeriod storage period = periods[currentPeriod]; - - uint precision = 10 ** 3; // given that exchangeRate is a uint, we need more precision for interpolating - - uint exchangeRate = period.initialPrice * precision; - if (period.finalPrice != 0) { // interpolate - uint periodDelta = period.periodEnds - periodStartBlock; - uint periodState = getBlockNumber() - periodStartBlock; - if (period.finalPrice > period.initialPrice) { - uint p1 = period.finalPrice - period.initialPrice; - exchangeRate += precision * p1 * periodState / periodDelta; - } else { - uint p2 = period.initialPrice - period.finalPrice; - exchangeRate -= precision * p2 * periodState / periodDelta; - } - } - - return (isInverseRate ? _amount * precision / exchangeRate : _amount * exchangeRate / precision); - } - - function buy(address _holder, uint _tokenAmount) internal transitionPeriod { - require(getBlockNumber() >= periodStartBlock && getBlockNumber() < periods[currentPeriod].periodEnds); - require(_tokenAmount >= minBuy); - - uint allowedAmount = _tokenAmount; - if (totalCollected + _tokenAmount > cap) - allowedAmount = cap - totalCollected; - - totalCollected += allowedAmount; - - uint boughtTokens = getAcquiredTokens(allowedAmount); - mintTokens(_holder, boughtTokens); - - Buy(_holder, boughtTokens); - - if (allowedAmount < _tokenAmount) - raiseToken.transfer(_holder, _tokenAmount - allowedAmount); - if (totalCollected == cap) - closeSale(); - } - - function close() transitionPeriod { - require(getBlockNumber() >= periods[currentPeriod].periodEnds); - closeSale(); - } - - function transitionIfNeeded() internal { - uint64 newStartBlock = periodStartBlock; - while (getBlockNumber() >= periods[currentPeriod].periodEnds) { - // In all transitions but last - if (periods.length > currentPeriod + 1) { - newStartBlock = periods[currentPeriod].periodEnds; - currentPeriod += 1; - } else { - newStartBlock = 0; // last period ended - break; - } - } - - if (periodStartBlock != newStartBlock) - periodStartBlock = newStartBlock; - } - - modifier transitionPeriod { - transitionIfNeeded(); - _; - } - - function sell(address _holder, uint _x) internal { - _holder; _x; // silence unused variables warning - revert(); - } -} diff --git a/contracts/apps/readme.md b/contracts/apps/readme.md new file mode 100644 index 000000000..9a858af52 --- /dev/null +++ b/contracts/apps/readme.md @@ -0,0 +1,3 @@ +# Aragon apps + +Aragon default apps have been moved to their own repository: [aragon-apps](https://github.com/aragon/aragon-apps) diff --git a/contracts/apps/status/IStatusApp.sol b/contracts/apps/status/IStatusApp.sol deleted file mode 100644 index bbfa27c77..000000000 --- a/contracts/apps/status/IStatusApp.sol +++ /dev/null @@ -1,11 +0,0 @@ -pragma solidity ^0.4.13; - -contract IStatusOracle { - function getEntityStatus(address entity) constant public returns (uint); -} - -contract IStatusApp is IStatusOracle { - event ChangeEntityStatus(address indexed entity, uint8 indexed status); - - function setEntityStatus(address entity, uint8 status) external; -} diff --git a/contracts/apps/status/StatusApp.sol b/contracts/apps/status/StatusApp.sol deleted file mode 100644 index 4a4f88a2b..000000000 --- a/contracts/apps/status/StatusApp.sol +++ /dev/null @@ -1,29 +0,0 @@ -pragma solidity ^0.4.11; - -/** -* @author Jorge Izquierdo (Aragon) -* @description StatusApp is a very basic app that keeps track of numeric status for entities -*/ - -import "../Application.sol"; -import "./IStatusApp.sol"; - -contract StatusApp is IStatusApp, Application { - mapping (address => uint) entityStatus; - - function StatusApp(address _dao) - Application(_dao) {} - /** - * @dev Assign status `_status` to `_entity` - * @param _entity Address of the entity being modified - * @param _status New status for entity - */ - function setEntityStatus(address _entity, uint8 _status) onlyDAO external { - entityStatus[_entity] = _status; - ChangeEntityStatus(_entity, _status); - } - - function getEntityStatus(address entity) constant public returns (uint) { - return entityStatus[entity]; - } -} diff --git a/contracts/common/DelegateProxy.sol b/contracts/common/DelegateProxy.sol new file mode 100644 index 000000000..475848863 --- /dev/null +++ b/contracts/common/DelegateProxy.sol @@ -0,0 +1,31 @@ +pragma solidity 0.4.18; + + +contract DelegateProxy { + /** + * @dev Performs a delegatecall and returns whatever the delegatecall returned (entire context execution will return!) + * @param _dst Destination address to perform the delegatecall + * @param _calldata Calldata for the delegatecall + */ + function delegatedFwd(address _dst, bytes _calldata) internal { + require(isContract(_dst)); + assembly { + let result := delegatecall(sub(gas, 10000), _dst, add(_calldata, 0x20), mload(_calldata), 0, 0) + 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 isContract(address _target) internal view returns (bool) { + uint256 size; + assembly { size := extcodesize(_target) } + return size > 0; + } +} diff --git a/contracts/common/EtherToken.sol b/contracts/common/EtherToken.sol new file mode 100644 index 000000000..c6e57d3b6 --- /dev/null +++ b/contracts/common/EtherToken.sol @@ -0,0 +1,51 @@ +pragma solidity 0.4.18; + +import "../lib/erc677/ERC677Token.sol"; + + +contract EtherToken is ERC677Token { + using SafeMath for uint256; + + string public name = "Ether"; + string public symbol = "ETH"; + uint8 public decimals = 18; + + function wrap() payable public { + _wrap(msg.sender, msg.value); + } + + function wrapAndCall(address _receiver, bytes _data) payable public { + _wrap(_receiver, msg.value); + _postTransferCall(_receiver, msg.value, _data); + } + + function unwrap() public { + withdraw(msg.sender, balances[msg.sender]); + } + + function withdraw(address _recipient, uint256 _amount) public { + require(_amount > 0); + require(balances[msg.sender] >= _amount); + + totalSupply = totalSupply.sub(_amount); + balances[msg.sender] = balances[msg.sender].sub(_amount); // fails if no balance + + Burn(msg.sender, _amount); + Transfer(msg.sender, 0, _amount); + + _recipient.transfer(_amount); + } + + function _wrap(address _beneficiary, uint256 _amount) internal { + require(_amount > 0); + + totalSupply = totalSupply.add(_amount); + balances[_beneficiary] = balances[_beneficiary].add(_amount); + + Mint(_beneficiary, _amount); + Transfer(0, _beneficiary, _amount); + } + + event Mint(address indexed actor, uint value); + event Burn(address indexed actor, uint value); +} diff --git a/contracts/common/IForwarder.sol b/contracts/common/IForwarder.sol new file mode 100644 index 000000000..2c4baccc0 --- /dev/null +++ b/contracts/common/IForwarder.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.4.18; + + +interface IForwarder { + function isForwarder() public pure returns (bool); + function canForward(address sender, bytes evmCallScript) public view returns (bool); + function forward(bytes evmCallScript) public; +} diff --git a/contracts/common/Initializable.sol b/contracts/common/Initializable.sol new file mode 100644 index 000000000..adfd42e1e --- /dev/null +++ b/contracts/common/Initializable.sol @@ -0,0 +1,34 @@ +pragma solidity ^0.4.18; + +import "../apps/AppStorage.sol"; + + +contract Initializable is AppStorage { + modifier onlyInit { + require(initializationBlock == 0); + _; + } + + /** + * @return Block number in which the contract was initialized + */ + function getInitializationBlock() public view returns (uint256) { + return initializationBlock; + } + + /** + * @dev Function to be called by top level contract after initialization has finished. + */ + function initialized() internal onlyInit { + initializationBlock = getBlockNumber(); + } + + /** + * @dev Returns the current block number. + * Using a function rather than `block.number` allows us to easily mock the block number in + * tests. + */ + function getBlockNumber() internal view returns (uint256) { + return block.number; + } +} diff --git a/contracts/dao/DAO.sol b/contracts/dao/DAO.sol deleted file mode 100644 index c39640e0b..000000000 --- a/contracts/dao/DAO.sol +++ /dev/null @@ -1,43 +0,0 @@ -pragma solidity ^0.4.13; - -/** -* @title DAO base contract -* @author Jorge Izquierdo (Aragon) -* @description DAO is the base contract on top of which all DAO lives. -* This is the only element of the DAO that is non-upgradeable -* Given the simplicity of this contract, it could be written in LLL and/or -* be formally proven. -*/ - -import "./DAOStorage.sol"; -contract DAO is DAOStorage { - /** - * @dev DAO constructor references to the DAO kernel and saves its own identity as self - * @param deployedKernel instance of a Kernel to be linked with the DAO - */ - function DAO(address deployedKernel) { - setKernel(deployedKernel); - setSelf(this); - - // setupOrgans() function needs to be called in DAO's context - assert(deployedKernel.delegatecall(setupOrgansSig, deployedKernel)); - assert(deployedKernel == getKernel()); - } - bytes4 constant setupOrgansSig = bytes4(sha3("setupOrgans(address)")); - - /** - * @dev All calls to the DAO are forwarded to the kernel with a delegatecall - * @return - the underlying call returns (upto RETURN_MEMORY_SIZE memory) - */ - function () payable public { - uint32 len = RETURN_MEMORY_SIZE; - address target = getKernel(); - require(target > 0); // fails if kernel hasn't been set - assembly { - calldatacopy(0x0, 0x0, calldatasize) - let result := delegatecall(sub(gas, 10000), target, 0x0, calldatasize, 0, len) - switch result case 0 { invalid() } - return(0, len) - } - } -} diff --git a/contracts/dao/DAOEvents.sol b/contracts/dao/DAOEvents.sol deleted file mode 100644 index f0d76978a..000000000 --- a/contracts/dao/DAOEvents.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity ^0.4.11; - -import "../organs/IVaultOrgan.sol"; -import "../organs/IMetaOrgan.sol"; -import "../kernel/IKernelRegistry.sol"; - -contract DAOEvents is IKernelRegistryEvents, IMetaOrganEvents, IVaultOrganEvents {} diff --git a/contracts/dao/DAOStorage.sol b/contracts/dao/DAOStorage.sol deleted file mode 100644 index dff8f6684..000000000 --- a/contracts/dao/DAOStorage.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity ^0.4.11; - -import "./IDAO.sol"; -import "./UIntStorage.sol"; - -contract DAOStorage is IDAO, UIntStorage { - bytes32 constant SELF_KEY = sha3(0x00, 0x00); - bytes32 constant KERNAL_KEY = sha3(0x00, 0x01); - uint32 constant RETURN_MEMORY_SIZE = 24 * 32; - - function setKernel(address kernelAddress) internal { - storageSet(KERNAL_KEY, uint256(kernelAddress)); - } - - function setSelf(address selfAddress) internal { - storageSet(SELF_KEY, uint256(selfAddress)); - } - - function getSelf() constant public returns (address) { - return address(storageGet(SELF_KEY)); - } - - function getKernel() constant public returns (address) { - return address(storageGet(KERNAL_KEY)); - } -} diff --git a/contracts/dao/IDAO.sol b/contracts/dao/IDAO.sol deleted file mode 100644 index ee2004f0c..000000000 --- a/contracts/dao/IDAO.sol +++ /dev/null @@ -1,8 +0,0 @@ -pragma solidity ^0.4.11; - - -// @dev IDAO defines the storage the DAO has. -contract IDAO { - function getSelf() constant public returns (address); - function getKernel() constant public returns (address); -} diff --git a/contracts/dao/UIntStorage.sol b/contracts/dao/UIntStorage.sol deleted file mode 100644 index 0595282ce..000000000 --- a/contracts/dao/UIntStorage.sol +++ /dev/null @@ -1,13 +0,0 @@ -pragma solidity ^0.4.11; - -contract UIntStorage { - mapping (bytes32 => uint256) uintStorage; - - function storageSet(bytes32 key, uint256 value) internal { - uintStorage[key] = value; - } - - function storageGet(bytes32 key) constant internal returns (uint256) { - return uintStorage[key]; - } -} diff --git a/contracts/ens/ENSConstants.sol b/contracts/ens/ENSConstants.sol new file mode 100644 index 000000000..021198b89 --- /dev/null +++ b/contracts/ens/ENSConstants.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.4.18; + + +contract ENSConstants { + bytes32 constant public ENS_ROOT = bytes32(0); + bytes32 constant public ETH_TLD_LABEL = keccak256("eth"); + bytes32 constant public ETH_TLD_NODE = keccak256(ENS_ROOT, ETH_TLD_LABEL); + bytes32 constant public PUBLIC_RESOLVER_LABEL = keccak256("resolver"); + bytes32 constant public PUBLIC_RESOLVER_NODE = keccak256(ETH_TLD_NODE, PUBLIC_RESOLVER_LABEL); +} diff --git a/contracts/ens/ENSSubdomainRegistrar.sol b/contracts/ens/ENSSubdomainRegistrar.sol new file mode 100644 index 000000000..22a80a4d0 --- /dev/null +++ b/contracts/ens/ENSSubdomainRegistrar.sol @@ -0,0 +1,81 @@ +pragma solidity 0.4.18; + +import "../lib/ens/AbstractENS.sol"; +import "../lib/ens/PublicResolver.sol"; +import "./ENSConstants.sol"; + +import "../apps/AragonApp.sol"; + + +contract ENSSubdomainRegistrar is AragonApp, ENSConstants { + bytes32 constant public CREATE_NAME_ROLE = bytes32(1); + bytes32 constant public DELETE_NAME_ROLE = bytes32(2); + bytes32 constant public POINT_ROOTNODE_ROLE = bytes32(3); + + AbstractENS public ens; + bytes32 public rootNode; + + event NewName(bytes32 indexed node, bytes32 indexed label); + event DeleteName(bytes32 indexed node, bytes32 indexed label); + + function initialize(AbstractENS _ens, bytes32 _rootNode) onlyInit public { + initialized(); + + // We need ownership to create subnodes + require(_ens.owner(_rootNode) == address(this)); + + ens = _ens; + rootNode = _rootNode; + } + + function createName(bytes32 _label, address _owner) auth(CREATE_NAME_ROLE) external returns (bytes32 node) { + return _createName(_label, _owner); + } + + function createNameAndPoint(bytes32 _label, address _target) auth(CREATE_NAME_ROLE) external returns (bytes32 node) { + node = _createName(_label, this); + _pointToResolverAndResolve(node, _target); + } + + function deleteName(bytes32 _label) auth(DELETE_NAME_ROLE) external { + bytes32 node = keccak256(rootNode, _label); + + address currentOwner = ens.owner(node); + + require(currentOwner != address(0)); // fail if deleting unset name + + if (currentOwner != address(this)) { // needs to reclaim ownership so it can set resolver + ens.setSubnodeOwner(rootNode, _label, this); + } + + ens.setResolver(node, address(0)); // remove resolver so it ends resolving + ens.setOwner(node, address(0)); + + DeleteName(node, _label); + } + + function pointRootNode(address _target) auth(POINT_ROOTNODE_ROLE) external { + _pointToResolverAndResolve(rootNode, _target); + } + + function _createName(bytes32 _label, address _owner) internal returns (bytes32 node) { + node = keccak256(rootNode, _label); + require(ens.owner(node) == address(0)); // avoid name reset + + ens.setSubnodeOwner(rootNode, _label, _owner); + + NewName(node, _label); + } + + function _pointToResolverAndResolve(bytes32 _node, address _target) internal { + address publicResolver = getAddr(PUBLIC_RESOLVER_NODE); + ens.setResolver(_node, publicResolver); + + PublicResolver(publicResolver).setAddr(_node, _target); + } + + function getAddr(bytes32 node) internal view returns (address) { + address resolver = ens.resolver(node); + return PublicResolver(resolver).addr(node); + } +} diff --git a/contracts/evmscript/EVMScriptRegistry.sol b/contracts/evmscript/EVMScriptRegistry.sol new file mode 100644 index 000000000..5d1c1a305 --- /dev/null +++ b/contracts/evmscript/EVMScriptRegistry.sol @@ -0,0 +1,47 @@ +pragma solidity 0.4.18; + +import "./ScriptHelpers.sol"; +import "./IEVMScriptExecutor.sol"; +import "./IEVMScriptRegistry.sol"; + +import "../apps/AragonApp.sol"; + + +contract EVMScriptRegistry is IEVMScriptRegistry, EVMScriptRegistryConstants, AragonApp { + using ScriptHelpers for bytes; + + // WARN: Manager can censor all votes and the like happening in an org + bytes32 constant public REGISTRY_MANAGER_ROLE = bytes32(1); + + struct ExecutorEntry { + address executor; + bool enabled; + } + + ExecutorEntry[] public executors; + + function initialize() onlyInit public { + initialized(); + // Create empty record to begin executor IDs at 1 + executors.push(ExecutorEntry(address(0), false)); + } + + function addScriptExecutor(address _executor) external auth(REGISTRY_MANAGER_ROLE) returns (uint id) { + return executors.push(ExecutorEntry(_executor, true)); + } + + function disableScriptExecutor(uint256 _executorId) external auth(REGISTRY_MANAGER_ROLE) { + executors[_executorId].enabled = false; + } + + function getScriptExecutor(bytes _script) public view returns (address) { + uint256 id = _script.getSpecId(); + + if (id == 0 || id >= executors.length) { + return address(0); + } + + ExecutorEntry storage entry = executors[id]; + return entry.enabled ? entry.executor : address(0); + } +} diff --git a/contracts/evmscript/EVMScriptRunner.sol b/contracts/evmscript/EVMScriptRunner.sol new file mode 100644 index 000000000..59a681f46 --- /dev/null +++ b/contracts/evmscript/EVMScriptRunner.sol @@ -0,0 +1,60 @@ +pragma solidity ^0.4.18; + +import "../apps/AppStorage.sol"; +import "./IEVMScriptExecutor.sol"; +import "./IEVMScriptRegistry.sol"; + +import "./ScriptHelpers.sol"; + + +contract EVMScriptRunner is AppStorage, EVMScriptRegistryConstants { + using ScriptHelpers for bytes; + + function runScript(bytes _script, bytes _input, address[] _blacklist) protectState internal returns (bytes output) { + // TODO: Too much data flying around, maybe extracting spec id here is cheaper + address executorAddr = getExecutor(_script); + require(executorAddr != address(0)); + + bytes memory calldataArgs = _script.encode(_input, _blacklist); + bytes4 sig = IEVMScriptExecutor(0).execScript.selector; + + require(executorAddr.delegatecall(sig, calldataArgs)); + + return returnedDataDecoded(); + } + + function getExecutor(bytes _script) public view returns (IEVMScriptExecutor) { + return IEVMScriptExecutor(getExecutorRegistry().getScriptExecutor(_script)); + } + + // TODO: Internal + function getExecutorRegistry() internal view returns (IEVMScriptRegistry) { + address registryAddr = kernel.getApp(EVMSCRIPT_REGISTRY_APP); + return IEVMScriptRegistry(registryAddr); + } + + /** + * @dev copies and returns last's call data. Needs to ABI decode first + */ + function returnedDataDecoded() internal view returns (bytes ret) { + assembly { + let size := returndatasize + switch size + case 0 {} + default { + ret := mload(0x40) // free mem ptr get + mstore(0x40, add(ret, add(size, 0x20))) // free mem ptr set + returndatacopy(ret, 0x20, sub(size, 0x20)) // copy return data + } + } + return ret; + } + + modifier protectState { + address preKernel = kernel; + bytes32 preAppId = appId; + _; // exec + require(kernel == preKernel); + require(appId == preAppId); + } +} \ No newline at end of file diff --git a/contracts/evmscript/IEVMScriptExecutor.sol b/contracts/evmscript/IEVMScriptExecutor.sol new file mode 100644 index 000000000..03e8edf38 --- /dev/null +++ b/contracts/evmscript/IEVMScriptExecutor.sol @@ -0,0 +1,6 @@ +pragma solidity ^0.4.18; + + +interface IEVMScriptExecutor { + function execScript(bytes script, bytes input, address[] blacklist) external returns (bytes); +} diff --git a/contracts/evmscript/IEVMScriptRegistry.sol b/contracts/evmscript/IEVMScriptRegistry.sol new file mode 100644 index 000000000..a44eddf93 --- /dev/null +++ b/contracts/evmscript/IEVMScriptRegistry.sol @@ -0,0 +1,15 @@ +pragma solidity 0.4.18; + + +contract EVMScriptRegistryConstants { + bytes32 constant public EVMSCRIPT_REGISTRY_APP_ID = keccak256("evmreg.aragonpm.eth"); + bytes32 constant public EVMSCRIPT_REGISTRY_APP = keccak256(keccak256("app"), EVMSCRIPT_REGISTRY_APP_ID); +} + + +interface IEVMScriptRegistry { + function addScriptExecutor(address executor) external returns (uint id); + function disableScriptExecutor(uint256 executorId) external; + + function getScriptExecutor(bytes script) public view returns (address); +} \ No newline at end of file diff --git a/contracts/evmscript/ScriptHelpers.sol b/contracts/evmscript/ScriptHelpers.sol new file mode 100644 index 000000000..041e178f2 --- /dev/null +++ b/contracts/evmscript/ScriptHelpers.sol @@ -0,0 +1,131 @@ +pragma solidity 0.4.18; + + +library ScriptHelpers { + // To test with JS and compare with actual encoder. Maintaining for reference. + // t = function() { return IEVMScriptExecutor.at('0x4bcdd59d6c77774ee7317fc1095f69ec84421e49').contract.execScript.getData(...[].slice.call(arguments)).slice(10).match(/.{1,64}/g) } + // run = function() { return ScriptHelpers.new().then(sh => { sh.abiEncode.call(...[].slice.call(arguments)).then(a => console.log(a.slice(2).match(/.{1,64}/g)) ) }) } + // This is truly not beautiful but lets no daydream to the day solidity gets reflection features + + function abiEncode(bytes _a, bytes _b, address[] _c) public pure returns (bytes d) { + return encode(_a, _b, _c); + } + + function encode(bytes memory _a, bytes memory _b, address[] memory _c) internal pure returns (bytes memory d) { + // A is positioned after the 3 position words + uint256 aPosition = 0x60; + uint256 bPosition = aPosition + 32 * abiLength(_a); + uint256 cPosition = bPosition + 32 * abiLength(_b); + uint256 length = cPosition + 32 * abiLength(_c); + + d = new bytes(length); + assembly { + // Store positions + mstore(add(d, 0x20), aPosition) + mstore(add(d, 0x40), bPosition) + mstore(add(d, 0x60), cPosition) + } + + // Copy memory to correct position + copy(d, getPtr(_a), aPosition, _a.length); + copy(d, getPtr(_b), bPosition, _b.length); + copy(d, getPtr(_c), cPosition, _c.length * 32); // 1 word per address + } + + function abiLength(bytes memory _a) internal pure returns (uint256) { + // 1 for length + + // memory words + 1 if not divisible for 32 to offset word + return 1 + (_a.length / 32) + (_a.length % 32 > 0 ? 1 : 0); + } + + function abiLength(address[] _a) internal pure returns (uint256) { + // 1 for length + 1 per item + return 1 + _a.length; + } + + function copy(bytes _d, uint256 _src, uint256 _pos, uint256 _length) internal pure { + uint dest; + assembly { + dest := add(add(_d, 0x20), _pos) + } + memcpy(dest, _src, _length + 32); + } + + function getPtr(bytes memory _x) internal pure returns (uint256 ptr) { + assembly { + ptr := _x + } + } + + function getPtr(address[] memory _x) internal pure returns (uint256 ptr) { + assembly { + ptr := _x + } + } + + function getSpecId(bytes _script) internal pure returns (uint32) { + return uint32At(_script, 0); + } + + function uint256At(bytes _data, uint256 _location) internal pure returns (uint256 result) { + assembly { + result := mload(add(_data, add(0x20, _location))) + } + } + + function addressAt(bytes _data, uint256 _location) internal pure returns (address result) { + uint256 word = uint256At(_data, _location); + + assembly { + result := div(and(word, 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000), + 0x1000000000000000000000000) + } + } + + function uint32At(bytes _data, uint256 _location) internal pure returns (uint32 result) { + uint256 word = uint256At(_data, _location); + + assembly { + result := div(and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000), + 0x100000000000000000000000000000000000000000000000000000000) + } + } + + function locationOf(bytes _data, uint256 _location) internal pure returns (uint256 result) { + assembly { + result := add(_data, add(0x20, _location)) + } + } + + function toBytes(bytes4 _sig) internal pure returns (bytes) { + bytes memory payload = new bytes(4); + payload[0] = bytes1(_sig); + payload[1] = bytes1(_sig << 8); + payload[2] = bytes1(_sig << 16); + payload[3] = bytes1(_sig << 24); + return payload; + } + + function memcpy(uint _dest, uint _src, uint _len) public pure { + uint256 src = _src; + uint256 dest = _dest; + uint256 len = _len; + + // 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)) + } + } +} \ No newline at end of file diff --git a/contracts/evmscript/executors/CallsScript.sol b/contracts/evmscript/executors/CallsScript.sol new file mode 100644 index 000000000..db8677c50 --- /dev/null +++ b/contracts/evmscript/executors/CallsScript.sol @@ -0,0 +1,48 @@ +pragma solidity ^0.4.18; + +// Inspired by https://github.com/reverendus/tx-manager + +import "../ScriptHelpers.sol"; +import "../IEVMScriptExecutor.sol"; + + +contract CallsScript is IEVMScriptExecutor { + using ScriptHelpers for bytes; + + uint256 constant internal SCRIPT_START_LOCATION = 4; + + event LogScriptCall(address indexed sender, address indexed src, address indexed dst); + + /** + * @notice Executes a number of call scripts + * @param _script [ specId (uint32) ] many calls with this structure -> + * [ to (address: 20 bytes) ] [ calldataLength (uint32: 4 bytes) ] [ calldata (calldataLength bytes) ] + * @param _input Input is ignored in callscript + * @param _blacklist Addresses the script cannot call to, or will revert. + * @return always returns empty byte array + */ + function execScript(bytes _script, bytes _input, address[] _blacklist) external returns (bytes) { + uint256 location = SCRIPT_START_LOCATION; // first 32 bits are spec id + while (location < _script.length) { + address contractAddress = _script.addressAt(location); + // Check address being called is not blacklist + for (uint i = 0; i < _blacklist.length; i++) { + require(contractAddress != _blacklist[i]); + } + + // logged before execution to ensure event ordering in receipt + // if failed entire execution is reverted regardless + LogScriptCall(msg.sender, address(this), contractAddress); + + uint256 calldataLength = uint256(_script.uint32At(location + 0x14)); + uint256 calldataStart = _script.locationOf(location + 0x14 + 0x04); + + assembly { + let success := call(sub(gas, 5000), contractAddress, 0, calldataStart, calldataLength, 0, 0) + switch success case 0 { revert(0, 0) } + } + + location += (0x14 + 0x04 + calldataLength); + } + } +} \ No newline at end of file diff --git a/contracts/evmscript/executors/DelegateScript.sol b/contracts/evmscript/executors/DelegateScript.sol new file mode 100644 index 000000000..04fb2e0ff --- /dev/null +++ b/contracts/evmscript/executors/DelegateScript.sol @@ -0,0 +1,64 @@ +pragma solidity 0.4.18; + +import "../ScriptHelpers.sol"; +import "../IEVMScriptExecutor.sol"; + + +interface DelegateScriptTarget { + function exec() public; +} + + +contract DelegateScript is IEVMScriptExecutor { + using ScriptHelpers for *; + + uint256 constant internal SCRIPT_START_LOCATION = 4; + + /** + * @notice Executes script by delegatecall into a contract + * @param _script [ specId (uint32) ][ contract address (20 bytes) ] + * @param _input ABI encoded call to be made to contract (if empty executes default exec() function) + * @param _blacklist If any address is passed, will revert. + * @return Call return data + */ + function execScript(bytes _script, bytes _input, address[] _blacklist) external returns (bytes) { + require(_blacklist.length == 0); // dont have ability to control bans, so fail. + + // Script should be spec id + address (20 bytes) + require(_script.length == SCRIPT_START_LOCATION + 20); + return delegate(_script.addressAt(SCRIPT_START_LOCATION), _input); + } + + /** + * @dev Delegatecall to contract with input data + */ + function delegate(address _addr, bytes memory _input) internal returns (bytes memory output) { + require(isContract(_addr)); + require(_addr.delegatecall(_input.length > 0 ? _input : defaultInput())); + return returnedData(); + } + + function isContract(address _target) internal view returns (bool) { + uint256 size; + assembly { size := extcodesize(_target) } + return size > 0; + } + + function defaultInput() internal pure returns (bytes) { + return DelegateScriptTarget(0).exec.selector.toBytes(); + } + + /** + * @dev copies and returns last's call data + */ + function returnedData() internal view returns (bytes ret) { + assembly { + let size := returndatasize + ret := mload(0x40) // free mem ptr get + mstore(0x40, add(ret, add(size, 0x20))) // free mem ptr set + mstore(ret, size) // set array length + returndatacopy(add(ret, 0x20), 0, size) // copy return data + } + return ret; + } +} \ No newline at end of file diff --git a/contracts/evmscript/executors/DeployDelegateScript.sol b/contracts/evmscript/executors/DeployDelegateScript.sol new file mode 100644 index 000000000..4c847eb53 --- /dev/null +++ b/contracts/evmscript/executors/DeployDelegateScript.sol @@ -0,0 +1,45 @@ +pragma solidity 0.4.18; + +import "./DelegateScript.sol"; + +// Inspired by: https://github.com/dapphub/ds-proxy/blob/master/src/proxy.sol + + +contract DeployDelegateScript is DelegateScript { + uint256 constant internal SCRIPT_START_LOCATION = 4; + + mapping (bytes32 => address) cache; + + /** + * @notice Executes script by delegatecall into a deployed contract (exec() function) + * @param _script [ specId (uint32) ][ contractInitcode (bytecode) ] + * @param _input ABI encoded call to be made to contract (if empty executes default exec() function) + * @param _blacklist If any address is passed, will revert. + * @return Call return data + */ + function execScript(bytes _script, bytes _input, address[] _blacklist) external returns (bytes) { + require(_blacklist.length == 0); // dont have ability to control bans, so fail. + + bytes32 id = keccak256(_script); + address deployed = cache[id]; + if (deployed == address(0)) { + deployed = deploy(_script); + cache[id] = deployed; + } + + return DelegateScript.delegate(deployed, _input); + } + + /** + * @dev Deploys contract byte code to network + */ + function deploy(bytes _script) internal returns (address addr) { + assembly { + // 0x24 = 0x20 (length) + 0x04 (spec id uint32) + // Length of code is 4 bytes less than total script size + addr := create(0, add(_script, 0x24), sub(mload(_script), 0x04)) + switch iszero(extcodesize(addr)) + case 1 { revert(0, 0) } // throw if contract failed to deploy + } + } +} \ No newline at end of file diff --git a/contracts/factories/BasicFactory.sol b/contracts/factories/BasicFactory.sol deleted file mode 100644 index fa9f9ca55..000000000 --- a/contracts/factories/BasicFactory.sol +++ /dev/null @@ -1,280 +0,0 @@ -/* -This is an automatically generated file. Please edit BasicFactory.sol.tmpl or the generate_factory.js script -*/ - -pragma solidity ^0.4.11; - -import "../tokens/MiniMeIrrevocableVestedToken.sol"; -import "../dao/DAO.sol"; -import "../organs/MetaOrgan.sol"; -import "../apps/Application.sol"; -import "../apps/ownership/OwnershipApp.sol"; -import "../apps/bylaws/BylawsApp.sol"; -import "./ForwarderFactory.sol"; - -contract BasicFactory { - event DeployDAO(address dao); - address public kernel; - ForwarderFactory public forwarderFactory; - address public metaorgan; - address public vaultorgan; - address public actionsorgan; - - address public bylawsapp; - address public ownershipapp; - address public statusapp; - address public votingapp; - - function BasicFactory(address _kernel, ForwarderFactory _forwarderFactory, address _metaorgan, address _vaultorgan, address _actionsorgan, address _bylawsapp, address _ownershipapp, address _statusapp, address _votingapp) { - kernel = _kernel; - forwarderFactory = _forwarderFactory; - metaorgan = _metaorgan; - vaultorgan = _vaultorgan; - actionsorgan = _actionsorgan; - bylawsapp = _bylawsapp; - ownershipapp = _ownershipapp; - statusapp = _statusapp; - votingapp = _votingapp; - } - - function create(string _tokenName, string _tokenSymbol, bool _testrpc) { - MiniMeIrrevocableVestedToken token = new MiniMeIrrevocableVestedToken(0, 0, 0, _tokenName, 1, _tokenSymbol, true); - DAO dao = new DAO(kernel); - token.changeController(address(dao)); - installOrgans(MetaOrgan(dao)); - address bylawsApp = installApps(MetaOrgan(dao), _testrpc); - issueToken(address(dao), address(token)); - installBylaws(BylawsApp(bylawsApp), BylawsApp(address(dao))); - MetaOrgan(dao).setPermissionsOracle(bylawsApp); - // TODO: set status for sender - - DeployDAO(dao); - } - - function installOrgans(MetaOrgan dao) internal { - bytes4[] memory metaorganSigs = new bytes4[](10); - metaorganSigs[0] = o0_s0; // setPermissionsOracle(address) - metaorganSigs[1] = o0_s1; // removeOrgan(bytes4[]) - metaorganSigs[2] = o0_s2; // installOrgan(address,bytes4[]) - metaorganSigs[3] = o0_s3; // installApp(address,bytes4[]) - metaorganSigs[4] = o0_s4; // ceaseToExist() - metaorganSigs[5] = o0_s5; // get(bytes4) - metaorganSigs[6] = o0_s6; // updateOrgan(address,bytes4[]) - metaorganSigs[7] = o0_s7; // removeApp(bytes4[]) - metaorganSigs[8] = o0_s8; // replaceKernel(address) - metaorganSigs[9] = o0_s9; // updateApp(address,bytes4[]) - dao.installOrgan(metaorgan, metaorganSigs); - - bytes4[] memory vaultorganSigs = new bytes4[](15); - vaultorganSigs[0] = o1_s0; // transferEther(address,uint256) - vaultorganSigs[1] = o1_s1; // setTokenBlacklist(address,bool) - vaultorganSigs[2] = o1_s2; // setupEtherToken() - vaultorganSigs[3] = o1_s3; // getTokenBalance(address) - vaultorganSigs[4] = o1_s4; // getScapeHatch() - vaultorganSigs[5] = o1_s5; // recover(address,address) - vaultorganSigs[6] = o1_s6; // setEtherToken(address) - vaultorganSigs[7] = o1_s7; // deposit(address,address,uint256) - vaultorganSigs[8] = o1_s8; // scapeHatch(address[]) - vaultorganSigs[9] = o1_s9; // getEtherToken() - vaultorganSigs[10] = o1_s10; // getHaltTime() - vaultorganSigs[11] = o1_s11; // transfer(address,address,uint256) - vaultorganSigs[12] = o1_s12; // setScapeHatch(address) - vaultorganSigs[13] = o1_s13; // isTokenBlacklisted(address) - vaultorganSigs[14] = o1_s14; // halt(uint256) - dao.installOrgan(vaultorgan, vaultorganSigs); - - bytes4[] memory actionsorganSigs = new bytes4[](1); - actionsorganSigs[0] = o2_s0; // performAction(address,bytes) - dao.installOrgan(actionsorgan, actionsorganSigs); - - } - - function installApps(MetaOrgan dao, bool _testrpc) internal returns (address app) { - // Proxies are not working on testrpc, that's why for testing no proxy is created - Application deployedbylawsapp = Application(_testrpc ? bylawsapp : forwarderFactory.createForwarder(bylawsapp)); - deployedbylawsapp.setDAO(address(dao)); - bytes4[] memory bylawsappSigs = new bytes4[](15); - bylawsappSigs[0] = a0_s0; // getStatusBylaw(uint256) - bylawsappSigs[1] = a0_s1; // setCombinatorBylaw(uint256,uint256,uint256,bool) - bylawsappSigs[2] = a0_s2; // linkBylaw(bytes4,uint256) - bylawsappSigs[3] = a0_s3; // setStatusBylaw(uint8,bool,bool) - bylawsappSigs[4] = a0_s4; // setVotingBylaw(uint256,uint256,uint64,uint64,bool) - bylawsappSigs[5] = a0_s5; // getAddressBylaw(uint256) - bylawsappSigs[6] = a0_s6; // getBylawType(uint256) - bylawsappSigs[7] = a0_s7; // getVotingBylaw(uint256) - bylawsappSigs[8] = a0_s8; // setAddressBylaw(address,bool,bool) - bylawsappSigs[9] = a0_s9; // canPerformAction(address,address,uint256,bytes) - bylawsappSigs[10] = a0_s10; // isTokenWhitelisted(address) - bylawsappSigs[11] = a0_s11; // setTokenWhitelist(address,bool) - bylawsappSigs[12] = a0_s12; // getBylawNot(uint256) - bylawsappSigs[13] = a0_s13; // getCombinatorBylaw(uint256) - bylawsappSigs[14] = a0_s14; // bylawEntrypoint(bytes4) - dao.installApp(deployedbylawsapp, bylawsappSigs); - - // Proxies are not working on testrpc, that's why for testing no proxy is created - Application deployedownershipapp = Application(_testrpc ? ownershipapp : forwarderFactory.createForwarder(ownershipapp)); - deployedownershipapp.setDAO(address(dao)); - bytes4[] memory ownershipappSigs = new bytes4[](22); - ownershipappSigs[0] = a1_s0; // sale_closeSale() - ownershipappSigs[1] = a1_s1; // getTokenSale(uint256) - ownershipappSigs[2] = a1_s2; // createTokenSale(address,address,bool) - ownershipappSigs[3] = a1_s3; // sale_destroyTokens(address,address,uint256) - ownershipappSigs[4] = a1_s4; // issueTokens(address,uint256) - ownershipappSigs[5] = a1_s5; // onTransfer(address,address,uint256) - ownershipappSigs[6] = a1_s6; // removeToken(address) - ownershipappSigs[7] = a1_s7; // tokenSaleForAddress(address) - ownershipappSigs[8] = a1_s8; // getTokenAddress(uint256) - ownershipappSigs[9] = a1_s9; // getTokenCount() - ownershipappSigs[10] = a1_s10; // updateIsController(address) - ownershipappSigs[11] = a1_s11; // tokenIdForAddress(address) - ownershipappSigs[12] = a1_s12; // addToken(address,uint256,uint128,uint128) - ownershipappSigs[13] = a1_s13; // grantVestedTokens(address,address,uint256,uint64,uint64,uint64) - ownershipappSigs[14] = a1_s14; // sale_mintTokens(address,address,uint256) - ownershipappSigs[15] = a1_s15; // isHolder(address) - ownershipappSigs[16] = a1_s16; // getTokenSaleCount() - ownershipappSigs[17] = a1_s17; // onApprove(address,address,uint256) - ownershipappSigs[18] = a1_s18; // closeTokenSale(address) - ownershipappSigs[19] = a1_s19; // getToken(uint256) - ownershipappSigs[20] = a1_s20; // proxyPayment(address) - ownershipappSigs[21] = a1_s21; // grantTokens(address,address,uint256) - dao.installApp(deployedownershipapp, ownershipappSigs); - - // Proxies are not working on testrpc, that's why for testing no proxy is created - Application deployedstatusapp = Application(_testrpc ? statusapp : forwarderFactory.createForwarder(statusapp)); - deployedstatusapp.setDAO(address(dao)); - bytes4[] memory statusappSigs = new bytes4[](2); - statusappSigs[0] = a2_s0; // setEntityStatus(address,uint8) - statusappSigs[1] = a2_s1; // getEntityStatus(address) - dao.installApp(deployedstatusapp, statusappSigs); - - // Proxies are not working on testrpc, that's why for testing no proxy is created - Application deployedvotingapp = Application(_testrpc ? votingapp : forwarderFactory.createForwarder(votingapp)); - deployedvotingapp.setDAO(address(dao)); - bytes4[] memory votingappSigs = new bytes4[](11); - votingappSigs[0] = a3_s0; // voteNay(uint256) - votingappSigs[1] = a3_s1; // getVoteStatus(uint256) - votingappSigs[2] = a3_s2; // isVoteCodeValid(address) - votingappSigs[3] = a3_s3; // hashForCode(address) - votingappSigs[4] = a3_s4; // createVote(address,uint64,uint64) - votingappSigs[5] = a3_s5; // transitionStateIfChanged(uint256) - votingappSigs[6] = a3_s6; // validVoteCode(bytes32) - votingappSigs[7] = a3_s7; // setValidVoteCode(bytes32,bool) - votingappSigs[8] = a3_s8; // voteYay(uint256) - votingappSigs[9] = a3_s9; // isVoteApproved(address,uint256,uint256,uint64,uint64) - votingappSigs[10] = a3_s10; // voteYayAndExecute(uint256) - dao.installApp(deployedvotingapp, votingappSigs); - - return deployedbylawsapp; // first app is bylaws - } - - function installBylaws(BylawsApp bylaws, BylawsApp dao_bylaws) internal { - uint bylaw_1 = bylaws.setVotingBylaw(pct(80), pct(100), 1 days, 7 days, false); - uint bylaw_2 = bylaws.setVotingBylaw(pct(75), pct(0), 1 days, 7 days, false); - uint bylaw_3 = bylaws.setStatusBylaw(3, false, false); - uint bylaw_4 = bylaws.setAddressBylaw(0, false, false); - - dao_bylaws.linkBylaw(o0_s0, bylaw_2); // setPermissionsOracle(address) - dao_bylaws.linkBylaw(o0_s1, bylaw_2); // removeOrgan(bytes4[]) - dao_bylaws.linkBylaw(o0_s2, bylaw_2); // installOrgan(address,bytes4[]) - dao_bylaws.linkBylaw(o0_s3, bylaw_3); // installApp(address,bytes4[]) - dao_bylaws.linkBylaw(o0_s4, bylaw_1); // ceaseToExist() - dao_bylaws.linkBylaw(o0_s6, bylaw_2); // updateOrgan(address,bytes4[]) - dao_bylaws.linkBylaw(o0_s7, bylaw_2); // removeApp(bytes4[]) - dao_bylaws.linkBylaw(o0_s8, bylaw_2); // replaceKernel(address) - dao_bylaws.linkBylaw(o0_s9, bylaw_2); // updateApp(address,bytes4[]) - dao_bylaws.linkBylaw(o1_s7, bylaw_4); // deposit(address,address,uint256) - } - - function pct(uint x) internal constant returns (uint) { - return x * 10 ** 16; - } - - function issueToken(address dao, address token) internal { - OwnershipApp(dao).addToken(address(token), 1, 1, 1); - OwnershipApp(dao).grantTokens(address(token), msg.sender, 1); - } - - // metaorgan - bytes4 constant o0_s0 = 0x080440a6; // setPermissionsOracle(address) - bytes4 constant o0_s1 = 0x4ef6cf12; // removeOrgan(bytes4[]) - bytes4 constant o0_s2 = 0x58184ef2; // installOrgan(address,bytes4[]) - bytes4 constant o0_s3 = 0x59a565d7; // installApp(address,bytes4[]) - bytes4 constant o0_s4 = 0x5bb95c74; // ceaseToExist() - bytes4 constant o0_s5 = 0x62a2cf0c; // get(bytes4) - bytes4 constant o0_s6 = 0x78a54225; // updateOrgan(address,bytes4[]) - bytes4 constant o0_s7 = 0x869effe3; // removeApp(bytes4[]) - bytes4 constant o0_s8 = 0xcebe30ac; // replaceKernel(address) - bytes4 constant o0_s9 = 0xe6f79926; // updateApp(address,bytes4[]) - // vaultorgan - bytes4 constant o1_s0 = 0x05b1137b; // transferEther(address,uint256) - bytes4 constant o1_s1 = 0x1ff0769a; // setTokenBlacklist(address,bool) - bytes4 constant o1_s2 = 0x21a342e8; // setupEtherToken() - bytes4 constant o1_s3 = 0x3aecd0e3; // getTokenBalance(address) - bytes4 constant o1_s4 = 0x4371677c; // getScapeHatch() - bytes4 constant o1_s5 = 0x648bf774; // recover(address,address) - bytes4 constant o1_s6 = 0x6ad419a8; // setEtherToken(address) - bytes4 constant o1_s7 = 0x8340f549; // deposit(address,address,uint256) - bytes4 constant o1_s8 = 0x863ca8f0; // scapeHatch(address[]) - bytes4 constant o1_s9 = 0x877d08ee; // getEtherToken() - bytes4 constant o1_s10 = 0xae2ae305; // getHaltTime() - bytes4 constant o1_s11 = 0xbeabacc8; // transfer(address,address,uint256) - bytes4 constant o1_s12 = 0xc4e65c99; // setScapeHatch(address) - bytes4 constant o1_s13 = 0xce9be9ba; // isTokenBlacklisted(address) - bytes4 constant o1_s14 = 0xfb1fad50; // halt(uint256) - // actionsorgan - bytes4 constant o2_s0 = 0x4036176a; // performAction(address,bytes) - // bylawsapp - bytes4 constant a0_s0 = 0x1d304a28; // getStatusBylaw(uint256) - bytes4 constant a0_s1 = 0x29fcb9e4; // setCombinatorBylaw(uint256,uint256,uint256,bool) - bytes4 constant a0_s2 = 0x2ca60ae3; // linkBylaw(bytes4,uint256) - bytes4 constant a0_s3 = 0x39d2245b; // setStatusBylaw(uint8,bool,bool) - bytes4 constant a0_s4 = 0x423c962c; // setVotingBylaw(uint256,uint256,uint64,uint64,bool) - bytes4 constant a0_s5 = 0x50839d11; // getAddressBylaw(uint256) - bytes4 constant a0_s6 = 0x7ac41ef5; // getBylawType(uint256) - bytes4 constant a0_s7 = 0x7b0dfa35; // getVotingBylaw(uint256) - bytes4 constant a0_s8 = 0x81a08245; // setAddressBylaw(address,bool,bool) - bytes4 constant a0_s9 = 0xb18fe4f3; // canPerformAction(address,address,uint256,bytes) - bytes4 constant a0_s10 = 0xb5af090f; // isTokenWhitelisted(address) - bytes4 constant a0_s11 = 0xc9bcc97e; // setTokenWhitelist(address,bool) - bytes4 constant a0_s12 = 0xe289793e; // getBylawNot(uint256) - bytes4 constant a0_s13 = 0xe69308d2; // getCombinatorBylaw(uint256) - bytes4 constant a0_s14 = 0xea986c0a; // bylawEntrypoint(bytes4) - // ownershipapp - bytes4 constant a1_s0 = 0x10451468; // sale_closeSale() - bytes4 constant a1_s1 = 0x1fbc147b; // getTokenSale(uint256) - bytes4 constant a1_s2 = 0x3de7c5c5; // createTokenSale(address,address,bool) - bytes4 constant a1_s3 = 0x3eaacd90; // sale_destroyTokens(address,address,uint256) - bytes4 constant a1_s4 = 0x475a9fa9; // issueTokens(address,uint256) - bytes4 constant a1_s5 = 0x4a393149; // onTransfer(address,address,uint256) - bytes4 constant a1_s6 = 0x5fa7b584; // removeToken(address) - bytes4 constant a1_s7 = 0x611cdd8f; // tokenSaleForAddress(address) - bytes4 constant a1_s8 = 0x67ccdf38; // getTokenAddress(uint256) - bytes4 constant a1_s9 = 0x78a89567; // getTokenCount() - bytes4 constant a1_s10 = 0x897bc45d; // updateIsController(address) - bytes4 constant a1_s11 = 0x9075845d; // tokenIdForAddress(address) - bytes4 constant a1_s12 = 0xaef268fa; // addToken(address,uint256,uint128,uint128) - bytes4 constant a1_s13 = 0xd30def44; // grantVestedTokens(address,address,uint256,uint64,uint64,uint64) - bytes4 constant a1_s14 = 0xd49d6a0f; // sale_mintTokens(address,address,uint256) - bytes4 constant a1_s15 = 0xd4d7b19a; // isHolder(address) - bytes4 constant a1_s16 = 0xd985992f; // getTokenSaleCount() - bytes4 constant a1_s17 = 0xda682aeb; // onApprove(address,address,uint256) - bytes4 constant a1_s18 = 0xdbf5eb1c; // closeTokenSale(address) - bytes4 constant a1_s19 = 0xe4b50cb8; // getToken(uint256) - bytes4 constant a1_s20 = 0xf48c3054; // proxyPayment(address) - bytes4 constant a1_s21 = 0xf881a92f; // grantTokens(address,address,uint256) - // statusapp - bytes4 constant a2_s0 = 0x6035fa06; // setEntityStatus(address,uint8) - bytes4 constant a2_s1 = 0x7c35ae77; // getEntityStatus(address) - // votingapp - bytes4 constant a3_s0 = 0x014396f2; // voteNay(uint256) - bytes4 constant a3_s1 = 0x0519bb83; // getVoteStatus(uint256) - bytes4 constant a3_s2 = 0x0cacbd1c; // isVoteCodeValid(address) - bytes4 constant a3_s3 = 0x23e6c756; // hashForCode(address) - bytes4 constant a3_s4 = 0x3ae05af2; // createVote(address,uint64,uint64) - bytes4 constant a3_s5 = 0x3dfcedfe; // transitionStateIfChanged(uint256) - bytes4 constant a3_s6 = 0x48681a20; // validVoteCode(bytes32) - bytes4 constant a3_s7 = 0x64bfa2f6; // setValidVoteCode(bytes32,bool) - bytes4 constant a3_s8 = 0x8f328d7a; // voteYay(uint256) - bytes4 constant a3_s9 = 0xad49224c; // isVoteApproved(address,uint256,uint256,uint64,uint64) - bytes4 constant a3_s10 = 0xdb82d1e7; // voteYayAndExecute(uint256) -} diff --git a/contracts/factories/BasicFactory.sol.tmpl b/contracts/factories/BasicFactory.sol.tmpl deleted file mode 100644 index fae7c2d6b..000000000 --- a/contracts/factories/BasicFactory.sol.tmpl +++ /dev/null @@ -1,128 +0,0 @@ -/* -{{ disclaimer }} -*/ - -pragma solidity ^0.4.11; - -import "../tokens/MiniMeIrrevocableVestedToken.sol"; -import "../dao/DAO.sol"; -import "../organs/MetaOrgan.sol"; -import "../apps/Application.sol"; -import "../apps/ownership/OwnershipApp.sol"; -import "../apps/bylaws/BylawsApp.sol"; -import "./ForwarderFactory.sol"; - -contract BasicFactory { - event DeployDAO(address dao); - address public kernel; - ForwarderFactory public forwarderFactory; - {{#organs}} - address public {{name}}; - {{/organs}} - - {{#apps}} - address public {{name}}; - {{/apps}} - - function BasicFactory(address _kernel, ForwarderFactory _forwarderFactory, {{#organs}}address _{{name}}, {{/organs}}{{#apps}}address _{{name}}{{^last}}, {{/last}}{{/apps}}) { - kernel = _kernel; - forwarderFactory = _forwarderFactory; - {{#organs}} - {{name}} = _{{name}}; - {{/organs}} - {{#apps}} - {{name}} = _{{name}}; - {{/apps}} - } - - function create(string _tokenName, string _tokenSymbol, bool _testrpc) { - MiniMeIrrevocableVestedToken token = new MiniMeIrrevocableVestedToken(0, 0, 0, _tokenName, 1, _tokenSymbol, true); - DAO dao = new DAO(kernel); - token.changeController(address(dao)); - installOrgans(MetaOrgan(dao)); - address bylawsApp = installApps(MetaOrgan(dao), _testrpc); - issueToken(address(dao), address(token)); - installBylaws(BylawsApp(bylawsApp), BylawsApp(address(dao))); - MetaOrgan(dao).setPermissionsOracle(bylawsApp); - // TODO: set status for sender - - DeployDAO(dao); - } - - function installOrgans(MetaOrgan dao) internal { - {{#organs}} - bytes4[] memory {{name}}Sigs = new bytes4[]({{sigs.length}}); - {{#sigs}} - {{../name}}Sigs[{{@index}}] = o{{@../index}}_s{{@index}}; // {{name}} - {{/sigs}} - dao.installOrgan({{name}}, {{name}}Sigs); - - {{/organs}} - } - - function installApps(MetaOrgan dao, bool _testrpc) internal returns (address app) { - {{#apps}} - // Proxies are not working on testrpc, that's why for testing no proxy is created - Application deployed{{name}} = Application(_testrpc ? {{name}} : forwarderFactory.createForwarder({{name}})); - deployed{{name}}.setDAO(address(dao)); - bytes4[] memory {{name}}Sigs = new bytes4[]({{sigs.length}}); - {{#sigs}} - {{../name}}Sigs[{{@index}}] = a{{@../index}}_s{{@index}}; // {{name}} - {{/sigs}} - dao.installApp(deployed{{name}}, {{name}}Sigs); - - {{/apps}} - return deployed{{apps.0.name}}; // first app is bylaws - } - - function installBylaws(BylawsApp bylaws, BylawsApp dao_bylaws) internal { - {{#bylaws}} - {{#if bylaw.status}} - uint bylaw_{{id}} = bylaws.setStatusBylaw({{bylaw.status.[0]}}, false, false); - {{/if}} - {{#if bylaw.voting}} - uint bylaw_{{id}} = bylaws.setVotingBylaw(pct({{bylaw.voting.[0]}}), pct({{bylaw.voting.[1]}}), 1 days, 7 days, false); - {{/if}} - {{#if bylaw.address}} - uint bylaw_{{id}} = bylaws.setAddressBylaw({{bylaw.address.[0]}}, false, false); - {{/if}} - {{/bylaws}} - - {{#organs}} - {{#sigs}} - {{#if bylaw}} - dao_bylaws.linkBylaw(o{{@../index}}_s{{@index}}, bylaw_{{bylaw}}); // {{name}} - {{/if}} - {{/sigs}} - {{/organs}} - {{#apps}} - {{#sigs}} - {{#if bylaw}} - dao_bylaws.linkBylaw(a{{@../index}}_s{{@index}}, bylaw_{{bylaw}}); // {{name}} - {{/if}} - {{/sigs}} - {{/apps}} - } - - function pct(uint x) internal constant returns (uint) { - return x * 10 ** 16; - } - - function issueToken(address dao, address token) internal { - OwnershipApp(dao).addToken(address(token), 1, 1, 1); - OwnershipApp(dao).grantTokens(address(token), msg.sender, 1); - } - - {{#organs}} - // {{name}} - {{#sigs}} - bytes4 constant o{{@../index}}_s{{@index}} = {{bytes}}; // {{name}} - {{/sigs}} - {{/organs}} - {{#apps}} - // {{name}} - {{#sigs}} - bytes4 constant a{{@../index}}_s{{@index}} = {{bytes}}; // {{name}} - {{/sigs}} - {{/apps}} -} diff --git a/contracts/factories/ForwarderFactory.sol b/contracts/factories/ForwarderFactory.sol deleted file mode 100644 index 13f3be294..000000000 --- a/contracts/factories/ForwarderFactory.sol +++ /dev/null @@ -1,24 +0,0 @@ -pragma solidity ^0.4.13; - -contract ForwarderFactory { - function createForwarder(address target) returns (address fwdContract) { - // TODO: Comented as it is causing 'Internal compiler error: Assembly exception for bytecode' - bytes32 b1 = 0x602e600c600039602e6000f33660006000376101006000366000730000000000; // length 27 bytes = 1b - bytes32 b2 = 0x5af41558576101006000f3000000000000000000000000000000000000000000; // length 11 bytes - - uint256 shiftedAddress = uint256(target) * ((2 ** 8) ** 12); // Shift address 12 bytes to the left - - assembly { - let contractCode := mload(0x40) // Find empty storage location using "free memory pointer" - mstore(contractCode, b1) // We add the first part of the bytecode - mstore(add(contractCode, 0x1b), shiftedAddress) // Add target address - mstore(add(contractCode, 0x2f), b2) // Final part of bytecode - fwdContract := create(0, contractCode, 0x3A) // total length 58 dec = 3a - switch extcodesize(fwdContract) case 0 { invalid() } - } - - DeployForwarder(fwdContract, target); - } - - event DeployForwarder(address forwarderAddress, address indexed targetContract); -} diff --git a/contracts/factory/APMRegistryFactory.sol b/contracts/factory/APMRegistryFactory.sol new file mode 100644 index 000000000..3708432fa --- /dev/null +++ b/contracts/factory/APMRegistryFactory.sol @@ -0,0 +1,93 @@ +pragma solidity 0.4.18; + + +import "../apm/APMRegistry.sol"; +import "../ens/ENSSubdomainRegistrar.sol"; + +import "./DAOFactory.sol"; +import "./ENSFactory.sol"; +import "./AppProxyFactory.sol"; + + +contract APMRegistryFactory is DAOFactory, AppProxyFactory, APMRegistryConstants { + APMRegistry public registryBase; + Repo public repoBase; + ENSSubdomainRegistrar public ensSubdomainRegistrarBase; + ENS public ens; + + event DeployAPM(bytes32 indexed node, address apm); + + // Needs either one ENS or ENSFactory + function APMRegistryFactory( + APMRegistry _registryBase, + Repo _repoBase, + ENSSubdomainRegistrar _ensSubBase, + ENS _ens, + ENSFactory _ensFactory + ) DAOFactory(address(0)) public // DAO initialized without evmscript run support + { + registryBase = _registryBase; + repoBase = _repoBase; + ensSubdomainRegistrarBase = _ensSubBase; + + // Either the ENS address provided is used, if any. + // Or we use the ENSFactory to generate a test instance of ENS + // If not the ENS address nor factory address are provided, this will revert + ens = _ens != address(0) ? _ens : _ensFactory.newENS(this); + } + + function newAPM(bytes32 _tld, bytes32 _label, address _root) public returns (APMRegistry) { + bytes32 node = keccak256(_tld, _label); + + // Assume it is the test ENS + if (ens.owner(node) != address(this)) { + // If we weren't in test ens and factory doesn't have ownership, will fail + ens.setSubnodeOwner(_tld, _label, this); + } + + Kernel dao = newDAO(this); + ACL acl = ACL(dao.acl()); + + acl.createPermission(this, dao, dao.APP_MANAGER_ROLE(), this); + + bytes32 namespace = dao.APP_BASES_NAMESPACE(); + + // Deploy app proxies + ENSSubdomainRegistrar ensSub = ENSSubdomainRegistrar(dao.newAppInstance(ENS_SUB_APP_ID, ensSubdomainRegistrarBase)); + APMRegistry apm = APMRegistry(dao.newAppInstance(APM_APP_ID, registryBase)); + + // APMRegistry controls Repos + dao.setApp(namespace, REPO_APP_ID, repoBase); + + DeployAPM(node, apm); + + // Grant permissions needed for APM on ENSSubdomainRegistrar + acl.createPermission(apm, ensSub, ensSub.CREATE_NAME_ROLE(), _root); + acl.createPermission(apm, ensSub, ensSub.POINT_ROOTNODE_ROLE(), _root); + + configureAPMPermissions(acl, apm, _root); + + // allow apm to create permissions for Repos in Kernel + bytes32 permRole = acl.CREATE_PERMISSIONS_ROLE(); + + acl.grantPermission(apm, acl, permRole); + + // Permission transition to _root + acl.setPermissionManager(_root, dao, dao.APP_MANAGER_ROLE()); + acl.revokePermission(this, acl, permRole); + acl.grantPermission(_root, acl, permRole); + acl.setPermissionManager(_root, acl, permRole); + + // Initialize + ens.setOwner(node, ensSub); + ensSub.initialize(ens, node); + apm.initialize(ensSub); + + return apm; + } + + // Factory can be subclassed and permissions changed + function configureAPMPermissions(ACL _acl, APMRegistry _apm, address _root) internal { + _acl.createPermission(_root, _apm, _apm.CREATE_REPO_ROLE(), _root); + } +} diff --git a/contracts/factory/AppProxyFactory.sol b/contracts/factory/AppProxyFactory.sol new file mode 100644 index 000000000..697d04e94 --- /dev/null +++ b/contracts/factory/AppProxyFactory.sol @@ -0,0 +1,29 @@ +pragma solidity 0.4.18; + +import "../apps/AppProxyUpgradeable.sol"; +import "../apps/AppProxyPinned.sol"; + + +contract AppProxyFactory { + event NewAppProxy(address proxy); + + function newAppProxy(IKernel _kernel, bytes32 _appId) public returns (AppProxyUpgradeable) { + return newAppProxy(_kernel, _appId, new bytes(0)); + } + + function newAppProxy(IKernel _kernel, bytes32 _appId, bytes _initializePayload) public returns (AppProxyUpgradeable) { + AppProxyUpgradeable proxy = new AppProxyUpgradeable(_kernel, _appId, _initializePayload); + NewAppProxy(address(proxy)); + return proxy; + } + + function newAppProxyPinned(IKernel _kernel, bytes32 _appId) public returns (AppProxyPinned) { + return newAppProxyPinned(_kernel, _appId, new bytes(0)); + } + + function newAppProxyPinned(IKernel _kernel, bytes32 _appId, bytes _initializePayload) public returns (AppProxyPinned) { + AppProxyPinned proxy = new AppProxyPinned(_kernel, _appId, _initializePayload); + NewAppProxy(address(proxy)); + return proxy; + } +} diff --git a/contracts/factory/DAOFactory.sol b/contracts/factory/DAOFactory.sol new file mode 100644 index 000000000..3e3477484 --- /dev/null +++ b/contracts/factory/DAOFactory.sol @@ -0,0 +1,60 @@ +pragma solidity 0.4.18; + +import "../kernel/Kernel.sol"; +import "../kernel/KernelProxy.sol"; + +import "../acl/ACL.sol"; + +import "./EVMScriptRegistryFactory.sol"; + + +contract DAOFactory { + address public baseKernel; + address public baseACL; + EVMScriptRegistryFactory public regFactory; + + event DeployDAO(address dao); + event DeployEVMScriptRegistry(address reg); + + function DAOFactory(address _regFactory) public { + // No need to init as it cannot be killed by devops199 + baseKernel = address(new Kernel()); + baseACL = address(new ACL()); + + if (_regFactory != address(0)) { + regFactory = EVMScriptRegistryFactory(_regFactory); + } + } + + /** + * @param _root Address that will be granted control to setup DAO permissions + */ + function newDAO(address _root) public returns (Kernel dao) { + dao = Kernel(new KernelProxy(baseKernel)); + + address initialRoot = address(regFactory) != address(0) ? this : _root; + dao.initialize(baseACL, initialRoot); + + ACL acl = ACL(dao.acl()); + + if (address(regFactory) != address(0)) { + bytes32 permRole = acl.CREATE_PERMISSIONS_ROLE(); + bytes32 appManagerRole = dao.APP_MANAGER_ROLE(); + + acl.grantPermission(regFactory, acl, permRole); + + acl.createPermission(regFactory, dao, appManagerRole, this); + + EVMScriptRegistry reg = regFactory.newEVMScriptRegistry(dao, _root); + DeployEVMScriptRegistry(address(reg)); + + acl.revokePermission(regFactory, dao, appManagerRole); + acl.grantPermission(_root, acl, permRole); + + acl.setPermissionManager(address(0), dao, appManagerRole); + acl.setPermissionManager(_root, acl, permRole); + } + + DeployDAO(dao); + } +} \ No newline at end of file diff --git a/contracts/factory/ENSFactory.sol b/contracts/factory/ENSFactory.sol new file mode 100644 index 000000000..498167d93 --- /dev/null +++ b/contracts/factory/ENSFactory.sol @@ -0,0 +1,29 @@ +pragma solidity 0.4.18; + +import "../lib/ens/ENS.sol"; +import "../lib/ens/PublicResolver.sol"; +import "../ens/ENSSubdomainRegistrar.sol"; + + +contract ENSFactory is ENSConstants { + event DeployENS(address ens); + + // This is an incredibly trustfull ENS deployment, only use for testing + function newENS(address _owner) public returns (ENS ens) { + ens = new ENS(); + + // Setup .eth TLD + ens.setSubnodeOwner(ENS_ROOT, ETH_TLD_LABEL, this); + + // Setup public resolver + PublicResolver resolver = new PublicResolver(ens); + ens.setSubnodeOwner(ETH_TLD_NODE, PUBLIC_RESOLVER_LABEL, this); + ens.setResolver(PUBLIC_RESOLVER_NODE, resolver); + resolver.setAddr(PUBLIC_RESOLVER_NODE, resolver); + + ens.setOwner(ETH_TLD_NODE, _owner); + ens.setOwner(ENS_ROOT, _owner); + + DeployENS(ens); + } +} diff --git a/contracts/factory/EVMScriptRegistryFactory.sol b/contracts/factory/EVMScriptRegistryFactory.sol new file mode 100644 index 000000000..9c55b40a5 --- /dev/null +++ b/contracts/factory/EVMScriptRegistryFactory.sol @@ -0,0 +1,45 @@ +pragma solidity 0.4.18; + +import "../evmscript/EVMScriptRegistry.sol"; + +import "../evmscript/executors/CallsScript.sol"; +import "../evmscript/executors/DelegateScript.sol"; +import "../evmscript/executors/DeployDelegateScript.sol"; + +import "./AppProxyFactory.sol"; +import "../kernel/Kernel.sol"; +import "../acl/ACL.sol"; + + +contract EVMScriptRegistryFactory is AppProxyFactory, EVMScriptRegistryConstants { + address public baseReg; + address public baseCalls; + address public baseDel; + address public baseDeployDel; + + function EVMScriptRegistryFactory() public { + baseReg = address(new EVMScriptRegistry()); + baseCalls = address(new CallsScript()); + baseDel = address(new DelegateScript()); + baseDeployDel = address(new DeployDelegateScript()); + } + + function newEVMScriptRegistry(Kernel _dao, address _root) public returns (EVMScriptRegistry reg) { + reg = EVMScriptRegistry(_dao.newPinnedAppInstance(EVMSCRIPT_REGISTRY_APP_ID, baseReg)); + reg.initialize(); + + ACL acl = ACL(_dao.acl()); + + _dao.setApp(_dao.APP_ADDR_NAMESPACE(), EVMSCRIPT_REGISTRY_APP_ID, reg); + acl.createPermission(this, reg, reg.REGISTRY_MANAGER_ROLE(), this); + + reg.addScriptExecutor(baseCalls); // spec 1 = CallsScript + reg.addScriptExecutor(baseDel); // spec 2 = DelegateScript + reg.addScriptExecutor(baseDeployDel); // spec 3 = DeployDelegateScript + + acl.revokePermission(this, reg, reg.REGISTRY_MANAGER_ROLE()); + acl.setPermissionManager(_root, reg, reg.REGISTRY_MANAGER_ROLE()); + + return reg; + } +} diff --git a/contracts/kernel/IKernel.sol b/contracts/kernel/IKernel.sol index 6895bd5d5..0a5883cea 100644 --- a/contracts/kernel/IKernel.sol +++ b/contracts/kernel/IKernel.sol @@ -1,11 +1,13 @@ -pragma solidity ^0.4.13; +pragma solidity ^0.4.18; +import "../acl/IACL.sol"; -contract IKernel { - function canPerformAction( - address sender, - address token, - uint256 value, - bytes data - ) constant returns (bool); -} +interface IKernel { + event SetApp(bytes32 indexed namespace, bytes32 indexed name, bytes32 indexed id, address app); + + function acl() public view returns (IACL); + function hasPermission(address who, address where, bytes32 what, bytes how) public view returns (bool); + + function setApp(bytes32 namespace, bytes32 name, address app) public returns (bytes32 id); + function getApp(bytes32 id) public view returns (address); +} \ No newline at end of file diff --git a/contracts/kernel/IKernelRegistry.sol b/contracts/kernel/IKernelRegistry.sol deleted file mode 100644 index 0e4eebb9d..000000000 --- a/contracts/kernel/IKernelRegistry.sol +++ /dev/null @@ -1,12 +0,0 @@ -pragma solidity ^0.4.11; - -import "../dao/DAOStorage.sol"; - -contract IKernelRegistryEvents { - event Register(bytes4 indexed compId, address addr, bool isDelegate); - event Deregister(bytes4 indexed compId, bool isDelegate); -} - -contract IKernelRegistry is IKernelRegistryEvents { - function get(bytes4 _sig) constant returns (address, bool); -} diff --git a/contracts/kernel/IPermissionsOracle.sol b/contracts/kernel/IPermissionsOracle.sol deleted file mode 100644 index 027a15b25..000000000 --- a/contracts/kernel/IPermissionsOracle.sol +++ /dev/null @@ -1,5 +0,0 @@ -pragma solidity ^0.4.11; - -contract IPermissionsOracle { - function canPerformAction(address sender, address token, uint256 value, bytes data) constant returns (bool); -} diff --git a/contracts/kernel/Kernel.sol b/contracts/kernel/Kernel.sol index 3598ed1f0..12aab183a 100644 --- a/contracts/kernel/Kernel.sol +++ b/contracts/kernel/Kernel.sol @@ -1,214 +1,134 @@ -pragma solidity ^0.4.13; - -/** -* @title DAO Kernel -* @author Jorge Izquierdo (Aragon) -* @description Kernel's purpose is to intercept different types of transactions that can -* be made to the DAO, check if the action can be done and dispatch it. -* The Kernel keeps a registry what organ or applications handles each action. -*/ +pragma solidity 0.4.18; import "./IKernel.sol"; -import "./KernelRegistry.sol"; -import "./IPermissionsOracle.sol"; -import "../misc/DAOMsg.sol"; - -import "../tokens/EtherToken.sol"; -import "zeppelin/token/ERC20.sol"; +import "./KernelStorage.sol"; +import "../acl/ACLSyntaxSugar.sol"; +import "../apps/IAppProxy.sol"; +import "../common/Initializable.sol"; +import "../factory/AppProxyFactory.sol"; -import "../organs/IOrgan.sol"; -import "../apps/Application.sol"; -contract Kernel is IKernel, IOrgan, KernelRegistry, DAOMsgEncoder { - /** - * @dev MetaOrgan instance keeps saved in its own context. - * @param _deployedMeta an instance of a MetaOrgan (used for setup) - */ - function Kernel(address _deployedMeta) { - deployedMeta = _deployedMeta; - } - - /** - * @dev Registers 'installOrgan' function from MetaOrgan, all further organ installs can be performed with it - * @param _baseKernel an instance to the kernel to call and get the deployedMeta - */ - function setupOrgans(address _baseKernel) { - var (a,) = get(INSTALL_ORGAN_SIG); - require(a == 0); // assert this can only be called once in the DAO - bytes4[] memory installOrganSig = new bytes4[](1); - installOrganSig[0] = INSTALL_ORGAN_SIG; - register(Kernel(_baseKernel).deployedMeta(), installOrganSig, true); - } +contract Kernel is IKernel, KernelStorage, Initializable, AppProxyFactory, ACLSyntaxSugar { + bytes32 constant public APP_MANAGER_ROLE = bytes32(1); /** - * @dev Vanilla ETH transfers get intercepted in the fallback + * @dev Initialize can only be called once. It saves the block number in which it was initialized. + * @notice Initializes a kernel instance along with its ACL and sets `_permissionsCreator` as the entity that can create other permissions + * @param _baseAcl Address of base ACL app + * @param _permissionsCreator Entity that will be given permission over createPermission */ - function () payable public { - dispatchEther(msg.sender, msg.value, msg.data); - } + function initialize(address _baseAcl, address _permissionsCreator) onlyInit public { + initialized(); - /** - * @notice Send a transaction of behalf of the holder that signed it (data: `data`) - * @dev Dispatches a preauthorized ETH transaction - * @param _data Presigned transaction data to be executed - * @param _nonce Numeric identifier that allows for multiple tx with the same data to be executed. - * @param _r ECDSA signature r value - * @param _s ECDSA signature s value - * @param _v ECDSA signature v value - */ - function preauthDispatch(bytes _data, uint _nonce, bytes32 _r, bytes32 _s, uint8 _v) payable public { - bytes32 signingPayload = personalSignedPayload(_data, _nonce); // Calculate the hashed payload that was signed - require(!isUsedPayload(signingPayload)); - setUsedPayload(signingPayload); + IACL acl = IACL(newAppProxy(this, ACL_APP_ID)); - address signer = ecrecover(signingPayload, _v, _r, _s); - dispatchEther(signer, msg.value, _data); - } + _setApp(APP_BASES_NAMESPACE, ACL_APP_ID, _baseAcl); + _setApp(APP_ADDR_NAMESPACE, ACL_APP_ID, acl); - /** - * @dev ERC223 receiver compatible - * @param _sender address that performed the token transfer (only trustable if token is trusted) - * @param _origin address from which the tokens came from (same as _sender unless transferFrom) - * @param _value amount of tokens being sent - * @param _data executable data alonside token transaction - */ - function tokenFallback(address _sender, address _origin, uint256 _value, bytes _data) public returns (bool ok) { - _origin; // silence unused variable warning - dispatch(_sender, msg.sender, _value, _data); - return true; + acl.initialize(_permissionsCreator); } /** - * @dev ApproveAndCall compatibility - * @param _sender address that performed the token transfer (only trustable if token is trusted) - * @param _value amount of tokens being sent - * @param _token token address (same as msg.sender) - * @param _data executable data alonside token transaction - */ - function receiveApproval(address _sender, uint256 _value, address _token, bytes _data) public { - assert(ERC20(_token).transferFrom(_sender, address(this), _value)); - // We can only trust the values sent for sender and data when the sender is the token (assures a trustless approveAndCall happened) - // This still allows to do an external approveAndCall for just depositing the tokens (w/o execution but w/ accounting) - // Ref: https://github.com/aragon/aragon-core/issues/72#issuecomment-321508691 - dispatch(_token == msg.sender ? _sender : msg.sender, _token, _value, _token == msg.sender ? _data : new bytes(0)); - } - - /** - * @dev For ETH transactions this function wraps the ETH in a token and dispatches it - * @param _sender address that performed the ether transfer - * @param _value amount of tokens being sent - * @param _data executable data alonside token transaction + * @dev Create a new instance of an app linked to this kernel and set its base + * implementation if it was not already set + * @param _name Name of the app + * @param _appBase Address of the app's base implementation + * @return AppProxy instance */ - function dispatchEther(address _sender, uint256 _value, bytes _data) internal { - // dispatched token address is 0, this is intercepted by the Vault - dispatch(_sender, 0, _value, _data); + function newAppInstance(bytes32 _name, address _appBase) auth(APP_MANAGER_ROLE, arr(APP_BASES_NAMESPACE, _name)) public returns (IAppProxy appProxy) { + _setAppIfNew(APP_BASES_NAMESPACE, _name, _appBase); + appProxy = newAppProxy(this, _name); } /** - * @dev Sends the transaction to the dispatcher organ - * @param _sender address that performed the token transfer - * @param _token token address - * @param _value amount of tokens being sent - * @param _payload executable data alonside token transaction - * @return - the underlying call returns (upto RETURN_MEMORY_SIZE memory) + * @dev Create a new pinned instance of an app linked to this kernel and set + * its base implementation if it was not already set + * @param _name Name of the app + * @param _appBase Address of the app's base implementation + * @return AppProxy instance */ - function dispatch(address _sender, address _token, uint256 _value, bytes _payload) internal { - - vaultDeposit(_sender, _token, _value); // deposit tokens that come with the call in the vault - - - if (_payload.length == 0) - return; // Just receive the tokens - - require(canPerformAction(_sender, _token, _value, _payload)); - - bytes4 sig; - assembly { sig := mload(add(_payload, 0x20)) } - var (target, isDelegate) = get(sig); - uint32 len = RETURN_MEMORY_SIZE; - - require(target > 0); - - bytes memory payloadMsg = calldataWithDAOMsg(_payload, _sender, _token, _value); - - assembly { - let result := 0 - - switch isDelegate - case 1 { result := delegatecall(sub(gas, 10000), target, add(payloadMsg, 0x20), mload(payloadMsg), 0, len) } - case 0 { result := call(sub(gas, 10000), target, 0, add(payloadMsg, 0x20), mload(payloadMsg), 0, len) } - switch result case 0 { invalid() } - return(0, len) - } + function newPinnedAppInstance(bytes32 _name, address _appBase) auth(APP_MANAGER_ROLE, arr(APP_BASES_NAMESPACE, _name)) public returns (IAppProxy appProxy) { + _setAppIfNew(APP_BASES_NAMESPACE, _name, _appBase); + appProxy = newAppProxyPinned(this, _name); } /** - * @dev Sends the transaction to the dispatcher organ - * @param _sender address that performed the token transfer - * @param _token token address - * @param _value amount of tokens being sent - * @param _data executable data alonside token transaction - * @return bool whether the action is allowed by permissions oracle + * @dev Set the resolving address of an app instance or base implementation + * @param _namespace App namespace to use + * @param _name Name of the app + * @param _app Address of the app + * @return ID of app */ - function canPerformAction(address _sender, address _token, uint256 _value, bytes _data) constant returns (bool) { - address p = getPermissionsOracle(); - return p == 0 || IPermissionsOracle(p).canPerformAction(_sender, _token, _value, _data); + function setApp(bytes32 _namespace, bytes32 _name, address _app) auth(APP_MANAGER_ROLE, arr(_namespace, _name)) kernelIntegrity public returns (bytes32 id) { + return _setApp(_namespace, _name, _app); } /** - * @dev Low level deposit of funds to the Vault Organ - * @param _sender address that performed the token transfer - * @param _token address of the token - * @param _amount amount of the token + * @dev Get the address of an app instance or base implementation + * @param _id App identifier + * @return Address of the app */ - function vaultDeposit(address _sender, address _token, uint256 _amount) internal { - var (vaultOrgan,) = get(DEPOSIT_SIG); - if (_amount == 0 || vaultOrgan == 0) - return; - - assert(vaultOrgan.delegatecall(DEPOSIT_SIG, uint256(_sender), uint256(_token), _amount)); + function getApp(bytes32 _id) public view returns (address) { + return apps[_id]; } /** - * @dev Sets a preauth payload as used - * @param _payload hash of the action used + * @dev Get the installed ACL app + * @return ACL app */ - function setUsedPayload(bytes32 _payload) internal { - storageSet(getStorageKeyForPayload(_payload), 1); + function acl() public view returns (IACL) { + return IACL(getApp(ACL_APP)); } /** - * @dev Whether a given preauth payload was already used - * @param _payload hash of the action used - * @return bool was payload it was used before or not + * @dev Function called by apps to check ACL on kernel or to check permission status + * @param _who Sender of the original call + * @param _where Address of the app + * @param _what Identifier for a group of actions in app + * @param _how Extra data for ACL auth + * @return boolean indicating whether the ACL allows the role or not */ - function isUsedPayload(bytes32 _payload) constant returns (bool) { - return storageGet(getStorageKeyForPayload(_payload)) == 1; + function hasPermission(address _who, address _where, bytes32 _what, bytes _how) public view returns (bool) { + return acl().hasPermission(_who, _where, _what, _how); } - /** - * @dev Compute payload to be signed in order to preauthorize a transaction - * @param _data transaction data to be executed - * @param _nonce identifier of the transaction to allow repeating actions without double-spends - * @return bytes32 hash to be signed - */ - function personalSignedPayload(bytes _data, uint _nonce) constant public returns (bytes32) { - return keccak256(0x19, "Ethereum Signed Message:\n32", payload(_data, _nonce)); + function _setApp(bytes32 _namespace, bytes32 _name, address _app) internal returns (bytes32 id) { + id = keccak256(_namespace, _name); + apps[id] = _app; + SetApp(_namespace, _name, id, _app); } - function payload(bytes _data, uint _nonce) constant public returns (bytes32) { - return keccak256(address(this), _data, _nonce); + function _setAppIfNew(bytes32 _namespace, bytes32 _name, address _app) internal returns (bytes32 id) { + id = keccak256(_namespace, _name); + + if (_app != address(0)) { + address app = getApp(id); + if (app != address(0)) { + require(app == _app); + } else { + apps[id] = _app; + SetApp(_namespace, _name, id, _app); + } + } } - function getStorageKeyForPayload(bytes32 _payload) constant internal returns (bytes32) { - return sha3(0x01, 0x01, _payload); + modifier auth(bytes32 _role, uint256[] memory params) { + bytes memory how; + uint256 byteLength = params.length * 32; + assembly { + how := params // forced casting + mstore(how, byteLength) + } + // Params is invalid from this point fwd + require(hasPermission(msg.sender, address(this), _role, how)); + _; } - function getPermissionsOracle() constant returns (address) { - return address(storageGet(sha3(0x01, 0x03))); + modifier kernelIntegrity { + _; // After execution check integrity + address kernel = getApp(KERNEL_APP); + uint256 size; + assembly { size := extcodesize(kernel) } + require(size > 0); } - - address public deployedMeta; - bytes4 constant INSTALL_ORGAN_SIG = bytes4(sha3('installOrgan(address,bytes4[])')); - bytes4 constant DEPOSIT_SIG = bytes4(sha3('deposit(address,address,uint256)')); } diff --git a/contracts/kernel/KernelProxy.sol b/contracts/kernel/KernelProxy.sol new file mode 100644 index 000000000..7386dfa8f --- /dev/null +++ b/contracts/kernel/KernelProxy.sol @@ -0,0 +1,24 @@ +pragma solidity 0.4.18; + +import "./KernelStorage.sol"; +import "../common/DelegateProxy.sol"; + + +contract KernelProxy is KernelStorage, DelegateProxy { + /** + * @dev KernelProxy is a proxy contract to a kernel implementation. The implementation + * can update the reference, which effectively upgrades the contract + * @param _kernelImpl Address of the contract used as implementation for kernel + */ + function KernelProxy(address _kernelImpl) public { + apps[keccak256(CORE_NAMESPACE, KERNEL_APP_ID)] = _kernelImpl; + } + + /** + * @dev All calls made to the proxy are forwarded to the kernel implementation via a delegatecall + * @return Any bytes32 value the implementation returns + */ + function () payable public { + delegatedFwd(apps[KERNEL_APP], msg.data); + } +} \ No newline at end of file diff --git a/contracts/kernel/KernelRegistry.sol b/contracts/kernel/KernelRegistry.sol deleted file mode 100644 index 6c616e41b..000000000 --- a/contracts/kernel/KernelRegistry.sol +++ /dev/null @@ -1,61 +0,0 @@ -pragma solidity ^0.4.11; - -import "./IKernelRegistry.sol"; -import "../dao/DAOStorage.sol"; - -contract KernelRegistry is IKernelRegistry, DAOStorage { - /** - * @dev Get dispatching information about a given signature - * @param _sig The first 4 bytes of the hash of the function signature in question - * @return address Component of the DAO that dispatches the signature (0 if none) - * @return bool Whether the action is dispatched with a delegate call (true = delegatecall (organ), false = call (app)) - */ - function get(bytes4 _sig) constant returns (address, bool) { - uint v = storageGet(storageKeyForSig(_sig)); - bool isDelegate = v >> 8 * 20 == 1; - return (address(v), isDelegate); - } - - /** - * @dev Register a set of function signatures to a given component address. Apps cannot overwrite existing signatures without deregistering first - * @param _comp Address of the component that will handle the function signatures - * @param _sigs The first 4 bytes of the hash of the function signatures being registered. Must be ordered (0x10 before 0x20 and so on) - * @param _delegate Whether to register as delegate callable or not (true = organ, false = app) - */ - function register(address _comp, bytes4[] _sigs, bool _delegate) internal { - uint addDelegate = _delegate ? 2 ** 8 ** 20 : 0; // whether is delefare is stored as the 21st byte first bit - bytes4 id = bytes4(sha3(_sigs)); - storageSet(storageKeyForSig(id), identifier(_delegate)); - - for (uint i = 0; i < _sigs.length; i++) { - require(_delegate || storageGet(storageKeyForSig(_sigs[i])) == 0); // don't allow to overwrite on apps - require(i == 0 || _sigs[i] > _sigs[i - 1]); // assert sigs are ordered - storageSet(storageKeyForSig(_sigs[i]), uint(address(_comp)) + addDelegate); - } - - Register(id, _comp, _delegate); - } - - /** - * @dev Deegister a set of function signatures - * @param _sigs The first 4 bytes of the hash of the function signatures being registered. Must be the same set of signatures that were registered all together - * @param _delegate Whether signatures were registered as delegate or not - */ - function deregister(bytes4[] _sigs, bool _delegate) internal { - bytes4 id = bytes4(sha3(_sigs)); - // performs integrity check (all sigs being removed) and allows double auth for organs or apps - require(storageGet(storageKeyForSig(id)) == identifier(_delegate)); - for (uint i = 0; i < _sigs.length; i++) - storageSet(storageKeyForSig(_sigs[i]), 0); - - Deregister(id, _delegate); - } - - function identifier(bool isDelegate) internal returns (uint) { - return isDelegate ? 2 : 1; - } - - function storageKeyForSig(bytes4 _sig) internal returns (bytes32) { - return sha3(0x01, 0x00, _sig); - } -} diff --git a/contracts/kernel/KernelStorage.sol b/contracts/kernel/KernelStorage.sol new file mode 100644 index 000000000..f8af29c6b --- /dev/null +++ b/contracts/kernel/KernelStorage.sol @@ -0,0 +1,19 @@ +pragma solidity 0.4.18; + + +contract KernelConstants { + bytes32 constant public CORE_NAMESPACE = keccak256("core"); + bytes32 constant public APP_BASES_NAMESPACE = keccak256("base"); + bytes32 constant public APP_ADDR_NAMESPACE = keccak256("app"); + + bytes32 constant public KERNEL_APP_ID = keccak256("kernel.aragonpm.eth"); + bytes32 constant public KERNEL_APP = keccak256(CORE_NAMESPACE, KERNEL_APP_ID); + + bytes32 constant public ACL_APP_ID = keccak256("acl.aragonpm.eth"); + bytes32 constant public ACL_APP = keccak256(APP_ADDR_NAMESPACE, ACL_APP_ID); +} + + +contract KernelStorage is KernelConstants { + mapping (bytes32 => address) public apps; +} diff --git a/contracts/lib/ens/AbstractENS.sol b/contracts/lib/ens/AbstractENS.sol new file mode 100644 index 000000000..d379b8c66 --- /dev/null +++ b/contracts/lib/ens/AbstractENS.sol @@ -0,0 +1,24 @@ +pragma solidity ^0.4.15; + + +interface AbstractENS { + function owner(bytes32 _node) constant returns (address); + function resolver(bytes32 _node) constant returns (address); + function ttl(bytes32 _node) constant returns (uint64); + function setOwner(bytes32 _node, address _owner); + function setSubnodeOwner(bytes32 _node, bytes32 label, address _owner); + function setResolver(bytes32 _node, address _resolver); + function setTTL(bytes32 _node, uint64 _ttl); + + // Logged when the owner of a node assigns a new owner to a subnode. + event NewOwner(bytes32 indexed _node, bytes32 indexed _label, address _owner); + + // Logged when the owner of a node transfers ownership to a new account. + event Transfer(bytes32 indexed _node, address _owner); + + // Logged when the resolver for a node changes. + event NewResolver(bytes32 indexed _node, address _resolver); + + // Logged when the TTL of a node changes + event NewTTL(bytes32 indexed _node, uint64 _ttl); +} diff --git a/contracts/lib/ens/ENS.sol b/contracts/lib/ens/ENS.sol new file mode 100644 index 000000000..20b9ed403 --- /dev/null +++ b/contracts/lib/ens/ENS.sol @@ -0,0 +1,95 @@ +pragma solidity ^0.4.0; + + +import './AbstractENS.sol'; + +/** + * The ENS registry contract. + */ +contract ENS is AbstractENS { + struct Record { + address owner; + address resolver; + uint64 ttl; + } + + mapping(bytes32=>Record) records; + + // Permits modifications only by the owner of the specified node. + modifier only_owner(bytes32 node) { + if (records[node].owner != msg.sender) throw; + _; + } + + /** + * Constructs a new ENS registrar. + */ + function ENS() { + records[0].owner = msg.sender; + } + + /** + * Returns the address that owns the specified node. + */ + function owner(bytes32 node) constant returns (address) { + return records[node].owner; + } + + /** + * Returns the address of the resolver for the specified node. + */ + function resolver(bytes32 node) constant returns (address) { + return records[node].resolver; + } + + /** + * Returns the TTL of a node, and any records associated with it. + */ + function ttl(bytes32 node) constant returns (uint64) { + return records[node].ttl; + } + + /** + * Transfers ownership of a node to a new address. May only be called by the current + * owner of the node. + * @param node The node to transfer ownership of. + * @param owner The address of the new owner. + */ + function setOwner(bytes32 node, address owner) only_owner(node) { + Transfer(node, owner); + records[node].owner = owner; + } + + /** + * Transfers ownership of a subnode keccak256(node, label) to a new address. May only be + * called by the owner of the parent node. + * @param node The parent node. + * @param label The hash of the label specifying the subnode. + * @param owner The address of the new owner. + */ + function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) { + var subnode = keccak256(node, label); + NewOwner(node, label, owner); + records[subnode].owner = owner; + } + + /** + * Sets the resolver address for the specified node. + * @param node The node to update. + * @param resolver The address of the resolver. + */ + function setResolver(bytes32 node, address resolver) only_owner(node) { + NewResolver(node, resolver); + records[node].resolver = resolver; + } + + /** + * Sets the TTL for the specified node. + * @param node The node to update. + * @param ttl The TTL in seconds. + */ + function setTTL(bytes32 node, uint64 ttl) only_owner(node) { + NewTTL(node, ttl); + records[node].ttl = ttl; + } +} diff --git a/contracts/lib/ens/PublicResolver.sol b/contracts/lib/ens/PublicResolver.sol new file mode 100644 index 000000000..9dcc95689 --- /dev/null +++ b/contracts/lib/ens/PublicResolver.sol @@ -0,0 +1,212 @@ +pragma solidity ^0.4.0; + +import './AbstractENS.sol'; + +/** + * A simple resolver anyone can use; only allows the owner of a node to set its + * address. + */ +contract PublicResolver { + bytes4 constant INTERFACE_META_ID = 0x01ffc9a7; + bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de; + bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5; + bytes4 constant NAME_INTERFACE_ID = 0x691f3431; + bytes4 constant ABI_INTERFACE_ID = 0x2203ab56; + bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233; + bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c; + + event AddrChanged(bytes32 indexed node, address a); + event ContentChanged(bytes32 indexed node, bytes32 hash); + event NameChanged(bytes32 indexed node, string name); + event ABIChanged(bytes32 indexed node, uint256 indexed contentType); + event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); + event TextChanged(bytes32 indexed node, string indexed indexedKey, string key); + + struct PublicKey { + bytes32 x; + bytes32 y; + } + + struct Record { + address addr; + bytes32 content; + string name; + PublicKey pubkey; + mapping(string=>string) text; + mapping(uint256=>bytes) abis; + } + + AbstractENS ens; + mapping(bytes32=>Record) records; + + modifier only_owner(bytes32 node) { + if (ens.owner(node) != msg.sender) throw; + _; + } + + /** + * Constructor. + * @param ensAddr The ENS registrar contract. + */ + function PublicResolver(AbstractENS ensAddr) { + ens = ensAddr; + } + + /** + * Returns true if the resolver implements the interface specified by the provided hash. + * @param interfaceID The ID of the interface to check for. + * @return True if the contract implements the requested interface. + */ + function supportsInterface(bytes4 interfaceID) constant returns (bool) { + return interfaceID == ADDR_INTERFACE_ID || + interfaceID == CONTENT_INTERFACE_ID || + interfaceID == NAME_INTERFACE_ID || + interfaceID == ABI_INTERFACE_ID || + interfaceID == PUBKEY_INTERFACE_ID || + interfaceID == TEXT_INTERFACE_ID || + interfaceID == INTERFACE_META_ID; + } + + /** + * Returns the address associated with an ENS node. + * @param node The ENS node to query. + * @return The associated address. + */ + function addr(bytes32 node) constant returns (address ret) { + ret = records[node].addr; + } + + /** + * Sets the address associated with an ENS node. + * May only be called by the owner of that node in the ENS registry. + * @param node The node to update. + * @param addr The address to set. + */ + function setAddr(bytes32 node, address addr) only_owner(node) { + records[node].addr = addr; + AddrChanged(node, addr); + } + + /** + * Returns the content hash associated with an ENS node. + * Note that this resource type is not standardized, and will likely change + * in future to a resource type based on multihash. + * @param node The ENS node to query. + * @return The associated content hash. + */ + function content(bytes32 node) constant returns (bytes32 ret) { + ret = records[node].content; + } + + /** + * Sets the content hash associated with an ENS node. + * May only be called by the owner of that node in the ENS registry. + * Note that this resource type is not standardized, and will likely change + * in future to a resource type based on multihash. + * @param node The node to update. + * @param hash The content hash to set + */ + function setContent(bytes32 node, bytes32 hash) only_owner(node) { + records[node].content = hash; + ContentChanged(node, hash); + } + + /** + * Returns the name associated with an ENS node, for reverse records. + * Defined in EIP181. + * @param node The ENS node to query. + * @return The associated name. + */ + function name(bytes32 node) constant returns (string ret) { + ret = records[node].name; + } + + /** + * Sets the name associated with an ENS node, for reverse records. + * May only be called by the owner of that node in the ENS registry. + * @param node The node to update. + * @param name The name to set. + */ + function setName(bytes32 node, string name) only_owner(node) { + records[node].name = name; + NameChanged(node, name); + } + + /** + * Returns the ABI associated with an ENS node. + * Defined in EIP205. + * @param node The ENS node to query + * @param contentTypes A bitwise OR of the ABI formats accepted by the caller. + * @return contentType The content type of the return value + * @return data The ABI data + */ + function ABI(bytes32 node, uint256 contentTypes) constant returns (uint256 contentType, bytes data) { + var record = records[node]; + for(contentType = 1; contentType <= contentTypes; contentType <<= 1) { + if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) { + data = record.abis[contentType]; + return; + } + } + contentType = 0; + } + + /** + * Sets the ABI associated with an ENS node. + * Nodes may have one ABI of each content type. To remove an ABI, set it to + * the empty string. + * @param node The node to update. + * @param contentType The content type of the ABI + * @param data The ABI data. + */ + function setABI(bytes32 node, uint256 contentType, bytes data) only_owner(node) { + // Content types must be powers of 2 + if (((contentType - 1) & contentType) != 0) throw; + + records[node].abis[contentType] = data; + ABIChanged(node, contentType); + } + + /** + * Returns the SECP256k1 public key associated with an ENS node. + * Defined in EIP 619. + * @param node The ENS node to query + * @return x, y the X and Y coordinates of the curve point for the public key. + */ + function pubkey(bytes32 node) constant returns (bytes32 x, bytes32 y) { + return (records[node].pubkey.x, records[node].pubkey.y); + } + + /** + * Sets the SECP256k1 public key associated with an ENS node. + * @param node The ENS node to query + * @param x the X coordinate of the curve point for the public key. + * @param y the Y coordinate of the curve point for the public key. + */ + function setPubkey(bytes32 node, bytes32 x, bytes32 y) only_owner(node) { + records[node].pubkey = PublicKey(x, y); + PubkeyChanged(node, x, y); + } + + /** + * Returns the text data associated with an ENS node and key. + * @param node The ENS node to query. + * @param key The text data key to query. + * @return The associated text data. + */ + function text(bytes32 node, string key) constant returns (string ret) { + ret = records[node].text[key]; + } + + /** + * Sets the text data associated with an ENS node and key. + * May only be called by the owner of that node in the ENS registry. + * @param node The node to update. + * @param key The key to set. + * @param value The text data value to set. + */ + function setText(bytes32 node, string key, string value) only_owner(node) { + records[node].text[key] = value; + TextChanged(node, key, key); + } +} diff --git a/contracts/lib/erc677/ERC677Receiver.sol b/contracts/lib/erc677/ERC677Receiver.sol new file mode 100644 index 000000000..bf3695987 --- /dev/null +++ b/contracts/lib/erc677/ERC677Receiver.sol @@ -0,0 +1,6 @@ +pragma solidity 0.4.18; + + +contract ERC677Receiver { + function tokenFallback(address from, uint256 amount, bytes data) external returns (bool success); +} diff --git a/contracts/lib/erc677/ERC677Token.sol b/contracts/lib/erc677/ERC677Token.sol new file mode 100644 index 000000000..6ad8d88c2 --- /dev/null +++ b/contracts/lib/erc677/ERC677Token.sol @@ -0,0 +1,16 @@ +pragma solidity 0.4.18; + + +import "./ERC677Receiver.sol"; +import "../zeppelin/token/StandardToken.sol"; + +contract ERC677Token is StandardToken { + function transferAndCall(address receiver, uint amount, bytes data) public returns (bool success) { + require(transfer(receiver, amount)); + return _postTransferCall(receiver, amount, data); + } + + function _postTransferCall(address receiver, uint amount, bytes data) internal returns (bool success) { + return ERC677Receiver(receiver).tokenFallback(msg.sender, amount, data); + } +} diff --git a/contracts/tokens/MiniMeController.sol b/contracts/lib/minime/ITokenController.sol similarity index 84% rename from contracts/tokens/MiniMeController.sol rename to contracts/lib/minime/ITokenController.sol index e9dcc1206..ed13d13cb 100644 --- a/contracts/tokens/MiniMeController.sol +++ b/contracts/lib/minime/ITokenController.sol @@ -1,11 +1,13 @@ -pragma solidity ^0.4.8; +pragma solidity ^0.4.18; /// @dev The token controller contract must implement these functions -contract MiniMeController { + + +interface ITokenController { /// @notice Called when `_owner` sends ether to the MiniMe Token contract /// @param _owner The address that sent the ether to create tokens /// @return True if the ether is accepted, false if it throws - function proxyPayment(address _owner) payable returns(bool); + function proxyPayment(address _owner) public payable returns(bool); /// @notice Notifies the controller about a token transfer allowing the /// controller to react if desired @@ -13,7 +15,7 @@ contract MiniMeController { /// @param _to The destination of the transfer /// @param _amount The amount of the transfer /// @return False if the controller does not authorize the transfer - function onTransfer(address _from, address _to, uint _amount) returns(bool); + function onTransfer(address _from, address _to, uint _amount) public constant returns(bool); /// @notice Notifies the controller about an approval allowing the /// controller to react if desired @@ -21,6 +23,5 @@ contract MiniMeController { /// @param _spender The spender in the `approve()` call /// @param _amount The amount in the `approve()` call /// @return False if the controller does not authorize the approval - function onApprove(address _owner, address _spender, uint _amount) - returns(bool); + function onApprove(address _owner, address _spender, uint _amount) public constant returns(bool); } diff --git a/contracts/tokens/MiniMeToken.sol b/contracts/lib/minime/MiniMeToken.sol similarity index 75% rename from contracts/tokens/MiniMeToken.sol rename to contracts/lib/minime/MiniMeToken.sol index a7bdb6839..8828b424b 100644 --- a/contracts/tokens/MiniMeToken.sol +++ b/contracts/lib/minime/MiniMeToken.sol @@ -1,46 +1,65 @@ -pragma solidity ^0.4.8; +pragma solidity ^0.4.6; -import "zeppelin/token/ERC20.sol"; -import "./MiniMeController.sol"; +/* + Copyright 2016, Jordi Baylina -/** - Copyright 2017, Jorge Izquierdo (Aragon Foundation) - Copyright 2017, Jordi Baylina (Giveth) + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +/// @title MiniMeToken Contract +/// @author Jordi Baylina +/// @dev This token contract's goal is to make it easy for anyone to clone this +/// token using the token distribution at a given block, this will allow DAO's +/// and DApps to upgrade their features in a decentralized manner without +/// affecting the original token +/// @dev It is ERC20 compliant, but still needs to under go further testing. + +import "./ITokenController.sol"; - Based on MineMeToken.sol from https://github.com/Giveth/minime -*/ contract Controlled { /// @notice The address of the controller is the only address that can call /// a function with this modifier - modifier onlyController { - if (msg.sender != controller) - revert(); + require(msg.sender == controller); _; } address public controller; - function Controlled() { controller = msg.sender;} + function Controlled() public { controller = msg.sender;} /// @notice Changes the controller of the contract /// @param _newController The new controller of the contract - function changeController(address _newController) onlyController { + function changeController(address _newController) onlyController public { controller = _newController; } } -contract ApproveAndCallReceiver { +contract ApproveAndCallFallBack { function receiveApproval( - address _from, + address from, uint256 _amount, address _token, bytes _data - ); + ) public; } +/// @dev The actual token contract, the default controller is the msg.sender +/// that deploys the contract, so usually this token will be deployed by a +/// token controller contract, which Giveth will call a "Campaign" +contract MiniMeToken is Controlled { -contract MiniMeToken is ERC20, Controlled { string public name; //The Token's name: e.g. DigixDAO Tokens uint8 public decimals; //Number of decimals of the smallest unit string public symbol; //An identifier: e.g. REP @@ -112,7 +131,8 @@ contract MiniMeToken is ERC20, Controlled { uint8 _decimalUnits, string _tokenSymbol, bool _transfersEnabled - ) { + ) public + { tokenFactory = MiniMeTokenFactory(_tokenFactory); name = _tokenName; // Set the name decimals = _decimalUnits; // Set the decimals @@ -123,6 +143,7 @@ contract MiniMeToken is ERC20, Controlled { creationBlock = block.number; } + /////////////////// // ERC20 Methods /////////////////// @@ -131,9 +152,8 @@ contract MiniMeToken is ERC20, Controlled { /// @param _to The address of the recipient /// @param _amount The amount of tokens to be transferred /// @return Whether the transfer was successful or not - function transfer(address _to, uint256 _amount) returns (bool success) { - if (!transfersEnabled) - revert(); + function transfer(address _to, uint256 _amount) public returns (bool success) { + require(transfersEnabled); return doTransfer(msg.sender, _to, _amount); } @@ -143,21 +163,18 @@ contract MiniMeToken is ERC20, Controlled { /// @param _to The address of the recipient /// @param _amount The amount of tokens to be transferred /// @return True if the transfer was successful - function transferFrom(address _from, address _to, uint256 _amount - ) returns (bool success) - { + function transferFrom(address _from, address _to, uint256 _amount) public returns (bool success) { // The controller of this contract can move tokens around at will, // this is important to recognize! Confirm that you trust the // controller of this contract, which in most situations should be // another open source smart contract or 0x0 if (msg.sender != controller) { - if (!transfersEnabled) - revert(); + require(transfersEnabled); // The standard ERC 20 transferFrom functionality if (allowed[_from][msg.sender] < _amount) - revert(); + return false; allowed[_from][msg.sender] -= _amount; } return doTransfer(_from, _to, _amount); @@ -169,51 +186,40 @@ contract MiniMeToken is ERC20, Controlled { /// @param _to The address of the recipient /// @param _amount The amount of tokens to be transferred /// @return True if the transfer was successful - function doTransfer(address _from, address _to, uint _amount - ) internal returns(bool) - { - + function doTransfer(address _from, address _to, uint _amount) internal returns(bool) { if (_amount == 0) { return true; } - + require(parentSnapShotBlock < block.number); // Do not allow transfer to 0x0 or the token contract itself - if ((_to == 0) || (_to == address(this))) - revert(); - + require((_to != 0) && (_to != address(this))); // If the amount being transfered is more than the balance of the // account the transfer returns false var previousBalanceFrom = balanceOfAt(_from, block.number); if (previousBalanceFrom < _amount) { - revert(); + return false; } - // Alerts the token controller of the transfer if (isContract(controller)) { - if (!MiniMeController(controller).onTransfer(_from, _to, _amount)) - revert(); + // Adding the ` == true` makes the linter shut up so... + require(ITokenController(controller).onTransfer(_from, _to, _amount) == true); } - // First update the balance array with the new value for the address // sending the tokens updateValueAtNow(balances[_from], previousBalanceFrom - _amount); - // Then update the balance array with the new value for the address // receiving the tokens var previousBalanceTo = balanceOfAt(_to, block.number); - if (previousBalanceTo + _amount < previousBalanceTo) - revert(); // Check for overflow + require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow updateValueAtNow(balances[_to], previousBalanceTo + _amount); - // An event to make the transfer easy to find on the blockchain Transfer(_from, _to, _amount); - return true; } /// @param _owner The address that's balance is being requested /// @return The balance of `_owner` at the current block - function balanceOf(address _owner) constant returns (uint256 balance) { + function balanceOf(address _owner) public constant returns (uint256 balance) { return balanceOfAt(_owner, block.number); } @@ -223,21 +229,19 @@ contract MiniMeToken is ERC20, Controlled { /// @param _spender The address of the account able to transfer the tokens /// @param _amount The amount of tokens to be approved for transfer /// @return True if the approval was successful - function approve(address _spender, uint256 _amount) returns (bool success) { - if (!transfersEnabled) - revert(); + function approve(address _spender, uint256 _amount) public returns (bool success) { + require(transfersEnabled); - // To change the approve amount you first have to reduce the addresses´ + // To change the approve amount you first have to reduce the addresses` // allowance to zero by calling `approve(_spender,0)` if it is not // already 0 to mitigate the race condition described here: // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - if ((_amount != 0) && (allowed[msg.sender][_spender] != 0)) - revert(); + require((_amount == 0) || (allowed[msg.sender][_spender] == 0)); // Alerts the token controller of the approve function call if (isContract(controller)) { - if (!MiniMeController(controller).onApprove(msg.sender, _spender, _amount)) - revert(); + // Adding the ` == true` makes the linter shut up so... + require(ITokenController(controller).onApprove(msg.sender, _spender, _amount) == true); } allowed[msg.sender][_spender] = _amount; @@ -250,9 +254,7 @@ contract MiniMeToken is ERC20, Controlled { /// @param _spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens of _owner that _spender is allowed /// to spend - function allowance(address _owner, address _spender - ) constant returns (uint256 remaining) - { + function allowance(address _owner, address _spender) public constant returns (uint256 remaining) { return allowed[_owner][_spender]; } @@ -263,32 +265,26 @@ contract MiniMeToken is ERC20, Controlled { /// @param _spender The address of the contract able to transfer the tokens /// @param _amount The amount of tokens to be approved for transfer /// @return True if the function call was successful - function approveAndCall(address _spender, uint256 _amount, bytes _extraData - ) returns (bool success) - { - approve(_spender, _amount); - - // This portion is copied from ConsenSys's Standard Token Contract. It - // calls the receiveApproval function that is part of the contract that - // is being approved (`_spender`). The function should look like: - // `receiveApproval(address _from, uint256 _amount, address - // _tokenContract, bytes _extraData)` It is assumed that the call - // *should* succeed, otherwise the plain vanilla approve would be used - ApproveAndCallReceiver(_spender).receiveApproval( + function approveAndCall(address _spender, uint256 _amount, bytes _extraData) public returns (bool success) { + require(approve(_spender, _amount)); + + ApproveAndCallFallBack(_spender).receiveApproval( msg.sender, _amount, this, _extraData ); + return true; } /// @dev This function makes it easy to get the total number of tokens /// @return The total number of tokens - function totalSupply() constant returns (uint) { + function totalSupply() public constant returns (uint) { return totalSupplyAt(block.number); } + //////////////// // Query balance and totalSupply in History //////////////// @@ -297,17 +293,14 @@ contract MiniMeToken is ERC20, Controlled { /// @param _owner The address from which the balance will be retrieved /// @param _blockNumber The block number when the balance is queried /// @return The balance at `_blockNumber` - function balanceOfAt(address _owner, uint _blockNumber) constant - returns (uint) - { + function balanceOfAt(address _owner, uint _blockNumber) public constant returns (uint) { // These next few lines are used when the balance of the token is // requested before a check point was ever created for this token, it // requires that the `parentToken.balanceOfAt` be queried at the // genesis block for that token as this contains initial balance of // this token - if ((balances[_owner].length == 0) || - (balances[_owner][0].fromBlock > _blockNumber)) { + if ((balances[_owner].length == 0) || (balances[_owner][0].fromBlock > _blockNumber)) { if (address(parentToken) != 0) { return parentToken.balanceOfAt(_owner, min(_blockNumber, parentSnapShotBlock)); } else { @@ -324,15 +317,14 @@ contract MiniMeToken is ERC20, Controlled { /// @notice Total amount of tokens at a specific `_blockNumber`. /// @param _blockNumber The block number when the totalSupply is queried /// @return The total amount of tokens at `_blockNumber` - function totalSupplyAt(uint _blockNumber) constant returns(uint) { + function totalSupplyAt(uint _blockNumber) public constant returns(uint) { // These next few lines are used when the totalSupply of the token is // requested before a check point was ever created for this token, it // requires that the `parentToken.totalSupplyAt` be queried at the // genesis block for this token as that contains totalSupply of this // token at this block number. - if ((totalSupplyHistory.length == 0) || - (totalSupplyHistory[0].fromBlock > _blockNumber)) { + if ((totalSupplyHistory.length == 0) || (totalSupplyHistory[0].fromBlock > _blockNumber)) { if (address(parentToken) != 0) { return parentToken.totalSupplyAt(min(_blockNumber, parentSnapShotBlock)); } else { @@ -345,10 +337,6 @@ contract MiniMeToken is ERC20, Controlled { } } - function min(uint a, uint b) internal returns (uint) { - return a < b ? a : b; - } - //////////////// // Clone Token Method //////////////// @@ -360,7 +348,7 @@ contract MiniMeToken is ERC20, Controlled { /// @param _cloneTokenSymbol Symbol of the clone token /// @param _snapshotBlock Block when the distribution of the parent token is /// copied to set the initial distribution of the new clone token; - /// if the block is higher than the actual block, the current block is used + /// if the block is zero than the actual block, the current block is used /// @param _transfersEnabled True if transfers are allowed in the clone /// @return The address of the new MiniMeToken Contract function createCloneToken( @@ -369,13 +357,13 @@ contract MiniMeToken is ERC20, Controlled { string _cloneTokenSymbol, uint _snapshotBlock, bool _transfersEnabled - ) returns(address) + ) public returns(address) { - if (_snapshotBlock > block.number) - _snapshotBlock = block.number; + uint256 snapshot = _snapshotBlock == 0 ? block.number - 1 : _snapshotBlock; + MiniMeToken cloneToken = tokenFactory.createCloneToken( this, - _snapshotBlock, + snapshot, _cloneTokenName, _cloneDecimalUnits, _cloneTokenSymbol, @@ -385,7 +373,7 @@ contract MiniMeToken is ERC20, Controlled { cloneToken.changeController(msg.sender); // An event to make the token easy to find on the blockchain - NewCloneToken(address(cloneToken), _snapshotBlock); + NewCloneToken(address(cloneToken), snapshot); return address(cloneToken); } @@ -397,33 +385,28 @@ contract MiniMeToken is ERC20, Controlled { /// @param _owner The address that will be assigned the new tokens /// @param _amount The quantity of tokens generated /// @return True if the tokens are generated correctly - function generateTokens(address _owner, uint _amount) onlyController returns (bool) { - uint curTotalSupply = getValueAt(totalSupplyHistory, block.number); - if (curTotalSupply + _amount < curTotalSupply) - revert(); // Check for overflow + function generateTokens(address _owner, uint _amount) onlyController public returns (bool) { + uint curTotalSupply = totalSupply(); + require(curTotalSupply + _amount >= curTotalSupply); // Check for overflow + uint previousBalanceTo = balanceOf(_owner); + require(previousBalanceTo + _amount >= previousBalanceTo); // Check for overflow updateValueAtNow(totalSupplyHistory, curTotalSupply + _amount); - var previousBalanceTo = balanceOf(_owner); - if (previousBalanceTo + _amount < previousBalanceTo) - revert(); // Check for overflow updateValueAtNow(balances[_owner], previousBalanceTo + _amount); Transfer(0, _owner, _amount); return true; } + /// @notice Burns `_amount` tokens from `_owner` /// @param _owner The address that will lose the tokens /// @param _amount The quantity of tokens to burn /// @return True if the tokens are burned correctly - function destroyTokens(address _owner, uint _amount - ) onlyController returns (bool) - { - uint curTotalSupply = getValueAt(totalSupplyHistory, block.number); - if (curTotalSupply < _amount) - revert(); + function destroyTokens(address _owner, uint _amount) onlyController public returns (bool) { + uint curTotalSupply = totalSupply(); + require(curTotalSupply >= _amount); + uint previousBalanceFrom = balanceOf(_owner); + require(previousBalanceFrom >= _amount); updateValueAtNow(totalSupplyHistory, curTotalSupply - _amount); - var previousBalanceFrom = balanceOf(_owner); - if (previousBalanceFrom < _amount) - revert(); updateValueAtNow(balances[_owner], previousBalanceFrom - _amount); Transfer(_owner, 0, _amount); return true; @@ -436,7 +419,7 @@ contract MiniMeToken is ERC20, Controlled { /// @notice Enables token holders to transfer their tokens freely if true /// @param _transfersEnabled True if transfers are allowed in the clone - function enableTransfers(bool _transfersEnabled) onlyController { + function enableTransfers(bool _transfersEnabled) onlyController public { transfersEnabled = _transfersEnabled; } @@ -448,9 +431,7 @@ contract MiniMeToken is ERC20, Controlled { /// @param checkpoints The history of values being queried /// @param _block The block number to retrieve the value at /// @return The number of tokens being queried - function getValueAt(Checkpoint[] storage checkpoints, uint _block - ) constant internal returns (uint) - { + function getValueAt(Checkpoint[] storage checkpoints, uint _block) constant internal returns (uint) { if (checkpoints.length == 0) return 0; @@ -478,16 +459,13 @@ contract MiniMeToken is ERC20, Controlled { /// `totalSupplyHistory` /// @param checkpoints The history of data being updated /// @param _value The new number of tokens - function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value - ) internal - { - if ((checkpoints.length == 0) || - (checkpoints[checkpoints.length - 1].fromBlock < block.number)) { + function updateValueAtNow(Checkpoint[] storage checkpoints, uint _value) internal { + if ((checkpoints.length == 0) || (checkpoints[checkpoints.length - 1].fromBlock < block.number)) { Checkpoint storage newCheckPoint = checkpoints[checkpoints.length++]; newCheckPoint.fromBlock = uint128(block.number); newCheckPoint.value = uint128(_value); } else { - Checkpoint storage oldCheckPoint = checkpoints[checkpoints.length-1]; + Checkpoint storage oldCheckPoint = checkpoints[checkpoints.length - 1]; oldCheckPoint.value = uint128(_value); } } @@ -499,28 +477,60 @@ contract MiniMeToken is ERC20, Controlled { uint size; if (_addr == 0) return false; + assembly { size := extcodesize(_addr) } + return size>0; } + /// @dev Helper function to return a min betwen the two uints + function min(uint a, uint b) internal returns (uint) { + return a < b ? a : b; + } + /// @notice The fallback function: If the contract's controller has not been /// set to 0, then the `proxyPayment` method is called which relays the /// ether and creates tokens as described in the token controller contract - function () payable { - if (isContract(controller)) { - if (! MiniMeController(controller).proxyPayment.value(msg.value)(msg.sender)) - revert(); - } else { - revert(); + function () payable public { + require(isContract(controller)); + // Adding the ` == true` makes the linter shut up so... + require(ITokenController(controller).proxyPayment.value(msg.value)(msg.sender) == true); + } + +////////// +// Safety Methods +////////// + + /// @notice This method can be used by the controller to extract mistakenly + /// sent tokens to this contract. + /// @param _token The address of the token contract that you want to recover + /// set to 0 in case you want to extract ether. + function claimTokens(address _token) onlyController public { + if (_token == 0x0) { + controller.transfer(this.balance); + return; } + + MiniMeToken token = MiniMeToken(_token); + uint balance = token.balanceOf(this); + token.transfer(controller, balance); + ClaimedTokens(_token, controller, balance); } //////////////// // Events //////////////// + event ClaimedTokens(address indexed _token, address indexed _controller, uint _amount); + event Transfer(address indexed _from, address indexed _to, uint256 _amount); event NewCloneToken(address indexed _cloneToken, uint _snapshotBlock); + event Approval( + address indexed _owner, + address indexed _spender, + uint256 _amount + ); + } @@ -550,7 +560,7 @@ contract MiniMeTokenFactory { uint8 _decimalUnits, string _tokenSymbol, bool _transfersEnabled - ) returns (MiniMeToken) + ) public returns (MiniMeToken) { MiniMeToken newToken = new MiniMeToken( this, diff --git a/contracts/misc/Migrations.sol b/contracts/lib/misc/Migrations.sol similarity index 71% rename from contracts/misc/Migrations.sol rename to contracts/lib/misc/Migrations.sol index 6590cf150..189ef8031 100644 --- a/contracts/misc/Migrations.sol +++ b/contracts/lib/misc/Migrations.sol @@ -10,15 +10,15 @@ contract Migrations { _; } - function Migrations() { + function Migrations() public { owner = msg.sender; } - function setCompleted(uint completed) restricted { + function setCompleted(uint completed) restricted public { lastCompletedMigration = completed; } - function upgrade(address newAddress) restricted { + function upgrade(address newAddress) restricted public { Migrations upgraded = Migrations(newAddress); upgraded.setCompleted(lastCompletedMigration); } diff --git a/contracts/lib/zeppelin/math/Math.sol b/contracts/lib/zeppelin/math/Math.sol new file mode 100644 index 000000000..3d016c0ac --- /dev/null +++ b/contracts/lib/zeppelin/math/Math.sol @@ -0,0 +1,24 @@ +pragma solidity ^0.4.11; + +/** + * @title Math + * @dev Assorted math operations + */ + +library Math { + function max64(uint64 a, uint64 b) internal constant returns (uint64) { + return a >= b ? a : b; + } + + function min64(uint64 a, uint64 b) internal constant returns (uint64) { + return a < b ? a : b; + } + + function max256(uint256 a, uint256 b) internal constant returns (uint256) { + return a >= b ? a : b; + } + + function min256(uint256 a, uint256 b) internal constant returns (uint256) { + return a < b ? a : b; + } +} diff --git a/contracts/lib/zeppelin/math/SafeMath.sol b/contracts/lib/zeppelin/math/SafeMath.sol new file mode 100644 index 000000000..9de762c80 --- /dev/null +++ b/contracts/lib/zeppelin/math/SafeMath.sol @@ -0,0 +1,32 @@ +pragma solidity ^0.4.11; + + +/** + * @title SafeMath + * @dev Math operations with safety checks that throw on error + */ +library SafeMath { + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a * b; + require(a == 0 || c / a == b); + return c; + } + + function div(uint256 a, uint256 b) internal pure returns (uint256) { + // assert(b > 0); // Solidity automatically throws when dividing by 0 + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + return c; + } + + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + require(b <= a); + return a - b; + } + + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a); + return c; + } +} diff --git a/contracts/lib/zeppelin/token/BasicToken.sol b/contracts/lib/zeppelin/token/BasicToken.sol new file mode 100644 index 000000000..a45157f81 --- /dev/null +++ b/contracts/lib/zeppelin/token/BasicToken.sol @@ -0,0 +1,42 @@ +pragma solidity ^0.4.11; + + +import './ERC20Basic.sol'; +import '../math/SafeMath.sol'; + + +/** + * @title Basic token + * @dev Basic version of StandardToken, with no allowances. + */ +contract BasicToken is ERC20Basic { + using SafeMath for uint256; + + mapping(address => uint256) balances; + + /** + * @dev transfer token for a specified address + * @param _to The address to transfer to. + * @param _value The amount to be transferred. + */ + function transfer(address _to, uint256 _value) public returns (bool) { + require(_to != address(0)); + require(_value <= balances[msg.sender]); + + // SafeMath.sub will throw if there is not enough balance. + balances[msg.sender] = balances[msg.sender].sub(_value); + balances[_to] = balances[_to].add(_value); + Transfer(msg.sender, _to, _value); + return true; + } + + /** + * @dev Gets the balance of the specified address. + * @param _owner The address to query the the balance of. + * @return An uint256 representing the amount owned by the passed address. + */ + function balanceOf(address _owner) public constant returns (uint256 balance) { + return balances[_owner]; + } + +} diff --git a/contracts/lib/zeppelin/token/ERC20.sol b/contracts/lib/zeppelin/token/ERC20.sol new file mode 100644 index 000000000..ca36d737b --- /dev/null +++ b/contracts/lib/zeppelin/token/ERC20.sol @@ -0,0 +1,16 @@ +pragma solidity ^0.4.11; + + +import './ERC20Basic.sol'; + + +/** + * @title ERC20 interface + * @dev see https://github.com/ethereum/EIPs/issues/20 + */ +contract ERC20 is ERC20Basic { + function allowance(address owner, address spender) public constant returns (uint256); + function transferFrom(address from, address to, uint256 value) public returns (bool); + function approve(address spender, uint256 value) public returns (bool); + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/contracts/lib/zeppelin/token/ERC20Basic.sol b/contracts/lib/zeppelin/token/ERC20Basic.sol new file mode 100644 index 000000000..76e0704ba --- /dev/null +++ b/contracts/lib/zeppelin/token/ERC20Basic.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.4.11; + + +/** + * @title ERC20Basic + * @dev Simpler version of ERC20 interface + * @dev see https://github.com/ethereum/EIPs/issues/179 + */ +contract ERC20Basic { + uint256 public totalSupply; + function balanceOf(address who) public constant returns (uint256); + function transfer(address to, uint256 value) public returns (bool); + event Transfer(address indexed from, address indexed to, uint256 value); +} diff --git a/contracts/lib/zeppelin/token/StandardToken.sol b/contracts/lib/zeppelin/token/StandardToken.sol new file mode 100644 index 000000000..7ab917c95 --- /dev/null +++ b/contracts/lib/zeppelin/token/StandardToken.sol @@ -0,0 +1,87 @@ +pragma solidity ^0.4.11; + + +import './BasicToken.sol'; +import './ERC20.sol'; + + +/** + * @title Standard ERC20 token + * + * @dev Implementation of the basic standard token. + * @dev https://github.com/ethereum/EIPs/issues/20 + * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol + */ +contract StandardToken is ERC20, BasicToken { + + mapping (address => mapping (address => uint256)) internal allowed; + + + /** + * @dev Transfer tokens from one address to another + * @param _from address The address which you want to send tokens from + * @param _to address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + */ + function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { + require(_to != address(0)); + require(_value <= balances[_from]); + require(_value <= allowed[_from][msg.sender]); + + balances[_from] = balances[_from].sub(_value); + balances[_to] = balances[_to].add(_value); + allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); + Transfer(_from, _to, _value); + return true; + } + + /** + * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. + * + * Beware that changing an allowance with this method brings the risk that someone may use both the old + * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this + * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * @param _spender The address which will spend the funds. + * @param _value The amount of tokens to be spent. + */ + function approve(address _spender, uint256 _value) public returns (bool) { + allowed[msg.sender][_spender] = _value; + Approval(msg.sender, _spender, _value); + return true; + } + + /** + * @dev Function to check the amount of tokens that an owner allowed to a spender. + * @param _owner address The address which owns the funds. + * @param _spender address The address which will spend the funds. + * @return A uint256 specifying the amount of tokens still available for the spender. + */ + function allowance(address _owner, address _spender) public constant returns (uint256 remaining) { + return allowed[_owner][_spender]; + } + + /** + * approve should be called when allowed[_spender] == 0. To increment + * allowed value is better to use this function to avoid 2 calls (and wait until + * the first transaction is mined) + * From MonolithDAO Token.sol + */ + function increaseApproval (address _spender, uint _addedValue) public returns (bool success) { + allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); + Approval(msg.sender, _spender, allowed[msg.sender][_spender]); + return true; + } + + function decreaseApproval (address _spender, uint _subtractedValue) public returns (bool success) { + uint oldValue = allowed[msg.sender][_spender]; + if (_subtractedValue > oldValue) { + allowed[msg.sender][_spender] = 0; + } else { + allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); + } + Approval(msg.sender, _spender, allowed[msg.sender][_spender]); + return true; + } + +} diff --git a/contracts/misc/CodeHelper.sol b/contracts/misc/CodeHelper.sol deleted file mode 100644 index d4dd0eb36..000000000 --- a/contracts/misc/CodeHelper.sol +++ /dev/null @@ -1,24 +0,0 @@ -pragma solidity ^0.4.13; - - -// Could be converted into a library. Would it be worth it gas wise? -contract CodeHelper { - // TODO: When we migrate to solc 0.4.12, use so we save the copy - // switch size case 0 { hash := 0 } - function hashForCode(address _addr) constant returns (bytes32 hash) { - uint size = contractSize(_addr); - if (size == 0) - return bytes32(0); - assembly { - let o_code := mload(0x40) - mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) - mstore(o_code, size) - extcodecopy(_addr, add(o_code, 0x20), 0, size) - hash := sha3(add(o_code, 0x20), size) - } - } - - function contractSize(address _addr) internal constant returns (uint size) { - assembly { size := extcodesize(_addr) } - } -} diff --git a/contracts/misc/DAOMsg.sol b/contracts/misc/DAOMsg.sol deleted file mode 100644 index af85501d7..000000000 --- a/contracts/misc/DAOMsg.sol +++ /dev/null @@ -1,82 +0,0 @@ -pragma solidity ^0.4.13; - -contract DAOMsgEncoder { - /** - * @dev Package encoding: 0th to 24th byte are all 0s (padding so entire package is 32*3 bytes) 24 to 44 bytes sender, 44 to 64 token, 64 to 96 value - * @param _data Original calldata to append dao_msg packet - * @param _sender Address of the sender of the DAO message (Encoded from byte 24th to 44th) - * @param _token Address of the token used to send the message (Encoded from byte 44th to 64th) - * @param _value Value of token transfered in call - * @return bytes payload to be appended to calldata for a DAO call - */ - function calldataWithDAOMsg(bytes _data, address _sender, address _token, uint _value) internal constant returns (bytes payload) { - payload = new bytes(_data.length + 96); - uint dataptr; uint payloadptr; - assembly { dataptr := add(_data, 0x20) payloadptr := add(payload, 0x20) } - memcpy(payloadptr, dataptr, _data.length); - encodeDAOMsg(payloadptr + _data.length, _sender, _token, _value); - } - - function encodeDAOMsg(uint payloadptr, address _sender, address _token, uint _value) internal { - assembly { - mstore(add(payloadptr, 0x40), _value) // save value in last slot - mstore(add(payloadptr, 0x20), _token) // save token address before value, will leave first 12 bytes as 0s - mstore(add(payloadptr, sub(0x20, 0x14)), _sender) // save sender on top of _token 0s - } - } - - // From @arachnid's stringutils https://github.com/Arachnid/solidity-stringutils - function memcpy(uint dest, uint src, uint len) private { - // 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)) - } - } - -} - -contract DAOMsgReader { - struct DAOMsg { - address sender; - address token; - uint value; - bytes data; - } - - function dao_msg() internal returns (DAOMsg memory) { - address sender; - address token; - uint value; - uint padding; - bytes memory data; - - assembly { - padding := calldataload(sub(calldatasize(), 0x60)) - sender := calldataload(sub(calldatasize(), sub(0x60, 0x0c))) - token := calldataload(sub(calldatasize(), 0x40)) - value := calldataload(sub(calldatasize(), 0x20)) - - let size := sub(calldatasize(), 0x60) // size of data without payload - data := mload(0x40) // get free memory pointer - mstore(0x40, add(data, and(add(add(size, 0x20), 0x1f), not(0x1f)))) // save next free memory pointer - - mstore(data, size) // store size of the bytes array - calldatacopy(add(data, 0x20), 0, size) - } - - assert(padding >> 8 * 8 == 0); // assert package was correctly padded, first 24 bytes should be 0 - return DAOMsg(sender, token, value, data); - } -} diff --git a/contracts/misc/Requestor.sol b/contracts/misc/Requestor.sol deleted file mode 100644 index 29eecb2b4..000000000 --- a/contracts/misc/Requestor.sol +++ /dev/null @@ -1,19 +0,0 @@ -pragma solidity ^0.4.13; - - -// Simulates web3 ability to do token.transfer.request() that returns the data needed -// to perform that call -// Problem: requires to store -contract Requestor { - bytes data; - - function getData() internal returns (bytes) { - bytes memory d = data; - data = new bytes(0); // remove storage on get so it refunds some gas - return d; - } - - function () { - data = msg.data; - } -} diff --git a/contracts/organs/ActionsOrgan.sol b/contracts/organs/ActionsOrgan.sol deleted file mode 100644 index bb067bfc2..000000000 --- a/contracts/organs/ActionsOrgan.sol +++ /dev/null @@ -1,16 +0,0 @@ -pragma solidity ^0.4.13; - -import "./IOrgan.sol"; - -// @dev ActionsOrgan allows to make external calls on behalf of the DAO -contract ActionsOrgan is IOrgan { - /** - * @dev Extremely critical, all DAO assets can be lost if set inappropriately. - * @notice Perform arbitrary actions on behalf of the DAO. - * @param _to address being called - * @param _data data being executed in `_to` - */ - function performAction(address _to, bytes _data) returns (bool) { - return _to.call(_data); // performs action with DAO as msg.sender - } -} diff --git a/contracts/organs/IMetaOrgan.sol b/contracts/organs/IMetaOrgan.sol deleted file mode 100644 index 86cc177c5..000000000 --- a/contracts/organs/IMetaOrgan.sol +++ /dev/null @@ -1,18 +0,0 @@ -pragma solidity ^0.4.11; - -contract IMetaOrganEvents { - event ReplaceKernel(address newKernel); - event ReplacePermissionsOracle(address newPermissionsOracle); -} - -contract IMetaOrgan is IMetaOrganEvents { - function ceaseToExist() external; - function replaceKernel(address newKernel) external; - function setPermissionsOracle(address newOracle) external; - function installApp(address appAddress, bytes4[] sigs) external; - function removeApp(bytes4[] sigs) external; - function updateApp(address appAddress, bytes4[] sigs) external; - function installOrgan(address organAddress, bytes4[] sigs) external; - function removeOrgan(bytes4[] sigs) external; - function updateOrgan(address organAddress, bytes4[] sigs) external; -} diff --git a/contracts/organs/IOrgan.sol b/contracts/organs/IOrgan.sol deleted file mode 100644 index 4158d1c65..000000000 --- a/contracts/organs/IOrgan.sol +++ /dev/null @@ -1,7 +0,0 @@ -pragma solidity ^0.4.11; - -import "../dao/DAOStorage.sol"; -import "../misc/DAOMsg.sol"; - -contract IOrgan is DAOStorage, DAOMsgReader { -} diff --git a/contracts/organs/IVaultOrgan.sol b/contracts/organs/IVaultOrgan.sol deleted file mode 100644 index 889b640dc..000000000 --- a/contracts/organs/IVaultOrgan.sol +++ /dev/null @@ -1,27 +0,0 @@ -pragma solidity ^0.4.11; - -contract IVaultOrganEvents { - event Deposit(address indexed token, address indexed sender, uint256 amount); - event Withdraw(address indexed token, address indexed approvedBy, uint256 amount, address indexed recipient); - event Recover(address indexed token, address indexed approvedBy, uint256 amount, address indexed recipient); - event NewTokenDeposit(address indexed token); -} - -contract IVaultOrgan is IVaultOrganEvents { - function deposit(address _sender, address _token, uint256 _amount) external payable; - function getTokenBalance(address _token) constant returns (uint256); - - function transfer(address _token, address _to, uint256 _amount) external; - function transferEther(address _to, uint256 _amount) external; - - function halt(uint256 _haltTime) external; - function getHaltTime() constant returns (uint256 started, uint256 ends); - - function scapeHatch(address[] _tokens) external; - function setScapeHatch(address _scapeHatch) external; - function getScapeHatch() constant returns (address); - - function setTokenBlacklist(address _token, bool _blacklisted) external; - function isTokenBlacklisted(address _token) constant returns (bool); - function recover(address _token, address _to) external; -} diff --git a/contracts/organs/MetaOrgan.sol b/contracts/organs/MetaOrgan.sol deleted file mode 100644 index 14c77455e..000000000 --- a/contracts/organs/MetaOrgan.sol +++ /dev/null @@ -1,100 +0,0 @@ -pragma solidity ^0.4.13; - -import "./IOrgan.sol"; -import "./IMetaOrgan.sol"; -import "../kernel/KernelRegistry.sol"; - -// @dev MetaOrgan can modify all critical aspects of the DAO. -contract MetaOrgan is IMetaOrgan, IOrgan, KernelRegistry { - bytes32 constant PERMISSION_ORACLE_KEY = sha3(0x01, 0x03); - - /** - * @notice Destruct organization for ever (non-recoverable) - * #bylaw voting:80,100 - */ - function ceaseToExist() external { - // Check it is called in DAO context and not from the outside which would - // delete the organ logic from the EVM - address self = getSelf(); - assert(this == self && self > 0); - selfdestruct(0xdead); - } - - /** - * @notice Change DAO Kernel to Kernel at address `address` - * #bylaw voting:75,0 - */ - function replaceKernel(address newKernel) external { - setKernel(newKernel); - ReplaceKernel(newKernel); - } - - /** - * @notice Set `address` as permissions oracle - * #bylaw voting:75,0 - */ - function setPermissionsOracle(address newOracle) external { - storageSet(PERMISSION_ORACLE_KEY, uint256(newOracle)); - ReplacePermissionsOracle(newOracle); - } - - /** - * @notice Install application at address `address` - * #bylaw status:3 - * @param appAddress address of the receiving contract for functions - * @param sigs should be ordered from 0x0 to 0xffffffff - */ - function installApp(address appAddress, bytes4[] sigs) external { - register(appAddress, sigs, false); - } - - /** - * @notice Remove application, you will lose functionality in your org - * #bylaw voting:75,0 - * @param sigs should be ordered from 0x0 to 0xffffffff - */ - function removeApp(bytes4[] sigs) external { - deregister(sigs, false); - } - - /** - * @notice Updates application atomically - * #bylaw voting:75,0 - * @param appAddress new address of the receiving contract for functions - * @param sigs should be ordered from 0x0 to 0xffffffff - */ - function updateApp(address appAddress, bytes4[] sigs) external { - deregister(sigs, false); - register(appAddress, sigs, false); - } - - /** - * @notice Install organ at address `organAddress` - * #bylaw voting:75,0 - * @param organAddress address of the receiving contract for functions - * @param sigs should be ordered from 0x0 to 0xffffffff - */ - function installOrgan(address organAddress, bytes4[] sigs) external { - register(organAddress, sigs, true); - } - - /** - * @notice Remove organ, you will lose functionality in your org - * #bylaw voting:75,0 - * @param sigs should be ordered from 0x0 to 0xffffffff - */ - function removeOrgan(bytes4[] sigs) external { - deregister(sigs, true); - } - - /** - * @notice Updates organ atomically - * #bylaw voting:75,0 - * @param organAddress address of the receiving contract for functions - * @param sigs should be ordered from 0x0 to 0xffffffff - */ - function updateOrgan(address organAddress, bytes4[] sigs) external { - deregister(sigs, true); - register(organAddress, sigs, true); - } -} diff --git a/contracts/organs/VaultOrgan.sol b/contracts/organs/VaultOrgan.sol deleted file mode 100644 index 5c441abb9..000000000 --- a/contracts/organs/VaultOrgan.sol +++ /dev/null @@ -1,336 +0,0 @@ -pragma solidity ^0.4.13; - -import "./IVaultOrgan.sol"; - -import "../tokens/EtherToken.sol"; -import "./IOrgan.sol"; -import "zeppelin/SafeMath.sol"; - -contract VaultOrgan is IVaultOrgan, SafeMath, IOrgan { - uint8 constant VAULT_PRIMARY_KEY = 0x02; - - uint8 constant BALANCE_SECONDARY_KEY = 0x00; - bytes32 constant HALT_TIME_KEY = sha3(VAULT_PRIMARY_KEY, 0x01); - bytes32 constant HALT_DURATION_KEY = sha3(VAULT_PRIMARY_KEY, 0x02); - bytes32 constant SCAPE_HATCH_SECONDARY_KEY = sha3(VAULT_PRIMARY_KEY, 0x03); - uint8 constant BLACKLIST_SECONDARY_KEY = 0x04; - bytes32 constant ETHER_TOKEN_SECONDARY_KEY = sha3(VAULT_PRIMARY_KEY, 0x05); - - uint constant MAX_TOKEN_TRANSFER_GAS = 150000; - uint constant MAX_HALT = 7 days; // can be prorrogated during halt - - /** - * @dev deposit is not reachable on purpose using normal dispatch route (cannot use dao_msg()) - * #bylaw address:0 - * @param _token Address for the token being deposited in call - * @param _amount Token units being deposited - */ - function deposit(address _sender, address _token, uint256 _amount) - check_blacklist(_token) - external - payable - { - require(msg.data.length == 4 + 3 * 32); // assure call doesn't have DAOmsg (cannot be called externally) - if (_amount == 0) - return; - if (_token == 0 && msg.value == _amount) - tokenizeEther(_amount); // if call has ETH, we tokenize it - - address token = _token == 0 ? getEtherToken() : _token; - - uint256 currentBalance = getTokenBalance(token); - // This will actually be dispatched every time balance goes from 0 to non-zero. - // The idea is that the frontend can listen for this event in all DAO history. - // TODO: Is an event for when a certain token balance goes to 0 needed? - if (currentBalance == 0) - NewTokenDeposit(token); - - // TODO: Aragon Network funds redirect goes here :) - - uint256 newBalance = safeAdd(currentBalance, _amount); // - aragonNetworkFee; - // Check token balance isn't less than expected. - // Could be less because of a faulty erc20 implementation (can't trust) - // Could be more because a token transfer can be done without notifying - assert(newBalance <= ERC20(token).balanceOf(this)); - - setTokenBalance(token, newBalance); - Deposit(token, _sender, _amount); - } - - /** - * @dev Function called from other organs, applications or the outside to send funds - * @notice Low level transfer of tokens from the DAOs Vault (should not be called directly in most cases) - * @param _token Token address to be tranferred - * @param _to Recipient of the tokens - * @param _amount Token units being sent - */ - function transfer(address _token, address _to, uint256 _amount) - only_not_halted - external - { - doTransfer(_token, _to, _amount); - } - - // @dev internal function that handles transfer logic. - function doTransfer(address _token, address _to, uint256 _amount) internal { - uint newBalance = performTokenTransferAccounting(_token, _amount, _to); - secureTokenTransfer(_token, _to, _amount); // perform actual transfer - - assert(ERC20(_token).balanceOf(this) == newBalance); // check that we have as many tokens as we expected - } - - /** - * @dev Function called from other organs, applications or the outside to send ether - * @notice Low level transfer of ether from the DAOs Vault (should not be called directly in most cases) - * @param _to Recipient of the ether - * @param _amount wei amount being sent - */ - function transferEther(address _to, uint256 _amount) - only_not_halted - external - { - address etherToken = getEtherToken(); - uint newBalance = performTokenTransferAccounting(etherToken, _amount, _to); - - // secure withdraw sends ETH without reentrancy possibilities (send by selfdestruct) - EtherToken(etherToken).secureWithdraw(_amount, _to); - - assert(ERC20(etherToken).balanceOf(this) == newBalance); // check that we have as many tokens as we expected - } - - /** - * @dev Function called to stop token withdraws for _haltTime seconds as a security measure. - * @notice Lock Vault for `_haltTime` seconds. In the meantime, the scape hatch can be executed. - * @dev Halting vault organ opens the possibility to execute the scape hatch - * @param _haltTime Number of seconds vault will be halted (can be overwriten by another shorter halt) - */ - function halt(uint256 _haltTime) external { - assert(_haltTime <= MAX_HALT); - - // Store timestamp of the halt and halt period - storageSet(HALT_TIME_KEY, now); - storageSet(HALT_DURATION_KEY, _haltTime); - } - - /** - * @dev Function called as a security measure to remove all funds from the DAO - * @dev Can only be executed during a halt - * @notice Empty `_tokens` from DAO sending them to the scape hatch address - * @param _tokens Addresses of the tokens in which we execute the scape hatch (to avoid OOG errors) - */ - function scapeHatch(address[] _tokens) - only_halted - external - { - address scapeHatch = getScapeHatch(); - require(scapeHatch > 0); // check it has been set to avoid burning the tokens - - // could go OOG but then you can always split calls in multiple calls with subsets of tokens - for (uint i = 0; i < _tokens.length; i++) { - address token = _tokens[i]; - doTransfer(token, scapeHatch, getTokenBalance(token)); - } - } - - /* - * @notice Change the scape hatch address for emergency emptying the DAO - * @param _scapeHatch New scape hatch address being set - */ - function setScapeHatch(address _scapeHatch) external { - storageSet(SCAPE_HATCH_SECONDARY_KEY, uint256(_scapeHatch)); - } - - /** - * @dev Change the status of a token in the blacklist. - * @dev Allows for not allowing a certain token at the lowest level - * @notice Make `_token` status in Vault token blacklist `_blacklisted` - * @param _token Address for the token being modified - * @param _blacklisted New blacklist state for token - */ - function setTokenBlacklist(address _token, bool _blacklisted) external { - storageSet(storageKeyForBlacklist(_token), _blacklisted ? 1 : 0); - } - - /** - * @dev Function to be called externally to withdraw accidentally sent tokens that weren't accounted - * @notice Move `_token` tokens held by the DAO that aren't accounted, sending them to `_to` - * @param _token address for the token being recovered - * @param _to recipient for recovered tokens - */ - function recover(address _token, address _to) external { - uint256 accountedBalance = getTokenBalance(_token); - uint256 tokenBalance = ERC20(_token).balanceOf(this); - - // already checks if delta > 0 or throws - uint256 tokenDelta = safeSub(tokenBalance, accountedBalance); - - if (tokenDelta == 0) - return; - - secureTokenTransfer(_token, _to, tokenDelta); - Recover( - _token, - dao_msg().sender, - tokenDelta, - _to - ); - } - - /** - * @dev TODO: Should be external once setupEtherToken is removed - * @notice Sets reference to Ether token for the DAO - * @param _newToken new ether token to be used - */ - function setEtherToken(address _newToken) /*external*/ { - storageSet(ETHER_TOKEN_SECONDARY_KEY, uint256(_newToken)); - } - - /** - * @dev Getter for scape hatch - * @return address for current scape hatch - */ - function getScapeHatch() constant returns (address) { - return address(storageGet(SCAPE_HATCH_SECONDARY_KEY)); - } - - /** - * @dev Getter for token balance - * @param _token address of the token being requested - * @return accounted DAO balance for a given token - */ - function getTokenBalance(address _token) constant returns (uint256) { - return storageGet(storageKeyForBalance(_token)); - } - - /** - * @dev Getter for halt status - * @return started timestamp for the moment the halt was executed - * @return ends timestamp for the moment the halt is scheduled to end - */ - function getHaltTime() constant returns (uint256 started, uint256 ends) { - started = storageGet(HALT_TIME_KEY); - ends = safeAdd(started, storageGet(HALT_DURATION_KEY)); - } - - /** - * Getter for whether a token is blacklisted - * @param _token token being requested for blacklisting state - * @return bool current blacklist state for _token - */ - function isTokenBlacklisted(address _token) constant returns (bool) { - return storageGet(storageKeyForBlacklist(_token)) == 1; - } - - /** - * @dev Internal function that takes care of tokenizing ether to hold it as a ERC20 token - * @param _amount wei being tokenized - */ - function tokenizeEther(uint256 _amount) internal { - assert(address(this).balance >= _amount); - EtherToken(getEtherToken()).wrap.value(_amount)(); - // assert always that DAO keeps 0 ETH funds as there is no way to send them - // TODO: Why does dao have balance? :o - // assert(address(this).balance == 0); - } - - /** - * @dev Internal function that handles token accounting on withdraws - * @param _token Token address to be tranferred - * @param _to Recipient of the tokens - * @param _amount Token units being sent - * @return new balance after substracting tokens being transferred - */ - function performTokenTransferAccounting(address _token, uint256 _amount, address _to) - internal - returns (uint256 newBalance) - { - newBalance = safeSub(getTokenBalance(_token), _amount); // will throw on overflow - setTokenBalance(_token, newBalance); - - Withdraw( - _token, - dao_msg().sender, - _amount, - _to - ); - } - - /** - * @dev Internal function to modify storage for current token balance - * @param _token Token address to be tranferred - * @param _balance New token balance - */ - function setTokenBalance(address _token, uint256 _balance) internal { - storageSet(storageKeyForBalance(_token), _balance); - } - - /** - * @dev Internal function that performs an external ERC20 transfer but throws if too much gas is used, to avoid reentrancy by malicious tokens - * @param _token Token address to be tranferred - * @param _to Recipient of the tokens - * @param _amount Token units being sent - */ - function secureTokenTransfer(address _token, address _to, uint256 _amount) - max_gas(MAX_TOKEN_TRANSFER_GAS) - internal - { - assert( - ERC20(_token) - .transfer(_to, _amount) - ); - } - - /** - @return address for current ether token - */ - function getEtherToken() constant returns (address) { - return address(storageGet(ETHER_TOKEN_SECONDARY_KEY)); - } - - /** - * @dev get key for token balance - * @param _token Token address checked - * @return hash used as key in DAO storage - */ - function storageKeyForBalance(address _token) internal returns (bytes32) { - return sha3(VAULT_PRIMARY_KEY, BALANCE_SECONDARY_KEY, _token); - } - - /** - * @dev get key for token blacklist - * @param _token Token address checked - * @return hash used as key in DAO storage - */ - function storageKeyForBlacklist(address _token) internal returns (bytes32) { - return sha3(VAULT_PRIMARY_KEY, BLACKLIST_SECONDARY_KEY, _token); - } - - // TODO: Remove this and have instantiation be outside of vault - function setupEtherToken() { - require(getEtherToken() == 0); - setEtherToken(address(new EtherToken())); - } - - modifier only_not_halted { - var (,haltEnds) = getHaltTime(); - assert(now >= haltEnds); - _; - } - - modifier only_halted { - var (,haltEnds) = getHaltTime(); - assert(now < haltEnds); - _; - } - - modifier check_blacklist(address _token) { - require(!isTokenBlacklisted(_token)); - _; - } - - modifier max_gas(uint max_delta) { - uint initialGas = msg.gas; - _; - assert(initialGas - msg.gas < max_delta); - } -} diff --git a/contracts/tokens/EtherToken.sol b/contracts/tokens/EtherToken.sol deleted file mode 100644 index a304c3c6a..000000000 --- a/contracts/tokens/EtherToken.sol +++ /dev/null @@ -1,59 +0,0 @@ -pragma solidity ^0.4.13; - -import "zeppelin/token/StandardToken.sol"; - - -contract EtherToken is StandardToken { - string public name = "Ether"; - string public symbol = "ETH"; - uint8 public decimals = 18; - - function wrap() payable { - supply = safeAdd(supply, msg.value); - balances[msg.sender] = safeAdd(balances[msg.sender], msg.value); - - Mint(msg.sender, msg.value); - } - - function withdraw(uint256 amount, address recipient) { - performWithdrawAccounting(amount); - - recipient.transfer(amount); - } - - // Withdraw without the oportunity of re-entrancy on the ETH transfer. - // Credits to Jordi Baylina (https://gist.github.com/jbaylina/e8ac19b8e7478fd10cf0363ad1a5a4b3) - function secureWithdraw(uint256 amount, address recipient) { - performWithdrawAccounting(amount); - - assert(address(this).balance >= amount); - address payContract; - assembly { - // Create a very basic contract that will send ether to the recipient by - // self-destructing on constructor, which removes the oportunity for re-entrancy. - // We basically code that very basic contract inline. - let contractCode := mload(0x40) // Find empty storage location using "free memory pointer" - mstore8(contractCode, 0x7f) // PUSH32 - mstore(add(contractCode, 1), recipient) - mstore8(add(contractCode, 0x21), 0xff) // SELFDESTRUCT - payContract := create(amount, contractCode, 0x22) - } - assert(payContract != 0); // check that contract was correctly created - } - - // Internal function with common logic executed in a withdraw - function performWithdrawAccounting(uint256 amount) internal { - supply = safeSub(supply, amount); - balances[msg.sender] = safeSub(balances[msg.sender], amount); // will throw if less than 0 - - Burn(msg.sender, amount); - } - - uint256 supply; - function totalSupply() constant public returns (uint) { - return supply; - } - - event Mint(address indexed actor, uint value); - event Burn(address indexed actor, uint value); -} diff --git a/contracts/tokens/MiniMeIrrevocableVestedToken.sol b/contracts/tokens/MiniMeIrrevocableVestedToken.sol deleted file mode 100644 index d5790f8c5..000000000 --- a/contracts/tokens/MiniMeIrrevocableVestedToken.sol +++ /dev/null @@ -1,234 +0,0 @@ -pragma solidity ^0.4.8; - -// Slightly modified Zeppelin's Vested Token deriving MiniMeToken - -import "./MiniMeToken.sol"; -import "zeppelin/SafeMath.sol"; - -/* - Copyright 2017, Jorge Izquierdo (Aragon Foundation) - - Based on VestedToken.sol from https://github.com/OpenZeppelin/zeppelin-solidity - - SafeMath – Copyright (c) 2016 Smart Contract Solutions, Inc. - MiniMeToken – Copyright 2017, Jordi Baylina (Giveth) - */ - -// @dev MiniMeIrrevocableVestedToken is a derived version of MiniMeToken adding the -// ability to createTokenGrants which are basically a transfer that limits the -// receiver of the tokens how can he spend them over time. - -// For simplicity, token grants are not saved in MiniMe type checkpoints. -// Vanilla cloning ANT will clone it into a MiniMeToken without vesting. -// More complex cloning could account for past vesting calendars. - -contract MiniMeIrrevocableVestedToken is MiniMeToken, SafeMath { - // Keep the struct at 2 sstores (1 slot for value + 64 * 3 (dates) + 20 (address) = 2 slots (2nd slot is 212 bytes, lower than 256)) - struct TokenGrant { - address granter; - uint256 value; - uint64 cliff; - uint64 vesting; - uint64 start; - } - - event NewTokenGrant(address indexed from, address indexed to, uint256 value, uint64 start, uint64 cliff, uint64 vesting); - - mapping (address => TokenGrant[]) public grants; - - mapping (address => bool) canCreateGrants; - address vestingWhitelister; - - modifier canTransfer(address _sender, uint _value) { - require(spendableBalanceOf(_sender) >= _value); - _; - } - - modifier onlyVestingWhitelister { - require(msg.sender == vestingWhitelister); - _; - } - - function MiniMeIrrevocableVestedToken ( - address _tokenFactory, - address _parentToken, - uint _parentSnapShotBlock, - string _tokenName, - uint8 _decimalUnits, - string _tokenSymbol, - bool _transfersEnabled - ) MiniMeToken(_tokenFactory, _parentToken, _parentSnapShotBlock, _tokenName, _decimalUnits, _tokenSymbol, _transfersEnabled) { - vestingWhitelister = msg.sender; - doSetCanCreateGrants(vestingWhitelister, true); - } - - // @dev Add canTransfer modifier before allowing transfer and transferFrom to go through - function transfer(address _to, uint _value) - canTransfer(msg.sender, _value) - public - returns (bool success) { - return super.transfer(_to, _value); - } - - function transferFrom(address _from, address _to, uint _value) - canTransfer(_from, _value) - public - returns (bool success) { - return super.transferFrom(_from, _to, _value); - } - - function spendableBalanceOf(address _holder) constant public returns (uint) { - return transferableTokens(_holder, uint64(now)); - } - - function grantVestedTokens( - address _to, - uint256 _value, - uint64 _start, - uint64 _cliff, - uint64 _vesting) public { - - // Check start, cliff and vesting are properly order to ensure correct functionality of the formula. - require(_cliff >= _start); - require(_vesting >= _start); - require(_vesting >= _cliff); - - // if (!canCreateGrants[msg.sender]) throw; - require(tokenGrantsCount(_to) < 20); // To prevent a user being spammed and have his balance locked (out of gas attack when calculating vesting). - - TokenGrant memory grant = TokenGrant(msg.sender, _value, _cliff, _vesting, _start); - grants[_to].push(grant); - - assert(transfer(_to, _value)); - - NewTokenGrant(msg.sender, _to, _value, _cliff, _vesting, _start); - } - - function setCanCreateGrants(address _addr, bool _allowed) - onlyVestingWhitelister public { - doSetCanCreateGrants(_addr, _allowed); - } - - function doSetCanCreateGrants(address _addr, bool _allowed) - internal { - canCreateGrants[_addr] = _allowed; - } - - function changeVestingWhitelister(address _newWhitelister) onlyVestingWhitelister public { - doSetCanCreateGrants(vestingWhitelister, false); - vestingWhitelister = _newWhitelister; - doSetCanCreateGrants(vestingWhitelister, true); - } - - /* - // @dev Not allow token grants - function revokeTokenGrant(address _holder, uint _grantId) public { - _holder; _grantId; - revert(); - } - */ - - // - function tokenGrantsCount(address _holder) constant public returns (uint index) { - return grants[_holder].length; - } - - function tokenGrant(address _holder, uint _grantId) constant public returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting) { - TokenGrant storage grant = grants[_holder][_grantId]; - - granter = grant.granter; - value = grant.value; - start = grant.start; - cliff = grant.cliff; - vesting = grant.vesting; - - vested = vestedTokens(grant, uint64(now)); - } - - function vestedTokens(TokenGrant storage grant, uint64 time) internal constant returns (uint256) { - return calculateVestedTokens( - grant.value, - uint256(time), - uint256(grant.start), - uint256(grant.cliff), - uint256(grant.vesting) - ); - } - - // transferableTokens - // | /-------- vestedTokens - // | / - // | / - // | / - // | / - // | / - // | .| - // | . | - // | . | - // | . | - // | . | - // | . | - // +===+===========+---------+----------> time - // Start Clift Vesting - - function calculateVestedTokens( - uint256 tokens, - uint256 time, - uint256 start, - uint256 cliff, - uint256 vesting) internal constant returns (uint256) - { - - // Shortcuts for before cliff and after vesting cases. - if (time < cliff) return 0; - if (time >= vesting) return tokens; - - // Interpolate all vested tokens. - // As before cliff the shortcut returns 0, we can use just this function to - // calculate it. - - // vestedTokens = tokens * (time - start) / (vesting - start) - uint256 vestedTokens = safeDiv( - safeMul( - tokens, - safeSub(time, start) - ), - safeSub(vesting, start) - ); - - return vestedTokens; - } - - function nonVestedTokens(TokenGrant storage grant, uint64 time) internal constant returns (uint256) { - // Of all the tokens of the grant, how many of them are not vested? - // grantValue - vestedTokens - return safeSub(grant.value, vestedTokens(grant, time)); - } - - // @dev The date in which all tokens are transferable for the holder - // Useful for displaying purposes (not used in any logic calculations) - function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) { - date = uint64(now); - uint256 grantIndex = tokenGrantsCount(holder); - for (uint256 i = 0; i < grantIndex; i++) { - date = max64(grants[holder][i].vesting, date); - } - return date; - } - - // @dev How many tokens can a holder transfer at a point in time - function transferableTokens(address holder, uint64 time) constant public returns (uint256) { - uint256 grantIndex = tokenGrantsCount(holder); - - if (grantIndex == 0) return balanceOf(holder); // shortcut for holder without grants - - // Iterate through all the grants the holder has, and add all non-vested tokens - uint256 nonVested = 0; - for (uint256 i = 0; i < grantIndex; i++) { - nonVested = safeAdd(nonVested, nonVestedTokens(grants[holder][i], time)); - } - - // Balance - totalNonVested is the amount of tokens a holder can transfer at any given time - return safeSub(balanceOf(holder), nonVested); - } -} diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index dfc4dee50..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: '2' -services: - core: - build: . - image: aragon/core - hostname: aragon-core - ports: - - "3000:3000" - volumes: - - ./docker_home:/root/ - - ./:/usr/src/app - - /usr/src/app/node_modules - diff --git a/entrypoint.sh b/entrypoint.sh deleted file mode 100644 index c7023a908..000000000 --- a/entrypoint.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -#set -x -set -e - -# Define help message -show_help() { - echo """ - Commands - test : runs test suite - bash : bash prompt in container - help : show this help - """ -} - -lint_test() { - # TODO: add linter - cd /usr/src/app - npm t -} - -run_coveralls() { - cd /usr/src/app - npm run coveralls -} - -run_coverage(){ - cd /usr/src/app - npm run coverage -} - -case "$1" in - test) - lint_test - ;; - coveralls) - run_coveralls - ;; - coverage) - run_coverage - ;; - help) - show_help - ;; - bash ) - exec bash "${@:2}" - ;; - *) - show_help - ;; -esac diff --git a/index.js b/index.js deleted file mode 100644 index 02084c2af..000000000 --- a/index.js +++ /dev/null @@ -1,15 +0,0 @@ -var glob = require('glob') -var path = require('path') -var basePath = './build/contracts' - -module.exports = glob.sync( - path.resolve(__dirname, basePath, '*.json') -).reduce(function (contracts, file) { - var contract = require(file) - - if (contract.contract_name) { - contracts[contract.contract_name] = contract - } - - return contracts -}, {}) diff --git a/installed_contracts/zeppelin/contracts/Bounty.sol b/installed_contracts/zeppelin/contracts/Bounty.sol deleted file mode 100644 index 73e9fe07d..000000000 --- a/installed_contracts/zeppelin/contracts/Bounty.sol +++ /dev/null @@ -1,58 +0,0 @@ -pragma solidity ^0.4.8; - - -import './payment/PullPayment.sol'; -import './lifecycle/Killable.sol'; - - -/* - * Bounty - * - * This bounty will pay out to a researcher if they break invariant logic of the contract. - */ -contract Bounty is PullPayment, Killable { - bool public claimed; - mapping(address => address) public researchers; - - event TargetCreated(address createdAddress); - - function() payable { - if (claimed) { - throw; - } - } - - function createTarget() returns(Target) { - Target target = Target(deployContract()); - researchers[target] = msg.sender; - TargetCreated(target); - return target; - } - - function deployContract() internal returns(address); - - function claim(Target target) { - address researcher = researchers[target]; - if (researcher == 0) { - throw; - } - // Check Target contract invariants - if (target.checkInvariant()) { - throw; - } - asyncSend(researcher, this.balance); - claimed = true; - } - -} - - -/* - * Target - * - * Your main contract should inherit from this class and implement the checkInvariant method. This is a function that should check everything your contract assumes to be true all the time. If this function returns false, it means your contract was broken in some way and is in an inconsistent state. This is what security researchers will try to acomplish when trying to get the bounty. - */ -contract Target { - function checkInvariant() returns(bool); -} - diff --git a/installed_contracts/zeppelin/contracts/DayLimit.sol b/installed_contracts/zeppelin/contracts/DayLimit.sol deleted file mode 100644 index 6cdf983fe..000000000 --- a/installed_contracts/zeppelin/contracts/DayLimit.sol +++ /dev/null @@ -1,66 +0,0 @@ -pragma solidity ^0.4.8; - - -import './ownership/Shareable.sol'; - - -/* - * DayLimit - * - * inheritable "property" contract that enables methods to be protected by placing a linear limit (specifiable) - * on a particular resource per calendar day. is multiowned to allow the limit to be altered. resource that method - * uses is specified in the modifier. - */ -contract DayLimit { - - uint public dailyLimit; - uint public spentToday; - uint public lastDay; - - - function DayLimit(uint _limit) { - dailyLimit = _limit; - lastDay = today(); - } - - // sets the daily limit. doesn't alter the amount already spent today - function _setDailyLimit(uint _newLimit) internal { - dailyLimit = _newLimit; - } - - // resets the amount already spent today. - function _resetSpentToday() internal { - spentToday = 0; - } - - // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and - // returns true. otherwise just returns false. - function underLimit(uint _value) internal returns (bool) { - // reset the spend limit if we're on a different day to last time. - if (today() > lastDay) { - spentToday = 0; - lastDay = today(); - } - // check to see if there's enough left - if so, subtract and return true. - // overflow protection // dailyLimit check - if (spentToday + _value >= spentToday && spentToday + _value <= dailyLimit) { - spentToday += _value; - return true; - } - return false; - } - - // determines today's index. - function today() private constant returns (uint) { - return now / 1 days; - } - - - // simple modifier for daily limit. - modifier limitedDaily(uint _value) { - if (!underLimit(_value)) { - throw; - } - _; - } -} diff --git a/installed_contracts/zeppelin/contracts/LimitBalance.sol b/installed_contracts/zeppelin/contracts/LimitBalance.sol deleted file mode 100644 index 8d73eb9e9..000000000 --- a/installed_contracts/zeppelin/contracts/LimitBalance.sol +++ /dev/null @@ -1,27 +0,0 @@ -pragma solidity ^0.4.8; - - -/** - * LimitBalance - * Simple contract to limit the balance of child contract. - * Note this doesn't prevent other contracts to send funds - * by using selfdestruct(address); - * See: https://github.com/ConsenSys/smart-contract-best-practices#remember-that-ether-can-be-forcibly-sent-to-an-account - */ -contract LimitBalance { - - uint public limit; - - function LimitBalance(uint _limit) { - limit = _limit; - } - - modifier limitedPayable() { - if (this.balance > limit) { - throw; - } - _; - - } - -} diff --git a/installed_contracts/zeppelin/contracts/MultisigWallet.sol b/installed_contracts/zeppelin/contracts/MultisigWallet.sol deleted file mode 100644 index c8ed091c6..000000000 --- a/installed_contracts/zeppelin/contracts/MultisigWallet.sol +++ /dev/null @@ -1,100 +0,0 @@ -pragma solidity ^0.4.8; - - -import "./ownership/Multisig.sol"; -import "./ownership/Shareable.sol"; -import "./DayLimit.sol"; - - -/* - * MultisigWallet - * usage: - * bytes32 h = Wallet(w).from(oneOwner).execute(to, value, data); - * Wallet(w).from(anotherOwner).confirm(h); - */ -contract MultisigWallet is Multisig, Shareable, DayLimit { - - struct Transaction { - address to; - uint value; - bytes data; - } - - function MultisigWallet(address[] _owners, uint _required, uint _daylimit) - Shareable(_owners, _required) - DayLimit(_daylimit) { } - - // kills the contract sending everything to `_to`. - function kill(address _to) onlymanyowners(sha3(msg.data)) external { - suicide(_to); - } - - // gets called when no other function matches - function() payable { - // just being sent some cash? - if (msg.value > 0) - Deposit(msg.sender, msg.value); - } - - // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit. - // If not, goes into multisig process. We provide a hash on return to allow the sender to provide - // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value - // and _data arguments). They still get the option of using them if they want, anyways. - function execute(address _to, uint _value, bytes _data) external onlyOwner returns (bytes32 _r) { - // first, take the opportunity to check that we're under the daily limit. - if (underLimit(_value)) { - SingleTransact(msg.sender, _value, _to, _data); - // yes - just execute the call. - if (!_to.call.value(_value)(_data)) { - throw; - } - return 0; - } - // determine our operation hash. - _r = sha3(msg.data, block.number); - if (!confirm(_r) && txs[_r].to == 0) { - txs[_r].to = _to; - txs[_r].value = _value; - txs[_r].data = _data; - ConfirmationNeeded(_r, msg.sender, _value, _to, _data); - } - } - - // confirm a transaction through just the hash. we use the previous transactions map, txs, in order - // to determine the body of the transaction from the hash provided. - function confirm(bytes32 _h) onlymanyowners(_h) returns (bool) { - if (txs[_h].to != 0) { - if (!txs[_h].to.call.value(txs[_h].value)(txs[_h].data)) { - throw; - } - MultiTransact(msg.sender, _h, txs[_h].value, txs[_h].to, txs[_h].data); - delete txs[_h]; - return true; - } - } - - function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external { - _setDailyLimit(_newLimit); - } - - function resetSpentToday() onlymanyowners(sha3(msg.data)) external { - _resetSpentToday(); - } - - - // INTERNAL METHODS - - function clearPending() internal { - uint length = pendingsIndex.length; - for (uint i = 0; i < length; ++i) { - delete txs[pendingsIndex[i]]; - } - super.clearPending(); - } - - - // FIELDS - - // pending transactions we have at present. - mapping (bytes32 => Transaction) txs; -} diff --git a/installed_contracts/zeppelin/contracts/SafeMath.sol b/installed_contracts/zeppelin/contracts/SafeMath.sol deleted file mode 100644 index 78dc56607..000000000 --- a/installed_contracts/zeppelin/contracts/SafeMath.sol +++ /dev/null @@ -1,47 +0,0 @@ -pragma solidity ^0.4.8; - - -/** - * Math operations with safety checks - */ -contract SafeMath { - function safeMul(uint a, uint b) internal returns (uint) { - uint c = a * b; - assert(a == 0 || c / a == b); - return c; - } - - function safeDiv(uint a, uint b) internal returns (uint) { - assert(b > 0); - uint c = a / b; - assert(a == b * c + a % b); - return c; - } - - function safeSub(uint a, uint b) internal returns (uint) { - assert(b <= a); - return a - b; - } - - function safeAdd(uint a, uint b) internal returns (uint) { - uint c = a + b; - assert(c>=a && c>=b); - return c; - } - - function max64(uint64 a, uint64 b) internal constant returns (uint64) { - return a >= b ? a : b; - } - - function min64(uint64 a, uint64 b) internal constant returns (uint64) { - return a < b ? a : b; - } - - function max256(uint256 a, uint256 b) internal constant returns (uint256) { - return a >= b ? a : b; - } - - function min256(uint256 a, uint256 b) internal constant returns (uint256) { - return a < b ? a : b; - } -} diff --git a/installed_contracts/zeppelin/contracts/lifecycle/Killable.sol b/installed_contracts/zeppelin/contracts/lifecycle/Killable.sol deleted file mode 100644 index 0a1367df8..000000000 --- a/installed_contracts/zeppelin/contracts/lifecycle/Killable.sol +++ /dev/null @@ -1,15 +0,0 @@ -pragma solidity ^0.4.8; - - -import "../ownership/Ownable.sol"; - - -/* - * Killable - * Base contract that can be killed by owner. All funds in contract will be sent to the owner. - */ -contract Killable is Ownable { - function kill() onlyOwner { - selfdestruct(owner); - } -} diff --git a/installed_contracts/zeppelin/contracts/lifecycle/Migrations.sol b/installed_contracts/zeppelin/contracts/lifecycle/Migrations.sol deleted file mode 100644 index 6b1bb0ad4..000000000 --- a/installed_contracts/zeppelin/contracts/lifecycle/Migrations.sol +++ /dev/null @@ -1,18 +0,0 @@ -pragma solidity ^0.4.8; - - -import '../ownership/Ownable.sol'; - - -contract Migrations is Ownable { - uint public lastCompletedMigration; - - function setCompleted(uint completed) onlyOwner { - lastCompletedMigration = completed; - } - - function upgrade(address newAddress) onlyOwner { - Migrations upgraded = Migrations(newAddress); - upgraded.setCompleted(lastCompletedMigration); - } -} diff --git a/installed_contracts/zeppelin/contracts/lifecycle/Pausable.sol b/installed_contracts/zeppelin/contracts/lifecycle/Pausable.sol deleted file mode 100644 index 9ac044a7f..000000000 --- a/installed_contracts/zeppelin/contracts/lifecycle/Pausable.sol +++ /dev/null @@ -1,37 +0,0 @@ -pragma solidity ^0.4.8; - - -import "../ownership/Ownable.sol"; - - -/* - * Pausable - * Abstract contract that allows children to implement an - * emergency stop mechanism. - */ -contract Pausable is Ownable { - bool public stopped; - - modifier stopInEmergency { - if (!stopped) { - _; - } - } - - modifier onlyInEmergency { - if (stopped) { - _; - } - } - - // called by the owner on emergency, triggers stopped state - function emergencyStop() external onlyOwner { - stopped = true; - } - - // called by the owner on end of emergency, returns to normal state - function release() external onlyOwner onlyInEmergency { - stopped = false; - } - -} diff --git a/installed_contracts/zeppelin/contracts/ownership/Claimable.sol b/installed_contracts/zeppelin/contracts/ownership/Claimable.sol deleted file mode 100644 index a99ee5366..000000000 --- a/installed_contracts/zeppelin/contracts/ownership/Claimable.sol +++ /dev/null @@ -1,31 +0,0 @@ -pragma solidity ^0.4.0; - - -import './Ownable.sol'; - - -/* - * Claimable - * - * Extension for the Ownable contract, where the ownership needs to be claimed. This allows the new owner to accept the transfer. - */ -contract Claimable is Ownable { - address public pendingOwner; - - modifier onlyPendingOwner() { - if (msg.sender != pendingOwner) { - throw; - } - _; - } - - function transferOwnership(address newOwner) onlyOwner { - pendingOwner = newOwner; - } - - function claimOwnership() onlyPendingOwner { - owner = pendingOwner; - pendingOwner = 0x0; - } - -} diff --git a/installed_contracts/zeppelin/contracts/ownership/Contactable.sol b/installed_contracts/zeppelin/contracts/ownership/Contactable.sol deleted file mode 100644 index 4c32b749d..000000000 --- a/installed_contracts/zeppelin/contracts/ownership/Contactable.sol +++ /dev/null @@ -1,16 +0,0 @@ -pragma solidity ^0.4.0; - -import './Ownable.sol'; -/* - * Contactable token - * Basic version of a contactable contract - */ -contract Contactable is Ownable{ - - string public contactInformation; - - function setContactInformation(string info) onlyOwner{ - contactInformation = info; - } - -} diff --git a/installed_contracts/zeppelin/contracts/ownership/DelayedClaimable.sol b/installed_contracts/zeppelin/contracts/ownership/DelayedClaimable.sol deleted file mode 100644 index 349400a6b..000000000 --- a/installed_contracts/zeppelin/contracts/ownership/DelayedClaimable.sol +++ /dev/null @@ -1,32 +0,0 @@ -pragma solidity ^0.4.8; - - -import './Ownable.sol'; -import './Claimable.sol'; - - -/* - * DelayedClaimable - * Extension for the Claimable contract, where the ownership needs to be claimed before/after certain block number - */ -contract DelayedClaimable is Ownable, Claimable { - - uint public end; - uint public start; - - function setLimits(uint _start, uint _end) onlyOwner { - if (_start > _end) - throw; - end = _end; - start = _start; - } - - function claimOwnership() onlyPendingOwner { - if ((block.number > end) || (block.number < start)) - throw; - owner = pendingOwner; - pendingOwner = 0x0; - end = 0; - } - -} diff --git a/installed_contracts/zeppelin/contracts/ownership/Multisig.sol b/installed_contracts/zeppelin/contracts/ownership/Multisig.sol deleted file mode 100644 index b124b54dd..000000000 --- a/installed_contracts/zeppelin/contracts/ownership/Multisig.sol +++ /dev/null @@ -1,29 +0,0 @@ -pragma solidity ^0.4.8; - - -/* - * Multisig - * Interface contract for multisig proxy contracts; see below for docs. - */ -contract Multisig { - // EVENTS - - // logged events: - // Funds has arrived into the wallet (record how much). - event Deposit(address _from, uint value); - // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going). - event SingleTransact(address owner, uint value, address to, bytes data); - // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going). - event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data); - // Confirmation still needed for a transaction. - event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data); - - - // FUNCTIONS - - // TODO: document - function changeOwner(address _from, address _to) external; - function execute(address _to, uint _value, bytes _data) external returns (bytes32); - function confirm(bytes32 _h) returns (bool); -} - diff --git a/installed_contracts/zeppelin/contracts/ownership/Ownable.sol b/installed_contracts/zeppelin/contracts/ownership/Ownable.sol deleted file mode 100644 index 53c56a789..000000000 --- a/installed_contracts/zeppelin/contracts/ownership/Ownable.sol +++ /dev/null @@ -1,30 +0,0 @@ -pragma solidity ^0.4.8; - - -/* - * Ownable - * - * Base contract with an owner. - * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner. - */ -contract Ownable { - address public owner; - - function Ownable() { - owner = msg.sender; - } - - modifier onlyOwner() { - if (msg.sender != owner) { - throw; - } - _; - } - - function transferOwnership(address newOwner) onlyOwner { - if (newOwner != address(0)) { - owner = newOwner; - } - } - -} diff --git a/installed_contracts/zeppelin/contracts/ownership/Shareable.sol b/installed_contracts/zeppelin/contracts/ownership/Shareable.sol deleted file mode 100644 index e07516bd1..000000000 --- a/installed_contracts/zeppelin/contracts/ownership/Shareable.sol +++ /dev/null @@ -1,155 +0,0 @@ -pragma solidity ^0.4.8; - - -/* - * Shareable - * - * Based on https://github.com/ethereum/dapp-bin/blob/master/wallet/wallet.sol - * - * inheritable "property" contract that enables methods to be protected by requiring the acquiescence of either a single, or, crucially, each of a number of, designated owners. - * - * usage: - * use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by some number (specified in constructor) of the set of owners (specified in the constructor) before the interior is executed. - */ -contract Shareable { - // struct for the status of a pending operation. - struct PendingState { - uint yetNeeded; - uint ownersDone; - uint index; - } - - // the number of owners that must confirm the same operation before it is run. - uint public required; - - // list of owners - uint[256] owners; - // index on the list of owners to allow reverse lookup - mapping(uint => uint) ownerIndex; - // the ongoing operations. - mapping(bytes32 => PendingState) pendings; - bytes32[] pendingsIndex; - - - // this contract only has six types of events: it can accept a confirmation, in which case - // we record owner and operation (hash) alongside it. - event Confirmation(address owner, bytes32 operation); - event Revoke(address owner, bytes32 operation); - - - // simple single-sig function modifier. - modifier onlyOwner { - if (!isOwner(msg.sender)) { - throw; - } - _; - } - - // multi-sig function modifier: the operation must have an intrinsic hash in order - // that later attempts can be realised as the same underlying operation and - // thus count as confirmations. - modifier onlymanyowners(bytes32 _operation) { - if (confirmAndCheck(_operation)) { - _; - } - } - - // constructor is given number of sigs required to do protected "onlymanyowners" transactions - // as well as the selection of addresses capable of confirming them. - function Shareable(address[] _owners, uint _required) { - owners[1] = uint(msg.sender); - ownerIndex[uint(msg.sender)] = 1; - for (uint i = 0; i < _owners.length; ++i) { - owners[2 + i] = uint(_owners[i]); - ownerIndex[uint(_owners[i])] = 2 + i; - } - required = _required; - } - - // Revokes a prior confirmation of the given operation - function revoke(bytes32 _operation) external { - uint index = ownerIndex[uint(msg.sender)]; - // make sure they're an owner - if (index == 0) { - return; - } - uint ownerIndexBit = 2**index; - var pending = pendings[_operation]; - if (pending.ownersDone & ownerIndexBit > 0) { - pending.yetNeeded++; - pending.ownersDone -= ownerIndexBit; - Revoke(msg.sender, _operation); - } - } - - // Gets an owner by 0-indexed position (using numOwners as the count) - function getOwner(uint ownerIndex) external constant returns (address) { - return address(owners[ownerIndex + 1]); - } - - function isOwner(address _addr) constant returns (bool) { - return ownerIndex[uint(_addr)] > 0; - } - - function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) { - var pending = pendings[_operation]; - uint index = ownerIndex[uint(_owner)]; - - // make sure they're an owner - if (index == 0) { - return false; - } - - // determine the bit to set for this owner. - uint ownerIndexBit = 2**index; - return !(pending.ownersDone & ownerIndexBit == 0); - } - - function confirmAndCheck(bytes32 _operation) internal returns (bool) { - // determine what index the present sender is: - uint index = ownerIndex[uint(msg.sender)]; - // make sure they're an owner - if (index == 0) { - return; - } - - var pending = pendings[_operation]; - // if we're not yet working on this operation, switch over and reset the confirmation status. - if (pending.yetNeeded == 0) { - // reset count of confirmations needed. - pending.yetNeeded = required; - // reset which owners have confirmed (none) - set our bitmap to 0. - pending.ownersDone = 0; - pending.index = pendingsIndex.length++; - pendingsIndex[pending.index] = _operation; - } - // determine the bit to set for this owner. - uint ownerIndexBit = 2**index; - // make sure we (the message sender) haven't confirmed this operation previously. - if (pending.ownersDone & ownerIndexBit == 0) { - Confirmation(msg.sender, _operation); - // ok - check if count is enough to go ahead. - if (pending.yetNeeded <= 1) { - // enough confirmations: reset and run interior. - delete pendingsIndex[pendings[_operation].index]; - delete pendings[_operation]; - return true; - } else { - // not enough: record that this owner in particular confirmed. - pending.yetNeeded--; - pending.ownersDone |= ownerIndexBit; - } - } - } - - function clearPending() internal { - uint length = pendingsIndex.length; - for (uint i = 0; i < length; ++i) { - if (pendingsIndex[i] != 0) { - delete pendings[pendingsIndex[i]]; - } - } - delete pendingsIndex; - } - -} diff --git a/installed_contracts/zeppelin/contracts/payment/PullPayment.sol b/installed_contracts/zeppelin/contracts/payment/PullPayment.sol deleted file mode 100644 index 7a5ce3f48..000000000 --- a/installed_contracts/zeppelin/contracts/payment/PullPayment.sol +++ /dev/null @@ -1,36 +0,0 @@ -pragma solidity ^0.4.8; - - -/* - * PullPayment - * Base contract supporting async send for pull payments. - * Inherit from this contract and use asyncSend instead of send. - */ -contract PullPayment { - mapping(address => uint) public payments; - - // store sent amount as credit to be pulled, called by payer - function asyncSend(address dest, uint amount) internal { - payments[dest] += amount; - } - - // withdraw accumulated balance, called by payee - function withdrawPayments() { - address payee = msg.sender; - uint payment = payments[payee]; - - if (payment == 0) { - throw; - } - - if (this.balance < payment) { - throw; - } - - payments[payee] = 0; - - if (!payee.send(payment)) { - throw; - } - } -} diff --git a/installed_contracts/zeppelin/contracts/token/BasicToken.sol b/installed_contracts/zeppelin/contracts/token/BasicToken.sol deleted file mode 100644 index 053ba899c..000000000 --- a/installed_contracts/zeppelin/contracts/token/BasicToken.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity ^0.4.8; - - -import './ERC20Basic.sol'; -import '../SafeMath.sol'; - - -/* - * Basic token - * Basic version of StandardToken, with no allowances - */ -contract BasicToken is ERC20Basic, SafeMath { - - mapping(address => uint) balances; - - function transfer(address _to, uint _value) { - balances[msg.sender] = safeSub(balances[msg.sender], _value); - balances[_to] = safeAdd(balances[_to], _value); - Transfer(msg.sender, _to, _value); - } - - function balanceOf(address _owner) constant returns (uint balance) { - return balances[_owner]; - } - -} diff --git a/installed_contracts/zeppelin/contracts/token/CrowdsaleToken.sol b/installed_contracts/zeppelin/contracts/token/CrowdsaleToken.sol deleted file mode 100644 index c10d08808..000000000 --- a/installed_contracts/zeppelin/contracts/token/CrowdsaleToken.sol +++ /dev/null @@ -1,40 +0,0 @@ -pragma solidity ^0.4.8; - - -import "./StandardToken.sol"; - - -/* - * CrowdsaleToken - * - * Simple ERC20 Token example, with crowdsale token creation - */ -contract CrowdsaleToken is StandardToken { - - string public name = "CrowdsaleToken"; - string public symbol = "CRW"; - uint public decimals = 18; - - // 1 ether = 500 example tokens - uint PRICE = 500; - - function () payable { - createTokens(msg.sender); - } - - function createTokens(address recipient) payable { - if (msg.value == 0) { - throw; - } - - uint tokens = safeMul(msg.value, getPrice()); - - totalSupply = safeAdd(totalSupply, tokens); - balances[recipient] = safeAdd(balances[recipient], tokens); - } - - // replace this with any other price function - function getPrice() constant returns (uint result) { - return PRICE; - } -} diff --git a/installed_contracts/zeppelin/contracts/token/ERC20.sol b/installed_contracts/zeppelin/contracts/token/ERC20.sol deleted file mode 100644 index d7c0d8c28..000000000 --- a/installed_contracts/zeppelin/contracts/token/ERC20.sol +++ /dev/null @@ -1,18 +0,0 @@ -pragma solidity ^0.4.8; - - -/* - * ERC20 interface - * see https://github.com/ethereum/EIPs/issues/20 - */ -contract ERC20 { - function totalSupply() constant public returns (uint); - function balanceOf(address who) constant returns (uint); - function allowance(address owner, address spender) constant returns (uint); - - function transfer(address to, uint value) returns (bool ok); - function transferFrom(address from, address to, uint value) returns (bool ok); - function approve(address spender, uint value) returns (bool ok); - event Transfer(address indexed from, address indexed to, uint value); - event Approval(address indexed owner, address indexed spender, uint value); -} diff --git a/installed_contracts/zeppelin/contracts/token/ERC20Basic.sol b/installed_contracts/zeppelin/contracts/token/ERC20Basic.sol deleted file mode 100644 index 809addebf..000000000 --- a/installed_contracts/zeppelin/contracts/token/ERC20Basic.sol +++ /dev/null @@ -1,14 +0,0 @@ -pragma solidity ^0.4.8; - - -/* - * ERC20Basic - * Simpler version of ERC20 interface - * see https://github.com/ethereum/EIPs/issues/20 - */ -contract ERC20Basic { - uint public totalSupply; - function balanceOf(address who) constant returns (uint); - function transfer(address to, uint value); - event Transfer(address indexed from, address indexed to, uint value); -} diff --git a/installed_contracts/zeppelin/contracts/token/SimpleToken.sol b/installed_contracts/zeppelin/contracts/token/SimpleToken.sol deleted file mode 100644 index db9137ff3..000000000 --- a/installed_contracts/zeppelin/contracts/token/SimpleToken.sol +++ /dev/null @@ -1,26 +0,0 @@ -pragma solidity ^0.4.8; - - -import "./StandardToken.sol"; - - -/* - * SimpleToken - * - * Very simple ERC20 Token example, where all tokens are pre-assigned - * to the creator. Note they can later distribute these tokens - * as they wish using `transfer` and other `StandardToken` functions. - */ -contract SimpleToken is StandardToken { - - string public name = "SimpleToken"; - string public symbol = "SIM"; - uint public decimals = 18; - uint public INITIAL_SUPPLY = 10000; - - function SimpleToken() { - totalSupply = INITIAL_SUPPLY; - balances[msg.sender] = INITIAL_SUPPLY; - } - -} diff --git a/installed_contracts/zeppelin/contracts/token/StandardToken.sol b/installed_contracts/zeppelin/contracts/token/StandardToken.sol deleted file mode 100644 index dbf1bb393..000000000 --- a/installed_contracts/zeppelin/contracts/token/StandardToken.sol +++ /dev/null @@ -1,54 +0,0 @@ -pragma solidity ^0.4.8; - - -import './ERC20.sol'; -import '../SafeMath.sol'; - - -/** - * Standard ERC20 token - * - * https://github.com/ethereum/EIPs/issues/20 - * Based on code by FirstBlood: - * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol - */ -contract StandardToken is ERC20, SafeMath { - - mapping(address => uint) balances; - mapping (address => mapping (address => uint)) allowed; - - function transfer(address _to, uint _value) returns (bool success) { - balances[msg.sender] = safeSub(balances[msg.sender], _value); - balances[_to] = safeAdd(balances[_to], _value); - Transfer(msg.sender, _to, _value); - return true; - } - - function transferFrom(address _from, address _to, uint _value) returns (bool success) { - var _allowance = allowed[_from][msg.sender]; - - // Check is not needed because safeSub(_allowance, _value) will already throw if this condition is not met - // if (_value > _allowance) throw; - - balances[_to] = safeAdd(balances[_to], _value); - balances[_from] = safeSub(balances[_from], _value); - allowed[_from][msg.sender] = safeSub(_allowance, _value); - Transfer(_from, _to, _value); - return true; - } - - function balanceOf(address _owner) constant returns (uint balance) { - return balances[_owner]; - } - - function approve(address _spender, uint _value) returns (bool success) { - allowed[msg.sender][_spender] = _value; - Approval(msg.sender, _spender, _value); - return true; - } - - function allowance(address _owner, address _spender) constant returns (uint remaining) { - return allowed[_owner][_spender]; - } - -} diff --git a/installed_contracts/zeppelin/contracts/token/VestedToken.sol b/installed_contracts/zeppelin/contracts/token/VestedToken.sol deleted file mode 100644 index 15082e33d..000000000 --- a/installed_contracts/zeppelin/contracts/token/VestedToken.sol +++ /dev/null @@ -1,143 +0,0 @@ -pragma solidity ^0.4.8; - - -import "./StandardToken.sol"; - - -contract VestedToken is StandardToken { - struct TokenGrant { - address granter; - uint256 value; - uint64 cliff; - uint64 vesting; - uint64 start; - } - - mapping (address => TokenGrant[]) public grants; - - modifier canTransfer(address _sender, uint _value) { - if (_value > transferableTokens(_sender, uint64(now))) throw; - _; - } - - function transfer(address _to, uint _value) canTransfer(msg.sender, _value) returns (bool success) { - return super.transfer(_to, _value); - } - - function transferFrom(address _from, address _to, uint _value) canTransfer(_from, _value) returns (bool success) { - return super.transferFrom(_from, _to, _value); - } - - function grantVestedTokens( - address _to, - uint256 _value, - uint64 _start, - uint64 _cliff, - uint64 _vesting) { - - if (_cliff < _start) { - throw; - } - if (_vesting < _start) { - throw; - } - if (_vesting < _cliff) { - throw; - } - - - TokenGrant memory grant = TokenGrant(msg.sender, _value, _cliff, _vesting, _start); - grants[_to].push(grant); - - transfer(_to, _value); - } - - function revokeTokenGrant(address _holder, uint _grantId) { - TokenGrant storage grant = grants[_holder][_grantId]; - - if (grant.granter != msg.sender) { - throw; - } - uint256 nonVested = nonVestedTokens(grant, uint64(now)); - - // remove grant from array - delete grants[_holder][_grantId]; - grants[_holder][_grantId] = grants[_holder][grants[_holder].length - 1]; - grants[_holder].length -= 1; - - balances[msg.sender] = safeAdd(balances[msg.sender], nonVested); - balances[_holder] = safeSub(balances[_holder], nonVested); - Transfer(_holder, msg.sender, nonVested); - } - - function tokenGrantsCount(address _holder) constant returns (uint index) { - return grants[_holder].length; - } - - function tokenGrant(address _holder, uint _grantId) constant returns (address granter, uint256 value, uint256 vested, uint64 start, uint64 cliff, uint64 vesting) { - TokenGrant storage grant = grants[_holder][_grantId]; - - granter = grant.granter; - value = grant.value; - start = grant.start; - cliff = grant.cliff; - vesting = grant.vesting; - - vested = vestedTokens(grant, uint64(now)); - } - - function vestedTokens(TokenGrant storage grant, uint64 time) private constant returns (uint256) { - return calculateVestedTokens( - grant.value, - uint256(time), - uint256(grant.start), - uint256(grant.cliff), - uint256(grant.vesting) - ); - } - - function calculateVestedTokens( - uint256 tokens, - uint256 time, - uint256 start, - uint256 cliff, - uint256 vesting) constant returns (uint256 vestedTokens) - { - - if (time < cliff) { - return 0; - } - if (time > vesting) { - return tokens; - } - - uint256 cliffTokens = safeDiv(safeMul(tokens, safeSub(cliff, start)), safeSub(vesting, start)); - vestedTokens = cliffTokens; - - uint256 vestingTokens = safeSub(tokens, cliffTokens); - - vestedTokens = safeAdd(vestedTokens, safeDiv(safeMul(vestingTokens, safeSub(time, cliff)), safeSub(vesting, start))); - } - - function nonVestedTokens(TokenGrant storage grant, uint64 time) private constant returns (uint256) { - return safeSub(grant.value, vestedTokens(grant, time)); - } - - function lastTokenIsTransferableDate(address holder) constant public returns (uint64 date) { - date = uint64(now); - uint256 grantIndex = grants[holder].length; - for (uint256 i = 0; i < grantIndex; i++) { - date = max64(grants[holder][i].vesting, date); - } - } - - function transferableTokens(address holder, uint64 time) constant public returns (uint256 nonVested) { - uint256 grantIndex = grants[holder].length; - - for (uint256 i = 0; i < grantIndex; i++) { - nonVested = safeAdd(nonVested, nonVestedTokens(grants[holder][i], time)); - } - - return safeSub(balances[holder], nonVested); - } -} diff --git a/installed_contracts/zeppelin/ethpm.json b/installed_contracts/zeppelin/ethpm.json deleted file mode 100644 index 35c98b513..000000000 --- a/installed_contracts/zeppelin/ethpm.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "authors": [ - "Manuel Araoz " - ], - "license": "MIT", - "description": "Secure Smart Contract library for Solidity", - "keywords": [ - "solidity", - "ethereum", - "smart", - "contracts", - "security", - "zeppelin" - ], - "links": {}, - "sources": [ - "./contracts/Bounty.sol", - "./contracts/DayLimit.sol", - "./contracts/LimitBalance.sol", - "./contracts/MultisigWallet.sol", - "./contracts/SafeMath.sol", - "./contracts/lifecycle/Killable.sol", - "./contracts/lifecycle/Migrations.sol", - "./contracts/lifecycle/Pausable.sol", - "./contracts/ownership/Claimable.sol", - "./contracts/ownership/Contactable.sol", - "./contracts/ownership/DelayedClaimable.sol", - "./contracts/ownership/Multisig.sol", - "./contracts/ownership/Ownable.sol", - "./contracts/ownership/Shareable.sol", - "./contracts/payment/PullPayment.sol", - "./contracts/token/BasicToken.sol", - "./contracts/token/CrowdsaleToken.sol", - "./contracts/token/ERC20.sol", - "./contracts/token/ERC20Basic.sol", - "./contracts/token/SimpleToken.sol", - "./contracts/token/StandardToken.sol", - "./contracts/token/VestedToken.sol" - ], - "dependencies": {}, - "manifest_version": 1, - "package_name": "zeppelin", - "version": "1.0.4" -} \ No newline at end of file diff --git a/installed_contracts/zeppelin/lock.json b/installed_contracts/zeppelin/lock.json deleted file mode 100644 index 56680a71e..000000000 --- a/installed_contracts/zeppelin/lock.json +++ /dev/null @@ -1 +0,0 @@ -{"lockfile_version":"1","package_name":"zeppelin","meta":{"authors":["Manuel Araoz "],"license":"MIT","description":"Secure Smart Contract library for Solidity","keywords":["solidity","ethereum","smart","contracts","security","zeppelin"],"links":{}},"version":"1.0.4","contract_types":{"DayLimit":{"contract_name":"DayLimit","bytecode":"0x6060604052346100005760405160208061012983398101604052515b600081905561003564010000000061009c61003f82021704565b6002555b50610049565b6201518042045b90565b60d2806100576000396000f300606060405263ffffffff60e060020a60003504166367eeba0c811460365780636b0c932d146052578063f059cf2b14606e575b6000565b346000576040608a565b60408051918252519081900360200190f35b3460005760406090565b60408051918252519081900360200190f35b3460005760406096565b60408051918252519081900360200190f35b60005481565b60025481565b60015481565b6201518042045b905600a165627a7a72305820af92a751cebb5f8a04a8f050b843843b633c44e637475fb307e9da4e0f9ba8e90029","abi":[{"constant":true,"inputs":[],"name":"dailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"lastDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"spentToday","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_limit","type":"uint256"}],"payable":false,"type":"constructor"}]},"LimitBalance":{"contract_name":"LimitBalance","bytecode":"0x6060604052346000576040516020806100a083398101604052515b60008190555b505b6070806100306000396000f300606060405263ffffffff60e060020a600035041663a4d66daf81146022575b6000565b34600057602c603e565b60408051918252519081900360200190f35b600054815600a165627a7a723058203a5b44ce7ea45f11bbe0b7aef3f08d3f12d57e3974e85f2c122dfc69638722da0029","abi":[{"constant":true,"inputs":[],"name":"limit","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_limit","type":"uint256"}],"payable":false,"type":"constructor"}]},"MultisigWallet":{"contract_name":"MultisigWallet","abi":[{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"resetSpentToday","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"dailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"lastDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_h","type":"bytes32"}],"name":"confirm","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newLimit","type":"uint256"}],"name":"setDailyLimit","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"execute","outputs":[{"name":"_r","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"kill","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"required","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"spentToday","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"},{"name":"_daylimit","type":"uint256"}],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"SingleTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"MultiTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"ConfirmationNeeded","type":"event"}]},"Bounty":{"contract_name":"Bounty","abi":[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"researchers","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"target","type":"address"}],"name":"claim","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"withdrawPayments","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"createTarget","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"payments","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"claimed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"createdAddress","type":"address"}],"name":"TargetCreated","type":"event"}]},"Target":{"contract_name":"Target","abi":[{"constant":false,"inputs":[],"name":"checkInvariant","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"}]},"SafeMath":{"contract_name":"SafeMath","bytecode":"0x6060604052346000575b60358060166000396000f30060606040525b60005600a165627a7a723058209c738e1e5b188cfa1f8ef54a8048f46de631fdbc670990690d9416755eee53fe0029","abi":[]},"Killable":{"contract_name":"Killable","bytecode":"0x60606040525b60008054600160a060020a03191633600160a060020a03161790555b5b61014c806100316000396000f300606060405263ffffffff60e060020a60003504166341c0e1b5811461003a5780638da5cb5b14610049578063f2fde38b14610072575b610000565b346100005761004761008d565b005b34610000576100566100b9565b60408051600160a060020a039092168252519081900360200190f35b3461000057610047600160a060020a03600435166100c8565b005b60005433600160a060020a039081169116146100a857610000565b600054600160a060020a0316ff5b5b565b600054600160a060020a031681565b60005433600160a060020a039081169116146100e357610000565b600160a060020a0381161561011b576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a7230582051ab692e3d4665017b504f074df8b5ce268c5282b0fc57084169dd66c09e8acc0029","abi":[{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"}]},"Migrations":{"contract_name":"Migrations","bytecode":"0x60606040525b60008054600160a060020a03191633600160a060020a03161790555b5b610214806100316000396000f300606060405263ffffffff60e060020a6000350416630900f01081146100505780638da5cb5b1461006b578063f2fde38b14610094578063fbdbad3c146100af578063fdacd576146100ce575b610000565b3461000057610069600160a060020a03600435166100e0565b005b3461000057610078610156565b60408051600160a060020a039092168252519081900360200190f35b3461000057610069600160a060020a0360043516610165565b005b34610000576100bc6101bd565b60408051918252519081900360200190f35b34610000576100696004356101c3565b005b6000805433600160a060020a039081169116146100fc57610000565b81905080600160a060020a031663fdacd5766001546040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b156100005760325a03f115610000575050505b5b5050565b600054600160a060020a031681565b60005433600160a060020a0390811691161461018057610000565b600160a060020a038116156101b8576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b50565b60015481565b60005433600160a060020a039081169116146101de57610000565b60018190555b5b505600a165627a7a72305820c4cc5127f514026e5140957c723c1866ff467cb2a2824df850b8a9d4dccc1c650029","abi":[{"constant":false,"inputs":[{"name":"newAddress","type":"address"}],"name":"upgrade","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"lastCompletedMigration","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"completed","type":"uint256"}],"name":"setCompleted","outputs":[],"payable":false,"type":"function"}]},"Pausable":{"contract_name":"Pausable","bytecode":"0x60606040525b60008054600160a060020a03191633600160a060020a03161790555b5b61020a806100316000396000f300606060405263ffffffff60e060020a60003504166363a599a4811461005057806375f12b211461005f57806386d1a69f146100805780638da5cb5b1461008f578063f2fde38b146100b8575b610000565b346100005761005d6100d3565b005b346100005761006c610116565b604080519115158252519081900360200190f35b346100005761005d610126565b005b346100005761009c610177565b60408051600160a060020a039092168252519081900360200190f35b346100005761005d600160a060020a0360043516610186565b005b60005433600160a060020a039081169116146100ee57610000565b6000805474ff0000000000000000000000000000000000000000191660a060020a1790555b5b565b60005460a060020a900460ff1681565b60005433600160a060020a0390811691161461014157610000565b60005460a060020a900460ff1615610113576000805474ff0000000000000000000000000000000000000000191690555b5b5b5b565b600054600160a060020a031681565b60005433600160a060020a039081169116146101a157610000565b600160a060020a038116156101d9576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a7230582051a39a49a584355f3268d911815cb4c6381f1cfbe6dcb24e4f279e4a61ab74030029","abi":[{"constant":false,"inputs":[],"name":"emergencyStop","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"release","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"}]},"PullPayment":{"contract_name":"PullPayment","bytecode":"0x606060405234610000575b610118806100196000396000f300606060405263ffffffff60e060020a6000350416636103d70b8114602c578063e2982c21146038575b6000565b3460005760366060565b005b34600057604e600160a060020a036004351660da565b60408051918252519081900360200190f35b33600160a060020a0381166000908152602081905260409020548015156084576000565b8030600160a060020a03163110156099576000565b600160a060020a0382166000818152602081905260408082208290555183156108fc0291849190818181858888f19350505050151560d5576000565b5b5050565b600060208190529081526040902054815600a165627a7a72305820c017f7fa25a090e0fa4092a0dcf3fba8a595534d0b15d0b14a06caccb19bff830029","abi":[{"constant":false,"inputs":[],"name":"withdrawPayments","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"payments","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"}]},"Contactable":{"contract_name":"Contactable","bytecode":"0x60606040525b60008054600160a060020a03191633600160a060020a03161790555b5b610347806100316000396000f300606060405263ffffffff60e060020a60003504166336f7ab5e81146100455780638da5cb5b146100d2578063b967a52e146100fb578063f2fde38b14610150575b610000565b346100005761005261016b565b604080516020808252835181830152835191928392908301918501908083838215610098575b80518252602083111561009857601f199092019160209182019101610078565b505050905090810190601f1680156100c45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576100df6101f8565b60408051600160a060020a039092168252519081900360200190f35b346100005761014e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965061020795505050505050565b005b346100005761014e600160a060020a03600435166102c3565b005b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156101f05780601f106101c5576101008083540402835291602001916101f0565b820191906000526020600020905b8154815290600101906020018083116101d357829003601f168201915b505050505081565b600054600160a060020a031681565b60005433600160a060020a0390811691161461022257610000565b8060019080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061026e57805160ff191683800117855561029b565b8280016001018555821561029b579182015b8281111561029b578251825591602001919060010190610280565b5b506102bc9291505b808211156102b857600081556001016102a4565b5090565b50505b5b50565b60005433600160a060020a039081169116146102de57610000565b600160a060020a038116156102bf576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a723058204112f92e8a96ac7265951c50d239abee4f3858bbf3e6c8ad37f211050a5d7f000029","abi":[{"constant":true,"inputs":[],"name":"contactInformation","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"info","type":"string"}],"name":"setContactInformation","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"}]},"Claimable":{"contract_name":"Claimable","bytecode":"0x60606040525b60008054600160a060020a03191633600160a060020a03161790555b5b6101a4806100316000396000f300606060405263ffffffff60e060020a6000350416634e71e0c881146100455780638da5cb5b14610054578063e30c39781461007d578063f2fde38b146100a6575b610000565b34610000576100526100c1565b005b3461000057610061610112565b60408051600160a060020a039092168252519081900360200190f35b3461000057610061610121565b60408051600160a060020a039092168252519081900360200190f35b3461000057610052600160a060020a0360043516610130565b005b60015433600160a060020a039081169116146100dc57610000565b600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551690555b5b565b600054600160a060020a031681565b600154600160a060020a031681565b60005433600160a060020a0390811691161461014b57610000565b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b505600a165627a7a72305820be915b7ef672a3786065fb166cae8942971cc9b78d057079e318dc3beaf2caf00029","abi":[{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"}]},"DelayedClaimable":{"contract_name":"DelayedClaimable","bytecode":"0x60606040525b60008054600160a060020a03191633600160a060020a03161790555b5b610282806100316000396000f300606060405236156100675763ffffffff60e060020a6000350416634e71e0c8811461006c5780638da5cb5b1461007b578063be9a6555146100a4578063c4590d3f146100c3578063e30c3978146100d8578063efbe1c1c14610101578063f2fde38b14610120575b610000565b346100005761007961013b565b005b34610000576100886101ac565b60408051600160a060020a039092168252519081900360200190f35b34610000576100b16101bb565b60408051918252519081900360200190f35b34610000576100796004356024356101c1565b005b34610000576100886101f9565b60408051600160a060020a039092168252519081900360200190f35b34610000576100b1610208565b60408051918252519081900360200190f35b3461000057610079600160a060020a036004351661020e565b005b60015433600160a060020a0390811691161461015657610000565b600254431180610167575060035443105b1561017157610000565b600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a0384161782559091169091556002555b5b565b600054600160a060020a031681565b60035481565b60005433600160a060020a039081169116146101dc57610000565b808211156101e957610000565b600281905560038290555b5b5050565b600154600160a060020a031681565b60025481565b60005433600160a060020a0390811691161461022957610000565b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b505600a165627a7a72305820f9571ddb02378aff5e4c3fe6f809e73a2f15d295d49ddc6604c70b5e2464e2d40029","abi":[{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_start","type":"uint256"},{"name":"_end","type":"uint256"}],"name":"setLimits","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"end","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"}]},"Multisig":{"contract_name":"Multisig","abi":[{"constant":false,"inputs":[{"name":"_h","type":"bytes32"}],"name":"confirm","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"execute","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"SingleTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"MultiTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"ConfirmationNeeded","type":"event"}]},"Ownable":{"contract_name":"Ownable","bytecode":"0x606060405234610000575b60008054600160a060020a03191633600160a060020a03161790555b5b60fa806100356000396000f300606060405263ffffffff60e060020a6000350416638da5cb5b8114602c578063f2fde38b146052575b6000565b346000576036606a565b60408051600160a060020a039092168252519081900360200190f35b346000576068600160a060020a03600435166079565b005b600054600160a060020a031681565b60005433600160a060020a039081169116146092576000565b600160a060020a0381161560c9576000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b5b505600a165627a7a7230582012c103608a96de98da02560514aadbfed18f42b57ebfecc4f1da76c51217c1870029","abi":[{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"}]},"Shareable":{"contract_name":"Shareable","bytecode":"0x6060604052346100005760405161037038038061037083398101604052805160208201519101905b600033600160a060020a03166002825b505550600160a060020a033316600090815261010160205260408120600190555b82518110156100da57828181518110156100005790602001906020020151600160a060020a0316600182600201610100811015610000570160005b5081905550806002016101016000858481518110156100005790602001906020020151600160a060020a03168152602001908152602001600020819055505b600101610058565b60008290555b5050505b61027d806100f36000396000f300606060405263ffffffff60e060020a6000350416632f54bf6e8114610050578063b75c7dc61461007d578063c2cf73261461008f578063c41a360a146100bf578063dc8452cd146100eb575b610000565b3461000057610069600160a060020a036004351661010a565b604080519115158252519081900360200190f35b346100005761008d60043561012b565b005b3461000057610069600435600160a060020a03602435166101d6565b604080519115158252519081900360200190f35b34610000576100cf60043561022b565b60408051600160a060020a039092168252519081900360200190f35b34610000576100f861024b565b60408051918252519081900360200190f35b600160a060020a03811660009081526101016020526040812054115b919050565b600160a060020a033316600090815261010160205260408120549080821515610153576101cf565b50506000828152610102602052604081206001810154600284900a9290831611156101cf5780546001908101825581018054839003905560408051600160a060020a03331681526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a15b5b50505050565b600082815261010260209081526040808320600160a060020a03851684526101019092528220548281151561020e5760009350610222565b8160020a9050808360010154166000141593505b50505092915050565b6000600182600101610100811015610000570160005b505490505b919050565b600054815600a165627a7a7230582037eda0b13a780f1fd1f715acc4735016e5f3d5bd9a83920934894c87b156a8300029","abi":[{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"required","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"}],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"}]},"BasicToken":{"contract_name":"BasicToken","bytecode":"0x606060405234610000575b6101f3806100196000396000f300606060405263ffffffff60e060020a60003504166318160ddd811461003a57806370a0823114610059578063a9059cbb14610084575b610000565b34610000576100476100a2565b60408051918252519081900360200190f35b3461000057610047600160a060020a03600435166100a8565b60408051918252519081900360200190f35b34610000576100a0600160a060020a03600435166024356100c7565b005b60005481565b600160a060020a0381166000908152600160205260409020545b919050565b600160a060020a0333166000908152600160205260409020546100ea9082610176565b600160a060020a033381166000908152600160205260408082209390935590841681522054610119908261018f565b600160a060020a038084166000818152600160209081526040918290209490945580518581529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35b5050565b6000610184838311156101b7565b508082035b92915050565b60008282016101ac8482108015906101a75750838210155b6101b7565b8091505b5092915050565b8015156101c357610000565b5b505600a165627a7a723058205915901f41e2c0f7724085a2b208cd44095d7a1d60211a9c0d9d311c6d2626af0029","abi":[{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]},"CrowdsaleToken":{"contract_name":"CrowdsaleToken","bytecode":"0x60a0604052600e60608190527f43726f776473616c65546f6b656e00000000000000000000000000000000000060809081526003805460008290527f43726f776473616c65546f6b656e00000000000000000000000000000000001c825590927fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602060026001851615610100026000190190941693909304601f01929092048201929091906100d7565b828001600101855582156100d7579182015b828111156100d75782518255916020019190600101906100bc565b5b506100f89291505b808211156100f457600081556001016100e0565b5090565b50506040805180820190915260038082527f435257000000000000000000000000000000000000000000000000000000000060209283019081526004805460008290528251600660ff1990911617825590937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b60026001841615610100026000190190931692909204601f0104810192916101bb565b828001600101855582156101bb579182015b828111156101bb5782518255916020019190600101906101a0565b5b506101dc9291505b808211156100f457600081556001016100e0565b5090565b505060126005556101f460065534610000575b6107da806101fe6000396000f300606060405236156100935763ffffffff60e060020a60003504166306fdde0381146100a5578063095ea7b31461013257806318160ddd1461016257806323b872dd14610181578063313ce567146101b757806370a08231146101d657806395d89b411461020157806398d5fdca1461028e578063a9059cbb146102ad578063cedbbeee146102dd578063dd62ed3e146102f3575b6100a35b6100a033610324565b5b565b005b34610000576100b2610394565b6040805160208082528351818301528351919283929083019185019080838382156100f8575b8051825260208311156100f857601f1990920191602091820191016100d8565b505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b346100005761014e600160a060020a0360043516602435610422565b604080519115158252519081900360200190f35b346100005761016f61048d565b60408051918252519081900360200190f35b346100005761014e600160a060020a0360043581169060243516604435610493565b604080519115158252519081900360200190f35b346100005761016f610596565b60408051918252519081900360200190f35b346100005761016f600160a060020a036004351661059c565b60408051918252519081900360200190f35b34610000576100b26105bb565b6040805160208082528351818301528351919283929083019185019080838382156100f8575b8051825260208311156100f857601f1990920191602091820191016100d8565b505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b346100005761016f610649565b60408051918252519081900360200190f35b346100005761014e600160a060020a0360043516602435610650565b604080519115158252519081900360200190f35b6100a3600160a060020a0360043516610324565b005b346100005761016f600160a060020a0360043581169060243516610704565b60408051918252519081900360200190f35b600034151561033257610000565b6103433461033e610649565b610731565b90506103516000548261075d565b6000908155600160a060020a038316815260016020526040902054610376908261075d565b600160a060020a0383166000908152600160205260409020555b5050565b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561041a5780601f106103ef5761010080835404028352916020019161041a565b820191906000526020600020905b8154815290600101906020018083116103fd57829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60005481565b600160a060020a0380841660009081526002602090815260408083203385168452825280832054938616835260019091528120549091906104d4908461075d565b600160a060020a0380861660009081526001602052604080822093909355908716815220546105039084610785565b600160a060020a0386166000908152600160205260409020556105268184610785565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b60055481565b600160a060020a0381166000908152600160205260409020545b919050565b6004805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561041a5780601f106103ef5761010080835404028352916020019161041a565b820191906000526020600020905b8154815290600101906020018083116103fd57829003601f168201915b505050505081565b6006545b90565b600160a060020a0333166000908152600160205260408120546106739083610785565b600160a060020a0333811660009081526001602052604080822093909355908516815220546106a2908361075d565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b92915050565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b600082820261075284158061074d575083858381156100005704145b61079e565b8091505b5092915050565b600082820161075284821080159061074d5750838210155b61079e565b8091505b5092915050565b60006107938383111561079e565b508082035b92915050565b8015156107aa57610000565b5b505600a165627a7a72305820364449c6b837343efc9ac6235f9212e7da22ece6c9c559d5296a5024f3cf3b910029","abi":[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPrice","outputs":[{"name":"result","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"}],"name":"createTokens","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]},"ERC20":{"contract_name":"ERC20","abi":[{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"ok","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"ok","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]},"ERC20Basic":{"contract_name":"ERC20Basic","abi":[{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]},"SimpleToken":{"contract_name":"SimpleToken","bytecode":"0x60a0604052600b60608190527f53696d706c65546f6b656e00000000000000000000000000000000000000000060809081526003805460008290527f53696d706c65546f6b656e000000000000000000000000000000000000000016825590927fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602060026001851615610100026000190190941693909304601f01929092048201929091906100d7565b828001600101855582156100d7579182015b828111156100d75782518255916020019190600101906100bc565b5b506100f89291505b808211156100f457600081556001016100e0565b5090565b50506040805180820190915260038082527f53494d000000000000000000000000000000000000000000000000000000000060209283019081526004805460008290528251600660ff1990911617825590937f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b60026001841615610100026000190190931692909204601f0104810192916101bb565b828001600101855582156101bb579182015b828111156101bb5782518255916020019190600101906101a0565b5b506101dc9291505b808211156100f457600081556001016100e0565b5090565b5050601260055561271060065534610000575b6006546000818155600160a060020a0333168152600160205260409020555b5b61070f8061021e6000396000f300606060405236156100885763ffffffff60e060020a60003504166306fdde03811461008d578063095ea7b31461011a57806318160ddd1461014a57806323b872dd146101695780632ff2e9dc1461019f578063313ce567146101be57806370a08231146101dd57806395d89b4114610208578063a9059cbb14610295578063dd62ed3e146102c5575b610000565b346100005761009a6102f6565b6040805160208082528351818301528351919283929083019185019080838382156100e0575b8051825260208311156100e057601f1990920191602091820191016100c0565b505050905090810190601f16801561010c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3461000057610136600160a060020a0360043516602435610384565b604080519115158252519081900360200190f35b34610000576101576103ef565b60408051918252519081900360200190f35b3461000057610136600160a060020a03600435811690602435166044356103f5565b604080519115158252519081900360200190f35b34610000576101576104f8565b60408051918252519081900360200190f35b34610000576101576104fe565b60408051918252519081900360200190f35b3461000057610157600160a060020a0360043516610504565b60408051918252519081900360200190f35b346100005761009a610523565b6040805160208082528351818301528351919283929083019185019080838382156100e0575b8051825260208311156100e057601f1990920191602091820191016100c0565b505050905090810190601f16801561010c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3461000057610136600160a060020a03600435166024356105b1565b604080519115158252519081900360200190f35b3461000057610157600160a060020a0360043581169060243516610665565b60408051918252519081900360200190f35b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561037c5780601f106103515761010080835404028352916020019161037c565b820191906000526020600020905b81548152906001019060200180831161035f57829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60005481565b600160a060020a0380841660009081526002602090815260408083203385168452825280832054938616835260019091528120549091906104369084610692565b600160a060020a03808616600090815260016020526040808220939093559087168152205461046590846106ba565b600160a060020a03861660009081526001602052604090205561048881846106ba565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b60065481565b60055481565b600160a060020a0381166000908152600160205260409020545b919050565b6004805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561037c5780601f106103515761010080835404028352916020019161037c565b820191906000526020600020905b81548152906001019060200180831161035f57829003601f168201915b505050505081565b600160a060020a0333166000908152600160205260408120546105d490836106ba565b600160a060020a0333811660009081526001602052604080822093909355908516815220546106039083610692565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b92915050565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60008282016106af8482108015906106aa5750838210155b6106d3565b8091505b5092915050565b60006106c8838311156106d3565b508082035b92915050565b8015156106df57610000565b5b505600a165627a7a723058202ee84497f6e30ff7a6215ba1d3201c6bd9fd24e235c2d527087c7fa2d781c4d80029","abi":[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]},"StandardToken":{"contract_name":"StandardToken","bytecode":"0x606060405234610000575b610463806100196000396000f3006060604052361561005c5763ffffffff60e060020a600035041663095ea7b3811461006157806318160ddd1461009157806323b872dd146100b057806370a08231146100e6578063a9059cbb14610111578063dd62ed3e14610141575b610000565b346100005761007d600160a060020a0360043516602435610172565b604080519115158252519081900360200190f35b346100005761009e6101dd565b60408051918252519081900360200190f35b346100005761007d600160a060020a03600435811690602435166044356101e3565b604080519115158252519081900360200190f35b346100005761009e600160a060020a03600435166102e6565b60408051918252519081900360200190f35b346100005761007d600160a060020a0360043516602435610305565b604080519115158252519081900360200190f35b346100005761009e600160a060020a03600435811690602435166103b9565b60408051918252519081900360200190f35b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60005481565b600160a060020a03808416600090815260026020908152604080832033851684528252808320549386168352600190915281205490919061022490846103e6565b600160a060020a038086166000908152600160205260408082209390935590871681522054610253908461040e565b600160a060020a038616600090815260016020526040902055610276818461040e565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b600160a060020a0381166000908152600160205260409020545b919050565b600160a060020a033316600090815260016020526040812054610328908361040e565b600160a060020a03338116600090815260016020526040808220939093559085168152205461035790836103e6565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b92915050565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b60008282016104038482108015906103fe5750838210155b610427565b8091505b5092915050565b600061041c83831115610427565b508082035b92915050565b80151561043357610000565b5b505600a165627a7a72305820c9dd1fc2c3f3415d7ae214300fc70e3423670b54cea1e62e8134524537dc3e160029","abi":[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]},"VestedToken":{"contract_name":"VestedToken","bytecode":"0x606060405234610000575b6110ff806100196000396000f300606060405236156100b35763ffffffff60e060020a600035041662e1986d81146100b857806302a72a4c146100ef578063095ea7b31461011a57806318160ddd1461014a57806323b872dd146101695780632c71e60a1461019f578063600e85b7146101fd5780636c182e991461026257806370a0823114610298578063a9059cbb146102c3578063d347c205146102f3578063dd62ed3e1461032b578063df3c211b1461035c578063eb944e4c1461038a575b610000565b34610000576100ed600160a060020a036004351660243567ffffffffffffffff604435811690606435811690608435166103a8565b005b3461000057610108600160a060020a03600435166105b9565b60408051918252519081900360200190f35b3461000057610136600160a060020a03600435166024356105d8565b604080519115158252519081900360200190f35b3461000057610108610643565b60408051918252519081900360200190f35b3461000057610136600160a060020a0360043581169060243516604435610649565b604080519115158252519081900360200190f35b34610000576101bb600160a060020a036004351660243561067b565b60408051600160a060020a039096168652602086019490945267ffffffffffffffff928316858501529082166060850152166080830152519081900360a00190f35b3461000057610219600160a060020a03600435166024356106e5565b60408051600160a060020a03909716875260208701959095528585019390935267ffffffffffffffff9182166060860152811660808501521660a0830152519081900360c00190f35b346100005761027b600160a060020a03600435166107ba565b6040805167ffffffffffffffff9092168252519081900360200190f35b3461000057610108600160a060020a0360043516610846565b60408051918252519081900360200190f35b3461000057610136600160a060020a0360043516602435610865565b604080519115158252519081900360200190f35b3461000057610108600160a060020a036004351667ffffffffffffffff60243516610895565b60408051918252519081900360200190f35b3461000057610108600160a060020a0360043581169060243516610999565b60408051918252519081900360200190f35b34610000576101086004356024356044356064356084356109c6565b60408051918252519081900360200190f35b34610000576100ed600160a060020a0360043516602435610a5f565b005b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff84811690841610156103ed57610000565b8367ffffffffffffffff168267ffffffffffffffff16101561040e57610000565b8267ffffffffffffffff168267ffffffffffffffff16101561042f57610000565b506040805160a081018252600160a060020a033381168252602080830188905267ffffffffffffffff80871684860152858116606085015287166080840152908816600090815260039091529190912080546001810180835582818380158290116104ea576003028160030283600052602060002091820191016104ea91905b808211156104e6578054600160a060020a031916815560006001820155600281018054600160c060020a03191690556003016104af565b5090565b5b505050916000526020600020906003020160005b5082518154600160a060020a031916600160a060020a03909116178155602083015160018201556040830151600290910180546060850151608086015167ffffffffffffffff1990921667ffffffffffffffff948516176fffffffffffffffff00000000000000001916604060020a918516919091021777ffffffffffffffff000000000000000000000000000000001916608060020a9390911692909202919091179055506105af8686610865565b505b505050505050565b600160a060020a0381166000908152600360205260409020545b919050565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60005481565b600083826106578242610895565b81111561066357610000565b61066e868686610dc1565b92505b5b50509392505050565b600360205281600052604060002081815481101561000057906000526020600020906003020160005b5080546001820154600290920154600160a060020a03909116935090915067ffffffffffffffff80821691604060020a8104821691608060020a9091041685565b6000600060006000600060006000600360008a600160a060020a0316600160a060020a0316815260200190815260200160002088815481101561000057906000526020600020906003020160005b508054600182015460028301546040805160a081018252600160a060020a039094168085526020850184905267ffffffffffffffff808416928601839052604060020a8404811660608701819052608060020a9094041660808601819052909c50929a5091975090955093509091506107ac9042610ec4565b94505b509295509295509295565b600160a060020a03811660009081526003602052604081205442915b8181101561083e57600160a060020a038416600090815260036020526040902080546108339190839081101561000057906000526020600020906003020160005b5060020154604060020a900467ffffffffffffffff1684610f14565b92505b6001016107d6565b5b5050919050565b600160a060020a0381166000908152600160205260409020545b919050565b600033826108738242610895565b81111561087f57610000565b6108898585610f43565b92505b5b505092915050565b600160a060020a038216600090815260036020526040812054815b8181101561096b576109608361095b6003600089600160a060020a0316600160a060020a0316815260200190815260200160002084815481101561000057906000526020600020906003020160005b506040805160a0810182528254600160a060020a031681526001830154602082015260029092015467ffffffffffffffff80821692840192909252604060020a810482166060840152608060020a900416608082015287610ff7565b611019565b92505b6001016108b0565b600160a060020a0385166000908152600160205260409020546108899084611041565b92505b505092915050565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b600060006000848710156109dd5760009250610a54565b838711156109ed57879250610a54565b610a12610a03896109fe888a611041565b61105a565b610a0d8689611041565b611086565b9150819250610a218883611041565b9050610a518361095b610a3d846109fe8c8b611041565b61105a565b610a0d888b611041565b611086565b611019565b92505b505095945050505050565b600160a060020a03821660009081526003602052604081208054829190849081101561000057906000526020600020906003020160005b50805490925033600160a060020a03908116911614610ab457610000565b6040805160a0810182528354600160a060020a0316815260018401546020820152600284015467ffffffffffffffff80821693830193909352604060020a810483166060830152608060020a90049091166080820152610b149042610ff7565b600160a060020a0385166000908152600360205260409020805491925090849081101561000057906000526020600020906003020160005b508054600160a060020a031916815560006001820181905560029091018054600160c060020a0319169055600160a060020a0385168152600360205260409020805460001981019081101561000057906000526020600020906003020160005b50600160a060020a03851660009081526003602052604090208054859081101561000057906000526020600020906003020160005b5081548154600160a060020a031916600160a060020a03918216178255600180840154908301556002928301805493909201805467ffffffffffffffff191667ffffffffffffffff948516178082558354604060020a908190048616026fffffffffffffffff000000000000000019909116178082559254608060020a9081900490941690930277ffffffffffffffff0000000000000000000000000000000019909216919091179091558416600090815260036020526040902080546000198101808355919082908015829011610d0957600302816003028360005260206000209182019101610d0991905b808211156104e6578054600160a060020a031916815560006001820155600281018054600160c060020a03191690556003016104af565b5090565b5b505050600160a060020a033316600090815260016020526040902054610d31915082611019565b600160a060020a033381166000908152600160205260408082209390935590861681522054610d609082611041565b600160a060020a038086166000818152600160209081526040918290209490945580518581529051339093169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35b50505050565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152812054909190610e029084611019565b600160a060020a038086166000908152600160205260408082209390935590871681522054610e319084611041565b600160a060020a038616600090815260016020526040902055610e548184611041565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b6000610f0b83602001518367ffffffffffffffff16856080015167ffffffffffffffff16866040015167ffffffffffffffff16876060015167ffffffffffffffff166109c6565b90505b92915050565b60008167ffffffffffffffff168367ffffffffffffffff161015610f385781610f0b565b825b90505b92915050565b600160a060020a033316600090815260016020526040812054610f669083611041565b600160a060020a033381166000908152600160205260408082209390935590851681522054610f959083611019565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b92915050565b6000610f0b836020015161100b8585610ec4565b611041565b90505b92915050565b60008282016110368482108015906110315750838210155b6110c3565b8091505b5092915050565b600061104f838311156110c3565b508082035b92915050565b6000828202611036841580611031575083858381156100005704145b6110c3565b8091505b5092915050565b60006000611096600084116110c3565b82848115610000570490506110368385811561000057068285020185146110c3565b8091505b5092915050565b8015156110cf57610000565b5b505600a165627a7a72305820c45efc3607ba7648b29c688c9499d2ca68bcf32a88396a48cd937cc83ef1e1ff0029","abi":[{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_start","type":"uint64"},{"name":"_cliff","type":"uint64"},{"name":"_vesting","type":"uint64"}],"name":"grantVestedTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"}],"name":"tokenGrantsCount","outputs":[{"name":"index","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"grants","outputs":[{"name":"granter","type":"address"},{"name":"value","type":"uint256"},{"name":"cliff","type":"uint64"},{"name":"vesting","type":"uint64"},{"name":"start","type":"uint64"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"},{"name":"_grantId","type":"uint256"}],"name":"tokenGrant","outputs":[{"name":"granter","type":"address"},{"name":"value","type":"uint256"},{"name":"vested","type":"uint256"},{"name":"start","type":"uint64"},{"name":"cliff","type":"uint64"},{"name":"vesting","type":"uint64"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"lastTokenIsTransferableDate","outputs":[{"name":"date","type":"uint64"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"},{"name":"time","type":"uint64"}],"name":"transferableTokens","outputs":[{"name":"nonVested","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"tokens","type":"uint256"},{"name":"time","type":"uint256"},{"name":"start","type":"uint256"},{"name":"cliff","type":"uint256"},{"name":"vesting","type":"uint256"}],"name":"calculateVestedTokens","outputs":[{"name":"vestedTokens","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_holder","type":"address"},{"name":"_grantId","type":"uint256"}],"name":"revokeTokenGrant","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]}},"deployments":{},"sources":{"./contracts/Bounty.sol":"ipfs://QmYt6ZfD1VNmKp85TeteEcsgaxHzP2gTSKupHxHMVgcHYb","./contracts/DayLimit.sol":"ipfs://QmexsaiGwyqruHyQic2KzWQDgZAFv4qB3MArgahW4WDjbT","./contracts/LimitBalance.sol":"ipfs://QmNjUFMzELfeVGEfvUZyzeRejmgiUnQYMNKfvNrkWm9Ao6","./contracts/MultisigWallet.sol":"ipfs://QmdNBzE44sDjTTaYzx6hUZypTBzcQProoBKF7DhhBLUbct","./contracts/SafeMath.sol":"ipfs://QmZKiNfFJRAd8K41pfAQxfY13kXjHCTv4Do2XgxTmY3muR","./contracts/lifecycle/Killable.sol":"ipfs://QmakG7GAR7hssgL7Csf83jbCB3FpKGGgLR4U9YmNn1C6cQ","./contracts/lifecycle/Migrations.sol":"ipfs://QmT7pw3vVMsD5mEiSyDkF7N9CrJ6HYSnwbfKS2yohSCecM","./contracts/lifecycle/Pausable.sol":"ipfs://QmPrzzPryn9JUNK4SJjX38JXvaYkq1KVjoV1FGHKwW1W4Z","./contracts/ownership/Claimable.sol":"ipfs://QmdbysHy6wocC8z5FuVA8hmVeGV32kbQSLKfNE8uNSA8DC","./contracts/ownership/Contactable.sol":"ipfs://QmRtSm3QhpVy9txT7YivY9ysgktzT4gxdjmTechhAsw3zD","./contracts/ownership/DelayedClaimable.sol":"ipfs://QmfY8nVBokMFTpfZ7crg2N3xnUM7ZhBDEL4M3idPGmmpMo","./contracts/ownership/Multisig.sol":"ipfs://QmbSumFuK281AdeekRHMUo8UcfmwowHSLNzKU7ykjBVoop","./contracts/ownership/Ownable.sol":"ipfs://QmYDvUXHxVbDRzG9r7Eb5dfLUeSftTt4UZ2r1JzGVkCbaH","./contracts/ownership/Shareable.sol":"ipfs://QmScDRoiu4MqVguqwTEqA45rRXQR1q9ogbeX2kLYgbj5DY","./contracts/payment/PullPayment.sol":"ipfs://QmSUtQXokkw7D6ona6KL8iJhC8yve5KPwhgMM4Li9EG1Kx","./contracts/token/BasicToken.sol":"ipfs://QmVMMpdu5E3x81n6jV64maioTkqCPaUXsXGX1qEaTJJkZn","./contracts/token/CrowdsaleToken.sol":"ipfs://QmWKR6vV3vvhWMffsqQFfz5BkqTaezZXixVeiBfp8SDhPw","./contracts/token/ERC20.sol":"ipfs://QmTuf7A4WiwiJSiZost1z9wF8QfWP5L6kNwMeUb7rUHqZ9","./contracts/token/ERC20Basic.sol":"ipfs://QmZz2HeBciA5B5ftsH2CZTtRpoDFvEmcWHVTSnp74cwcCf","./contracts/token/SimpleToken.sol":"ipfs://QmWJHRZa6pcg8rc6JQ7qhVWiCCKM4pAL2G3ZwFr2cvQeMe","./contracts/token/StandardToken.sol":"ipfs://QmWXbwiDHmrkF2RNNs2446z6KexhL4iyBDBHmWjvMSEBGs","./contracts/token/VestedToken.sol":"ipfs://QmNWLfTYi9J7H4mw68NoKjgDsWLA9SguowUSRJxTZ5bWB6"},"build_dependencies":{}} \ No newline at end of file diff --git a/installed_contracts/zeppelin/lock.uri b/installed_contracts/zeppelin/lock.uri deleted file mode 100644 index 6ee1799c4..000000000 --- a/installed_contracts/zeppelin/lock.uri +++ /dev/null @@ -1 +0,0 @@ -ipfs://Qmas6SZ4tXFfcrxSobqmETkGSzNzPEoqfmTztksKT3oY19 \ No newline at end of file diff --git a/migrations/2_apm.js b/migrations/2_apm.js new file mode 100644 index 000000000..e90347a95 --- /dev/null +++ b/migrations/2_apm.js @@ -0,0 +1,28 @@ +const namehash = require('eth-ens-namehash').hash +const keccak256 = require('js-sha3').keccak_256 + +const getContract = name => artifacts.require(name) + +const bases = ['APMRegistry', 'Repo', 'ENSSubdomainRegistrar'] +const baseContracts = bases.map(getContract) + +module.exports = async (deployer, network, accounts) => { + await deployer.deploy(baseContracts) + + const baseDeployed = baseContracts.map(c => c.address) + + // TODO: Take into account networks with ENS deployed + const ENSFactory = getContract('ENSFactory') + await deployer.deploy(ENSFactory) + + const APMRegistryFactory = getContract('APMRegistryFactory') + const ensAddr = '0x0' // so ensfactory creates one + + await deployer.deploy(APMRegistryFactory, ...baseDeployed, ensAddr, ENSFactory.address) + const factory = await APMRegistryFactory.deployed() + + console.log('Deploying APM...') + const receipt = await factory.newAPM(namehash('eth'), '0x'+keccak256('aragonpm'), accounts[0]) + const apmAddr = receipt.logs.filter(l => l.event == 'DeployAPM')[0].args.apm + console.log('Deployed APM at:', apmAddr) +} diff --git a/migrations/2_factory.js b/migrations/2_factory.js deleted file mode 100644 index cf33e0da8..000000000 --- a/migrations/2_factory.js +++ /dev/null @@ -1,24 +0,0 @@ -const BasicFactory = artifacts.require('BasicFactory') -const ForwarderFactory = artifacts.require('ForwarderFactory') -const Kernel = artifacts.require('Kernel') - -const getContract = x => artifacts.require(x) - -const liveNetworks = ['kovan', 'ropsten'] -const firstInstalls = ['ForwarderFactory', 'MetaOrgan'].map(getContract) -const normalInstall = ['VaultOrgan', 'ActionsOrgan', 'BylawsApp', 'OwnershipApp', 'StatusApp', 'VotingApp'].map(getContract) - -module.exports = (deployer, network) => { - const isLive = liveNetworks.indexOf(network) > -1 - - deployer.deploy(firstInstalls.concat(normalInstall)) - .then(() => deployer.deploy(Kernel, firstInstalls[1].address)) - .then(() => { - const parameters = [Kernel].concat(firstInstalls).concat(normalInstall) - const deployAddrs = parameters.map(x => x.address) - return deployer.deploy.apply(deployer, [BasicFactory].concat(deployAddrs)) - }) - .then(() => { - return BasicFactory.at(BasicFactory.address).create('Test Token', 'TST', !isLive).then(x => console.log('[test] Deployed DAO', x.logs[0].args.dao, 'gas:', x.receipt.gasUsed)) - }) -} diff --git a/migrations/3_factory.js b/migrations/3_factory.js new file mode 100644 index 000000000..1830c0220 --- /dev/null +++ b/migrations/3_factory.js @@ -0,0 +1,7 @@ +const Kernel = artifacts.require('Kernel') +const KernelProxy = artifacts.require('KernelProxy') + +module.exports = async (deployer, network) => { + deployer.deploy(Kernel) + deployer.deploy(KernelProxy, Kernel.address) +} diff --git a/migrations/4_links.js b/migrations/4_links.js new file mode 100644 index 000000000..434a9074b --- /dev/null +++ b/migrations/4_links.js @@ -0,0 +1,7 @@ +const ScriptHelpers = artifacts.require('ScriptHelpers') +const EVMScriptRegistryFactory = artifacts.require('EVMScriptRegistryFactory') + +module.exports = async (deployer, network) => { + deployer.deploy(ScriptHelpers) + deployer.link(ScriptHelpers, EVMScriptRegistryFactory) +} diff --git a/migrations_dao/1_initial_migration.js b/migrations_dao/1_initial_migration.js deleted file mode 100644 index adf69d172..000000000 --- a/migrations_dao/1_initial_migration.js +++ /dev/null @@ -1,5 +0,0 @@ -const Migrations = artifacts.require('Migrations.sol') - -module.exports = (deployer) => { - deployer.deploy(Migrations) -} diff --git a/migrations_dao/2_deploy_dao.js b/migrations_dao/2_deploy_dao.js deleted file mode 100644 index b68d979a6..000000000 --- a/migrations_dao/2_deploy_dao.js +++ /dev/null @@ -1,58 +0,0 @@ -var DAO = artifacts.require('DAO') -var Kernel = artifacts.require('Kernel') -var MetaOrgan = artifacts.require('MetaOrgan') -var ActionsOrgan = artifacts.require('ActionsOrgan') -var VaultOrgan = artifacts.require('VaultOrgan') -var IOrgan = artifacts.require('IOrgan') - -const organs = [MetaOrgan, VaultOrgan, ActionsOrgan] - -const { getNonce, signatures } = require('../test/helpers/web3') - -const liveNetworks = ['kovan', 'ropsten'] - -module.exports = (deployer, network) => { - let dao, meta = {} - - const isLive = liveNetworks.indexOf(network) > -1 - - return deployer - .then(() => deployer.deploy(MetaOrgan)) - .then(m => { - meta = MetaOrgan.at(MetaOrgan.address) - - return deployer.deploy(Kernel, meta.address) - }) - .then(k => { - console.log('deploying DAO with Kernel', Kernel.address) - return deployer.deploy(DAO, Kernel.address) - .then(() => { - dao = MetaOrgan.at(DAO.address) - - const firstOrgan = 3 - let nonce = 0 - - const installOrgan = (organ, i) => { - const sigs = signatures(organ, [IOrgan], web3) - console.log('Installing', organ.constructor._json.contract_name, organ.address, 'for sigs', sigs.join(',')) - - nonce += 1 - - const params = isLive ? { nonce } : {} - return dao.installOrgan(organ.address, sigs, params) - } - - return getNonce(web3).then(x => { - nonce = x - 1 - const installOrgans = Promise.all(organs.map((organ, i) => { - nonce += 1 - - const params = isLive ? { nonce } : {} - return organ.new(params) - })) - .then(x => Promise.all(x.map(installOrgan))) - return installOrgans - }) - }) - }) -} diff --git a/migrations_dao/3_install_apps.js b/migrations_dao/3_install_apps.js deleted file mode 100644 index 0539c2375..000000000 --- a/migrations_dao/3_install_apps.js +++ /dev/null @@ -1,59 +0,0 @@ -var DAO = artifacts.require('DAO') -var MetaOrgan = artifacts.require('MetaOrgan') -var Application = artifacts.require('Application') - -const appNames = ['BylawsApp', 'OwnershipApp', 'VotingApp', 'StatusApp'] - -let nonce = 0 -const { getNonce, signatures } = require('../test/helpers/web3') - -const liveNetworks = ['kovan', 'ropsten'] - -module.exports = (deployer, network) => { - let dao, meta = {} - let bylawsAddress = '' - - const isLive = liveNetworks.indexOf(network) > -1 - - const installApp = (app, i) => { - nonce += 1 - - const params = isLive ? { nonce } : {} - const sigs = signatures(app, [Application], web3) - - console.log('Installing app', app.constructor._json.contract_name, app.address) - return meta.installApp(app.address, sigs, params) - } - - const deployApps = daoAddress => { - const appsDeploy = appNames - .map(n => artifacts.require(n)) - .map((appContract, i) => { - nonce += 1 - const params = isLive ? { nonce } : {} - return appContract.new(daoAddress, params) - }) - - return Promise.all(appsDeploy) - } - - return deployer - .then(() => DAO.deployed()) - .then(d => { - dao = d - meta = MetaOrgan.at(dao.address) - return getNonce(web3) - }) - .then(x => { - nonce = x - 1 - return deployApps(dao.address, x) - }) - .then(deployedApps => { - bylawsAddress = deployedApps[0].address - return Promise.all(deployedApps.map((x, i) => installApp(x, i, appNames.length + nonce))) - }) - .then(() => { - console.log('Setting BylawsApp as DAO permissions oracle') - return meta.setPermissionsOracle(bylawsAddress) - }) -} diff --git a/migrations_dao/4_basic_setup.js b/migrations_dao/4_basic_setup.js deleted file mode 100644 index 86ea13c79..000000000 --- a/migrations_dao/4_basic_setup.js +++ /dev/null @@ -1,23 +0,0 @@ -var DAO = artifacts.require('DAO') -var OwnershipApp = artifacts.require('OwnershipApp') -var BylawsApp = artifacts.require('BylawsApp') -var MiniMeToken = artifacts.require('MiniMeToken') - -module.exports = (deployer) => { - let dao, token = {} - - return deployer - .then(() => DAO.deployed()) - .then(d => { - dao = d - return MiniMeToken.new('0x0', '0x0', 0, 'TT', 18, '', true) - }) - .then(t => { - token = t - return token.changeController(dao.address) - }) - .then(() => { - console.log('Adding DAO gov token', token.address) - return OwnershipApp.at(dao.address).addToken(token.address, 0, 1, 1) - }) -} diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json deleted file mode 100644 index 13007fab5..000000000 --- a/npm-shrinkwrap.json +++ /dev/null @@ -1,11032 +0,0 @@ -{ - "name": "aragon-core", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", - "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11" - } - }, - "aproba": { - "version": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", - "integrity": "sha1-RcZikJTeTpb2k+9+q3SuB5wkD8E=" - }, - "are-we-there-yet": { - "version": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "async": { - "version": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha1-hDGQ/WtzV6C54clW7d3V7IRitU0=", - "dev": true, - "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "asynckit": { - "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "aws-sign2": { - "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true - }, - "babel-code-frame": { - "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "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": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-explode-assignable-expression": { - "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": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-function-name": { - "version": "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": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-get-function-arity": { - "version": "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": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-helper-remap-async-to-generator": { - "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": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-messages": { - "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "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 - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "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 - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "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 - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "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.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "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.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz", - "integrity": "sha1-h11ryb52HFiirj/u5dxIldjH+SE=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz" - } - }, - "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "requires": { - "babel-runtime": "6.25.0", - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - }, - "dependencies": { - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-define-map": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.24.1", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", - "dev": true, - "requires": { - "regenerator-transform": "0.9.11" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "dev": true, - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "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 - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "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 - }, - "regenerator-transform": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "private": "0.1.7" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "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 - }, - "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 - } - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.23.0" - } - }, - "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", - "dev": true, - "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.25.0", - "core-js": "2.4.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - } - }, - "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "dev": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "dev": true, - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "dev": true, - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "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 - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "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 - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-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 - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "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 - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "dev": true, - "requires": { - "source-map": "0.5.6" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "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 - }, - "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 - }, - "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 - } - } - }, - "babel-runtime": { - "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", - "dev": true, - "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" - } - }, - "babel-template": { - "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } - }, - "babel-traverse": { - "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "dev": true, - "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", - "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } - }, - "babel-types": { - "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } - }, - "babylon": { - "version": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha1-Pot0AriNIsNCPhN6FXeIOxX/hpo=", - "dev": true - }, - "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - } - }, - "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", - "dev": true - }, - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" - }, - "binary-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=" - }, - "bindings": { - "version": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" - }, - "bip66": { - "version": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, - "bl": { - "version": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" - } - }, - "bn.js": { - "version": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "integrity": "sha1-3bBI5Q2UgnkAlME+s/z8gzznq0Y=" - }, - "boom": { - "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - } - }, - "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "requires": { - "buffer-xor": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "browserify-des": "1.0.0", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "des.js": "1.0.0", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "browserify-rsa": { - "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": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "browserify-sha3": { - "version": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", - "requires": { - "js-sha3": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "browserify-rsa": "4.0.1", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "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.9" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } - }, - "buffer-xor": { - "version": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "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 - }, - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - }, - "dependencies": { - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "1.3.0", - "async-each": "1.0.1", - "fsevents": "1.1.2", - "glob-parent": "2.0.0", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "readdirp": "2.1.0" - } - }, - "chownr": { - "version": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" - }, - "cipher-base": { - "version": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "integrity": "sha1-7qvxlEGc6QDaMBjCB9IS8qbfCgc=", - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" - } - }, - "co": { - "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "requires": { - "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - } - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - }, - "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "console-control-strings": { - "version": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", - "dev": true - }, - "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "coveralls": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", - "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", - "dev": true, - "requires": { - "js-yaml": "3.6.1", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.79.0" - }, - "dependencies": { - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "commander": "2.11.0", - "is-my-json-valid": "2.16.0", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", - "dev": true - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", - "dev": true, - "requires": { - "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "caseless": "0.11.0", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "har-validator": "2.0.6", - "hawk": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "qs": "6.3.2", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "uuid": "3.1.0" - } - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true - } - } - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz" - } - }, - "create-hash": { - "version": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" - } - }, - "create-hmac": { - "version": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" - } - }, - "cryptiles": { - "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" - } - }, - "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "diffie-hellman": "5.0.2", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "public-encrypt": "4.0.0", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "crypto-js": { - "version": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.24" - } - }, - "dashdash": { - "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=", - "dev": true - }, - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", - "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" - } - }, - "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-extend": { - "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "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 - }, - "delayed-stream": { - "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "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": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" - } - }, - "diff": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", - "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "miller-rabin": "4.0.0", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "drbg.js": { - "version": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz" - } - }, - "ecc-jsbn": { - "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - } - }, - "elliptic": { - "version": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "hmac-drbg": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "end-of-stream": { - "version": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - } - }, - "enhanced-resolve": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", - "integrity": "sha512-2qbxE7ek3YxPJ1ML6V+satHkzHpJQKWkRHmRx6mfAoW59yP8YH8BFplbegSP+u2hBd6B6KCOpvJQ3dZAP+hkpg==", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "memory-fs": "0.4.1", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "tapable": "0.2.7" - } - }, - "errno": { - "version": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true, - "requires": { - "prr": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" - }, - "dependencies": { - "prr": { - "version": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - } - } - }, - "error-ex": { - "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - } - }, - "es5-ext": { - "version": "0.10.24", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.24.tgz", - "integrity": "sha1-pVh3yZJLwMjZvTwsvhdJWsFwmxQ=", - "dev": true, - "requires": { - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24", - "es6-iterator": "2.0.1", - "es6-symbol": "3.1.1" - } - }, - "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" - }, - "dependencies": { - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "source-map": { - "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": "1.0.1" - } - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } - } - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "ethereumjs-abi": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.4.tgz", - "integrity": "sha1-m6G7BWSS0AwnJ59uzNTVgnWRLBo=", - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "ethereumjs-util": "4.5.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "keccakjs": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "rlp": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", - "secp256k1": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz" - } - } - } - }, - "ethereumjs-testrpc": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ethereumjs-testrpc/-/ethereumjs-testrpc-4.0.1.tgz", - "integrity": "sha1-ryO6v/TDYAhBi8beTID4FgaJbK0=", - "dev": true, - "requires": { - "webpack": "3.3.0" - } - }, - "ethereumjs-testrpc-sc": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-4.0.1.tgz", - "integrity": "sha512-hDyY7q6sqqYP9PMIa/5R5jnj9Ybc3LlACWM3qgX873CcjxBRit/cdsUApVVLDRNTA6XE1os04NqaJ5NbQJu+AQ==", - "dev": true, - "requires": { - "webpack": "3.3.0" - } - }, - "ethereumjs-util": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.2.tgz", - "integrity": "sha1-JboCFcu0wvCxCKb5avKi5i5Fkh8=", - "requires": { - "babel-preset-es2015": "6.24.1", - "babelify": "7.3.0", - "bn.js": "4.11.7", - "create-hash": "1.1.3", - "ethjs-util": "0.1.4", - "keccak": "1.3.0", - "rlp": "2.0.0", - "secp256k1": "3.3.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "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=" - }, - "aproba": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", - "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==" - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - } - }, - "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - } - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-define-map": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "6.24.1", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", - "requires": { - "regenerator-transform": "0.9.11" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1" - } - }, - "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", - "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.25.0", - "core-js": "2.4.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - } - }, - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "requires": { - "babel-runtime": "6.25.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "6.25.0", - "object-assign": "4.1.1" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bindings": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "bn.js": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==" - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "inherits": "2.0.3" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "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=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" - }, - "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=" - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "2.0.1" - } - }, - "drbg.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", - "requires": { - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "create-hmac": "1.1.6" - } - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "requires": { - "once": "1.4.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "ethjs-util": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.4.tgz", - "integrity": "sha1-HItoeSV0RO9NPz+7rC3tEs2ZfZM=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "requires": { - "create-hash": "1.1.3" - } - }, - "expand-template": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.0.3.tgz", - "integrity": "sha1-bDAzIxd6YrGyLAcCefeGEoe2mxo=" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.1.2", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "requires": { - "loose-envify": "1.3.1" - } - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "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=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "keccak": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.3.0.tgz", - "integrity": "sha512-JgsKPxYhcJxKrV+TrCyg/GwZbOjhpRPrz2kG8xbAsUaIDelUlKjm08YcwBO9Fm8sqf/Kg8ZWkk6nWujhLykfvw==", - "requires": { - "bindings": "1.3.0", - "inherits": "2.0.3", - "nan": "2.6.2", - "prebuild-install": "2.2.1", - "safe-buffer": "5.1.1" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" - }, - "node-abi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.1.0.tgz", - "integrity": "sha512-AbW35CPRE4vdieOse46V+16dKispLNv3PQwgqlcfg7GQeQHcLu3gvp3fbU2gTh7d8NfGjp5CJh+j4Hpyb0XzaA==" - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "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=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "prebuild-install": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.2.1.tgz", - "integrity": "sha512-y/sgNJ49vjXQ3qYdSI/jTRZq6D7g5Q2euK6x0/L8dvwK1EGvNLidtg2t4PZzTgkR6LahkzpYVshOmHKYtp0AlQ==", - "requires": { - "expand-template": "1.0.3", - "github-from-package": "0.0.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "node-abi": "2.1.0", - "noop-logger": "0.1.1", - "npmlog": "4.1.2", - "os-homedir": "1.0.2", - "pump": "1.0.2", - "rc": "1.2.1", - "simple-get": "1.4.3", - "tar-fs": "1.15.3", - "tunnel-agent": "0.6.0", - "xtend": "4.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "pump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", - "requires": { - "end-of-stream": "1.4.0", - "once": "1.4.0" - } - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "regenerator-transform": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "private": "0.1.7" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - } - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "1.0.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "rlp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", - "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "secp256k1": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz", - "integrity": "sha512-CbrQoeGG5V0kQ1ohEMGI+J7oKerapLTpivLICBaXR0R4HyQcN3kM9itLsV5fdpV1UR1bD14tOkJ1xughmlDIiQ==", - "requires": { - "bindings": "1.3.0", - "bip66": "1.1.5", - "bn.js": "4.11.7", - "create-hash": "1.1.3", - "drbg.js": "1.0.1", - "elliptic": "6.4.0", - "nan": "2.6.2", - "prebuild-install": "2.2.1", - "safe-buffer": "5.1.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "requires": { - "inherits": "2.0.3" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-get": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", - "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", - "requires": { - "once": "1.4.0", - "unzip-response": "1.0.2", - "xtend": "4.0.1" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "requires": { - "source-map": "0.5.6" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "tar-fs": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.3.tgz", - "integrity": "sha1-7M+TXpQUk9gVECjmNuUc5MPKfyA=", - "requires": { - "chownr": "1.0.1", - "mkdirp": "0.5.1", - "pump": "1.0.2", - "tar-stream": "1.5.4" - } - }, - "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "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=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "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=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - } - } - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.24" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "requires": { - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "2.2.3" - } - }, - "expand-template": { - "version": "https://registry.npmjs.org/expand-template/-/expand-template-1.0.3.tgz", - "integrity": "sha1-bDAzIxd6YrGyLAcCefeGEoe2mxo=" - }, - "extend": { - "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "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 - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "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=", - "requires": { - "for-in": "1.0.2" - } - }, - "forever-agent": { - "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz" - } - }, - "fs-extra": { - "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" - } - }, - "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "optional": true, - "requires": { - "nan": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "optional": true - } - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - } - } - }, - "gauge": { - "version": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", - "console-control-strings": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "has-unicode": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wide-align": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "1.0.2" - } - }, - "get-caller-file": { - "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" - }, - "getpass": { - "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "github-from-package": { - "version": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true, - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", - "dev": true - }, - "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" - }, - "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "dev": true, - "requires": { - "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "optimist": "0.6.1", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-js": "2.8.29" - } - }, - "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-unicode": { - "version": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hash-base": { - "version": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "hash.js": { - "version": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" - } - }, - "hawk": { - "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "sntp": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" - } - }, - "hmac-drbg": { - "version": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "minimalistic-assert": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "minimalistic-crypto-utils": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - } - }, - "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "hosted-git-info": { - "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=" - }, - "http-signature": { - "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "jsprim": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, - "invariant": { - "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" - } - }, - "invert-kv": { - "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-arrayish": { - "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "1.8.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" - }, - "is-builtin-module": { - "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "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=", - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true, - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "3.2.2" - } - }, - "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=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-typedarray": { - "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-utf8": { - "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } - }, - "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "dev": true, - "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.10", - "js-yaml": "3.9.1", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.2.14", - "wordwrap": "1.0.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" - } - } - }, - "js-sha3": { - "version": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" - }, - "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", - "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - } - } - }, - "jsbn": { - "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-loader": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz", - "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", - "dev": true - }, - "json-schema": { - "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "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 - }, - "json-stable-stringify": { - "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" - } - }, - "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - } - }, - "jsonify": { - "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "verror": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "keccakjs": { - "version": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", - "requires": { - "browserify-sha3": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "sha3": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz" - } - }, - "keybase-eth": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/keybase-eth/-/keybase-eth-0.3.6.tgz", - "integrity": "sha1-PweExkO+x4yDIdjgOR8a9/JP+Dk=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.5" - } - }, - "klaw": { - "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" - } - }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "levn": { - "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" - } - }, - "load-json-file": { - "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.1.3", - "emojis-list": "2.1.0", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true, - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" - } - }, - "memorystream": { - "version": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.3" - } - }, - "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "brorand": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - } - }, - "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true - }, - "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "dev": true, - "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz" - } - }, - "minimalistic-assert": { - "version": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "minimalistic-crypto-utils": { - "version": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" - } - }, - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - }, - "mocha": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", - "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", - "requires": { - "commander": "2.3.0", - "debug": "2.2.0", - "diff": "1.4.0", - "escape-string-regexp": "1.0.2", - "glob": "3.2.11", - "growl": "1.9.2", - "jade": "0.26.3", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "supports-color": "1.2.0", - "to-iso-string": "0.0.2" - }, - "dependencies": { - "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "requires": { - "ms": "0.7.1" - } - }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" - }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "0.3.0" - } - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" - }, - "supports-color": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", - "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" - } - } - }, - "mocha-lcov-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", - "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", - "dev": true - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "nan": { - "version": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" - }, - "node-abi": { - "version": "https://registry.npmjs.org/node-abi/-/node-abi-2.0.3.tgz", - "integrity": "sha1-DKZ+XmZ7jhNDVJyhcVOoFdC7/ao=" - }, - "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "querystring-es3": "0.2.1", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.2", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "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 - } - } - }, - "noop-logger": { - "version": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "nopt": { - "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.0.9" - } - }, - "normalize-package-data": { - "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.0.2" - } - }, - "npmlog": { - "version": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "requires": { - "are-we-there-yet": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "console-control-strings": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "gauge": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - } - }, - "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true - }, - "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "wordwrap": "1.0.0" - } - }, - "optionator": { - "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.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "original-require": { - "version": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=" - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", - "dev": true - }, - "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" - } - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "1.1.0" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "evp_bytestokey": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "pbkdf2": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-type": { - "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "pbkdf2": { - "version": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", - "dev": true, - "requires": { - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "create-hmac": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "ripemd160": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "sha.js": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" - } - }, - "pegjs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" - }, - "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } - }, - "prebuild-install": { - "version": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.1.2.tgz", - "integrity": "sha1-2a4MqFMw4Dli2TKS+VqLRMLr9QU=", - "requires": { - "expand-template": "https://registry.npmjs.org/expand-template/-/expand-template-1.0.3.tgz", - "github-from-package": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "node-abi": "https://registry.npmjs.org/node-abi/-/node-abi-2.0.3.tgz", - "noop-logger": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "npmlog": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "pump": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "rc": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "simple-get": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", - "tar-fs": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.3.tgz", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - }, - "dependencies": { - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "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 - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "process-nextick-args": { - "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "browserify-rsa": "4.0.1", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "parse-asn1": "5.1.0", - "randombytes": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" - } - }, - "pump": { - "version": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", - "requires": { - "end-of-stream": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - } - }, - "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha1-3ACaJGuNCaF3tLegrne8Vw9LG3k=", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, - "rc": { - "version": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "ini": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - }, - "dependencies": { - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "read-pkg": { - "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - } - }, - "read-pkg-up": { - "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" - } - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "set-immediate-shim": "1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.4.0" - }, - "dependencies": { - "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 - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - } - } - }, - "regenerator-runtime": { - "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } - }, - "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "req-cwd": { - "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" - } - }, - "req-from": { - "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" - } - }, - "require-directory": { - "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - }, - "require-main-filename": { - "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "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 - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" - } - }, - "ripemd160": { - "version": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "rlp": { - "version": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", - "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=" - }, - "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" - }, - "secp256k1": { - "version": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz", - "integrity": "sha1-UOybIBukAUA90TzL8h0x7rP/Q88=", - "requires": { - "bindings": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "bip66": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "bn.js": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "create-hash": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "drbg.js": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", - "elliptic": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "nan": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "prebuild-install": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.1.2.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - }, - "set-blocking": { - "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "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=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - }, - "sha3": { - "version": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", - "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", - "requires": { - "nan": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz" - } - }, - "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.1.2", - "interpret": "1.0.3", - "rechoir": "0.6.2" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-get": { - "version": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", - "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "unzip-response": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "sntp": { - "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - } - }, - "sol-digger": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", - "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=" - }, - "solidity-coverage": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.2.1.tgz", - "integrity": "sha512-+vsgS3tMK4UyBiliIv1aE6PC+MfaLo/XQ0qzBlkaIuP2e/vw8Zn8pnzw2mYBmoImoSugsK3EuwslHgRQXQjCRw==", - "dev": true, - "requires": { - "commander": "2.11.0", - "death": "1.1.0", - "ethereumjs-testrpc-sc": "4.0.1", - "istanbul": "0.4.5", - "keccakjs": "0.2.1", - "mkdirp": "0.5.1", - "req-cwd": "1.0.1", - "shelljs": "0.7.8", - "sol-explore": "1.6.2", - "solidity-parser": "git+https://github.com/sc-forks/solidity-parser.git#6c544bd308fb6d38b2ca7e2adde9a42334221ab0", - "web3": "0.18.4" - }, - "dependencies": { - "browserify-sha3": { - "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" - } - }, - "crypto-js": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", - "dev": true - }, - "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=", - "dev": true - }, - "keccakjs": { - "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.2.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", - "dev": true - }, - "sha3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", - "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", - "dev": true, - "requires": { - "nan": "2.6.2" - } - }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", - "dev": true - }, - "web3": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", - "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", - "dev": true, - "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "xmlhttprequest": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" - } - } - } - }, - "solidity-inspector": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/solidity-inspector/-/solidity-inspector-0.1.0.tgz", - "integrity": "sha512-Q1lU4Tx/sGXa5sqHZ02OxvcSAgX7+j1pa04o/yjxMO6/NwqF9FOfm4wwNVP4yQ9vY8j0OFmVqUXfPu0OjezZyw==", - "dev": true, - "requires": { - "solidity-parser": "0.4.0", - "yargs": "6.6.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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 - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "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 - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "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 - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "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" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-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 - }, - "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 - }, - "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 - }, - "solidity-parser": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/solidity-parser/-/solidity-parser-0.4.0.tgz", - "integrity": "sha1-o0PxPac8kWgyeQNGgOgMSR3jQPo=", - "dev": true, - "requires": { - "mocha": "2.5.3", - "pegjs": "0.10.0", - "yargs": "4.8.1" - }, - "dependencies": { - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" - } - } - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" - }, - "dependencies": { - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - } - } - } - }, - "solidity-parser": { - "version": "git+https://github.com/sc-forks/solidity-parser.git#6c544bd308fb6d38b2ca7e2adde9a42334221ab0", - "dev": true, - "requires": { - "mocha": "2.5.3", - "pegjs": "0.10.0", - "yargs": "4.8.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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 - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "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 - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "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 - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "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" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-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 - }, - "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 - }, - "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 - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - } - } - } - }, - "solium": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/solium/-/solium-0.5.4.tgz", - "integrity": "sha512-KvyGdk3Tq83wmFvRflVj0l2ipGK6Ns022KCsTDzzUJbvYy7BG5LhL9/6MV/6/T7LJUu7COcNqH3OOHThKPC0oA==", - "requires": { - "chokidar": "1.7.0", - "colors": "1.1.2", - "commander": "2.11.0", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "sol-digger": "0.0.2", - "sol-explore": "1.6.2", - "solparse": "1.2.1" - }, - "dependencies": { - "solparse": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/solparse/-/solparse-1.2.1.tgz", - "integrity": "sha512-7UkvVTNlC0IENaK20a9J/mRBf2+nIuYDH3nOk+hNiNC96EbYR+CT6KVk4Z6HVIKBxQflfeCqmcsZksmkmFd4iA==", - "requires": { - "mocha": "2.5.3", - "pegjs": "0.10.0", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" - } - } - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - }, - "spdx-correct": { - "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" - } - }, - "spdx-expression-parse": { - "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" - }, - "spdx-license-ids": { - "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "bcrypt-pbkdf": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "ecc-jsbn": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" - } - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "to-arraybuffer": "1.0.1", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - } - }, - "stringstream": { - "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, - "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } - }, - "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - } - }, - "strip-json-comments": { - "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "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" - } - }, - "tapable": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz", - "integrity": "sha1-5GwNqsuyuKmLmwzqD0BSEFgX7Vw=", - "dev": true - }, - "tar-fs": { - "version": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.3.tgz", - "integrity": "sha1-7M+TXpQUk9gVECjmNuUc5MPKfyA=", - "requires": { - "chownr": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "pump": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "tar-stream": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz" - } - }, - "tar-stream": { - "version": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "requires": { - "bl": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "end-of-stream": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "timers-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz", - "integrity": "sha1-q0iDz1l9zVCvIRNJoA+8pWrIa4Y=", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-iso-string": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", - "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=" - }, - "tough-cookie": { - "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - } - }, - "truffle": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-3.4.6.tgz", - "integrity": "sha1-cqBxVCM7TRGY7LmRpfq0aKDFRnE=", - "dev": true, - "requires": { - "mocha": "3.4.2", - "original-require": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "solc": "0.4.13" - }, - "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "mocha": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", - "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", - "diff": "3.2.0", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "growl": "1.9.2", - "json3": "3.3.2", - "lodash.create": "3.1.1", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "supports-color": "3.1.2" - } - }, - "solc": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.13.tgz", - "integrity": "sha1-qly9zOPmrjwZDSD1/fi8iAcC7HU=", - "dev": true, - "requires": { - "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "memorystream": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "require-from-string": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" - } - }, - "supports-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", - "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "truffle-config": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/truffle-config/-/truffle-config-1.0.1.tgz", - "integrity": "sha1-lbM9xemESR5xfPy6+qA9tlknInc=", - "requires": { - "find-up": "2.1.0", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "original-require": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", - "truffle-error": "0.0.2", - "truffle-provider": "0.0.2" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "2.0.0" - } - } - } - }, - "truffle-error": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/truffle-error/-/truffle-error-0.0.2.tgz", - "integrity": "sha1-AbGJt4UFVmrhaJwjnHyi3RIc/kw=" - }, - "truffle-expect": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/truffle-expect/-/truffle-expect-0.0.3.tgz", - "integrity": "sha1-m3XO80O9WW5+XbyHj18bLjGKlEw=" - }, - "truffle-hdwallet-provider": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/truffle-hdwallet-provider/-/truffle-hdwallet-provider-0.0.3.tgz", - "integrity": "sha1-Dh3gIQS3PTh14c9wkzBbTqii2EM=", - "requires": { - "bip39": "2.3.1", - "ethereumjs-wallet": "0.6.0", - "web3": "0.18.4", - "web3-provider-engine": "8.6.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.2.tgz", - "integrity": "sha512-6RmGuGZSsvwIYS9otANM+Rie7/6UNdE0IbxwUiXFjXmjHNCJZEjyX2Pltl5BvIYszLODlsnXtyA7A7Ujlca4Gw==", - "requires": { - "xtend": "4.0.1" - } - }, - "aes-js": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-0.2.4.tgz", - "integrity": "sha1-lLiBq3FyhtAV+iGeCPtmcJ3aWj0=" - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "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=" - }, - "aproba": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", - "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==" - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "requires": { - "lodash": "4.17.4" - } - }, - "async-eventemitter": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.3.tgz", - "integrity": "sha1-959IDf2mZFqXvWFCwBcVDWO05w4=", - "requires": { - "async": "2.5.0" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", - "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-generator": "6.25.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "convert-source-map": "1.5.0", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.7", - "slash": "1.0.0", - "source-map": "0.5.6" - } - }, - "babel-generator": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", - "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.6", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - } - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-define-map": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", - "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", - "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "lodash": "4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "6.24.1", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.25.0", - "babel-template": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "6.25.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "6.24.1", - "babel-runtime": "6.25.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", - "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", - "requires": { - "regenerator-transform": "0.9.11" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.24.1", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.24.1" - } - }, - "babel-register": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", - "requires": { - "babel-core": "6.25.0", - "babel-runtime": "6.25.0", - "core-js": "2.4.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.15" - } - }, - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "requires": { - "core-js": "2.4.1", - "regenerator-runtime": "0.10.5" - } - }, - "babel-template": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "requires": { - "babel-runtime": "6.25.0", - "babel-traverse": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "lodash": "4.17.4" - } - }, - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "requires": { - "babel-code-frame": "6.22.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "babylon": "6.17.4", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - } - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "requires": { - "babel-runtime": "6.25.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "requires": { - "babel-core": "6.25.0", - "object-assign": "4.1.1" - } - }, - "babylon": { - "version": "6.17.4", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz", - "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base-x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-1.1.0.tgz", - "integrity": "sha1-QtPXF0dPnqAiB/bRqh9CaRPut6w=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "bindings": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" - }, - "bip39": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.3.1.tgz", - "integrity": "sha1-yCOKvAnXGcbwETbvBC2szF3DWBs=", - "requires": { - "create-hash": "1.1.3", - "pbkdf2": "3.0.12", - "randombytes": "2.0.5", - "safe-buffer": "5.1.1", - "unorm": "1.4.1" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "requires": { - "readable-stream": "2.3.3" - } - }, - "bn.js": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz", - "integrity": "sha512-LxFiV5mefv0ley0SzqkOPR1bC4EbpPx8LkOz5vMe/Yi15t5hzwgO/G+tc7wOtL4PZTYjwHu8JnEiSLumuSjSfA==" - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", - "requires": { - "js-sha3": "0.3.1" - } - }, - "bs58": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-3.1.0.tgz", - "integrity": "sha1-1MJjiL9IBMrHFBQbGUWqR+XrJI4=", - "requires": { - "base-x": "1.1.0" - } - }, - "bs58check": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-1.3.4.tgz", - "integrity": "sha1-xSVABzdJEXcU+gQsMEfrj5FRy/g=", - "requires": { - "bs58": "3.1.0", - "create-hash": "1.1.3" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY=", - "requires": { - "functional-red-black-tree": "1.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "coinstring": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", - "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", - "requires": { - "bs58": "2.0.1", - "create-hash": "1.1.3" - }, - "dependencies": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" - } - } - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" - }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" - }, - "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=" - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.8" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "crypto-js": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "requires": { - "abstract-leveldown": "2.6.2" - } - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - }, - "dependencies": { - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "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=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "2.0.1" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "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=", - "requires": { - "browserify-aes": "1.0.6", - "create-hash": "1.1.3", - "create-hmac": "1.1.6" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "requires": { - "bn.js": "4.11.7", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.18" - } - }, - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "requires": { - "once": "1.4.0" - } - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "requires": { - "prr": "0.0.0" - }, - "dependencies": { - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" - } - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", - "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.0", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha1-L9w1dvIykDNYl26znaeDIT/5Uj8=" - }, - "ethereumjs-account": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.4.tgz", - "integrity": "sha1-+MMCMby3B/RRTYoFLB+doQNiTUc=", - "requires": { - "ethereumjs-util": "4.5.0", - "rlp": "2.0.0" - } - }, - "ethereumjs-block": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.6.0.tgz", - "integrity": "sha1-ze1JYt6soe7xc3K00pDoSzXIQ3I=", - "requires": { - "async": "2.5.0", - "ethereum-common": "0.0.18", - "ethereumjs-tx": "1.3.3", - "ethereumjs-util": "5.1.2", - "merkle-patricia-tree": "2.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.2.tgz", - "integrity": "sha1-JboCFcu0wvCxCKb5avKi5i5Fkh8=", - "requires": { - "babel-preset-es2015": "6.24.1", - "babelify": "7.3.0", - "bn.js": "4.11.7", - "create-hash": "1.1.3", - "ethjs-util": "0.1.4", - "keccak": "1.3.0", - "rlp": "2.0.0", - "secp256k1": "3.3.0" - } - } - } - }, - "ethereumjs-tx": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.3.tgz", - "integrity": "sha1-7OBR0+/b53GtKlGNYWMsoqt17Ls=", - "requires": { - "ethereum-common": "0.0.18", - "ethereumjs-util": "5.1.2" - }, - "dependencies": { - "ethereumjs-util": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.2.tgz", - "integrity": "sha1-JboCFcu0wvCxCKb5avKi5i5Fkh8=", - "requires": { - "babel-preset-es2015": "6.24.1", - "babelify": "7.3.0", - "bn.js": "4.11.7", - "create-hash": "1.1.3", - "ethjs-util": "0.1.4", - "keccak": "1.3.0", - "rlp": "2.0.0", - "secp256k1": "3.3.0" - } - } - } - }, - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "requires": { - "bn.js": "4.11.7", - "create-hash": "1.1.3", - "keccakjs": "0.2.1", - "rlp": "2.0.0", - "secp256k1": "3.3.0" - } - }, - "ethereumjs-vm": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.2.0.tgz", - "integrity": "sha1-qyKWsaYo7+xFA/ZpHH2jzQ6R0yM=", - "requires": { - "async": "2.5.0", - "async-eventemitter": "0.2.3", - "ethereum-common": "0.1.0", - "ethereumjs-account": "2.0.4", - "ethereumjs-block": "1.6.0", - "ethereumjs-util": "4.5.0", - "fake-merkle-patricia-tree": "1.0.1", - "functional-red-black-tree": "1.0.1", - "merkle-patricia-tree": "2.1.2" - }, - "dependencies": { - "ethereum-common": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.1.0.tgz", - "integrity": "sha1-h03Q+uXpYqVsUOvyjvpv45SSsOc=" - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.0.tgz", - "integrity": "sha1-gnY7Fpfuenlr5xVdqd+0my+Yz9s=", - "requires": { - "aes-js": "0.2.4", - "bs58check": "1.3.4", - "ethereumjs-util": "4.5.0", - "hdkey": "0.7.1", - "scrypt.js": "0.2.0", - "utf8": "2.1.2", - "uuid": "2.0.3" - } - }, - "ethjs-util": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.4.tgz", - "integrity": "sha1-HItoeSV0RO9NPz+7rC3tEs2ZfZM=", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz", - "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=", - "requires": { - "create-hash": "1.1.3" - } - }, - "expand-template": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.0.3.tgz", - "integrity": "sha1-bDAzIxd6YrGyLAcCefeGEoe2mxo=" - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" - }, - "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=", - "requires": { - "checkpoint-store": "1.1.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "for-each": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", - "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", - "requires": { - "is-function": "1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "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=" - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.16" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=" - }, - "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=" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.1.2", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "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=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "2.19.0", - "process": "0.5.2" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "requires": { - "function-bind": "1.1.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hdkey": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.7.1.tgz", - "integrity": "sha1-yu5L6BqneSHpCbjSKN0PKayu5jI=", - "requires": { - "coinstring": "2.3.0", - "secp256k1": "3.3.0" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" - } - }, - "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==" - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "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=", - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "1.7.1", - "whatwg-fetch": "2.0.3" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "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=", - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "keccak": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.3.0.tgz", - "integrity": "sha512-JgsKPxYhcJxKrV+TrCyg/GwZbOjhpRPrz2kG8xbAsUaIDelUlKjm08YcwBO9Fm8sqf/Kg8ZWkk6nWujhLykfvw==", - "requires": { - "bindings": "1.3.0", - "inherits": "2.0.3", - "nan": "2.6.2", - "prebuild-install": "2.2.1", - "safe-buffer": "5.1.1" - } - }, - "keccakjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", - "requires": { - "browserify-sha3": "0.0.1", - "sha3": "1.2.0" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } - }, - "level-codec": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.0.tgz", - "integrity": "sha1-x1W2jQ1E/6Cxy6BEuPgaVaFK05s=" - }, - "level-errors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.4.tgz", - "integrity": "sha1-NYXmI5dMc3qTdVSSpDwCZ82kQl8=", - "requires": { - "errno": "0.1.4" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", - "requires": { - "inherits": "2.0.3", - "level-errors": "1.0.4", - "readable-stream": "1.1.14", - "xtend": "4.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos=", - "requires": { - "readable-stream": "1.0.34", - "xtend": "2.1.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "0.4.0" - } - } - } - }, - "levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "requires": { - "deferred-leveldown": "1.2.2", - "level-codec": "7.0.0", - "level-errors": "1.0.4", - "level-iterator-stream": "1.3.1", - "prr": "1.0.1", - "semver": "5.4.1", - "xtend": "4.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } - }, - "ltgt": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz", - "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=" - }, - "memdown": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.2.4.tgz", - "integrity": "sha1-zZo0qvB01TRFonEQjrS43U7A8n8=", - "requires": { - "abstract-leveldown": "2.4.1", - "functional-red-black-tree": "1.0.1", - "immediate": "3.2.3", - "inherits": "2.0.3", - "ltgt": "2.1.3" - }, - "dependencies": { - "abstract-leveldown": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.4.1.tgz", - "integrity": "sha1-s7/tuITraToSd18MVenwpCDM7mQ=", - "requires": { - "xtend": "4.0.1" - } - } - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=" - }, - "merkle-patricia-tree": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.1.2.tgz", - "integrity": "sha1-ckSD1Ut1YxpI/t2lXhFAUXBqcpE=", - "requires": { - "async": "1.5.2", - "ethereumjs-util": "4.5.0", - "level-ws": "0.0.0", - "levelup": "1.3.9", - "memdown": "1.2.4", - "readable-stream": "2.3.3", - "rlp": "2.0.0", - "semaphore": "1.0.5" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - }, - "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" - }, - "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "requires": { - "mime-db": "1.29.0" - } - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "0.1.1" - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" - }, - "node-abi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.1.0.tgz", - "integrity": "sha512-AbW35CPRE4vdieOse46V+16dKispLNv3PQwgqlcfg7GQeQHcLu3gvp3fbU2gTh7d8NfGjp5CJh+j4Hpyb0XzaA==" - }, - "node-fetch": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz", - "integrity": "sha512-j8XsFGCLw79vWXkZtMSmmLaOk9z5SQ9bV/tkbZVCqvgwzrjAGq66igobLofHtF63NvMTp2WjytpsNTGKa+XRIQ==", - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "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==", - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.2.2.tgz", - "integrity": "sha1-yCEV5PzIiK6hTWTCLk8X9qcNXlo=" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "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=", - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", - "requires": { - "for-each": "0.3.2", - "trim": "0.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pbkdf2": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz", - "integrity": "sha1-vjZ4XFBn6kjYBv+SMojF91C2uKI=", - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.8" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, - "prebuild-install": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.2.1.tgz", - "integrity": "sha512-y/sgNJ49vjXQ3qYdSI/jTRZq6D7g5Q2euK6x0/L8dvwK1EGvNLidtg2t4PZzTgkR6LahkzpYVshOmHKYtp0AlQ==", - "requires": { - "expand-template": "1.0.3", - "github-from-package": "0.0.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "node-abi": "2.1.0", - "noop-logger": "0.1.1", - "npmlog": "4.1.2", - "os-homedir": "1.0.2", - "pump": "1.0.2", - "rc": "1.2.1", - "simple-get": "1.4.3", - "tar-fs": "1.15.3", - "tunnel-agent": "0.6.0", - "xtend": "4.0.1" - } - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", - "requires": { - "end-of-stream": "1.4.0", - "once": "1.4.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "regenerator-transform": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", - "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", - "requires": { - "babel-runtime": "6.25.0", - "babel-types": "6.25.0", - "private": "0.1.7" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "1.3.2", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - } - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - }, - "dependencies": { - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "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=" - }, - "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=" - }, - "resolve": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", - "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", - "requires": { - "path-parse": "1.0.5" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "2.3.8" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "requires": { - "glob": "7.1.2" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "rlp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", - "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "requires": { - "nan": "2.6.2" - } - }, - "scrypt.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", - "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", - "requires": { - "scrypt": "6.0.3", - "scryptsy": "1.2.1" - } - }, - "scryptsy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", - "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", - "requires": { - "pbkdf2": "3.0.12" - } - }, - "secp256k1": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.3.0.tgz", - "integrity": "sha512-CbrQoeGG5V0kQ1ohEMGI+J7oKerapLTpivLICBaXR0R4HyQcN3kM9itLsV5fdpV1UR1bD14tOkJ1xughmlDIiQ==", - "requires": { - "bindings": "1.3.0", - "bip66": "1.1.5", - "bn.js": "4.11.7", - "create-hash": "1.1.3", - "drbg.js": "1.0.1", - "elliptic": "6.4.0", - "nan": "2.6.2", - "prebuild-install": "2.2.1", - "safe-buffer": "5.1.1" - } - }, - "semaphore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.0.5.tgz", - "integrity": "sha1-tJJXbmavGT25XWXiXsU/Xxl5jWA=" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "requires": { - "inherits": "2.0.3" - } - }, - "sha3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", - "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", - "requires": { - "nan": "2.6.2" - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-get": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", - "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", - "requires": { - "once": "1.4.0", - "unzip-response": "1.0.2", - "xtend": "4.0.1" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } - }, - "solc": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.13.tgz", - "integrity": "sha1-qly9zOPmrjwZDSD1/fi8iAcC7HU=", - "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.4.1", - "yargs": "4.8.1" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "source-map-support": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "requires": { - "source-map": "0.5.6" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string.prototype.trim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", - "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.7.0", - "function-bind": "1.1.0" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "tape": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.7.0.tgz", - "integrity": "sha512-ePzu2KfZYVtq0v+KKGxBJ9HJWYZ4MaQWeGabD+KpVdMKRen3NJPf6EiwA5BxfMkhQPGtCwnOFWelcB39bhOUng==", - "requires": { - "deep-equal": "1.0.1", - "defined": "1.0.0", - "for-each": "0.3.2", - "function-bind": "1.1.0", - "glob": "7.1.2", - "has": "1.0.1", - "inherits": "2.0.3", - "minimist": "1.2.0", - "object-inspect": "1.2.2", - "resolve": "1.3.3", - "resumer": "0.0.0", - "string.prototype.trim": "1.1.2", - "through": "2.3.8" - } - }, - "tar-fs": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.3.tgz", - "integrity": "sha1-7M+TXpQUk9gVECjmNuUc5MPKfyA=", - "requires": { - "chownr": "1.0.1", - "mkdirp": "0.5.1", - "pump": "1.0.2", - "tar-stream": "1.5.4" - } - }, - "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "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=" - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "requires": { - "punycode": "1.4.1" - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "unorm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=" - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - }, - "utf8": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "requires": { - "extsprintf": "1.0.2" - } - }, - "web3": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", - "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", - "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "xmlhttprequest": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" - } - }, - "web3-provider-engine": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-8.6.1.tgz", - "integrity": "sha1-TYbhnjDKr5ffNRUR7A9gE25bMOs=", - "requires": { - "async": "2.5.0", - "clone": "2.1.1", - "ethereumjs-block": "1.6.0", - "ethereumjs-tx": "1.3.3", - "ethereumjs-util": "5.1.2", - "ethereumjs-vm": "2.2.0", - "isomorphic-fetch": "2.2.1", - "request": "2.81.0", - "semaphore": "1.0.5", - "solc": "0.4.13", - "tape": "4.7.0", - "web3": "0.16.0", - "xhr": "2.4.0", - "xtend": "4.0.1" - }, - "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#c7a38de919ed75e6fb6ba38051986e294b328df9" - }, - "ethereumjs-util": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.2.tgz", - "integrity": "sha1-JboCFcu0wvCxCKb5avKi5i5Fkh8=", - "requires": { - "babel-preset-es2015": "6.24.1", - "babelify": "7.3.0", - "bn.js": "4.11.7", - "create-hash": "1.1.3", - "ethjs-util": "0.1.4", - "keccak": "1.3.0", - "rlp": "2.0.0", - "secp256k1": "3.3.0" - } - }, - "web3": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.16.0.tgz", - "integrity": "sha1-pFVBdc1GKUMDWx8dOUMvdBxrYBk=", - "requires": { - "bignumber.js": "git+https://github.com/debris/bignumber.js.git#c7a38de919ed75e6fb6ba38051986e294b328df9", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xmlhttprequest": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" - } - } - } - }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "requires": { - "string-width": "1.0.2" - } - }, - "window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xhr": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.0.tgz", - "integrity": "sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=", - "requires": { - "global": "4.3.2", - "is-function": "1.0.1", - "parse-headers": "2.0.1", - "xtend": "4.0.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" - } - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" - } - } - } - }, - "truffle-provider": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/truffle-provider/-/truffle-provider-0.0.2.tgz", - "integrity": "sha1-UmFNwEva+Hj2Q5Kzh+ZDL5ybzG8=", - "requires": { - "truffle-error": "0.0.2", - "web3": "0.19.1" - }, - "dependencies": { - "bignumber.js": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.2.tgz", - "integrity": "sha1-LR3DfuWWiGfs6pC22k0W5oYI0h0=" - }, - "web3": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/web3/-/web3-0.19.1.tgz", - "integrity": "sha1-52PVsRB8S8JKvU+MvuG6Nlnm6zE=", - "requires": { - "bignumber.js": "4.0.2", - "crypto-js": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", - "utf8": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "xhr2": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "xmlhttprequest": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" - } - } - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "tweetnacl": { - "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "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" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.1" - } - }, - "unzip-response": { - "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "utf8": { - "version": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", - "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "validate-npm-package-license": { - "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "requires": { - "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" - } - }, - "verror": { - "version": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "requires": { - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "chokidar": "1.7.0", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" - } - }, - "webpack": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.3.0.tgz", - "integrity": "sha1-zi+eB2Vmq6kfdIhxM6iD/X2hh7w=", - "dev": true, - "requires": { - "acorn": "5.1.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.2", - "ajv-keywords": "2.1.0", - "async": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "enhanced-resolve": "3.3.0", - "escope": "3.6.0", - "interpret": "1.0.3", - "json-loader": "0.5.4", - "json5": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "node-libs-browser": "2.0.0", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "supports-color": "3.2.3", - "tapable": "0.2.7", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.0.1", - "yargs": "6.6.0" - }, - "dependencies": { - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "dev": true, - "requires": { - "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" - } - }, - "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "yargs-parser": "4.2.1" - } - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" - } - } - } - }, - "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" - } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=", - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" - } - }, - "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - } - }, - "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xhr2": { - "version": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" - }, - "xmlhttprequest": { - "version": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "requires": { - "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "which-module": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" - } - }, - "yargs-parser": { - "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "lodash.assign": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" - } - } - } -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..c8aaa5d72 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7474 @@ +{ + "name": "@aragon/os", + "version": "3.0.0-1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "abi-decoder": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abi-decoder/-/abi-decoder-1.0.9.tgz", + "integrity": "sha1-a8/Yb39j++yFc9l3izpPkruS4B8=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-loader": "6.4.1", + "babel-plugin-add-module-exports": "0.2.1", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-preset-es2015": "6.24.1", + "chai": "3.5.0", + "web3": "0.18.4", + "webpack": "2.7.0" + } + }, + "abstract-leveldown": { + "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.1" + } + }, + "acorn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", + "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "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 + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-eventemitter": { + "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.6.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.0", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-loader": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", + "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", + "dev": true, + "requires": { + "find-cache-dir": "0.1.1", + "loader-utils": "0.2.17", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-add-module-exports": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", + "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "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 + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "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.5" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", + "dev": true + }, + "bip39": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-2.5.0.tgz", + "integrity": "sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "pbkdf2": "3.0.14", + "randombytes": "2.0.6", + "safe-buffer": "5.1.1", + "unorm": "1.4.1" + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "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 + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sha3": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", + "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "dev": true, + "requires": { + "js-sha3": "0.3.1" + }, + "dependencies": { + "js-sha3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", + "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "bs58": { + "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" + } + }, + "bs58check": { + "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.3" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.1.0", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "checkpoint-store": { + "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" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "cli-table2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cli-table2/-/cli-table2-0.2.0.tgz", + "integrity": "sha1-LR738hig54biFFQFYtS9F3/jLZc=", + "dev": true, + "requires": { + "colors": "1.1.2", + "lodash": "3.10.1", + "string-width": "1.0.2" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "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 + }, + "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.3" + }, + "dependencies": { + "bs58": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", + "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=", + "dev": true + } + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "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 + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.6", + "randomfill": "1.0.3" + } + }, + "crypto-js": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.38" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=", + "dev": true + }, + "debug": { + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "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 + }, + "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 + }, + "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.3" + } + }, + "define-properties": { + "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.11" + }, + "dependencies": { + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "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.3", + "minimalistic-assert": "1.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "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 + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "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.1.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6" + } + }, + "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.1" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "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.19" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "errno": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.38", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", + "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "source-map": { + "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": "1.0.1" + } + } + } + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "eth-ens-namehash": { + "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" + } + }, + "eth-gas-reporter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.1.1.tgz", + "integrity": "sha512-ky5P27RRaDxD5EAzRL+xEBTq6uyfFj1Dyan2Epq5rfV66wEDtDkGTCYBefRaQpuXJ5C/U6Jsv5TR12qn7Mb83g==", + "dev": true, + "requires": { + "abi-decoder": "1.0.9", + "cli-table2": "0.2.0", + "colors": "1.1.2", + "lodash": "4.17.4", + "req-cwd": "2.0.0", + "request": "2.83.0", + "request-promise-native": "1.0.5", + "shelljs": "0.7.8" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "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 + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "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.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "dev": true + }, + "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.4.1", + "sshpk": "1.13.1" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "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.1.1" + } + } + } + }, + "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 + }, + "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.11.8", + "ethereumjs-util": "4.5.0" + } + }, + "ethereumjs-account": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.4.tgz", + "integrity": "sha1-+MMCMby3B/RRTYoFLB+doQNiTUc=", + "dev": true, + "requires": { + "ethereumjs-util": "4.5.0", + "rlp": "2.0.0" + } + }, + "ethereumjs-block": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.0.tgz", + "integrity": "sha512-4s4Hh7mWa1xr+Bggh3T3jsq9lmje5aYpJRFky00bo/xNgNe+RC8V2ulWYSR4YTEKqLbnLEsLNytjDe5hpblkZQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "1.3.3", + "ethereumjs-util": "5.1.3", + "merkle-patricia-tree": "2.3.0" + }, + "dependencies": { + "ethereumjs-util": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.3.tgz", + "integrity": "sha512-U/wmHagElZVxnpo3bFsvk5beFADegUcEzqtA/NfQbitAPOs6JoYq8M4SY9NfH4HD8236i63UOkkXafd7bqBL9A==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "ethjs-util": "0.1.4", + "keccak": "1.4.0", + "rlp": "2.0.0", + "safe-buffer": "5.1.1", + "secp256k1": "3.4.0" + } + } + } + }, + "ethereumjs-testrpc-sc": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-6.0.7.tgz", + "integrity": "sha512-6X/FknTe702L0UGtJ3V3qlh6HNavJkuuRxB18fbITOuOyvCike7O5TVYOthqyCdxgW+ZW/FQGtFpoKeuRZnbNg==", + "dev": true, + "requires": { + "webpack": "3.10.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "webpack": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "dev": true, + "requires": { + "acorn": "5.3.0", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "ethereumjs-tx": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.3.tgz", + "integrity": "sha1-7OBR0+/b53GtKlGNYWMsoqt17Ls=", + "dev": true, + "requires": { + "ethereum-common": "0.0.18", + "ethereumjs-util": "5.1.3" + }, + "dependencies": { + "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 + }, + "ethereumjs-util": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.3.tgz", + "integrity": "sha512-U/wmHagElZVxnpo3bFsvk5beFADegUcEzqtA/NfQbitAPOs6JoYq8M4SY9NfH4HD8236i63UOkkXafd7bqBL9A==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "ethjs-util": "0.1.4", + "keccak": "1.4.0", + "rlp": "2.0.0", + "safe-buffer": "5.1.1", + "secp256k1": "3.4.0" + } + } + } + }, + "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.11.8", + "create-hash": "1.1.3", + "keccakjs": "0.2.1", + "rlp": "2.0.0", + "secp256k1": "3.4.0" + } + }, + "ethereumjs-vm": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.3.2.tgz", + "integrity": "sha512-uREIQ4juS3nnZc9I1khWvw5fjpN4heaI/IDWdbc89x6YuXkmt/QrI/X3QDQI+S4ojFEoigBh9p1eezyitFmMKA==", + "dev": true, + "requires": { + "async": "2.6.0", + "async-eventemitter": "0.2.4", + "ethereum-common": "0.2.0", + "ethereumjs-account": "2.0.4", + "ethereumjs-block": "1.7.0", + "ethereumjs-util": "4.5.0", + "fake-merkle-patricia-tree": "1.0.1", + "functional-red-black-tree": "1.0.1", + "merkle-patricia-tree": "2.3.0", + "rustbn.js": "0.1.1", + "safe-buffer": "5.1.1" + } + }, + "ethereumjs-wallet": { + "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.4", + "bs58check": "1.3.4", + "ethereumjs-util": "4.5.0", + "hdkey": "0.7.1", + "scrypt.js": "0.2.0", + "utf8": "2.1.2", + "uuid": "2.0.3" + }, + "dependencies": { + "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 + } + } + }, + "ethjs-util": { + "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" + } + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.38" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "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" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "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 + }, + "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 + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "for-each": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", + "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", + "dev": true, + "requires": { + "is-function": "1.0.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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 + }, + "ganache-cli": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.0.3.tgz", + "integrity": "sha512-C7a8su4Zwtootvcy9HtroshTsyUtLC51+aOGUREpy/G4CXbAuLa3nNQri2NyFdqGyOrm/D+jxYP/PWnnrGLyXg==", + "dev": true, + "requires": { + "webpack": "3.10.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "webpack": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "dev": true, + "requires": { + "acorn": "5.3.0", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "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.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "dev": true + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "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 + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.13.0", + "is-my-json-valid": "2.17.1", + "pinkie-promise": "2.0.1" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hdkey": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-0.7.1.tgz", + "integrity": "sha1-yu5L6BqneSHpCbjSKN0PKayu5jI=", + "dev": true, + "requires": { + "coinstring": "2.3.0", + "secp256k1": "3.4.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "idna-uts46-hx": { + "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" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", + "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "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" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + } + }, + "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 + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.11", + "js-yaml": "3.6.1", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "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.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "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" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "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 + }, + "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 + }, + "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 + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + }, + "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": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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 + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "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", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "keccak": { + "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.3.0", + "inherits": "2.0.3", + "nan": "2.8.0", + "safe-buffer": "5.1.1" + } + }, + "keccakjs": { + "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.2.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "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 + }, + "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.6" + } + }, + "level-iterator-stream": { + "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.3", + "level-errors": "1.0.5", + "readable-stream": "1.1.14", + "xtend": "4.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "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.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + } + } + }, + "level-ws": { + "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.34", + "xtend": "2.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "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.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "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 + }, + "xtend": { + "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" + } + } + } + }, + "levelup": { + "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.2", + "level-codec": "7.0.1", + "level-errors": "1.0.5", + "level-iterator-stream": "1.3.1", + "prr": "1.0.1", + "semver": "5.4.1", + "xtend": "4.0.1" + } + }, + "levn": { + "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" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "ltgt": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.0.tgz", + "integrity": "sha1-tlul/LNJopkkyOMz98alVi8uSEI=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "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.1.0" + } + }, + "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.2", + "functional-red-black-tree": "1.0.1", + "immediate": "3.2.3", + "inherits": "2.0.3", + "ltgt": "2.2.0", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "abstract-leveldown": { + "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.1" + } + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.6", + "readable-stream": "2.3.3" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "merkle-patricia-tree": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.0.tgz", + "integrity": "sha512-LKd2OoIT9Re/OG38zXbd5pyHIk2IfcOUczCwkYXl5iJIbufg9nqpweh66VfPwMkUlrEvc7YVvtQdmSrB9V9TkQ==", + "dev": true, + "requires": { + "async": "1.5.2", + "ethereumjs-util": "5.1.3", + "level-ws": "0.0.0", + "levelup": "1.3.9", + "memdown": "1.4.1", + "readable-stream": "2.3.3", + "rlp": "2.0.0", + "semaphore": "1.1.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "ethereumjs-util": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.3.tgz", + "integrity": "sha512-U/wmHagElZVxnpo3bFsvk5beFADegUcEzqtA/NfQbitAPOs6JoYq8M4SY9NfH4HD8236i63UOkkXafd7bqBL9A==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "ethjs-util": "0.1.4", + "keccak": "1.4.0", + "rlp": "2.0.0", + "safe-buffer": "5.1.1", + "secp256k1": "3.4.0" + } + } + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "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.1" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "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 + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + } + } + }, + "mocha-lcov-reporter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", + "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true + }, + "node-fetch": { + "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.12", + "is-stream": "1.1.0" + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.8.0", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.4", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + } + }, + "nopt": { + "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.0.9" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "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 + }, + "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 + }, + "object-inspect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz", + "integrity": "sha512-OHHnLgLNXpM++GnJRyyhbr2bwl3pPVm4YvaraHrRvDt/N3r+s/gDVHciA7EJBTkijKXj61ssgSAikq1fb0IBRg==", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "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.10", + "wordwrap": "0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "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.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "original-require": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", + "integrity": "sha1-DxMEcVhM0zURxew4yNWSE/msXiA=", + "dev": true + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-headers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", + "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", + "dev": true, + "requires": { + "for-each": "0.3.2", + "trim": "0.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "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 + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.6" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "req-cwd": { + "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" + } + }, + "req-from": { + "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" + } + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "request-promise-core": { + "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.17.4" + } + }, + "request-promise-native": { + "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.1", + "tough-cookie": "2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "rlp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.0.0.tgz", + "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=", + "dev": true + }, + "rustbn.js": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.1.1.tgz", + "integrity": "sha512-+Xq0RaL+HEErm4vaTUSWq8uq94OuzOu2UR16LowDvj/C8gclDsoYGp8hKpmakKW2dKqL433v2tkf8HCa2za+Eg==", + "dev": true + }, + "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 + }, + "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.8.0" + } + }, + "scrypt.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", + "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", + "dev": true, + "requires": { + "scrypt": "6.0.3", + "scryptsy": "1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "dev": true, + "requires": { + "pbkdf2": "3.0.14" + } + }, + "secp256k1": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.4.0.tgz", + "integrity": "sha512-eC120ESQ6MB3gMkxj0PVcSjv/9VtSUmm9uPGNc58yTs93iMCUQZ1xeGPidQMY1z1O4psbCtOxRu3vNqpbuck6Q==", + "dev": true, + "requires": { + "bindings": "1.3.0", + "bip66": "1.1.5", + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "drbg.js": "1.0.1", + "elliptic": "6.4.0", + "nan": "2.8.0", + "safe-buffer": "5.1.1" + } + }, + "semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", + "dev": true + }, + "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 + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "sha3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", + "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", + "dev": true, + "requires": { + "nan": "2.8.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "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.1.2", + "interpret": "1.1.0", + "rechoir": "0.6.2" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sol-digger": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", + "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=", + "dev": true + }, + "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 + }, + "solc": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", + "integrity": "sha512-Kq+O3PNF9Pfq7fB+lDYAuoqRdghLmZyfngsg0h1Hj38NKAeVHeGPOGeZasn5KqdPeCzbMFvaGyTySxzGv6aXCg==", + "dev": true, + "requires": { + "fs-extra": "0.30.0", + "memorystream": "0.3.1", + "require-from-string": "1.2.1", + "semver": "5.4.1", + "yargs": "4.8.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" + } + } + } + }, + "solidity-coverage": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.3.5.tgz", + "integrity": "sha512-ZAzYfC9FVix3iqBbJyYow6EPxZevkUlEp0mjJ7b1bM7HWFjoPeoUowUq7nbYECP9WVOElakX6GLewJsIQern5w==", + "dev": true, + "requires": { + "death": "1.1.0", + "ethereumjs-testrpc-sc": "6.0.7", + "istanbul": "0.4.5", + "keccakjs": "0.2.1", + "req-cwd": "1.0.1", + "shelljs": "0.7.8", + "sol-explore": "1.6.2", + "solidity-parser-sc": "0.4.1", + "web3": "0.18.4" + }, + "dependencies": { + "req-cwd": { + "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" + } + }, + "req-from": { + "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" + } + }, + "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 + } + } + }, + "solidity-parser-sc": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/solidity-parser-sc/-/solidity-parser-sc-0.4.1.tgz", + "integrity": "sha512-51kDgZXLCfgOtmxrPPK1Jhgi257emdf8g9xBA7BA5TgFTM8tSEgRzvJGlGTPbI03txLETuSvNpPhy46c+srOyQ==", + "dev": true, + "requires": { + "mocha": "2.5.3", + "pegjs": "0.10.0", + "yargs": "4.8.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "dev": true, + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" + } + } + } + }, + "solium": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/solium/-/solium-1.1.2.tgz", + "integrity": "sha512-2CvpbiU0msntDkK+X6y3qCcRqg+W7Bf237BrHPTP32zufK7OCaINK4ci7UEMnusbEW41njJwLitN0h32C3rVKA==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "commander": "2.13.0", + "js-string-escape": "1.0.1", + "lodash": "4.17.4", + "sol-digger": "0.0.2", + "sol-explore": "1.6.1", + "solium-plugin-security": "0.1.1", + "solparse": "2.2.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "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" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "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 + }, + "mocha": { + "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", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + } + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "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 + }, + "solparse": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.2.tgz", + "integrity": "sha512-TKX0Foi/N73nKco65+boo0YTtifFVEEXEPQkN4b1GkkEsXLXyV1TnvvIeT0qg9lEPLdi4Ri5WUWYVJipnSny+Q==", + "dev": true, + "requires": { + "mocha": "4.1.0", + "pegjs": "0.10.0", + "yargs": "10.1.1" + } + }, + "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" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.1.tgz", + "integrity": "sha512-7uRL1HZdCbc1QTP+X8mehOPuCYKC/XTaqAPj7gABLfTt6pgLyVRn3QVte4qhtilZouWCvqd1kipgMKl5tKsFiw==", + "dev": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" + } + }, + "yargs-parser": { + "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" + } + } + } + }, + "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 + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "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 + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string.prototype.trim": { + "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.10.0", + "function-bind": "1.1.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", + "dev": true, + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tape": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", + "integrity": "sha512-TWILfEnvO7I8mFe35d98F6T5fbLaEtbFTG/lxWvid8qDfFTxt19EBijWmB4j3+Hoh5TfHE2faWs73ua+EphuBA==", + "dev": true, + "requires": { + "deep-equal": "1.0.1", + "defined": "1.0.0", + "for-each": "0.3.2", + "function-bind": "1.1.1", + "glob": "7.1.2", + "has": "1.0.1", + "inherits": "2.0.3", + "minimist": "1.2.0", + "object-inspect": "1.3.0", + "resolve": "1.4.0", + "resumer": "0.0.0", + "string.prototype.trim": "1.1.2", + "through": "2.3.8" + }, + "dependencies": { + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + } + } + }, + "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 + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "truffle": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.4.tgz", + "integrity": "sha512-keAkRNNfU3W7yUMRDF3YHoqmqdv6TChXY0g+RuPpxnRHfspXVtIKwuN2pV07jzY/RbDsIKShcSyF7VBV7eZUvg==", + "dev": true, + "requires": { + "mocha": "3.5.3", + "original-require": "1.0.1", + "solc": "0.4.18" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "truffle-config": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/truffle-config/-/truffle-config-1.0.4.tgz", + "integrity": "sha512-E8pvJNAIjs7LNsjkYeS2dgoOnLoSBrTwb1xF5lJwfvZmGMFpKvVL1sa5jpFxozpf/WkRn/rfxy8zTdb3pq16jA==", + "dev": true, + "requires": { + "find-up": "2.1.0", + "lodash": "4.17.4", + "original-require": "1.0.1", + "truffle-error": "0.0.2", + "truffle-provider": "0.0.4" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "truffle-error": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/truffle-error/-/truffle-error-0.0.2.tgz", + "integrity": "sha1-AbGJt4UFVmrhaJwjnHyi3RIc/kw=", + "dev": true + }, + "truffle-hdwallet-provider": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/truffle-hdwallet-provider/-/truffle-hdwallet-provider-0.0.3.tgz", + "integrity": "sha1-Dh3gIQS3PTh14c9wkzBbTqii2EM=", + "dev": true, + "requires": { + "bip39": "2.5.0", + "ethereumjs-wallet": "0.6.0", + "web3": "0.18.4", + "web3-provider-engine": "8.6.1" + } + }, + "truffle-provider": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/truffle-provider/-/truffle-provider-0.0.4.tgz", + "integrity": "sha512-yVxxjocxnJcFspQ0T4Rjq/1wvvm3iLxidb6oa1EAX5LsnSQLPG8wAM5+JLlJ4FDBsqJdZLGOq1RR5Ln/w7x5JA==", + "dev": true, + "requires": { + "truffle-error": "0.0.2", + "web3": "0.20.3" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "dev": true + }, + "web3": { + "version": "0.20.3", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.3.tgz", + "integrity": "sha1-yqRDc9yIFayHZ73ba6cwc5ZMqos=", + "dev": true, + "requires": { + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "crypto-js": "3.1.8", + "utf8": "2.1.2", + "xhr2": "0.1.4", + "xmlhttprequest": "1.8.0" + } + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "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-check": { + "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" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" + } + }, + "unorm": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", + "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "utf8": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.2.tgz", + "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "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", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.6.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + } + }, + "web3": { + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.18.4.tgz", + "integrity": "sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0=", + "dev": true, + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "crypto-js": "3.1.8", + "utf8": "2.1.2", + "xhr2": "0.1.4", + "xmlhttprequest": "1.8.0" + } + }, + "web3-provider-engine": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-8.6.1.tgz", + "integrity": "sha1-TYbhnjDKr5ffNRUR7A9gE25bMOs=", + "dev": true, + "requires": { + "async": "2.6.0", + "clone": "2.1.1", + "ethereumjs-block": "1.7.0", + "ethereumjs-tx": "1.3.3", + "ethereumjs-util": "5.1.3", + "ethereumjs-vm": "2.3.2", + "isomorphic-fetch": "2.2.1", + "request": "2.79.0", + "semaphore": "1.1.0", + "solc": "0.4.18", + "tape": "4.8.0", + "web3": "0.16.0", + "xhr": "2.4.1", + "xtend": "4.0.1" + }, + "dependencies": { + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#c7a38de919ed75e6fb6ba38051986e294b328df9", + "dev": true + }, + "ethereumjs-util": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.3.tgz", + "integrity": "sha512-U/wmHagElZVxnpo3bFsvk5beFADegUcEzqtA/NfQbitAPOs6JoYq8M4SY9NfH4HD8236i63UOkkXafd7bqBL9A==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "create-hash": "1.1.3", + "ethjs-util": "0.1.4", + "keccak": "1.4.0", + "rlp": "2.0.0", + "safe-buffer": "5.1.1", + "secp256k1": "3.4.0" + } + }, + "web3": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.16.0.tgz", + "integrity": "sha1-pFVBdc1GKUMDWx8dOUMvdBxrYBk=", + "dev": true, + "requires": { + "bignumber.js": "git+https://github.com/debris/bignumber.js.git#c7a38de919ed75e6fb6ba38051986e294b328df9", + "crypto-js": "3.1.8", + "utf8": "2.1.2", + "xmlhttprequest": "1.8.0" + } + } + } + }, + "webpack": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", + "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "dev": true, + "requires": { + "acorn": "5.3.0", + "acorn-dynamic-import": "2.0.2", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "0.2.17", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "3.2.3", + "tapable": "0.2.8", + "uglify-js": "2.8.29", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "6.6.0" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xhr": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz", + "integrity": "sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==", + "dev": true, + "requires": { + "global": "4.3.2", + "is-function": "1.0.1", + "parse-headers": "2.0.1", + "xtend": "4.0.1" + } + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=", + "dev": true + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + } + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index 7c11bc507..793a0ba1a 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,43 @@ { - "name": "aragon-core", - "version": "1.0.0", + "name": "@aragon/os", + "version": "3.0.0", "description": "Core contracts for Aragon", - "main": "index.js", "scripts": { - "prepublish": "truffle compile", - "generate:factory": "truffle exec scripts/generate_factory.js", - "test": "truffle test", + "test": "npm run ganache-cli:dev && truffle test --network rpc", + "test:gas": "GAS_REPORTER=true npm test", "lint": "solium --dir ./contracts", - "coverage": "scripts/coverage.sh", - "coveralls": "scripts/coveralls.sh" + "coverage": "npm run ganache-cli:coverage && node_modules/.bin/solidity-coverage", + "console": "node_modules/.bin/truffle console", + "ganache-cli:dev": "scripts/ganache-cli.sh", + "ganache-cli:coverage": "SOLIDITY_COVERAGE=true scripts/ganache-cli.sh", + "migrate:dev": "npm run ganache-cli:dev && npm run migrate:dev:contracts", + "migrate:dev:contracts": "truffle migrate --all --network rpc;", + "generate:artifacts-dev": "npm run migrate:dev; truffle exec --network rpc scripts/generate_artifacts.js" }, "files": [ "index.js", - "build/" + "build/", + "artifacts/", + "contracts/", + "truffle-config.js" ], - "author": "Jorge Izquierdo (Aragon)", - "license": "ISxC", - "dependencies": { - "babel-polyfill": "^6.23.0", - "ethereumjs-abi": "^0.6.4", - "ethereumjs-util": "^5.1.1", - "keybase-eth": "^0.3.0", - "solium": "^0.5.4", - "truffle-config": "^1.0.1", - "truffle-expect": "0.0.3", - "truffle-hdwallet-provider": "0.0.3" - }, + "author": "Aragon Institution MTU ", + "contributors": [ + "Jorge Izquierdo " + ], + "license": "GPL-3.0", "devDependencies": { - "babel-preset-es2015": "^6.18.0", - "babel-preset-stage-2": "^6.24.1", - "babel-preset-stage-3": "^6.17.0", - "babel-register": "^6.23.0", - "coveralls": "^2.13.1", - "ethereumjs-testrpc": "^4.0.1", - "handlebars": "^4.0.10", + "coveralls": "^2.13.3", + "eth-ens-namehash": "^2.0.8", + "eth-gas-reporter": "^0.1.1", + "ethereumjs-abi": "^0.6.5", + "ganache-cli": "^6.0.3", + "glob": "^7.1.2", "mocha-lcov-reporter": "^1.3.0", - "solidity-coverage": "^0.2.1", - "solidity-inspector": "^0.1.0", - "truffle": "^3.4.6" + "solidity-coverage": "^0.3.5", + "solium": "^1.1.2", + "truffle": "^4.0.4", + "truffle-config": "^1.0.4", + "truffle-hdwallet-provider": "0.0.3" } } diff --git a/readme.md b/readme.md index 8f2d1da72..1cd5aa950 100644 --- a/readme.md +++ b/readme.md @@ -1,31 +1,38 @@ -# Aragon Core [![Build Status](https://travis-ci.org/aragon/aragon-core.svg?branch=master)](https://travis-ci.org/aragon/aragon-core) [![Coverage Status](https://coveralls.io/repos/github/aragon/aragon-core/badge.svg?branch=master)](https://coveralls.io/github/aragon/aragon-core?branch=master) +# aragonOS [![Travis branch](https://img.shields.io/travis/aragon/aragonOS/master.svg?style=for-the-badge)](https://travis-ci.org/aragon/aragonOS) [![Coveralls branch](https://img.shields.io/coveralls/aragon/aragonOS/master.svg?style=for-the-badge)](https://coveralls.io/github/aragon/aragonOS?branch=master) [![npm](https://img.shields.io/npm/v/@aragon/os.svg?style=for-the-badge)](https://www.npmjs.com/package/@aragon/os) + +This repo contains Aragon's reference implementation for [aragonOS](https://wiki.aragon.one/dev/aragonOS_index/). #### 🚨 Everything in this repo is highly experimental software. It is not secure to use any of this code in production (mainnet) until proper security audits have been conducted. It can result in irreversible loss of funds. -#### 🦋 We are using [CommitETH](http://commiteth.com) to reward open source contributions outside the Aragon Core team. -All issues tagged with **[bounty](https://github.com/aragon/aragon-core/labels/bounty)** are eligible for a bounty on a succesfully merged Pull Request that solves the issue. Even if the bounty says 0 ETH, if it has the **bounty** label, it is higher than 0 ETH (until we automate it, we may take a bit to fund the bounties manually). - -Open source is awesome, but it is also hard work that needs to be rewarded to ensure top quality work, and that everyone in the world gets a fair chance to do it. +#### 🦋 We are using [Status Open Bounty](http://openbounty.status.im/app) to reward open source contributions with Aragon Tokens (ANT) +All issues tagged with **[bounty](https://github.com/aragon/aragonOS/labels/bounty)** are eligible for a bounty on a successfully merged Pull Request that solves the issue. Even if the bounty says 0 ANT, if it has the **bounty** label, it will always be higher than 0 ANT (until we automate it, we may take a bit to fund the bounties manually). -#### 👋 We are tagging tasks that are [beginner friendly](https://github.com/aragon/aragon-core/labels/beginner-friendly) so you can get started contributing to Aragon Core. +#### 👋 We are tagging tasks that are [good first issues](https://github.com/aragon/aragonOS/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) so you can get started contributing to Aragon Core. Don't be shy to contribute even the smallest tweak. Everyone will be specially nice and helpful to beginners to help you get started! ## Documentation -Visit the [wiki](https://github.com/aragon/aragon-core/wiki) for in depth documentation on the [architecture](https://github.com/aragon/aragon-core/wiki/Architecture) and different parts of the system. +Visit the [Aragon wiki](https://wiki.aragon.one/dev/aragonOS_index/) for in depth documentation on the [architecture](https://wiki.aragon.one/documentation/aragonOS/) and different parts of the system. -## Contributing +## Installing aragonOS -To make it easier for contributors to get up to speed, we provide a docker environment that provides all the requirements to build and test Aragon Core. +```sh +npm install +npm test -For more detail you can check the [contributing guide](https://github.com/aragon/aragon-core/wiki/How-to-contribute) on the wiki. +# Lint needs to pass as well +npm run lint +``` -### Requirements +## Using aragonOS for making Aragon apps - - [Docker](https://www.docker.com/get-docker) - - [Docker Compose](https://docs.docker.com/compose/install/) +``` +npm i --save-dev @aragon/os +``` -### Run tests +(section under construction) + +## Contributing - $ docker-compose run core test +For details about how to contribute you can check the [contributing guide](https://wiki.aragon.one/dev/aragonOS_how_to_contribute/) on the wiki. diff --git a/rsc/architecture.jpg b/rsc/architecture.jpg deleted file mode 100644 index e765d5d38..000000000 Binary files a/rsc/architecture.jpg and /dev/null differ diff --git a/rsc/basic-arch.png b/rsc/basic-arch.png deleted file mode 100644 index e52a11050..000000000 Binary files a/rsc/basic-arch.png and /dev/null differ diff --git a/rsc/kernel-arch.png b/rsc/kernel-arch.png deleted file mode 100644 index aa99770ee..000000000 Binary files a/rsc/kernel-arch.png and /dev/null differ diff --git a/scripts/coverage.sh b/scripts/coverage.sh deleted file mode 100755 index d9019e00e..000000000 --- a/scripts/coverage.sh +++ /dev/null @@ -1,26 +0,0 @@ -#! /bin/bash - -# Executes cleanup function at script exit. -trap cleanup EXIT - -cleanup() { - # Kill the testrpc instance that we started (if we started one). - if [ -n "$testrpc_pid" ]; then - kill -9 $testrpc_pid - fi -} - -testrpc_running() { - nc -z localhost 8555 -} - -if testrpc_running; then - echo "Using existing testrpc-sc instance" -else - echo "Starting testrpc-sc to generate coverage" - ./node_modules/ethereumjs-testrpc-sc/build/cli.node.js --gasLimit 0xfffffffffff --port 8555 > /dev/null & - testrpc_pid=$! -fi - -SOLIDITY_COVERAGE=true ./node_modules/.bin/solidity-coverage - diff --git a/scripts/coveralls.sh b/scripts/coveralls.sh deleted file mode 100755 index d3cab6098..000000000 --- a/scripts/coveralls.sh +++ /dev/null @@ -1,3 +0,0 @@ -#! /bin/bash - -npm run coverage && cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js diff --git a/scripts/function_analysis.js b/scripts/function_analysis.js deleted file mode 100644 index 5367a903c..000000000 --- a/scripts/function_analysis.js +++ /dev/null @@ -1,57 +0,0 @@ -const fs = require('fs') -const path = require('path') -const { signatures } = require('../test/helpers/web3') -const inspector = require('solidity-inspector') - -const getContract = x => artifacts.require(x) -const flatten = x => [].concat.apply([], x) - -const resultFile = path.join(process.cwd(), '../functions.csv') - -const organNames = ['organs/MetaOrgan.sol', 'organs/VaultOrgan.sol', 'organs/ActionsOrgan.sol'] -const appNames = ['apps/bylaws/BylawsApp.sol', 'apps/ownership/OwnershipApp.sol', 'apps/status/StatusApp.sol', 'apps/basic-governance/VotingApp.sol'] -const excludeOrgans = ['IOrgan'].map(getContract) -const excludeApps = ['Application'].map(getContract) - -const analizeContract = (f) => { - const filePath = path.join(process.cwd(), 'contracts', f) - const functions = inspector.parseFile(filePath).toJSON().functions - - return Object.keys(functions) - .map(k => functions[k]) - .filter(f => f.accessModifier != 'internal' && f.accessModifier != 'private') -} - -const contractName = p => path.basename(p).split('.')[0] - -module.exports = (done) => { - const organData = organNames.map(n => { - const d = analizeContract(n) - return { name: contractName(n), functions: d.map(f => f.name) } - }) - - const appData = appNames.map(n => { - const d = analizeContract(n) - return { name: contractName(n), functions: d.filter(f => f.modifiers.indexOf('onlyDAO') > -1).map(f => f.name) } - }) - - let content = 'Component,Function,Permissions,Notes\n' - for (const organ of organData) { - content += `${organ.name},,,\n` - for (const f of organ.functions) { - content += `,"${f}",,\n` - } - } - - for (const app of appData) { - content += `${app.name},,,\n` - for (const f of app.functions) { - content += `,"${f}",,\n` - } - } - - fs.writeFile(resultFile, content, err => { - if (err) console.log(err) - done() - }) -} diff --git a/scripts/ganache-cli.sh b/scripts/ganache-cli.sh new file mode 100755 index 000000000..19b5e3c0a --- /dev/null +++ b/scripts/ganache-cli.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +# Exit script as soon as a command fails. +set -o errexit + +if [ "$SOLIDITY_COVERAGE" = true ]; then + testrpc_port=8555 +else + testrpc_port=8545 +fi + +testrpc_running() { + nc -z localhost "$testrpc_port" +} + +start_testrpc() { + if [ "$SOLIDITY_COVERAGE" = true ]; then + node_modules/.bin/testrpc-sc -i 16 --gasLimit 0xfffffffffff --port "$testrpc_port" > /dev/null & + else + node_modules/.bin/ganache-cli -i 15 --gasLimit 50000000 > /dev/null & + fi + + testrpc_pid=$! +} + +if testrpc_running; then + echo "Using existing testrpc instance at port $testrpc_port" +else + echo "Starting our own testrpc instance at port $testrpc_port" + start_testrpc +fi diff --git a/scripts/generate_factory.js b/scripts/generate_factory.js deleted file mode 100644 index f316fd260..000000000 --- a/scripts/generate_factory.js +++ /dev/null @@ -1,91 +0,0 @@ -const Handlebars = require('handlebars') -const fs = require('fs') -const path = require('path') -const { signatures } = require('../test/helpers/web3') -const inspector = require('solidity-inspector') - -const factoryTemplate = path.join(process.cwd(), '../contracts/factories/BasicFactory.sol.tmpl') -const resultFile = path.join(process.cwd(), '../contracts/factories/BasicFactory.sol') - -const getContract = x => artifacts.require(x) -const flatten = x => [].concat.apply([], x) - -const organNames = ['organs/MetaOrgan.sol', 'organs/VaultOrgan.sol', 'organs/ActionsOrgan.sol'] -const appNames = ['apps/bylaws/BylawsApp.sol', 'apps/ownership/OwnershipApp.sol', 'apps/status/StatusApp.sol', 'apps/basic-governance/VotingApp.sol'] -const excludeOrgans = ['IOrgan'].map(getContract) -const excludeApps = ['Application'].map(getContract) - -const parseBylaw = bylaw => { - const args = bylaw.split(':') - if (args.length != 2) return console.log('Invalid bylaw syntax', bylaw) - - let dir = {} - dir[args[0]] = args[1].split(',') - return dir -} - -const flattenBylaws = x => { - let bylaws = {} - flatten(x) - .forEach(x => bylaws[x.bylaw] = !bylaws[x.bylaw] ? [x.name] : bylaws[x.bylaw].concat([x.name])) - - return Object.keys(bylaws) - .map((k, i) => ({id: i + 1, bylaw: parseBylaw(k), functions: bylaws[k] })) -} - -const getBylaws = (f) => { - const filePath = path.join(process.cwd(), 'contracts', f) - const functions = inspector.parseFile(filePath).toJSON().functions - - return Object.keys(functions).map(k => functions[k]) - .filter(x => x.bylaw) -} - -const assignBylaw = (bylaws, fn) => { - for (var bylaw of bylaws) { - for (var _fn of bylaw.functions) { - // remove [] as solidity-parser fails to get array types - if (fn.name.replace(/\[\]/g, '') == _fn) { - fn.bylaw = bylaw.id - return fn - } - } - } - return fn -} - -const contractName = p => path.basename(p).split('.')[0].toLowerCase() - -module.exports = (done) => { - fs.readFile(factoryTemplate, { encoding: 'utf-8'}, (err, file) => { - const template = Handlebars.compile(file) - - const bylaws = flattenBylaws(organNames.concat(appNames).map(getBylaws)) - - const organData = organNames.map((o, i) => { - const sigs = signatures(getContract(o), excludeOrgans, web3, true) - return { name: contractName(o), sigs: sigs.map(x => assignBylaw(bylaws, x)) } - }) - - const appData = appNames.map((a, i) => { - const sigs = signatures(getContract(a), excludeApps, web3, true) - return { name: contractName(a), sigs: sigs.map(x => assignBylaw(bylaws, x)) } - }) - - appData[appData.length-1].last = true - - const data = { - disclaimer: 'This is an automatically generated file. Please edit BasicFactory.sol.tmpl or the generate_factory.js script', - apps: appData, - organs: organData, - bylaws: bylaws, - } - - const content = template(data) - fs.writeFile(resultFile, content, err => { - if (err) return console.log('Error', err) - console.log('Saved', resultFile) - done() - }) - }) -} diff --git a/setup.sh b/setup.sh deleted file mode 100644 index 9814f45e0..000000000 --- a/setup.sh +++ /dev/null @@ -1,4 +0,0 @@ -npm uninstall --save truffle -npm install truffle@beta -npm i -rm -rf contracts/zeppelin diff --git a/test/TestACLInterpreter.sol b/test/TestACLInterpreter.sol new file mode 100644 index 000000000..1d6ff1123 --- /dev/null +++ b/test/TestACLInterpreter.sol @@ -0,0 +1,259 @@ +pragma solidity 0.4.18; + +import "truffle/Assert.sol"; +import "./helpers/ACLHelpers.sol"; + + +contract TestACLInterpreter is ACL, ACLHelpers { + function testEqualityUint() public { + // Assert param 0 is equal to 10, given that params are [10, 11] + assertEval(arr(uint256(10), 11), 0, Op.EQ, 10, true); + assertEval(arr(uint256(10), 11), 1, Op.EQ, 10, false); + assertEval(arr(uint256(10), 11), 1, Op.EQ, 11, true); + } + + function testEqualityAddr() public { + assertEval(arr(msg.sender), 0, Op.EQ, uint256(msg.sender), true); + assertEval(arr(msg.sender), 0, Op.EQ, uint256(this), false); + } + + function testEqualityBytes() public { + assertEval(arr(keccak256("hi")), 0, Op.EQ, uint256(keccak256("hi")), true); + assertEval(arr(keccak256("hi")), 0, Op.EQ, uint256(keccak256("bye")), false); + } + + function testInequalityUint() public { + assertEval(arr(uint256(10), 11), 0, Op.NEQ, 10, false); + assertEval(arr(uint256(10), 11), 1, Op.NEQ, 10, true); + assertEval(arr(uint256(10), 11), 1, Op.NEQ, 11, false); + } + + function testInequalityBytes() public { + assertEval(arr(keccak256("hi")), 0, Op.NEQ, uint256(keccak256("hi")), false); + assertEval(arr(keccak256("hi")), 0, Op.NEQ, uint256(keccak256("bye")), true); + } + + function testInequalityAddr() public { + assertEval(arr(msg.sender), 0, Op.NEQ, uint256(msg.sender), false); + assertEval(arr(msg.sender), 0, Op.NEQ, uint256(this), true); + } + + function testGreatherThan() public { + assertEval(arr(uint256(10), 11), 0, Op.GT, 9, true); + assertEval(arr(uint256(10), 11), 0, Op.GT, 10, false); + assertEval(arr(uint256(10), 11), 1, Op.GT, 10, true); + } + + function testLessThan() public { + assertEval(arr(uint256(10), 11), 0, Op.LT, 9, false); + assertEval(arr(uint256(9), 11), 0, Op.LT, 10, true); + assertEval(arr(uint256(10), 11), 1, Op.LT, 10, false); + } + + function testGreatherThanOrEqual() public { + assertEval(arr(uint256(10), 11), 0, Op.GTE, 9, true); + assertEval(arr(uint256(10), 11), 0, Op.GTE, 10, true); + assertEval(arr(uint256(10), 11), 1, Op.GTE, 12, false); + } + + function testLessThanOrEqual() public { + assertEval(arr(uint256(10), 11), 0, Op.LTE, 9, false); + assertEval(arr(uint256(9), 11), 0, Op.LTE, 10, true); + assertEval(arr(uint256(10), 11), 1, Op.LTE, 11, true); + } + + function testSender() public { + assertEval(arr(), SENDER_PARAM_ID, Op.EQ, uint256(msg.sender), true); + assertEval(arr(), SENDER_PARAM_ID, Op.EQ, uint256(0x1234), false); + } + + function testTimestamp() public { + assertEval(arr(), TIMESTAMP_PARAM_ID, Op.EQ, uint256(block.timestamp), true); + assertEval(arr(), TIMESTAMP_PARAM_ID, Op.EQ, uint256(1), false); + assertEval(arr(), TIMESTAMP_PARAM_ID, Op.GT, uint256(1), true); + } + + function testBlockNumber() public { + assertEval(arr(), BLOCK_NUMBER_PARAM_ID, Op.EQ, uint256(block.number), true); + assertEval(arr(), BLOCK_NUMBER_PARAM_ID, Op.EQ, uint256(1), false); + assertEval(arr(), BLOCK_NUMBER_PARAM_ID, Op.GT, uint256(block.number - 1), true); + } + + function testOracle() public { + assertEval(arr(), ORACLE_PARAM_ID, Op.EQ, uint256(new AcceptOracle()), true); + assertEval(arr(), ORACLE_PARAM_ID, Op.EQ, uint256(new RejectOracle()), false); + assertEval(arr(), ORACLE_PARAM_ID, Op.NEQ, uint256(new RejectOracle()), true); + } + + function testReturn() public { + assertEval(arr(), PARAM_VALUE_PARAM_ID, Op.RET, uint256(1), true); + assertEval(arr(), PARAM_VALUE_PARAM_ID, Op.RET, uint256(0), false); + assertEval(arr(), PARAM_VALUE_PARAM_ID, Op.RET, uint256(100), true); + assertEval(arr(), TIMESTAMP_PARAM_ID, Op.RET, uint256(0), true); + } + + function testNot() public { + Param memory retTrue = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 1); + Param memory retFalse = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 0); + + Param memory notOp = Param(LOGIC_OP_PARAM_ID, uint8(Op.NOT), encodeOperator(1, 0)); + Param[] memory params = new Param[](2); + + // !true == false + params[0] = notOp; + params[1] = retTrue; + assertEval(params, false); + + // !false == true + params[1] = retFalse; + assertEval(params, true); + } + + function testComplexCombination() { + // if (oracle and block number > block number - 1) then arg 0 < 10 or oracle else false + Param[] memory params = new Param[](7); + params[0] = Param(LOGIC_OP_PARAM_ID, uint8(Op.IF_ELSE), encodeIfElse(1, 4, 6)); + params[1] = Param(LOGIC_OP_PARAM_ID, uint8(Op.AND), encodeOperator(2, 3)); + params[2] = Param(ORACLE_PARAM_ID, uint8(Op.EQ), uint240(new AcceptOracle())); + params[3] = Param(BLOCK_NUMBER_PARAM_ID, uint8(Op.GT), uint240(block.number - 1)); + params[4] = Param(LOGIC_OP_PARAM_ID, uint8(Op.OR), encodeOperator(5, 2)); + params[5] = Param(0, uint8(Op.LT), uint240(10)); + params[6] = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 0); + + assertEval(params, arr(uint256(10)), true); + + params[4] = Param(LOGIC_OP_PARAM_ID, uint8(Op.AND), encodeOperator(5, 2)); + assertEval(params, arr(uint256(10)), false); + } + + function testParamOutOfBoundsFail() { + Param[] memory params = new Param[](2); + + params[1] = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 1); + assertEval(params, arr(uint256(10)), false); + + params[0] = Param(LOGIC_OP_PARAM_ID, uint8(Op.IF_ELSE), encodeIfElse(2, 2, 2)); + assertEval(params, arr(uint256(10)), false); + } + + function testArgOutOfBoundsFail() { + assertEval(arr(uint256(10), 11), 3, Op.EQ, 10, false); + } + + function testIfElse() public { + Param memory retTrue = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 1); + Param memory retFalse = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 0); + + // If 1 then 2 else 3 + Param memory ifOp = Param(LOGIC_OP_PARAM_ID, uint8(Op.IF_ELSE), encodeIfElse(1, 2, 3)); + Param[] memory params = new Param[](4); + + // true ? true : false == true + params[0] = ifOp; + params[1] = retTrue; + params[2] = retTrue; + params[3] = retFalse; + assertEval(params, true); + + // false ? true : false == false + params[1] = retFalse; + assertEval(params, false); + } + + function testCombinators() public { + Param memory retTrue = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 1); + Param memory retFalse = Param(PARAM_VALUE_PARAM_ID, uint8(Op.RET), 0); + + // OR param at index 1 or param 2 + Param memory orOp = Param(LOGIC_OP_PARAM_ID, uint8(Op.OR), encodeOperator(1, 2)); + Param memory andOp = Param(LOGIC_OP_PARAM_ID, uint8(Op.AND), encodeOperator(1, 2)); + Param memory xorOp = Param(LOGIC_OP_PARAM_ID, uint8(Op.XOR), encodeOperator(1, 2)); + + Param[] memory params = new Param[](3); + + // or true true == true + params[0] = orOp; + params[1] = retTrue; + params[2] = retTrue; + assertEval(params, true); + + // or false true == true + params[1] = retFalse; + assertEval(params, true); + + // or true false == true + params[1] = retTrue; + params[2] = retFalse; + assertEval(params, true); + + // or false false == false + params[1] = retFalse; + assertEval(params, false); + + // and false false == false + params[0] = andOp; + assertEval(params, false); + + // and true false == false + params[1] = retTrue; + assertEval(params, false); + + // and false true == false + params[1] = retFalse; + params[2] = retTrue; + assertEval(params, false); + + // and true true == true + params[1] = retTrue; + params[2] = retTrue; + assertEval(params, true); + + // xor true true == false + params[0] = xorOp; + assertEval(params, false); + + // xor false true == true + params[1] = retFalse; + assertEval(params, true); + + // xor true false == true + params[1] = retTrue; + params[2] = retFalse; + assertEval(params, true); + + // xor false false == false + params[1] = retFalse; + assertEval(params, false); + } + + + function assertEval(uint256[] memory args, uint8 argId, Op op, uint256 value, bool expected) internal { + Param[] memory params = new Param[](1); + params[0] = Param(argId, uint8(op), uint240(value)); + assertEval(params, args, expected); + } + + function assertEval(Param[] memory params, bool expected) internal { + assertEval(params, new uint256[](0), expected); + } + + function assertEval(Param[] memory params, uint256[] memory args, bool expected) internal { + bytes32 paramHash = encodeAndSaveParams(params); + bool allow = evalParam(paramHash, 0, address(0), address(0), bytes32(0), args); + + Assert.equal(allow, expected, "eval got unexpected result"); + } + + event LogParam(bytes32 param); + function encodeAndSaveParams(Param[] memory params) internal returns (bytes32) { + uint256[] memory encodedParams = new uint256[](params.length); + + for (uint256 i = 0; i < params.length; i++) { + Param memory param = params[i]; + encodedParams[i] = (uint256(param.id) << 248) + (uint256(param.op) << 240) + param.value; + LogParam(bytes32(encodedParams[i])); + } + + return _saveParams(encodedParams); + } +} diff --git a/test/apm_registry.js b/test/apm_registry.js new file mode 100644 index 000000000..d35dd47e3 --- /dev/null +++ b/test/apm_registry.js @@ -0,0 +1,175 @@ +const { assertRevert } = require('./helpers/assertThrow') +const namehash = require('eth-ens-namehash').hash +const keccak256 = require('js-sha3').keccak_256 + +const ENS = artifacts.require('ENS') +const Repo = artifacts.require('Repo') +const APMRegistry = artifacts.require('APMRegistry') +const PublicResolver = artifacts.require('PublicResolver') +const Kernel = artifacts.require('Kernel') +const ACL = artifacts.require('ACL') + +const getContract = name => artifacts.require(name) + +contract('APMRegistry', accounts => { + let ensFactory, ens, apmFactory, apmFactoryMock, registry, baseDeployed, baseAddrs, dao, acl = {} + const ensOwner = accounts[0] + const apmOwner = accounts[1] + const repoDev = accounts[2] + const notOwner = accounts[5] + + const rootNode = namehash('aragonpm.eth') + const testNode = namehash('test.aragonpm.eth') + + before(async () => { + const bases = ['APMRegistry', 'Repo', 'ENSSubdomainRegistrar'] + baseDeployed = await Promise.all(bases.map(c => getContract(c).new())) + baseAddrs = baseDeployed.map(c => c.address) + + ensFactory = await getContract('ENSFactory').new() + apmFactory = await getContract('APMRegistryFactory').new(...baseAddrs, '0x0', ensFactory.address) + apmFactoryMock = await getContract('APMRegistryFactoryMock').new(...baseAddrs, '0x0', ensFactory.address) + ens = ENS.at(await apmFactory.ens()) + }) + + beforeEach(async () => { + const receipt = await apmFactory.newAPM(namehash('eth'), '0x'+keccak256('aragonpm'), apmOwner) + const apmAddr = receipt.logs.filter(l => l.event == 'DeployAPM')[0].args.apm + registry = APMRegistry.at(apmAddr) + + dao = Kernel.at(await registry.kernel()) + acl = ACL.at(await dao.acl()) + const subdomainRegistrar = baseDeployed[2] + + // Get permission to delete names after each test case + await acl.createPermission(apmOwner, await registry.registrar(), await subdomainRegistrar.DELETE_NAME_ROLE(), apmOwner, { from: apmOwner }) + }) + + afterEach(async () => { + // Clean up test.aragonpm.eth if was set + const zeroAddr = '0x0000000000000000000000000000000000000000' + if (await ens.owner(testNode) == zeroAddr) return + + // Free test name so it can be used on next test + const registrar = getContract('ENSSubdomainRegistrar').at(await registry.registrar()) + await registrar.deleteName('0x'+keccak256('test'), { from: apmOwner }) + assert.equal(await ens.owner(testNode), zeroAddr, 'should have cleaned up') + }) + + it('aragonpm.eth should resolve to registry', async () => { + const resolver = PublicResolver.at(await ens.resolver(rootNode)) + + assert.equal(await resolver.addr(rootNode), registry.address, 'rootnode should be resolve') + }) + + it('aragonpm.eth should be owned by ENSSubdomainRegistrar', async () => { + assert.equal(await ens.owner(rootNode), await registry.registrar(), 'rootnode should be owned correctly') + }) + + it('fails to create empty repo name', async () => { + return assertRevert(async () => { + await registry.newRepo('', repoDev, { from: apmOwner }) + }) + }) + + it('fails if factory doesnt give permission to create permissions', async () => { + return assertRevert(async () => { + await apmFactoryMock.newBadAPM(namehash('eth'), '0x'+keccak256('aragonpm'), apmOwner, true) + }) + }) + + it('fails if factory doesnt give permission to create names', async () => { + return assertRevert(async () => { + await apmFactoryMock.newBadAPM(namehash('eth'), '0x'+keccak256('aragonpm'), apmOwner, false) + }) + }) + + it('inits with existing ENS deployment', async () => { + const receipt = await ensFactory.newENS(accounts[0]) + const ens2 = ENS.at(receipt.logs.filter(l => l.event == 'DeployENS')[0].args.ens) + const newFactory = await getContract('APMRegistryFactory').new(...baseAddrs, ens2.address, '0x00') + + await ens2.setSubnodeOwner(namehash('eth'), '0x'+keccak256('aragonpm'), newFactory.address) + const receipt2 = await newFactory.newAPM(namehash('eth'), '0x'+keccak256('aragonpm'), apmOwner) + const apmAddr = receipt2.logs.filter(l => l.event == 'DeployAPM')[0].args.apm + const resolver = PublicResolver.at(await ens2.resolver(rootNode)) + + assert.equal(await resolver.addr(rootNode), apmAddr, 'rootnode should be resolve') + }) + + const getRepoFromLog = receipt => receipt.logs.filter(x => x.event == 'NewRepo')[0].args.repo + + context('creating test.aragonpm.eth repo', () => { + let repo = {} + + beforeEach(async () => { + const receipt = await registry.newRepo('test', repoDev, { from: apmOwner }) + repo = Repo.at(getRepoFromLog(receipt)) + }) + + it('resolver is setup correctly', async () => { + const resolverNode = namehash('resolver.eth') + const publicResolver = PublicResolver.at(await ens.resolver(resolverNode)) + + assert.equal(await ens.resolver(testNode), await publicResolver.addr(resolverNode), 'resolver should be set to public resolver') + assert.equal(await publicResolver.addr(testNode), repo.address, 'resolver should resolve to repo address') + }) + + it('repo should have 0 versions', async () => { + assert.equal(await repo.getVersionsCount(), 0, 'shouldnt have created version') + }) + + it('fails when creating repo with existing name', async () => { + return assertRevert(async () => { + await registry.newRepo('test', repoDev) + }) + }) + + it('repo dev can create versions', async () => { + await repo.newVersion([1, 0, 0], '0x00', '0x00', { from: repoDev }) + await repo.newVersion([2, 0, 0], '0x00', '0x00', { from: repoDev }) + + assert.equal(await repo.getVersionsCount(), 2, 'should have created versions') + }) + + it('repo dev can authorize someone to interact with repo', async () => { + await repo.newVersion([1, 0, 0], '0x00', '0x00', { from: repoDev }) + const newOwner = accounts[8] + + await acl.grantPermission(newOwner, repo.address, await repo.CREATE_VERSION_ROLE(), { from: repoDev }) + + await repo.newVersion([2, 0, 0], '0x00', '0x00', { from: newOwner }) + await repo.newVersion([2, 1, 0], '0x00', '0x00', { from: repoDev }) // repoDev can still create them + + assert.equal(await repo.getVersionsCount(), 3, 'should have created versions') + }) + + it('repo dev can no longer create versions if permission is removed', async () => { + await repo.newVersion([1, 0, 0], '0x00', '0x00', { from: repoDev }) + await acl.revokePermission(repoDev, repo.address, await repo.CREATE_VERSION_ROLE(), { from: repoDev }) + + return assertRevert(async () => { + await repo.newVersion([2, 0, 0], '0x00', '0x00', { from: repoDev }) + }) + }) + + it('cannot create versions if not in ACL', async () => { + return assertRevert(async () => { + await repo.newVersion([1, 0, 0], '0x00', '0x00', { from: notOwner }) + }) + }) + }) + + it('can create repo with version', async () => { + const receipt = await registry.newRepoWithVersion('test', repoDev, [1, 0, 0], '0x00', '0x00', { from: apmOwner }) + const repoAddr = getRepoFromLog(receipt) + + assert.equal(await Repo.at(repoAddr).getVersionsCount(), 1, 'should have created version') + }) + + it('cannot create repo if not in ACL', async () => { + return assertRevert(async () => { + await registry.newRepo('test', repoDev, { from: notOwner }) + }) + }) +}) \ No newline at end of file diff --git a/test/apm_repo.js b/test/apm_repo.js new file mode 100644 index 000000000..4690cef8c --- /dev/null +++ b/test/apm_repo.js @@ -0,0 +1,131 @@ +const { assertRevert } = require('./helpers/assertThrow') + +const Repo = artifacts.require('Repo') + +contract('Repo', accounts => { + let repo = {} + + beforeEach(async () => { + repo = await Repo.new() + }) + + it('computes correct valid bumps', async () => { + await assert.isTrue(await repo.isValidBump.call([0, 0, 0], [0, 0, 1])) + await assert.isTrue(await repo.isValidBump.call([0, 0, 0], [0, 1, 0])) + await assert.isTrue(await repo.isValidBump.call([0, 0, 0], [1, 0, 0])) + await assert.isTrue(await repo.isValidBump.call([1, 4, 7], [2, 0, 0])) + await assert.isTrue(await repo.isValidBump.call([147, 4, 7], [147, 5, 0])) + + await assert.isFalse(await repo.isValidBump.call([0, 0, 1], [0, 0, 1])) + await assert.isFalse(await repo.isValidBump.call([0, 1, 0], [0, 2, 1])) + await assert.isFalse(await repo.isValidBump.call([0, 0, 2], [0, 0, 1])) + await assert.isFalse(await repo.isValidBump.call([2, 1, 0], [2, 2, 1])) + await assert.isFalse(await repo.isValidBump.call([1, 1, 1], [5, 0, 0])) + await assert.isFalse(await repo.isValidBump.call([5, 0, 0], [5, 2, 0])) + await assert.isFalse(await repo.isValidBump.call([0, 1, 2], [1, 1, 2])) + await assert.isFalse(await repo.isValidBump.call([0, 0, Math.pow(2, 16)], [0, 0, Math.pow(2, 16) - 1])) + }) + + // valid version as being a correct bump from 0.0.0 + it('cannot create invalid first version', async () => { + return assertRevert(async () => { + await repo.newVersion([1, 1, 0], '0x00', '0x00') + }) + }) + + context('creating initial version', () => { + const initialCode = accounts[8] // random addr, irrelevant + const initialContent = '0x12' + + beforeEach(async () => { + await repo.newVersion([1, 0, 0], initialCode, initialContent) + }) + + const assertVersion = (versionData, semanticVersion, code, contentUri) => { + const [[maj, min, pat], addr, content] = versionData + + assert.equal(maj, semanticVersion[0], 'major should match') + assert.equal(min, semanticVersion[1], 'minor should match') + assert.equal(pat, semanticVersion[2], 'patch should match') + + assert.equal(addr, code, 'code should match') + assert.equal(content, contentUri, 'content should match') + } + + it('version is fetchable as latest', async () => { + assertVersion(await repo.getLatest(), [1, 0, 0], initialCode, initialContent) + }) + + it('version is fetchable by semantic version', async () => { + assertVersion(await repo.getBySemanticVersion([1, 0, 0]), [1, 0, 0], initialCode, initialContent) + }) + + it('version is fetchable by contract address', async () => { + assertVersion(await repo.getLatestForContractAddress(initialCode), [1, 0, 0], initialCode, initialContent) + }) + + it('version is fetchable by version id', async () => { + assertVersion(await repo.getByVersionId(1), [1, 0, 0], initialCode, initialContent) + }) + + it('setting contract address to 0 reuses last version address', async () => { + await repo.newVersion([1, 1, 0], '0x00', initialContent) + assertVersion(await repo.getByVersionId(2), [1, 1, 0], initialCode, initialContent) + }) + + it('fails when changing contract address in non major version', async () => { + return assertRevert(async () => { + await repo.newVersion([1, 1, 0], accounts[2], initialContent) + }) + }) + + it('fails when version bump is invalid', async () => { + return assertRevert(async () => { + await repo.newVersion([1, 2, 0], initialCode, initialContent) + }) + }) + + it('fails if requesting version 0', async () => { + return assertRevert(async () => { + await repo.getByVersionId(0) + }) + }) + + context('adding new version', async () => { + const newCode = accounts[9] // random addr, irrelevant + const newContent = '0x13' + + beforeEach(async () => { + await repo.newVersion([2, 0, 0], newCode, newContent) + }) + + it('new version is fetchable as latest', async () => { + assertVersion(await repo.getLatest(), [2, 0, 0], newCode, newContent) + }) + + it('new version is fetchable by semantic version', async () => { + assertVersion(await repo.getBySemanticVersion([2, 0, 0]), [2, 0, 0], newCode, newContent) + }) + + it('new version is fetchable by contract address', async () => { + assertVersion(await repo.getLatestForContractAddress(newCode), [2, 0, 0], newCode, newContent) + }) + + it('new version is fetchable by version id', async () => { + assertVersion(await repo.getByVersionId(2), [2, 0, 0], newCode, newContent) + }) + + it('old version is fetchable by semantic version', async () => { + assertVersion(await repo.getBySemanticVersion([1, 0, 0]), [1, 0, 0], initialCode, initialContent) + }) + + it('old version is fetchable by contract address', async () => { + assertVersion(await repo.getLatestForContractAddress(initialCode), [1, 0, 0], initialCode, initialContent) + }) + + it('old version is fetchable by version id', async () => { + assertVersion(await repo.getByVersionId(1), [1, 0, 0], initialCode, initialContent) + }) + }) + }) +}) diff --git a/test/dao_apps.js b/test/dao_apps.js deleted file mode 100644 index caf81dfe2..000000000 --- a/test/dao_apps.js +++ /dev/null @@ -1,67 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var MockedApp = artifacts.require('./mocks/MockedApp') -var IOrgan = artifacts.require('IOrgan') -var Application = artifacts.require('Application') - -const { signatures } = require('./helpers/web3') -const { installOrgans } = require('./helpers/installer') - -var Kernel = artifacts.require('Kernel') - -const createDAO = () => DAO.new(Kernel.address) - -const zerothAddress = '0x' -const randomAddress = '0x0000000000000000000000000000000000001234' - -contract('Applications', accounts => { - let dao, metadao, kernel = {} - - beforeEach(async () => { - dao = await createDAO() - - metadao = MetaOrgan.at(dao.address) - await installOrgans(metadao, [MetaOrgan]) - - kernel = Kernel.at(dao.address) - }) - - context('installed app', () => { - let mockApp = {} - let dao_mockApp = {} - - beforeEach(async () => { - mockApp = await MockedApp.new(dao.address) - dao_mockApp = MockedApp.at(dao.address) - await metadao.installApp(mockApp.address, signatures(MockedApp, [Application], web3)) - }) - - it('returns installed app address', async () => { - const [addr, delegate] = await kernel.get(signatures(MockedApp, [Application], web3)[0]) - assert.equal(addr, mockApp.address, 'should have returned installed app addr') - assert.isFalse(delegate, 'Call to application shouldnt be delegate') - }) - - it('dispatches actions in apps', async () => { - await dao_mockApp.doStuff() - - assert.isTrue(await mockApp.didStuff(), 'should have done stuff') - }) - - it('throws when performing dao only methods from outside', async () => { - try { - await mockApp.doStuff() - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('can perform unprotected methods from the outside', async () => { - await mockApp.unprotectedDoStuff() - assert.isTrue(await mockApp.didStuff(), 'should have done stuff') - }) - }) - -}) diff --git a/test/dao_create.js b/test/dao_create.js deleted file mode 100644 index aacedf1b0..000000000 --- a/test/dao_create.js +++ /dev/null @@ -1,66 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var Kernel = artifacts.require('Kernel') -var MockedOrgan = artifacts.require('mocks/MockedOrgan') - -var IOrgan = artifacts.require('IOrgan') -const { signatures } = require('./helpers/web3') - -const createDAO = async () => { - const dao = await DAO.new(Kernel.address) - await MetaOrgan.at(dao.address).installOrgan(MetaOrgan.address, signatures(MetaOrgan, [IOrgan], web3)) - return dao -} - -const zerothAddress = '0x' -const randomAddress = '0x0000000000000000000000000000000000001234' - -contract('DAO', accounts => { - it('creates a DAO', async () => { - const dao = await createDAO() - - assert.equal(await dao.getSelf(), dao.address, 'Self should reference DAO') - assert.notEqual(await dao.getKernel(), zerothAddress, 'Kernel should be deployed') - }) - - describe('after DAO creation', () => { - let dao = {} - let metadao = {} - let kernel = {} - let sigs = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - }) - - it('deployed organs', async () => { - const [addr, delegate] = await kernel.get(signatures(MetaOrgan, [IOrgan], web3)[0]) - assert.equal(addr, MetaOrgan.address, 'metaorgan should be installed') - assert.isTrue(delegate, 'organs should be called with delegate calls') - }) - - it('can change kernel reference', async () => { - assert.notEqual(await dao.getKernel(), zerothAddress, 'Kernel should be deployed') - assert.notEqual(await dao.getKernel(), randomAddress, 'Kernel shouldnt be other addr') - - await metadao.replaceKernel(randomAddress) - await metadao.replaceKernel('0xbeef') // second change shouldn't affect as it is done to non-kernel - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('allows any action to happen before further config', async () => { - const canPerform = await kernel.canPerformAction('0x1', '0x2', 123, '0x1234') - - assert.isTrue(canPerform, 'DAO should allow all actions') - }) - - it('can set permissions oracle', async () => { - await metadao.setPermissionsOracle(randomAddress) - assert.equal(await kernel.getPermissionsOracle(), randomAddress, 'Should have new permissions oracle') - }) - }) -}) diff --git a/test/dao_dispatch.js b/test/dao_dispatch.js deleted file mode 100644 index 40292887b..000000000 --- a/test/dao_dispatch.js +++ /dev/null @@ -1,134 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var Kernel = artifacts.require('Kernel') -var VaultOrgan = artifacts.require('VaultOrgan') -var EtherToken = artifacts.require('EtherToken') -var MockedOrgan = artifacts.require('./mocks/MockedOrgan') -var StandardTokenPlus = artifacts.require('./helpers/StandardTokenPlus') -var Standard23Token = artifacts.require('./helpers/Standard23Token') - -var IOrgan = artifacts.require('IOrgan') - -const { installOrgans } = require('./helpers/installer') -const { sign } = require('./helpers/web3') - -const createDAO = () => DAO.new(Kernel.address) - -const zerothAddress = '0x' -const randomAddress = '0x0000000000000000000000000000000000001234' - -contract('Dispatcher', accounts => { - let dao, metadao, kernel, mockedOrgan, vault = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, VaultOrgan, MockedOrgan]) - - vault = VaultOrgan.at(dao.address) - await vault.setupEtherToken() - mockedOrgan = MockedOrgan.at(dao.address) - }) - - context('dispatches vanilla transaction', () => { - it('with 0 ETH', async () => { - await mockedOrgan.mock_setNumber(3) - assert.equal(await mockedOrgan.mock_getNumber(), 3, 'should have dispatched method') - }) - - it('with more than 0 ether', async () => { - const value = 101 - await mockedOrgan.mock_setNumber(3, { value }) - assert.equal(await mockedOrgan.mock_getNumber(), 3, 'should have dispatched method') - - const etherToken = EtherToken.at(await vault.getEtherToken()) - assert.equal(await etherToken.balanceOf(dao.address), value, 'transferred ether should be inside ETH token') - assert.equal(await vault.getTokenBalance(etherToken.address), value, 'DAO accounting should know token balance') - }) - }) - - context('dispatches presigned transactions', () => { - const signer = accounts[0] - const sender = accounts[1] - - const signedTransaction = async nonce => { - const data = mockedOrgan.mock_setNumber.request(4).params[0].data - const signingPayload = await kernel.payload(data, 1) - const signature = await sign(signingPayload, signer) - - const adding0x = x => '0x'.concat(x) - return { data, ...signature } - } - - beforeEach(async () => { - const nonce = 1 - const { r, s, v, data } = await signedTransaction(nonce) - await kernel.preauthDispatch(data, nonce, r, s, v, { from: sender }) - }) - - it('basic presigned dispatch', async () => { - assert.equal(await mockedOrgan.mock_getNumber(), 4, 'should have dispatched method') - }) - - - it('dispatches transaction using the signer identity', async () => { - assert.equal(await mockedOrgan.mock_getSender(), signer, 'signer should have been the sender of the transaction') - }) - - it('allows value transfer with the transaction', async () => { - const { r, s, v, data } = await signedTransaction(2) - await kernel.preauthDispatch(data, 2, r, s, v, { from: sender, value: 1}) - - const etherToken = EtherToken.at(await vault.getEtherToken()) - assert.equal(await etherToken.balanceOf(dao.address), 1, 'transferred ether should be inside ETH token') - assert.equal(await mockedOrgan.mock_getNumber(), 4, 'should have dispatched method') - assert.equal(await vault.getTokenBalance(etherToken.address), 1, 'DAO accounting should know token balance') - }) - - it('throws when reusing signed payload', async () => { - const { r, s, v, data } = await signedTransaction(1) - try { - await kernel.preauthDispatch(data, 1, r, s, v, { from: sender }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('dispatches token transactions', () => { - it('using approveAndCall', async () => { - const token = await StandardTokenPlus.new() - const data = mockedOrgan.mock_setNumber.request(5).params[0].data - - await token.approveAndCall(dao.address, 10, data) - - assert.equal(await mockedOrgan.mock_getNumber(), 5, 'should have dispatched method') - assert.equal(await token.balanceOf(dao.address), 10, 'DAO should have token balance') - assert.equal(await vault.getTokenBalance(token.address), 10, 'DAO accounting should know token balance') - }) - - it('using ERC223', async () => { - const token = await Standard23Token.new() - const data = mockedOrgan.mock_setNumber.request(5).params[0].data - - const erc23transfer = (a, v, d, p) => { - return new Promise((resolve, reject) => { - token.contract.transfer['address,uint256,bytes'](a, v, d, p, (err) => { - if (err) return reject(err) - resolve() - }) - }) - } - - await erc23transfer(dao.address, 10, data, { from: accounts[0], gas: 9e6 }) - - assert.equal(await token.balanceOf(dao.address), 10, 'DAO should have token balance') - assert.equal(await mockedOrgan.mock_getNumber(), 5, 'should have dispatched method') - assert.equal(await vault.getTokenBalance(token.address), 10, 'DAO accounting should know token balance') - }) - }) -}) diff --git a/test/dao_msg.js b/test/dao_msg.js deleted file mode 100644 index 30bae186c..000000000 --- a/test/dao_msg.js +++ /dev/null @@ -1,81 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var Kernel = artifacts.require('Kernel') -var VaultOrgan = artifacts.require('VaultOrgan') -var EtherToken = artifacts.require('EtherToken') -var DAOMsgOrgan = artifacts.require('DAOMsgOrgan') -var DAOMsgApp = artifacts.require('DAOMsgApp') -var StandardTokenPlus = artifacts.require('./helpers/StandardTokenPlus') -var Standard23Token = artifacts.require('./helpers/Standard23Token') - -var IOrgan = artifacts.require('IOrgan') - -const { installOrgans, installApps } = require('./helpers/installer') -const { sign } = require('./helpers/web3') - -const createDAO = () => DAO.new(Kernel.address) - -const zerothAddress = '0x0000000000000000000000000000000000000000' -const randomAddress = '0x0000000000000000000000000000000000001234' -const updateAddress = '0x0000000000000000000000000000000000004321' - -contract('DAO msg', accounts => { - let dao, metadao, kernel, vault, tester = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, VaultOrgan]) - - vault = VaultOrgan.at(dao.address) - await vault.setupEtherToken() - }) - - const tests = function () { - it('for vanilla call', async () => { - await tester.assertDaoMsg(accounts[0], zerothAddress, 0) - }) - - it('for value transfering calls', async () => { - await tester.assertDaoMsg(accounts[0], zerothAddress, 1, { value: 1 }) - }) - - it('for token calls', async () => { - const token = await StandardTokenPlus.new() - const data = tester.assertDaoMsg.request(accounts[0], token.address, 10).params[0].data - - await token.approveAndCall(dao.address, 10, data) - }) - - it('throws for incorrect params', async () => { - try { - await tester.assertDaoMsg(accounts[1], zerothAddress, 0) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - } - - context('when dispatching organ calls has correct dao_msg', () => { - beforeEach(async () => { - await installOrgans(metadao, [DAOMsgOrgan]) - tester = DAOMsgOrgan.at(dao.address) - }) - - context('', tests) - }) - - context('when dispatching app calls has correct dao_msg', () => { - let tester = {} - beforeEach(async () => { - await installApps(metadao, [DAOMsgApp]) - tester = DAOMsgOrgan.at(dao.address) - }) - - context('', tests) - }) -}) diff --git a/test/dao_registry.js b/test/dao_registry.js deleted file mode 100644 index 3a8a94d22..000000000 --- a/test/dao_registry.js +++ /dev/null @@ -1,143 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var Kernel = artifacts.require('Kernel') -var VaultOrgan = artifacts.require('VaultOrgan') -var EtherToken = artifacts.require('EtherToken') -var MockedOrgan = artifacts.require('./mocks/MockedOrgan') -var StandardTokenPlus = artifacts.require('./helpers/StandardTokenPlus') -var Standard23Token = artifacts.require('./helpers/Standard23Token') - -var IOrgan = artifacts.require('IOrgan') - -const { installOrgans } = require('./helpers/installer') -const { sign } = require('./helpers/web3') - -const createDAO = () => DAO.new(Kernel.address) - -const zerothAddress = '0x0000000000000000000000000000000000000000' -const randomAddress = '0x0000000000000000000000000000000000001234' -const updateAddress = '0x0000000000000000000000000000000000004321' - - -contract('Registry', accounts => { - let dao, metadao, kernel, mockedOrgan, vault = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, VaultOrgan, MockedOrgan]) - - vault = VaultOrgan.at(dao.address) - await vault.setupEtherToken() - mockedOrgan = MockedOrgan.at(dao.address) - }) - - const randSig = '0x12345678' - - context('registering organs', () => { - beforeEach(async () => { - await metadao.installOrgan(randomAddress, [randSig]) - }) - - it('was registered', async () => { - const [addr, isDelegate] = await kernel.get(randSig) - - assert.equal(addr, randomAddress, 'registered address should match') - assert.isTrue(isDelegate, 'registered organ should be delegate') - }) - - it('can be overwritten', async () => { - await metadao.installOrgan(randomAddress, [randSig]) - }) - - it('can be removed', async () => { - await metadao.removeOrgan([randSig]) - const [addr, isDelegate] = await kernel.get(randSig) - - assert.equal(addr, zerothAddress, 'removed organ should return 0 address') - }) - - it('can be updated', async () => { - await metadao.updateOrgan(updateAddress, [randSig]) - const [addr, isDelegate] = await kernel.get(randSig) - - assert.equal(addr, updateAddress, 'removed organ should return 0 address') - }) - - it('throws when being removed as part of other sigs array', async () => { - try { - await metadao.removeOrgan([randSig, '0x50']) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('throws when adding bad ordered sigs', async () => { - try { - await metadao.installOrgan(randomAddress, ['0x12', '0x50', '0x40']) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('registering apps', () => { - beforeEach(async () => { - await metadao.installApp(randomAddress, [randSig]) - }) - - it('was registered', async () => { - const [addr, isDelegate] = await kernel.get(randSig) - - assert.equal(addr, randomAddress, 'registered address should match') - assert.isFalse(isDelegate, 'registered app should not be delegate') - }) - - it('can only be overwriten by an organ', async () => { - try { - await metadao.installApp(randomAddress, [randSig]) - } catch (error) { - await metadao.installOrgan(randomAddress, [randSig]) - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('can be removed', async () => { - await metadao.removeApp([randSig]) - const [addr, isDelegate] = await kernel.get(randSig) - - assert.equal(addr, zerothAddress, 'removed app should return 0 address') - }) - - it('can be updated', async () => { - await metadao.updateApp(updateAddress, [randSig]) - const [addr, isDelegate] = await kernel.get(randSig) - - assert.equal(addr, updateAddress, 'removed organ should return 0 address') - }) - - it('throws when being removed as part of other sigs array', async () => { - try { - await metadao.removeApp([randSig, '0x50']) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('throws when adding bad ordered sigs', async () => { - try { - await metadao.installApp(randomAddress, ['0x12', '0x50', '0x40']) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) -}) diff --git a/test/dao_vault.js b/test/dao_vault.js deleted file mode 100644 index c13a67aa3..000000000 --- a/test/dao_vault.js +++ /dev/null @@ -1,225 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var Kernel = artifacts.require('Kernel') -var VaultOrgan = artifacts.require('VaultOrgan') -var EtherToken = artifacts.require('EtherToken') -var MockedOrgan = artifacts.require('./mocks/MockedOrgan') -var StandardTokenPlus = artifacts.require('./helpers/StandardTokenPlus') -var Standard23Token = artifacts.require('./helpers/Standard23Token') -const { getBalance } = require('./helpers/web3') -const { installOrgans } = require('./helpers/installer') -const timer = require('./helpers/timer') - -const createDAO = () => DAO.new(Kernel.address) - -const zerothAddress = '0x' -const randomAddress = '0x0000000000000000000000000000000000001234' - -contract('Vault', accounts => { - let dao, metadao, kernel, mockedOrgan, vault = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, VaultOrgan, MockedOrgan]) - - vault = VaultOrgan.at(dao.address) - await vault.setupEtherToken() - - mockedOrgan = MockedOrgan.at(dao.address) - }) - - it('throws when calling deposit() externally', async () => { - const token = await StandardTokenPlus.new() - await token.transfer(dao.address, 10) - try { - await vault.deposit(randomAddress, token.address, 10) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - context('when receiving ether', () => { - let token = {} - beforeEach(async () => { - token = EtherToken.at(await vault.getEtherToken()) - await mockedOrgan.mock_setNumber(3, { value: 10 }) - }) - - it('has correct accounted token balance', async () => { - assert.equal(await token.balanceOf(dao.address), 10, 'DAO should have token balance') - assert.equal(await vault.getTokenBalance(token.address), 10, 'DAO accounting should know token balance') - }) - - it('can transfer tokens', async () => { - await vault.transfer(token.address, randomAddress, 5) - - assert.equal(await token.balanceOf(dao.address), 5, 'DAO should have token balance') - assert.equal(await token.balanceOf(randomAddress), 5, 'receiver should have token balance') - assert.equal(await vault.getTokenBalance(token.address), 5, 'DAO accounting should know token balance') - }) - - it('can transfer ether', async () => { - await vault.transferEther(randomAddress, 6) - - assert.equal(await getBalance(randomAddress), 6, 'receiver should have correct ether balance') - assert.equal(await token.balanceOf(dao.address), 4, 'DAO should have token balance') - }) - - it('throws when transfering more tokens than owned', async () => { - try { - await vault.transfer(token.address, randomAddress, 11) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - context('when halting', () => { - const haltPeriod = 100 - let halting = 0 - beforeEach(async () => { - halting = parseInt(+new Date()/1000) - await vault.halt(haltPeriod) - }) - - it('returns correct halt start and period', async () => { - // assert.closeTo requires numbers, that's why we need to do the BigNumber conversion here - const [haltTime, haltEnds] = await vault.getHaltTime().then(vs => vs.map(x => x.toNumber())) - - assert.closeTo(haltTime, halting, 1, 'halt time should be correct') - assert.closeTo(haltEnds, halting + haltPeriod, 1, 'halt ends should be correct') - }) - - it('throws when transfering tokens during halt', async () => { - try { - await vault.transfer(token.address, randomAddress, 1) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('can halt during halt and it rewrites old halt', async () => { - halting = parseInt(+new Date()/1000) - await vault.halt(500) - const [haltTime, haltEnds] = await vault.getHaltTime().then(vs => vs.map(x => x.toNumber())) - - assert.closeTo(haltTime, halting, 1, 'halt time should be correct') - assert.closeTo(haltEnds, halting + 500, 1, 'halt ends should be correct') - }) - - it('can transfer again after halting period ends', async () => { - await timer(haltPeriod + 1) - await vault.transfer(token.address, randomAddress, 1) - assert.equal(await token.balanceOf(randomAddress), 1, 'receiver should have token balance') - }) - - it('throws when halt period is greater than 7 days', async () => { - try { - await vault.halt(7 * 24 * 3600 + 1) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - context('for scape hatch', () => { - beforeEach(async () => { - await vault.setScapeHatch(randomAddress) - }) - - it('correctly set scape hatch address', async () => { - assert.equal(await vault.getScapeHatch(), randomAddress, 'scape hatch address should match') - }) - - it('executes scape hatch successfully', async () => { - // sending another token to the DAO - const token2 = await StandardTokenPlus.new() - const data = mockedOrgan.mock_setNumber.request(5).params[0].data - await token2.approveAndCall(dao.address, 10, data) - - await vault.scapeHatch([token, token2].map(x => x.address)) - - assert.equal(await token.balanceOf(dao.address), 0, 'DAO should have 0 tokens after hatch') - assert.equal(await token2.balanceOf(dao.address), 0, 'DAO should have 0 tokens after hatch') - - assert.equal(await token.balanceOf(randomAddress), 10, 'scape hatch should have all tokens') - assert.equal(await token2.balanceOf(randomAddress), 10, 'scape hatch should have all tokens') - }) - - it('throws if scape hatch occurs when not halted', async () => { - await timer(haltPeriod + 1) - try { - await vault.scapeHatch([token.address]) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - }) - }) - - context('adding token to blacklist', () => { - let blacklistedToken = {} - - beforeEach(async () => { - blacklistedToken = await StandardTokenPlus.new() - await vault.setTokenBlacklist(blacklistedToken.address, true) - }) - - it('gets token as blacklisted', async () => { - assert.equal(await vault.isTokenBlacklisted(blacklistedToken.address), true) - }) - - it('throws when transfering a blacklisted token', async () => { - const data = mockedOrgan.mock_setNumber.request(5).params[0].data - - try { - await blacklistedToken.approveAndCall(dao.address, 10, data) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('can remove token from blacklist and receive tokens', async () => { - await vault.setTokenBlacklist(blacklistedToken.address, false) - const data = mockedOrgan.mock_setNumber.request(5).params[0].data - await blacklistedToken.approveAndCall(dao.address, 10, data) - assert.equal(await vault.getTokenBalance(blacklistedToken.address), 10, 'DAO accounting should know token balance') - }) - }) - - context('accidentally sending tokens to DAO', () => { - let token = {} - - beforeEach(async () => { - token = await StandardTokenPlus.new() - await token.transfer(dao.address, 5) - }) - - it('can recover not accounted tokens', async () => { - await vault.recover(token.address, randomAddress) - - assert.equal(await token.balanceOf(randomAddress), 5, 'recovery address should have tokens') - assert.equal(await token.balanceOf(dao.address), 0, 'recovery address should have tokens') - }) - - it('with accounted tokens recovers only not accounted', async () => { - const data = mockedOrgan.mock_setNumber.request(5).params[0].data - await token.approveAndCall(dao.address, 10, data) - - await vault.recover(token.address, randomAddress) - - assert.equal(await token.balanceOf(randomAddress), 5, 'recovery address should have tokens') - assert.equal(await token.balanceOf(dao.address), 10, 'recovery address should have tokens') - }) - - }) -}) diff --git a/test/ens_subdomains.js b/test/ens_subdomains.js new file mode 100644 index 000000000..498391667 --- /dev/null +++ b/test/ens_subdomains.js @@ -0,0 +1,104 @@ +const { assertRevert } = require('./helpers/assertThrow') +const namehash = require('eth-ens-namehash').hash +const keccak256 = require('js-sha3').keccak_256 + +const ENS = artifacts.require('ENS') +const Repo = artifacts.require('Repo') +const APMRegistry = artifacts.require('APMRegistry') +const PublicResolver = artifacts.require('PublicResolver') +const Kernel = artifacts.require('Kernel') +const ACL = artifacts.require('ACL') +const ENSSubdomainRegistrar = artifacts.require('ENSSubdomainRegistrar') + +const getContract = name => artifacts.require(name) + +// Using APMFactory in order to reuse it +contract('ENSSubdomainRegistrar', accounts => { + let ens, apmFactory, registry, baseDeployed, dao, acl, registrar = {} + const ensOwner = accounts[0] + const apmOwner = accounts[1] + const repoDev = accounts[2] + const notOwner = accounts[5] + + const rootNode = namehash('aragonpm.eth') + const holanode = namehash('hola.aragonpm.eth') + const holalabel = '0x'+keccak256('hola') + + const zeroAddr = '0x0000000000000000000000000000000000000000' + + before(async () => { + const bases = ['APMRegistry', 'Repo', 'ENSSubdomainRegistrar'] + baseDeployed = await Promise.all(bases.map(c => getContract(c).new())) + const baseAddrs = baseDeployed.map(c => c.address) + + const ensFactory = await getContract('ENSFactory').new() + apmFactory = await getContract('APMRegistryFactory').new(...baseAddrs, '0x0', ensFactory.address) + ens = ENS.at(await apmFactory.ens()) + }) + + beforeEach(async () => { + const receipt = await apmFactory.newAPM(namehash('eth'), '0x'+keccak256('aragonpm'), apmOwner) + const apmAddr = receipt.logs.filter(l => l.event == 'DeployAPM')[0].args.apm + registry = APMRegistry.at(apmAddr) + + dao = Kernel.at(await registry.kernel()) + acl = ACL.at(await dao.acl()) + + registrar = getContract('ENSSubdomainRegistrar').at(await registry.registrar()) + const subdomainRegistrar = baseDeployed[2] + + // Get permission to delete names after each test case + await acl.grantPermission(apmOwner, await registry.registrar(), await subdomainRegistrar.CREATE_NAME_ROLE(), { from: apmOwner }) + await acl.createPermission(apmOwner, await registry.registrar(), await subdomainRegistrar.DELETE_NAME_ROLE(), apmOwner, { from: apmOwner }) + }) + + afterEach(async () => { + // Clean up test.aragonpm.eth if was set + if (await ens.owner(holanode) == zeroAddr) return + + // Free test name so it can be used on next test + await registrar.deleteName(holalabel, { from: apmOwner }) + assert.equal(await ens.owner(holanode), zeroAddr, 'should have cleaned up') + }) + + it('can create name', async () => { + await registrar.createName(holalabel, apmOwner, { from: apmOwner }) + + assert.equal(await ens.owner(namehash('hola.aragonpm.eth')), apmOwner, 'should have created name') + }) + + it('fails if creating names twice', async () => { + await registrar.createName(holalabel, apmOwner, { from: apmOwner }) + return assertRevert(async () => { + await registrar.createName(holalabel, apmOwner, { from: apmOwner }) + }) + }) + + it('fails if deleting name not yet created', async () => { + return assertRevert(async () => { + await registrar.deleteName(holalabel, { from: apmOwner }) + }) + }) + + it('fails if not authorized to create name', async () => { + return assertRevert(async () => { + await registrar.createName(holalabel, apmOwner, { from: notOwner }) + }) + }) + + it('can delete names', async () => { + await registrar.createName(holalabel, apmOwner, { from: apmOwner }) + await registrar.deleteName(holalabel, { from: apmOwner }) + + assert.equal(await ens.owner(holanode), zeroAddr, 'should have reset name') + }) + + it('fails if initializing without rootnode ownership', async () => { + const reg = await ENSSubdomainRegistrar.new() + const ens = await ENS.new() + + return assertRevert(async () => { + await reg.initialize(ens.address, holanode) + }) + }) +}) \ No newline at end of file diff --git a/test/ether_token.js b/test/ether_token.js index 423af6ca4..12bb3335e 100644 --- a/test/ether_token.js +++ b/test/ether_token.js @@ -1,55 +1,92 @@ -const assertThrow = require('./helpers/assertThrow') -const { getBalance } = require('./helpers/web3') -var EtherToken = artifacts.require('EtherToken') - -// TODO: Add zeppelin standard token tests +const { assertRevert } = require('./helpers/assertThrow') +const { getBalance } = require('./helpers/web3') +const EtherToken = artifacts.require('EtherToken') +const ERC677Stub = artifacts.require('ERC677Stub') contract('EtherToken', accounts => { let token = {} - let randomAddress = 0 const value = 1000 const from = accounts[0] + const withdrawAddr = '0x0000000000000000000000000000000000001234' beforeEach(async () => { token = await EtherToken.new() - await token.wrap({ value, from }) }) - it('wraps ETH into token adding balance to sender', async () => { - assert.equal(await getBalance(token.address), value, 'ETH should be held inside token contract') - assert.equal(await token.balanceOf(from), value, 'Sender should have correct token balance') + it('fails when wrapping 0', async () => { + return assertRevert(async () => { + await token.wrap({ value: 0 }) + }) }) - it('unwraps ETH burning tokens and sending ETH', async () => { - const withdrawAmount = 300 + it('can wrap and call', async () => { + const stub = await ERC677Stub.new() + const data = '0x12' + + await token.wrapAndCall(stub.address, data, { from, value }) - const prevBalance = await getBalance('0x0000000000000000000000000000000000001234') - await token.withdraw(withdrawAmount, '0x0000000000000000000000000000000000001234') - const postBalance = await getBalance('0x0000000000000000000000000000000000001234') + assert.equal(await stub.token(), token.address, 'token should be correct') + assert.equal(await stub.from(), from, 'from should be correct') + assert.equal(await stub.amount(), value, 'value should be correct') + assert.equal(await stub.data(), data, 'value should be correct') - assert.equal(postBalance.minus(prevBalance), withdrawAmount, 'Should have gotten ETH in receipient address') - assert.equal(await getBalance(token.address), value - withdrawAmount, 'Remaining ETH should be held inside token contract after withdraw') - assert.equal(await token.balanceOf(from), value - withdrawAmount, 'Sender should have correct token balance after withdraw') + assert.equal(await token.balanceOf(from), 0, 'from should have 0 token balance') + assert.equal(await token.balanceOf(stub.address), value, 'receiver should have correct token balance') }) - it('unwraps ETH securely', async () => { - const withdrawAmount = 300 + context('wrapping eth', () => { + beforeEach(async () => { + await token.wrap({ value, from }) + }) - const prevBalance = await getBalance('0x0000000000000000000000000000000000001234') - await token.secureWithdraw(withdrawAmount, '0x0000000000000000000000000000000000001234') - const postBalance = await getBalance('0x0000000000000000000000000000000000001234') + it('wraps ETH into token adding balance to sender', async () => { + assert.equal(await getBalance(token.address), value, 'ETH should be held inside token contract') + assert.equal(await token.balanceOf(from), value, 'Sender should have correct token balance') + }) - assert.equal(postBalance.minus(prevBalance), withdrawAmount, 'Should have gotten ETH in receipient address') - assert.equal(await getBalance(token.address), value - withdrawAmount, 'Remaining ETH should be held inside token contract after withdraw') - assert.equal(await token.balanceOf(from), value - withdrawAmount, 'Sender should have correct token balance after withdraw') - }) + it('unwraps ETH burning tokens and sending ETH', async () => { + const withdrawAmount = 300 + + const prevBalance = await getBalance(withdrawAddr) + await token.withdraw(withdrawAddr, withdrawAmount) + const postBalance = await getBalance(withdrawAddr) + + assert.equal(postBalance.minus(prevBalance), withdrawAmount, 'Should have gotten ETH in receipient address') + assert.equal(await getBalance(token.address), value - withdrawAmount, 'Remaining ETH should be held inside token contract after withdraw') + assert.equal(await token.balanceOf(from), value - withdrawAmount, 'Sender should have correct token balance after withdraw') + }) + + it('unwraps entire amount to sender', async () => { + await token.unwrap() + assert.equal(await getBalance(token.address), 0, 'token should have 0 eth') + assert.equal(await token.balanceOf(from), 0, 'token balance should be 0') + }) + + it('can transfer and call', async () => { + const stub = await ERC677Stub.new() + const data = '0x12' + + await token.transferAndCall(stub.address, value, data, { from }) + + assert.equal(await stub.token(), token.address, 'token should be correct') + assert.equal(await stub.from(), from, 'from should be correct') + assert.equal(await stub.amount(), value, 'value should be correct') + assert.equal(await stub.data(), data, 'value should be correct') + + assert.equal(await token.balanceOf(from), 0, 'from should have 0 token balance') + assert.equal(await token.balanceOf(stub.address), value, 'receiver should have correct token balance') + }) + + it('fails when withdrawing more than balance', async () => { + return assertRevert(async () => { + await token.withdraw(withdrawAddr, value + 1) + }) + }) - it('throws when withdrawing more than balance', async () => { - try { - await token.withdraw(value + 1, randomAddress) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') + it('fails when withdrawing 0', async () => { + return assertRevert(async () => { + await token.withdraw(withdrawAddr, 0) + }) + }) }) }) diff --git a/test/evm_script.js b/test/evm_script.js new file mode 100644 index 000000000..da80d4aca --- /dev/null +++ b/test/evm_script.js @@ -0,0 +1,278 @@ +const { rawDecode } = require('ethereumjs-abi') + +const { assertRevert } = require('./helpers/assertThrow') +const { encodeCallScript, encodeDelegate, encodeDeploy } = require('./helpers/evmScript') + +const ExecutionTarget = artifacts.require('ExecutionTarget') +const Executor = artifacts.require('Executor') +const Delegator = artifacts.require('Delegator') +const FailingDelegator = artifacts.require('FailingDelegator') +const FailingDeployment = artifacts.require('FailingDeployment') + +const Kernel = artifacts.require('Kernel') +const ACL = artifacts.require('ACL') +const DAOFactory = artifacts.require('DAOFactory') +const EVMScriptRegistryFactory = artifacts.require('EVMScriptRegistryFactory') +const EVMScriptRegistry = artifacts.require('EVMScriptRegistry') +const EVMScriptRegistryConstants = artifacts.require('EVMScriptRegistryConstants') +const IEVMScriptExecutor = artifacts.require('IEVMScriptExecutor') + +const keccak256 = require('js-sha3').keccak_256 +const APP_BASE_NAMESPACE = '0x'+keccak256('base') + +contract('EVM Script', accounts => { + let executor, executionTarget, dao, daoFact, reg, constants, acl = {} + + const boss = accounts[1] + + const executorAppId = '0x1234' + + before(async () => { + const regFact = await EVMScriptRegistryFactory.new() + daoFact = await DAOFactory.new(regFact.address) + + constants = await EVMScriptRegistryConstants.new() + }) + + beforeEach(async () => { + const receipt = await daoFact.newDAO(boss) + dao = Kernel.at(receipt.logs.filter(l => l.event == 'DeployDAO')[0].args.dao) + acl = ACL.at(await dao.acl()) + reg = EVMScriptRegistry.at(receipt.logs.filter(l => l.event == 'DeployEVMScriptRegistry')[0].args.reg) + + await acl.createPermission(boss, dao.address, await dao.APP_MANAGER_ROLE(), boss, { from: boss }) + const baseExecutor = await Executor.new() + await dao.setApp(APP_BASE_NAMESPACE, executorAppId, baseExecutor.address, { from: boss }) + }) + + it('registered just 3 script executors', async () => { + const zeroAddr = '0x0000000000000000000000000000000000000000' + + assert.equal(await reg.getScriptExecutor('0x00000000'), zeroAddr) + assert.notEqual(await reg.getScriptExecutor('0x00000001'), zeroAddr) + assert.notEqual(await reg.getScriptExecutor('0x00000002'), zeroAddr) + assert.notEqual(await reg.getScriptExecutor('0x00000003'), zeroAddr) + assert.equal(await reg.getScriptExecutor('0x00000004'), zeroAddr) + }) + + it('fails if reinitializing registry', async () => { + return assertRevert(async () => { + await reg.initialize() + }) + }) + + context('executor', () => { + beforeEach(async () => { + const receipt = await dao.newAppInstance(executorAppId, '0x0', { from: boss }) + executor = Executor.at(receipt.logs.filter(l => l.event == 'NewAppProxy')[0].args.proxy) + executionTarget = await ExecutionTarget.new() + }) + + it('fails to execute if spec ID is 0', async () => { + return assertRevert(async () => { + await executor.execute('0x00000000') + }) + }) + + it('fails to execute if spec ID is unknown', async () => { + return assertRevert(async () => { + await executor.execute('0x00000004') + }) + }) + + it('can disable executors', async () => { + await acl.grantPermission(boss, reg.address, await reg.REGISTRY_MANAGER_ROLE(), { from: boss }) + await reg.disableScriptExecutor(1, { from: boss }) + return assertRevert(async () => { + await executor.execute(encodeCallScript([])) + }) + }) + + context('spec ID 1', () => { + it('executes single action script', async () => { + const action = { to: executionTarget.address, calldata: executionTarget.contract.execute.getData() } + const script = encodeCallScript([action]) + + await executor.execute(script) + + assert.equal(await executionTarget.counter(), 1, 'should have executed action') + }) + + it('fails to execute if has blacklist addresses being called', async () => { + const action = { to: executionTarget.address, calldata: executionTarget.contract.execute.getData() } + const script = encodeCallScript([action]) + + return assertRevert(async () => { + await executor.executeWithBan(script, [executionTarget.address]) + }) + }) + + it('can execute if call doesnt cointain blacklist addresses', async () => { + const action = { to: executionTarget.address, calldata: executionTarget.contract.execute.getData() } + const script = encodeCallScript([action]) + + await executor.executeWithBan(script, ['0x1234']) + + assert.equal(await executionTarget.counter(), 1, 'should have executed action') + }) + + it('executes multi action script', async () => { + const action = { to: executionTarget.address, calldata: executionTarget.contract.execute.getData() } + const script = encodeCallScript([action, action, action, action]) + + await executor.execute(script) + + assert.equal(await executionTarget.counter(), 4, 'should have executed action') + }) + + it('executes multi action script to multiple addresses', async () => { + const executionTarget2 = await ExecutionTarget.new() + + const action = { to: executionTarget.address, calldata: executionTarget.contract.execute.getData() } + const action2 = { to: executionTarget2.address, calldata: executionTarget2.contract.execute.getData() } + + const script = encodeCallScript([action2, action, action2, action, action2]) + + await executor.execute(script) + + assert.equal(await executionTarget.counter(), 2, 'should have executed action') + assert.equal(await executionTarget2.counter(), 3, 'should have executed action') + }) + + it('executes with parameters', async () => { + const action = { to: executionTarget.address, calldata: executionTarget.contract.setCounter.getData(101) } + const script = encodeCallScript([action]) + + await executor.execute(script) + + assert.equal(await executionTarget.counter(), 101, 'should have set counter') + }) + + it('execution fails if one call fails', async () => { + const action1 = { to: executionTarget.address, calldata: executionTarget.contract.setCounter.getData(101) } + const action2 = { to: executionTarget.address, calldata: executionTarget.contract.failExecute.getData() } + + const script = encodeCallScript([action1, action2]) + + return assertRevert(async () => { + await executor.execute(script) + }) + }) + + it('can execute empty script', async () => { + await executor.execute(encodeCallScript([])) + }) + }) + + const delegatorResultNumber = 1234 + + context('spec ID 2', () => { + let delegator = {} + before(async () => { + delegator = await Delegator.new() + }) + + it('can execute delegated action', async () => { + await executor.executeWithBan(encodeDelegate(delegator.address), []) + + assert.equal(await executor.randomNumber(), delegatorResultNumber, 'should have executed correctly') + }) + + it('can execute action with input and output', async () => { + const value = 101 + const input = delegator.contract.execReturnValue.getData(value) + const output = await executor.executeWithIO.call(encodeDelegate(delegator.address), input, []) + + assert.equal(new web3.BigNumber(output), value, 'return value should be correct') + }) + + it('fails to execute if it has blacklist addresses', async () => { + return assertRevert(async () => { + await executor.executeWithBan(encodeDelegate(delegator.address), ['0x12']) + }) + }) + + it('fails if underlying call fails', async () => { + const failingDelegator = await FailingDelegator.new() + return assertRevert(async () => { + // extra gas to avoid oog + await executor.executeWithBan(encodeDelegate(failingDelegator.address), [], { gas: 2e6 }) + }) + }) + + it('fails if calling to non-contract', async () => { + return assertRevert(async () => { + await executor.execute(encodeDelegate(accounts[0])) // addr is too small + }) + }) + + it('fails if payload is too small', async () => { + return assertRevert(async () => { + await executor.execute(encodeDelegate('0x1234')) // addr is too small + }) + }) + }) + + context('spec ID 3', () => { + it('can deploy and execute', async () => { + await executor.execute(encodeDeploy(Delegator)) + + assert.equal(await executor.randomNumber(), delegatorResultNumber, 'should have executed correctly') + }) + + it('can deploy action with input and output', async () => { + const value = 102 + const delegator = await Delegator.new() + const input = delegator.contract.execReturnValue.getData(value) + const output = await executor.executeWithIO.call(encodeDeploy(Delegator), input, []) + + assert.equal(new web3.BigNumber(output), value, 'return value should be correct') + }) + + it('caches deployed contract and reuses it', async () => { + const r1 = await executor.execute(encodeDeploy(Delegator)) + const r2 = await executor.execute(encodeDeploy(Delegator)) + + assert.isBelow(r2.receipt.gasUsed, r1.receipt.gasUsed / 2, 'should have used less than half the gas because of cache') + assert.equal(await executor.randomNumber(), delegatorResultNumber * 2, 'should have executed correctly twice') + }) + + it('fails if deployment fails', async () => { + return assertRevert(async () => { + await executor.execute(encodeDeploy(FailingDeployment)) + }) + }) + + it('fails if deployed contract doesnt have exec function', async () => { + return assertRevert(async () => { + // random contract without exec() func + await executor.execute(encodeDeploy(ExecutionTarget)) + }) + }) + + it('fails if exec function fails', async () => { + return assertRevert(async () => { + await executor.execute(encodeDeploy(FailingDelegator)) + }) + }) + + it('fails to execute if it has blacklist addresses', async () => { + return assertRevert(async () => { + await executor.executeWithBan(encodeDeploy(Delegator), ['0x1234']) + }) + }) + + it('fails if execution modifies kernel', async () => { + return assertRevert(async () => { + await executor.execute(encodeDeploy(artifacts.require('ProtectionModifierKernel'))) + }) + }) + + it('fails if execution modifies app id', async () => { + return assertRevert(async () => { + await executor.execute(encodeDeploy(artifacts.require('ProtectionModifierAppId'))) + }) + }) + }) + }) +}) diff --git a/test/evm_script_abi.js b/test/evm_script_abi.js new file mode 100644 index 000000000..cdff771cf --- /dev/null +++ b/test/evm_script_abi.js @@ -0,0 +1,52 @@ +const { rawEncode } = require('ethereumjs-abi') +const { toBuffer } = require('ethereumjs-util') +const ScriptHelpers = artifacts.require('ScriptHelpers') +const EncodeMock = artifacts.require('EncodeMock') + + +contract('EVM Script: ABI encoder', accounts => { + let helper = {} + + const testCase = [ + ['0x1231', '0x575775', []], + ['0x', '0x', []], + ['0x1231123112311231123112311231', '0x12311231123118383883', ['0x12', '0x34']], + ['0x', '0x', ['0x12', '0x34', '0x56', '0x57']], + ['0x', '0x12', ['0x12', '0x34', '0x56', '0x57']], + ['0x12', '0x00', ['0x12', '0x34', '0x56', '0x57']], + ['he he heyyyyy', 'wasa wasa wasaaaa', ['0x000000000000000000000000000000e000000000', '0xaaaab0000000000000000000000000e000000000']], + ] + + before(async () => { + helper = await ScriptHelpers.new() + }) + + context('against web3 encoding', () => { + testCase.forEach(async (t, i) => { + it(`test: ${i + 1}`, async () => { + const a = await helper.abiEncode.call(...t) + const curatedT = t.map(to => to.indexOf('0x') != 0 ? to : toBuffer(to)) + const b = '0x' + rawEncode(['bytes', 'bytes', 'address[]'], curatedT).toString('hex') + assert.equal(a, b, 'encoders should match') + }) + }) + }) + + context('against solc encoding', () => { + let tester = {} + before(async () => { + tester = await EncodeMock.new() + }) + + testCase.forEach(async (t, i) => { + it(`test: ${i + 1}`, async () => { + const a = await helper.abiEncode.call(...t) + const curatedT = t.map(to => to.indexOf('0x') != 0 ? to : toBuffer(to)) + await tester.exec(...t) + const result = await tester.result() + const b = "0x" + result.slice(10) // remove signature + assert.equal(a, b, 'encoders should match') + }) + }) + }) +}) diff --git a/test/helpers/ACLHelpers.sol b/test/helpers/ACLHelpers.sol new file mode 100644 index 000000000..907412d14 --- /dev/null +++ b/test/helpers/ACLHelpers.sol @@ -0,0 +1,28 @@ +pragma solidity 0.4.18; + +import "../../contracts/acl/ACL.sol"; + + +contract ACLHelpers { + function encodeOperator(uint256 param1, uint256 param2) internal pure returns (uint240) { + return encodeIfElse(param1, param2, 0); + } + + function encodeIfElse(uint256 condition, uint256 successParam, uint256 failureParam) internal pure returns (uint240) { + return uint240(condition + (successParam << 32) + (failureParam << 64)); + } +} + + +contract AcceptOracle is ACLOracle { + function canPerform(address who, address where, bytes32 what) public view returns (bool) { + return true; + } +} + + +contract RejectOracle is ACLOracle { + function canPerform(address who, address where, bytes32 what) public view returns (bool) { + return false; + } +} diff --git a/test/helpers/APMRegistryFactoryMock.sol b/test/helpers/APMRegistryFactoryMock.sol new file mode 100644 index 000000000..e5d3ec771 --- /dev/null +++ b/test/helpers/APMRegistryFactoryMock.sol @@ -0,0 +1,76 @@ +// without all permissions +// external ENS + +import "../../contracts/factory/APMRegistryFactory.sol"; + +contract APMRegistryFactoryMock is APMRegistryFactory { + + function APMRegistryFactoryMock( + APMRegistry _registryBase, + Repo _repoBase, + ENSSubdomainRegistrar _ensSubBase, + ENS _ens, + ENSFactory _ensFactory + ) + APMRegistryFactory(_registryBase, _repoBase, _ensSubBase, _ens, _ensFactory) public {} + + function newAPM(bytes32 tld, bytes32 label, address _root) public returns (APMRegistry) {} + + function newBadAPM(bytes32 tld, bytes32 label, address _root, bool withoutACL) public returns (APMRegistry) { + bytes32 node = keccak256(tld, label); + + // Assume it is the test ENS + if (ens.owner(node) != address(this)) { + // If we weren't in test ens and factory doesn't have ownership, will fail + ens.setSubnodeOwner(tld, label, this); + } + + Kernel dao = newDAO(this); + ACL acl = ACL(dao.acl()); + + acl.createPermission(this, dao, dao.APP_MANAGER_ROLE(), this); + + bytes32 namespace = dao.APP_BASES_NAMESPACE(); + + // App code for relevant apps + dao.setApp(namespace, APM_APP_ID, registryBase); + dao.setApp(namespace, REPO_APP_ID, repoBase); + dao.setApp(namespace, ENS_SUB_APP_ID, ensSubdomainRegistrarBase); + + // Deploy proxies + ENSSubdomainRegistrar ensSub = ENSSubdomainRegistrar(newAppProxy(dao, ENS_SUB_APP_ID)); + APMRegistry apm = APMRegistry(newAppProxy(dao, APM_APP_ID)); + + DeployAPM(node, apm); + + // Grant permissions needed for APM on ENSSubdomainRegistrar + + if (withoutACL) { + acl.createPermission(apm, ensSub, ensSub.CREATE_NAME_ROLE(), _root); + } + + acl.createPermission(apm, ensSub, ensSub.POINT_ROOTNODE_ROLE(), _root); + + configureAPMPermissions(acl, apm, _root); + + // allow apm to create permissions for Repos in Kernel + bytes32 permRole = acl.CREATE_PERMISSIONS_ROLE(); + + if (!withoutACL) { + acl.grantPermission(apm, acl, permRole); + } + + // Permission transition to _root + acl.setPermissionManager(_root, dao, dao.APP_MANAGER_ROLE()); + acl.revokePermission(this, acl, permRole); + acl.grantPermission(_root, acl, permRole); + acl.setPermissionManager(_root, acl, permRole); + + // Initialize + ens.setOwner(node, ensSub); + ensSub.initialize(ens, node); + apm.initialize(ensSub); + + return apm; + } +} diff --git a/test/helpers/DAOMsgOrgan.sol b/test/helpers/DAOMsgOrgan.sol deleted file mode 100644 index 4f55a677a..000000000 --- a/test/helpers/DAOMsgOrgan.sol +++ /dev/null @@ -1,24 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../contracts/apps/Application.sol"; -import "../../contracts/organs/IOrgan.sol"; - -contract DAOMsgOrgan is IOrgan { - function assertDaoMsg(address sender, address token, uint256 value) payable { - require(dao_msg().sender == sender); - require(dao_msg().token == token); - require(dao_msg().value == value); - require(dao_msg().data.length == 4 + 32 * 3); - } -} - -contract DAOMsgApp is Application { - function DAOMsgApp() Application(0) {} - - function assertDaoMsg(address sender, address token, uint256 value) payable { - require(dao_msg().sender == sender); - require(dao_msg().token == token); - require(dao_msg().value == value); - require(dao_msg().data.length == 4 + 32 * 3); - } -} diff --git a/test/helpers/Standard23Token.sol b/test/helpers/Standard23Token.sol deleted file mode 100644 index b29b02116..000000000 --- a/test/helpers/Standard23Token.sol +++ /dev/null @@ -1,61 +0,0 @@ -pragma solidity ^0.4.13; - -import "zeppelin/token/StandardToken.sol"; - -contract ERC23 is ERC20 { - function transfer(address to, uint value, bytes data) returns (bool ok); - function transferFrom(address from, address to, uint value, bytes data) returns (bool ok); -} - -contract ERC23Receiver { - function tokenFallback(address _sender, address _origin, uint _value, bytes _data) returns (bool ok); -} - -contract Standard23Token is ERC23, StandardToken { - // Mocked initializer - function Standard23Token() { - balances[msg.sender] = 100; - supply = 100; - } - - uint256 supply; - function totalSupply() constant public returns (uint) { - return supply; - } - - //function that is called when a user or another contract wants to transfer funds - function transfer(address _to, uint _value, bytes _data) returns (bool success) { - //filtering if the target is a contract with bytecode inside it - require(super.transfer(_to, _value)); // do a normal token transfer - if (isContract(_to)) return contractFallback(msg.sender, _to, _value, _data); - return true; - } - - function transferFrom(address _from, address _to, uint _value, bytes _data) returns (bool success) { - require(super.transferFrom(_from, _to, _value)); // do a normal token transfer - if (isContract(_to)) return contractFallback(_from, _to, _value, _data); - return true; - } - - function transfer(address _to, uint _value) returns (bool success) { - return transfer(_to, _value, new bytes(0)); - } - - function transferFrom(address _from, address _to, uint _value) returns (bool success) { - return transferFrom(_from, _to, _value, new bytes(0)); - } - - //function that is called when transaction target is a contract - function contractFallback(address _origin, address _to, uint _value, bytes _data) private returns (bool success) { - ERC23Receiver reciever = ERC23Receiver(_to); - return reciever.tokenFallback(msg.sender, _origin, _value, _data); - } - - //assemble the given address bytecode. If bytecode exists then the _addr is a contract. - function isContract(address _addr) private returns (bool is_contract) { - // retrieve the size of the code on target address, this needs assembly - uint length; - assembly { length := extcodesize(_addr) } - return length > 0; - } -} diff --git a/test/helpers/StandardTokenPlus.sol b/test/helpers/StandardTokenPlus.sol deleted file mode 100644 index d5aa179b7..000000000 --- a/test/helpers/StandardTokenPlus.sol +++ /dev/null @@ -1,33 +0,0 @@ -pragma solidity ^0.4.13; - -import "zeppelin/token/StandardToken.sol"; - -contract ApproveAndCallFallBack { - function receiveApproval(address from, uint256 _amount, address _token, bytes _data); -} - -contract StandardTokenPlus is StandardToken { - // Mocked initializer - function StandardTokenPlus() { - balances[msg.sender] = 100; - supply = 100; - } - - uint256 supply; - function totalSupply() constant public returns (uint) { - return supply; - } - - function approveAndCall(address _spender, uint256 _amount, bytes _extraData) public returns (bool success) { - require(approve(_spender, _amount)); - - ApproveAndCallFallBack(_spender).receiveApproval( - msg.sender, - _amount, - this, - _extraData - ); - - return true; - } -} diff --git a/test/helpers/ThrowProxy.sol b/test/helpers/ThrowProxy.sol deleted file mode 100644 index 31d1c0df5..000000000 --- a/test/helpers/ThrowProxy.sol +++ /dev/null @@ -1,32 +0,0 @@ -pragma solidity ^0.4.8; - -import "truffle/Assert.sol"; - -// Based on Simon de la Rouviere method: http://truffleframework.com/tutorials/testing-for-throws-in-solidity-tests - -// Proxy contract for testing throws -contract ThrowProxy { - address public target; - bytes data; - - function ThrowProxy(address _target) { - target = _target; - } - - //prime the data using the fallback function. - function() { - data = msg.data; - } - - function assertThrows(string msg) { - Assert.isFalse(execute(), msg); - } - - function assertItDoesntThrow(string msg) { - Assert.isTrue(execute(), msg); - } - - function execute() returns (bool) { - return target.call(data); - } -} diff --git a/test/helpers/assertEvent.js b/test/helpers/assertEvent.js new file mode 100644 index 000000000..7bd5bc28e --- /dev/null +++ b/test/helpers/assertEvent.js @@ -0,0 +1,4 @@ +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`) +} diff --git a/test/helpers/assertThrow.js b/test/helpers/assertThrow.js index 1695636a9..83ffad5a4 100644 --- a/test/helpers/assertThrow.js +++ b/test/helpers/assertThrow.js @@ -1,4 +1,26 @@ -module.exports = function(error) { - const isError = error.message.search('invalid opcode') > -1 || error.message.search('invalid JUMP') > -1 - assert.isTrue(isError, 'Error expected'); +function assertError(error, s, message) { + assert.isAbove(error.message.search(s), -1, message); +} + +async function assertThrows(codeBlock, message, errorCode) { + try { + await codeBlock() + } catch (e) { + return assertError(e, errorCode, message) + } + assert.fail('should have thrown before') +} + +module.exports = { + async assertJump(codeBlock, message = 'should have failed with invalid JUMP') { + return assertThrows(codeBlock, message, 'invalid JUMP') + }, + + async assertInvalidOpcode(codeBlock, message = 'should have failed with invalid opcode') { + return assertThrows(codeBlock, message, 'invalid opcode') + }, + + async assertRevert(codeBlock, message = 'should have failed by reverting') { + return assertThrows(codeBlock, message, 'revert') + }, } diff --git a/test/helpers/evmScript.js b/test/helpers/evmScript.js new file mode 100644 index 000000000..f8492252d --- /dev/null +++ b/test/helpers/evmScript.js @@ -0,0 +1,19 @@ +const abi = require('ethereumjs-abi') + +module.exports = { + // Encodes an array of actions ({ to: address, calldata: bytes}) into the EVM call script format + // Sets spec id 1 = 0x00000001 and + // Concatenates per call [ 20 bytes (address) ] + [ 4 bytes (uint32: calldata length) ] + [ calldataLength bytes (payload) ] + encodeCallScript: actions => { + return actions.reduce((script, { to, calldata }) => { + const addr = abi.rawEncode(['address'], [to]).toString('hex') + const length = abi.rawEncode(['uint256'], [(calldata.length - 2) / 2]).toString('hex') + + // Remove 12 first 0s of padding for addr and 28 0s for uint32 + return script + addr.slice(24) + length.slice(56) + calldata.slice(2) + }, '0x00000001') // spec 1 + }, + + encodeDelegate: addr => '0x00000002' + addr.slice(2), // remove 0x from addr + encodeDeploy: contract => '0x00000003' + contract.binary.slice(2), +} diff --git a/test/helpers/installer.js b/test/helpers/installer.js deleted file mode 100644 index 970b56c15..000000000 --- a/test/helpers/installer.js +++ /dev/null @@ -1,25 +0,0 @@ -const { signatures } = require('./web3') -var IOrgan = artifacts.require('IOrgan') -var Application = artifacts.require('Application') - -module.exports = { - async installOrgans(metadao, organs) { - const installs = organs.map(async (o) => { - const deployedOrgan = await o.new() - await metadao.installOrgan(deployedOrgan.address, signatures(o, [IOrgan], web3)) - return deployedOrgan - }) - - return Promise.all(installs) - }, - - async installApps(metadao, apps) { - const installs = apps.map(async (a) => { - const deployedApp = await a.new(metadao.address) - await metadao.installApp(deployedApp.address, signatures(a, [Application], web3)) - return deployedApp - }) - - return Promise.all(installs) - }, -} diff --git a/test/helpers/timer.js b/test/helpers/timer.js deleted file mode 100644 index 1b559a3b0..000000000 --- a/test/helpers/timer.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = s => { - return new Promise((resolve, reject) => { - web3.currentProvider.sendAsync({ - jsonrpc: '2.0', - method: 'evm_increaseTime', - params: [s], // 60 seaconds, may need to be hex, I forget - id: new Date().getTime() // Id of the request; anything works, really - }, function(err) { - if (err) return reject(err); - resolve(); - }); - //setTimeout(() => resolve(), s * 1000 + 600) // 600ms breathing room for testrpc to sync - }); -}; diff --git a/test/helpers/web3.js b/test/helpers/web3.js index f18a9313c..4d0084709 100644 --- a/test/helpers/web3.js +++ b/test/helpers/web3.js @@ -38,6 +38,15 @@ module.exports = { }) }, + getBlock(n) { + return new Promise(async (resolve, reject) => { + web3.eth.getBlock(n, (err, res) => { + if (err || !res) return reject(err) + resolve(res) + }) + }) + }, + sendTransaction(payload) { return new Promise((resolve, reject) => { web3.eth.sendTransaction(payload, async (err, res) => { diff --git a/test/integration_bylaws.js b/test/integration_bylaws.js deleted file mode 100644 index f7768215e..000000000 --- a/test/integration_bylaws.js +++ /dev/null @@ -1,599 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var BylawsApp = artifacts.require('BylawsApp') -var OwnershipApp = artifacts.require('OwnershipApp') -var VotingApp = artifacts.require('mocks/VotingAppMock') -var StatusApp = artifacts.require('StatusApp') -var MiniMeToken = artifacts.require('MiniMeToken') -var ActionsOrgan = artifacts.require('ActionsOrgan') -var VaultOrgan = artifacts.require('VaultOrgan') -var Vote = artifacts.require('Vote') -var BylawOracleMock = artifacts.require('./mocks/BylawOracleMock') -var MockedOrgan = artifacts.require('./mocks/MockedOrgan') -var Standard23Token = artifacts.require('./helpers/Standard23Token') - -var IOrgan = artifacts.require('IOrgan') - - -var Kernel = artifacts.require('Kernel') - -const { installOrgans, installApps } = require('./helpers/installer') -const { getBlockNumber } = require('./helpers/web3') - -const createDAO = () => DAO.new(Kernel.address) - -const zerothAddress = '0x' -const randomAddress = '0x0000000000000000000000000000000000001234' -const changeKernelSig = '0xcebe30ac' - -contract('Bylaws', accounts => { - - let dao, metadao, kernel, bylawsApp, mockedOrgan, installedBylaws = {} - let bylawId = '' - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, VaultOrgan, ActionsOrgan, MockedOrgan]) - const apps = await installApps(metadao, [BylawsApp]) - installedBylaws = apps[0] - - mockedOrgan = MockedOrgan.at(dao.address) - - bylawsApp = BylawsApp.at(dao.address) - await metadao.setPermissionsOracle(installedBylaws.address) - }) - - it('bylaws are successfully installed', async () => { - assert.equal(await kernel.getPermissionsOracle(), installedBylaws.address, 'should have set permissions oracle') - }) - - it('allows action if bylaw hasnt been specified', async () => { - await metadao.replaceKernel(randomAddress, { from: accounts[1] }) - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - context('adding token whitelist', () => { - - var token, tokenAddress; - const erc23transfer = (a, v, d, p) => { - return new Promise((resolve, reject) => { - token.contract.transfer['address,uint256,bytes'](a, v, d, p, (err) => { - if (err) return reject(err) - resolve() - }) - }) - } - - beforeEach(async () => { - token = await Standard23Token.new({from: accounts[3]}); - tokenAddress = await token.address; - }) - - it('correctly sets an whitlisted token', async () => { - await bylawsApp.setTokenWhitelist(tokenAddress, true, {from: accounts[1]}); - assert.isTrue(await bylawsApp.isTokenWhitelisted(tokenAddress), 'Token should be whitlisted'); - await bylawsApp.setTokenWhitelist(tokenAddress, false, {from: accounts[1]}); - assert.isFalse(await bylawsApp.isTokenWhitelisted(tokenAddress), 'Token shouldn`t be whitlisted'); - }); - - it('allows non listed token deposit', async () => { - var balance; - await token.transfer(dao.address, 10, {from: accounts[3]}); - balance = await token.balanceOf(dao.address) - assert.equal(balance.toNumber(), 10, 'The deposit should have been allowed '); - }); - - it('blocks non listed token exectuion', async () => { - const data = mockedOrgan.mock_setNumber.request(5).params[0].data; - - try { - await erc23transfer(dao.address, 10, data, { from: accounts[3], gas: 9e6 }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }); - - it('allows listed token execution', async () => { - await bylawsApp.setTokenWhitelist(tokenAddress, true, {from: accounts[1]}); - const data = mockedOrgan.mock_setNumber.request(5).params[0].data - - await erc23transfer(dao.address, 10, data, { from: accounts[3], gas: 9e6 }) - - assert.equal(await token.balanceOf(dao.address), 10, 'DAO should have token balance') - assert.equal(await mockedOrgan.mock_getNumber(), 5, 'should have dispatched method') - }); - }) - - it('throws when reseting bylaw', async () => { - await bylawsApp.setAddressBylaw(accounts[1], false, false) - try { - await bylawsApp.setAddressBylaw(accounts[1], false, false) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - context('adding address bylaw', () => { - beforeEach(async () => { - bylawId = await bylawsApp.setAddressBylaw.call(accounts[1], false, false) - await bylawsApp.setAddressBylaw(accounts[1], false, false) - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 3, 'bylaw type should be correct') - assert.equal(await bylawsApp.getAddressBylaw(bylawId), accounts[1], 'address should be correct') - }) - - it('allows action by specified address', async () => { - await metadao.replaceKernel(randomAddress, { from: accounts[1] }) - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws when not authorized address does action', async () => { - try { - await metadao.replaceKernel(randomAddress, { from: accounts[2] }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('adding oracle bylaw', () => { - let oracle = {} - beforeEach(async () => { - oracle = await BylawOracleMock.new() - bylawId = await bylawsApp.setAddressBylaw.call(oracle.address, true, false) - await bylawsApp.setAddressBylaw(oracle.address, true, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 4, 'bylaw type should be correct') - assert.equal(await bylawsApp.getAddressBylaw(bylawId), oracle.address, 'address should be correct') - assert.equal(await bylawsApp.getBylawNot(bylawId), false, 'not should be correct') - }) - - it('allows action when oracle is enabled', async () => { - await oracle.changeAllow(true) - await metadao.replaceKernel(randomAddress, { from: accounts[1] }) - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws when oracle is disabled and does action', async () => { - await oracle.changeAllow(false) - try { - await metadao.replaceKernel(randomAddress, { from: accounts[2] }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('adding negated address bylaw', () => { - beforeEach(async () => { - bylawId = await bylawsApp.setAddressBylaw.call(accounts[1], false, true) - await bylawsApp.setAddressBylaw(accounts[1], false, true) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 3, 'bylaw type should be correct') - assert.equal(await bylawsApp.getAddressBylaw(bylawId), accounts[1], 'address should be correct') - assert.equal(await bylawsApp.getBylawNot(bylawId), true, 'not should be correct') - }) - - it('allows action by any other than specified address', async () => { - await metadao.replaceKernel(randomAddress, { from: accounts[2] }) - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws when authorized address does action', async () => { - try { - await metadao.replaceKernel(randomAddress, { from: accounts[1] }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('adding voting bylaw', () => { - let votingApp, ownershipApp = {} - let vote = {} - - const [holder20, holder31, holder49] = accounts - const pct16 = x => new web3.BigNumber(x).times(new web3.BigNumber(10).toPower(16)) - - let currentBlock, startBlock, finalBlock = 0 - - beforeEach(async () => { - await installApps(metadao, [VotingApp, OwnershipApp]) - - ownershipApp = OwnershipApp.at(dao.address) - votingApp = VotingApp.at(dao.address) - - vote = await Vote.new() - const voteBytecode = await votingApp.hashForCode(vote.address) - await votingApp.setValidVoteCode(voteBytecode, true) - - await vote.instantiate(dao.address, metadao.replaceKernel.request(randomAddress).params[0].data) - - const token = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token.changeController(dao.address) - await ownershipApp.addToken(token.address, 100, 1, 1) - - await ownershipApp.grantTokens(token.address, holder20, 20) - await ownershipApp.grantTokens(token.address, holder31, 31) - await ownershipApp.grantTokens(token.address, holder49, 49) - - currentBlock = await getBlockNumber() - startBlock = currentBlock + 5 - finalBlock = currentBlock + 10 - }) - - it('normal vote flow', async () => { - bylawId = await bylawsApp.setVotingBylaw.call(pct16(50), pct16(40), 5, 5, false) - await bylawsApp.setVotingBylaw(pct16(50), pct16(40), 5, 5, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - await votingApp.createVote(vote.address, startBlock, finalBlock) - await votingApp.mock_setBlockNumber(startBlock) - await votingApp.voteYay(1, { from: holder31 }) - await votingApp.voteNay(1, { from: holder20 }) - await votingApp.mock_setBlockNumber(finalBlock) - - await vote.execute() - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - - // TODO: Figure out why we were getting weird values when called through DAO - assert.equal(await installedBylaws.getBylawType(bylawId), 0, 'bylaw type should be correct') - const [s, q, d, v] = await installedBylaws.getVotingBylaw(bylawId) - assert.equal(s.toNumber(), pct16(50).toNumber(), 'voting support should be correct') - assert.equal(q.toNumber(), pct16(40).toNumber(), 'quorum should be correct') - assert.equal(d, 5, 'voting debate should be correct') - assert.equal(v, 5, 'voting time should be correct') - }) - - it('vote prematurely decided flow with vote yay and execute', async () => { - bylawId = await bylawsApp.setVotingBylaw.call(pct16(50), pct16(40), 5, 5, false) - await bylawsApp.setVotingBylaw(pct16(50), pct16(40), 5, 5, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - await votingApp.createVote(vote.address, startBlock, finalBlock) - await votingApp.mock_setBlockNumber(startBlock) - await votingApp.mock_setBlockNumber(finalBlock) - await votingApp.voteYay(1, { from: holder31 }) - await votingApp.voteYayAndExecute(1, { from: holder20 }) - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws if voting hasnt been successful', async () => { - bylawId = await bylawsApp.setVotingBylaw.call(pct16(50), pct16(40), 5, 5, false) - await bylawsApp.setVotingBylaw(pct16(50), pct16(40), 5, 5, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - await votingApp.createVote(vote.address, startBlock, finalBlock) - await votingApp.mock_setBlockNumber(startBlock) - await votingApp.voteNay(1, { from: holder31 }) - await votingApp.voteYay(1, { from: holder20 }) - - await votingApp.mock_setBlockNumber(finalBlock) - - try { - await vote.execute() - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('throws if voting had no votes', async () => { - bylawId = await bylawsApp.setVotingBylaw.call(pct16(50), pct16(40), 5, 5, false) - await bylawsApp.setVotingBylaw(pct16(50), pct16(40), 5, 5, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - await votingApp.createVote(vote.address, startBlock, finalBlock) - await votingApp.mock_setBlockNumber(finalBlock) - - try { - await vote.execute() - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('throws if voting didnt get enough quorum', async () => { - bylawId = await bylawsApp.setVotingBylaw.call(pct16(50), pct16(21), 5, 5, false) - await bylawsApp.setVotingBylaw(pct16(50), pct16(21), 5, 5, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - await votingApp.createVote(vote.address, startBlock, finalBlock) - await votingApp.mock_setBlockNumber(startBlock) - await votingApp.voteYay(1, { from: holder20 }) - - await votingApp.mock_setBlockNumber(finalBlock) - - try { - await vote.execute() - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('throws when attempting to execute action twice', async () => { - bylawId = await bylawsApp.setVotingBylaw.call(pct16(50), pct16(40), 5, 5, false) - await bylawsApp.setVotingBylaw(pct16(50), pct16(40), 5, 5, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - await votingApp.createVote(vote.address, startBlock, finalBlock) - await votingApp.mock_setBlockNumber(startBlock) - await votingApp.voteYay(1, { from: holder31 }) - await votingApp.voteNay(1, { from: holder20 }) - await votingApp.mock_setBlockNumber(finalBlock) - - await vote.execute() - try { - await vote.execute() - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('adding token holder bylaw', () => { - let ownershipApp = {} - const holder1 = accounts[1] - const holder2 = accounts[2] - - beforeEach(async () => { - await installApps(metadao, [OwnershipApp]) - ownershipApp = OwnershipApp.at(dao.address) - - const token = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token.changeController(dao.address) - await ownershipApp.addToken(token.address, 100, 1, 1) - - const token2 = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token2.changeController(dao.address) - await ownershipApp.addToken(token2.address, 100, 1, 1) - - await ownershipApp.grantTokens(token.address, holder1, 10) - await ownershipApp.grantTokens(token2.address, holder2, 1) - - bylawId = await bylawsApp.setStatusBylaw.call(0, true, false) - await bylawsApp.setStatusBylaw(0, true, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 2, 'bylaw type should be correct') - assert.equal(await bylawsApp.getStatusBylaw(bylawId), 0, 'address should be correct') - assert.equal(await bylawsApp.getBylawNot(bylawId), false, 'not should be correct') - }) - - it('allows action by holder 1', async () => { - await metadao.replaceKernel(randomAddress, { from: holder1 }) - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('allows action by holder 2', async () => { - await metadao.replaceKernel(randomAddress, { from: holder2 }) - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws when another address does action', async () => { - try { - await metadao.replaceKernel(randomAddress, { from: accounts[0] }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('adding status bylaw', () => { - let statusApp = {} - const authorized = accounts[3] - const lowauth = accounts[4] - const authLevel = 8 - beforeEach(async () => { - await installApps(metadao, [StatusApp]) - - statusApp = StatusApp.at(dao.address) - - await statusApp.setEntityStatus(authorized, authLevel) - await statusApp.setEntityStatus(lowauth, authLevel - 1) - bylawId = await bylawsApp.setStatusBylaw.call(authLevel, false, false) - await bylawsApp.setStatusBylaw(authLevel, false, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 1, 'bylaw type should be correct') - assert.equal(await bylawsApp.getStatusBylaw(bylawId), authLevel, 'status should be correct') - }) - - it('allows action by entity with status', async () => { - await metadao.replaceKernel(randomAddress, { from: authorized }) - - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws when done by entity without status', async () => { - try { - await metadao.replaceKernel(randomAddress, { from: lowauth }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('adding combinable bylaws', () => { - const allowedAddress = accounts[2] - let oracle = {} - let addressBylaw = 1 - let oracleBylaw = 2 - - beforeEach(async () => { - oracle = await BylawOracleMock.new() - - addressBylaw = await bylawsApp.setAddressBylaw.call(allowedAddress, false, false) - oracleBylaw = await bylawsApp.setAddressBylaw.call(oracle.address, true, false) - - await bylawsApp.setAddressBylaw(allowedAddress, false, false) - await bylawsApp.setAddressBylaw(oracle.address, true, false) - }) - - context('adding OR bylaw', () => { - beforeEach(async () => { - bylawId = await bylawsApp.setCombinatorBylaw.call(0, addressBylaw, oracleBylaw, false) - await bylawsApp.setCombinatorBylaw(0, addressBylaw, oracleBylaw, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 5, 'bylaw type should be correct') - const [t, l, r] = await bylawsApp.getCombinatorBylaw(bylawId) - assert.equal(t, 0, 'comb type should be correct') - assert.equal(l.toString(), addressBylaw.toString(), 'addr bylaw should be correct') - assert.equal(r.toString(), oracleBylaw.toString(), 'oracle bylaw should be correct') - }) - - it('allows action if address is correct', async () => { - await metadao.replaceKernel(randomAddress, { from: allowedAddress }) - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('allows action if oracle allows is correct', async () => { - await oracle.changeAllow(true) - await metadao.replaceKernel(randomAddress, { from: accounts[8] }) - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('allows action if both are true', async () => { - await oracle.changeAllow(true) - await metadao.replaceKernel(randomAddress, { from: allowedAddress }) - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws when both fail', async () => { - try { - await metadao.replaceKernel(randomAddress, { from: accounts[8] }) - } catch (error) { - return assertThrow(error) - } - }) - }) - - context('adding AND bylaw', () => { - beforeEach(async () => { - bylawId = await bylawsApp.setCombinatorBylaw.call(1, addressBylaw, oracleBylaw, false) - await bylawsApp.setCombinatorBylaw(1, addressBylaw, oracleBylaw, false) - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 5, 'bylaw type should be correct') - const [t, l, r] = await bylawsApp.getCombinatorBylaw(bylawId) - assert.equal(t, 1, 'comb type should be correct') - assert.equal(l.toString(), addressBylaw.toString(), 'addr bylaw should be correct') - assert.equal(r.toString(), oracleBylaw.toString(), 'oracle bylaw should be correct') - }) - - it('allows action if both are true', async () => { - await oracle.changeAllow(true) - await metadao.replaceKernel(randomAddress, { from: allowedAddress }) - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws when first fails', async () => { - await oracle.changeAllow(true) - try { - await metadao.replaceKernel(randomAddress, { from: accounts[8] }) - } catch (error) { - return assertThrow(error) - } - }) - - it('throws when first fails', async () => { - await oracle.changeAllow(false) - try { - await metadao.replaceKernel(randomAddress, { from: allowedAddress }) - } catch (error) { - return assertThrow(error) - } - }) - }) - - context('adding XOR bylaw', () => { - beforeEach(async () => { - bylawId = await bylawsApp.setCombinatorBylaw.call(2, addressBylaw, oracleBylaw, false) - await bylawsApp.setCombinatorBylaw(2, addressBylaw, oracleBylaw, false) - - await bylawsApp.linkBylaw(changeKernelSig, bylawId) - }) - - it('saved bylaw correctly', async () => { - assert.equal(await bylawsApp.getBylawType(bylawId), 5, 'bylaw type should be correct') - const [t, l, r] = await bylawsApp.getCombinatorBylaw(bylawId) - assert.equal(t, 2, 'comb type should be correct') - assert.equal(l.toString(), addressBylaw.toString(), 'addr bylaw should be correct') - assert.equal(r.toString(), oracleBylaw.toString(), 'oracle bylaw should be correct') - }) - - it('allows when only first allows', async () => { - await oracle.changeAllow(false) - await metadao.replaceKernel(randomAddress, { from: allowedAddress }) - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('allows when only second allows', async () => { - await oracle.changeAllow(true) - await metadao.replaceKernel(randomAddress, { from: accounts[8] }) - assert.equal(await dao.getKernel(), randomAddress, 'Kernel should have been changed') - }) - - it('throws if both are false', async () => { - await oracle.changeAllow(false) - try { - await metadao.replaceKernel(randomAddress, { from: accounts[8] }) - } catch (error) { - return assertThrow(error) - } - }) - - it('throws if both are true', async () => { - await oracle.changeAllow(true) - try { - await metadao.replaceKernel(randomAddress, { from: allowedAddress }) - } catch (error) { - return assertThrow(error) - } - }) - }) - }) -}) diff --git a/test/integration_ownership.js b/test/integration_ownership.js deleted file mode 100644 index 1a2ab57c7..000000000 --- a/test/integration_ownership.js +++ /dev/null @@ -1,104 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var VaultOrgan = artifacts.require('VaultOrgan') -var ActionsOrgan = artifacts.require('ActionsOrgan') -var OwnershipApp = artifacts.require('OwnershipApp') -var MiniMeToken = artifacts.require('MiniMeIrrevocableVestedToken') -var Controller = artifacts.require('MiniMeController') -var IndividualSale = artifacts.require('mocks/IndividualSaleMock') -var StandardTokenPlus = artifacts.require('StandardTokenPlus') - -const { installOrgans, installApps } = require('./helpers/installer') - -var Kernel = artifacts.require('Kernel') - -const createDAO = () => DAO.new(Kernel.address) - -contract('OwnershipApp', accounts => { - let dao, metadao, kernel, appOrgan, ownershipApp = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, VaultOrgan, ActionsOrgan]) - await installApps(metadao, [OwnershipApp]) - - await VaultOrgan.at(dao.address).setupEtherToken() - - ownershipApp = OwnershipApp.at(dao.address) - }) - - context('adding new token', () => { - let token = {} - - beforeEach(async () => { - token = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token.changeController(dao.address) - await ownershipApp.addToken(token.address, 0, 1, 1) - }) - - it('added the token', async () => { - assert.equal(await ownershipApp.getTokenAddress(1), token.address, 'token address should match') - assert.equal(await ownershipApp.getTokenCount(), 1, 'token count should be 1') - - const [tokenAddress, governanceRights, economicRights] = await ownershipApp.getToken(1) - assert.equal(tokenAddress, token.address, 'token address should match in app') - assert.equal(governanceRights, 1, 'gov rights should match in app') - assert.equal(economicRights, 1, 'econ rights should match in app') - }) - - it('removes the token', async () => { - await ownershipApp.removeToken(token.address) - assert.equal(await ownershipApp.getTokenCount(), 0, 'token count should be 0') - }) - - it('replaces removed token', async () => { - await ownershipApp.removeToken(token.address) - token = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token.changeController(dao.address) - await ownershipApp.addToken(token.address, 0, 1, 1) - assert.equal(await ownershipApp.getTokenAddress(1), token.address, 'token address should match in app') - }) - - it('add second token and issue', async () => { - const token2 = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token2.changeController(dao.address) - - await ownershipApp.addToken(token2.address, 150, 1, 1) - - assert.equal(await token2.totalSupply(), 150, 'should have correct total supply after issueing') - assert.equal(await token2.balanceOf(dao.address), 150, 'DAO should have correct balance after issueing') - assert.equal(await ownershipApp.getTokenAddress(2), token2.address, 'token address should match in app') - assert.equal(await ownershipApp.getTokenCount(), 2, 'token count should be 1') - }) - - context('after issuing tokens', async () => { - beforeEach(async () => { - await ownershipApp.issueTokens(token.address, 100) - }) - - it('are properly allocated', async () => { - assert.equal(await token.totalSupply(), 100, 'should have correct total supply after issueing') - assert.equal(await token.balanceOf(dao.address), 100, 'DAO should have correct balance after issueing') - }) - - it('can grant tokens', async () => { - await ownershipApp.grantTokens(token.address, accounts[1], 10) - - assert.equal(await token.balanceOf(accounts[1]), 10, 'balances should be correct after transfer') - assert.equal(await token.balanceOf(dao.address), 90, 'balances should be correct after transfer') - }) - - it('can grant vested tokens', async () => { - const safenow = parseInt(+new Date()/1000 + 1000) - - await ownershipApp.grantVestedTokens(token.address, accounts[1], 10, safenow, safenow + 1, safenow + 2) - assert.equal(await token.balanceOf(accounts[1]), 10, 'balances should be correct after transfer') - assert.equal(await token.balanceOf(dao.address), 90, 'balances should be correct after transfer') - }) - }) - }) -}) diff --git a/test/integration_sales.js b/test/integration_sales.js deleted file mode 100644 index f07793585..000000000 --- a/test/integration_sales.js +++ /dev/null @@ -1,273 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var VaultOrgan = artifacts.require('VaultOrgan') -var ActionsOrgan = artifacts.require('ActionsOrgan') -var OwnershipApp = artifacts.require('OwnershipApp') -var MiniMeToken = artifacts.require('MiniMeIrrevocableVestedToken') -var Controller = artifacts.require('MiniMeController') -var IndividualSale = artifacts.require('mocks/IndividualSaleMock') -var PublicSale = artifacts.require('mocks/PublicSaleMock') -var VariablePriceSale = artifacts.require('mocks/VariablePriceSaleMock') -var StandardTokenPlus = artifacts.require('StandardTokenPlus') - -var Kernel = artifacts.require('Kernel') - -const { installOrgans, installApps } = require('./helpers/installer') -const createDAO = () => DAO.new(Kernel.address) - -contract('Token sales', accounts => { - let dao, metadao, kernel, appOrgan, ownershipApp, vault, token = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - vault = VaultOrgan.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, VaultOrgan, ActionsOrgan]) - await installApps(metadao, [OwnershipApp]) - - ownershipApp = OwnershipApp.at(dao.address) - - token = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token.changeController(dao.address) - await ownershipApp.addToken(token.address, 0, 1, 1) - await vault.setupEtherToken() - }) - - context('creating individual token sale', () => { - let sale, raiseToken = {} - const buyer = accounts[3] - - beforeEach(async () => { - raiseToken = await StandardTokenPlus.new() - await raiseToken.transfer(buyer, 80) - - sale = await IndividualSale.new() - await sale.mock_setBlockNumber(10) - - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, buyer, 60, 30, 20) - await ownershipApp.createTokenSale(sale.address, token.address, false) - }) - - it('sale throws when when sale expiry block is past', async () => { - sale = await IndividualSale.new(); - - try { - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, buyer, 60, 30, 19) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('saves sale information', async () => { - const [saleAddress, tokenAddress, canDestroy, closed] = await ownershipApp.getTokenSale(1) - - assert.equal(await ownershipApp.getTokenSaleCount(), 1, 'token sale count should match') - assert.equal(saleAddress, sale.address, 'sale addr should be correct') - assert.equal(tokenAddress, token.address, 'token addr should be correct') - assert.equal(canDestroy, false, 'can destroy should be correct') - assert.equal(closed, false, 'closed should be correct') - assert.equal(await sale.buyer(), buyer, 'buyer address should be correct') - assert.equal(await sale.tokensOffered(), 30, 'tokens sold should be correct') - assert.equal(await sale.buyAmount(), 60, 'tokens price should be correct') - assert.equal(await sale.expireBlock(), 20, 'expiry block should be correct') - }) - - it('throws when re-instantiating sale', async () => { - try { - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, buyer, 60, 30, 101) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('allows to buy if sending exact amount', async () => { - await raiseToken.approveAndCall(sale.address, 60, '0x', { from: buyer }) - assert.equal(await token.balanceOf(buyer), 30, 'should have received tokens') - assert.equal(await raiseToken.balanceOf(dao.address), 60, 'dao should have tokens') - assert.equal(await raiseToken.balanceOf(buyer), 20, 'buyer should have remaining tokens') - const [s, t, c, closed] = await ownershipApp.getTokenSale(1) - assert.equal(closed, true, 'Sale should be closed') - }) - - it('throws when buying after expiry block', async () => { - await sale.mock_setBlockNumber(21) - try { - await raiseToken.approveAndCall(sale.address, 60, '0x', { from: buyer }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('dao can close sale unilateraly', async () => { - await ownershipApp.closeTokenSale(sale.address) - try { - await raiseToken.approveAndCall(sale.address, 60, '0x', { from: buyer }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - }) - - context('creating ether individual token sale', () => { - let sale = {} - const buyer = accounts[3] - - beforeEach(async () => { - const etherToken = await vault.getEtherToken() - - sale = await IndividualSale.new() - await sale.mock_setBlockNumber(10) - await sale.instantiate(dao.address, ownershipApp.address, etherToken, token.address, buyer, 60, 30, 20) - await ownershipApp.createTokenSale(sale.address, token.address, false) - }) - - it('can buy with ether', async () => { - await sale.buy(buyer, { from: buyer, value: 60 }) - assert.equal(await token.balanceOf(buyer), 30, 'should have received tokens') - }) - }) - - context('creating public sale', () => { - let sale, raiseToken = {} - const buyer = accounts[3] - - beforeEach(async () => { - raiseToken = await StandardTokenPlus.new() - await raiseToken.transfer(buyer, 80) - - sale = await PublicSale.new() - await sale.mock_setBlockNumber(10) - - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, 30, 1, 2, false, 15, 20) - await ownershipApp.createTokenSale(sale.address, token.address, false) - }) - - it('saves sale information', async () => { - assert.equal(await sale.cap(), 30) - assert.equal(await sale.minBuy(), 1) - assert.equal(await sale.exchangeRate(), 2) - assert.equal(await sale.isInverseRate(), false) - assert.equal(await sale.startBlock(), 15) - assert.equal(await sale.closeBlock(), 20) - }) - - it('can buy more than cap which closes sale', async () => { - await sale.mock_setBlockNumber(15) - await raiseToken.approveAndCall(sale.address, 80, '0x', { from: buyer }) - - assert.equal(await token.balanceOf(buyer), 60, 'should have received tokens') - assert.equal(await raiseToken.balanceOf(dao.address), 30, 'dao should have tokens') - assert.equal(await raiseToken.balanceOf(buyer), 50, 'buyer should have received remaining tokens') - const [s, t, c, closed] = await ownershipApp.getTokenSale(1) - assert.equal(closed, true, 'Sale should be closed') - }) - - it('can buy normal amount', async () => { - await sale.mock_setBlockNumber(15) - await raiseToken.approveAndCall(sale.address, 20, '0x', { from: buyer }) - - assert.equal(await token.balanceOf(buyer), 40, 'should have received tokens') - assert.equal(await raiseToken.balanceOf(sale.address), 20, 'dao should have tokens') - const [s, t, c, closed] = await ownershipApp.getTokenSale(1) - assert.equal(closed, false, 'Sale should not be closed') - }) - - it('throws when buying before starting', async () => { - await sale.mock_setBlockNumber(14) - try { - await raiseToken.approveAndCall(sale.address, 60, '0x', { from: buyer }) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('can close sale after close block', async () => { - await sale.mock_setBlockNumber(21) - await sale.close(); - const [s, t, c, closed] = await ownershipApp.getTokenSale(1) - assert.equal(closed, true, 'Sale should be closed') - }) - }) - - context('variable sales', () => { - let sale, raiseToken = {} - const buyer = accounts[3] - - beforeEach(async () => { - raiseToken = await StandardTokenPlus.new() - await raiseToken.transfer(buyer, 80) - }) - - const assertAcquiredTokens = async (block, sent, expected) => { - await sale.mock_setBlockNumber(block) - assert.equal(await sale.getAcquiredTokens(sent), expected, 'should have acquired expected tokens') - } - - it('can handle decreasing price sale', async () => { - sale = await VariablePriceSale.new() - await sale.mock_setBlockNumber(10) - - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, 30, 1, false, 15, [20, 28], [1, 0, 2, 10]) - - await assertAcquiredTokens(16, 1, 1) - await assertAcquiredTokens(18, 1, 1) - await assertAcquiredTokens(20, 1, 2) - await assertAcquiredTokens(23, 1, 5) - await assertAcquiredTokens(27, 1, 9) - }) - - it('can handle increasing price sale', async () => { - sale = await VariablePriceSale.new() - await sale.mock_setBlockNumber(10) - - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, 30, 1, false, 15, [20, 28], [1, 0, 10, 2]) - - await assertAcquiredTokens(16, 1, 1) - await assertAcquiredTokens(18, 1, 1) - await assertAcquiredTokens(20, 1, 10) - await assertAcquiredTokens(23, 1, 7) - await assertAcquiredTokens(27, 1, 3) - }) - - it('can handle inverse price sales', async () => { - sale = await VariablePriceSale.new() - await sale.mock_setBlockNumber(10) - - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, 30, 1, true, 15, [20, 28], [2, 0, 2, 4]) - - await assertAcquiredTokens(20, 10, 5) - await assertAcquiredTokens(22, 20, 8) - await assertAcquiredTokens(24, 21, 7) - }) - - it('can handle buys, state transitions and capping', async () => { - sale = await VariablePriceSale.new() - await ownershipApp.createTokenSale(sale.address, token.address, false) - - await sale.mock_setBlockNumber(10) - - await sale.instantiate(dao.address, ownershipApp.address, raiseToken.address, token.address, 30, 1, true, 15, [20, 28], [2, 0, 2, 4]) - - sale.mock_setBlockNumber(20) - await raiseToken.approveAndCall(sale.address, 20, '0x', { from: buyer }) - assert.equal(await token.balanceOf(buyer), 10, 'should have received tokens') - assert.equal(await raiseToken.balanceOf(sale.address), 20, 'sale should have tokens') - - sale.mock_setBlockNumber(24) - await raiseToken.approveAndCall(sale.address, 60, '0x', { from: buyer }) - assert.equal(await token.balanceOf(buyer), 13, 'should have received tokens') - assert.equal(await raiseToken.balanceOf(dao.address), 30, 'dao should have tokens') - - const [s, t, c, closed] = await ownershipApp.getTokenSale(1) - assert.equal(closed, true, 'Sale should not be closed') - }) - }) -}) diff --git a/test/integration_voting.js b/test/integration_voting.js deleted file mode 100644 index 85ba32630..000000000 --- a/test/integration_voting.js +++ /dev/null @@ -1,127 +0,0 @@ -const assertThrow = require('./helpers/assertThrow'); -var DAO = artifacts.require('DAO'); -var MetaOrgan = artifacts.require('MetaOrgan') -var ActionsOrgan = artifacts.require('ActionsOrgan') -var OwnershipApp = artifacts.require('OwnershipApp') -var MiniMeToken = artifacts.require('MiniMeIrrevocableVestedToken') -var Controller = artifacts.require('MiniMeController') -var VotingApp = artifacts.require('./mocks/VotingAppMock') -var Vote = artifacts.require('Vote') - -var Kernel = artifacts.require('Kernel') - -const { getBlockNumber } = require('./helpers/web3') -const { installOrgans, installApps } = require('./helpers/installer') - -const createDAO = () => DAO.new(Kernel.address) - -const pct16 = x => new web3.BigNumber(x).times(new web3.BigNumber(10).toPower(16)) - -const states = { - debate: 0, - voting: 1, - closed: 2, -} - -contract('VotingApp', accounts => { - let dao, metadao, kernel, appOrgan, ownershipApp, votingApp, token, vote = {} - - beforeEach(async () => { - dao = await createDAO() - metadao = MetaOrgan.at(dao.address) - kernel = Kernel.at(dao.address) - - ownershipApp = OwnershipApp.at(dao.address) - votingApp = VotingApp.at(dao.address) - - await installOrgans(metadao, [MetaOrgan, ActionsOrgan]) - await installApps(metadao, [VotingApp, OwnershipApp]) - - vote = await Vote.new() - const voteBytecode = await votingApp.hashForCode(vote.address) - await votingApp.setValidVoteCode(voteBytecode, true) - - token = await MiniMeToken.new('0x0', '0x0', 0, 'hola', 18, '', true) - await token.changeController(dao.address) - await ownershipApp.addToken(token.address, 1000, 1, 1) - await ownershipApp.grantTokens(token.address, accounts[0], 30) - await ownershipApp.grantTokens(token.address, accounts[1], 35) - }) - - context('creating basic voting', () => { - let currentBlock, startBlock, finalBlock = 0 - - it('throws when vote bytecode is not valid', async () => { - try { - await votingApp.createVote(dao.address, startBlock, finalBlock) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('throws when vote address is a normal account', async () => { - try { - await votingApp.createVote(accounts[1], startBlock, finalBlock) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - beforeEach(async () => { - currentBlock = await getBlockNumber() - startBlock = currentBlock + 5 - finalBlock = currentBlock + 10 - await votingApp.mock_setBlockNumber(currentBlock) - await votingApp.createVote(vote.address, startBlock, finalBlock) - }) - - it('has correct initial state', async () => { - const [state, voteCreator, voteAddress, voteCreatedBlock, voteStartsBlock, voteEndsBlock] = await votingApp.getVoteStatus(1) - assert.equal(state, states.debate, 'state should be debate') - assert.equal(voteCreator, accounts[0], 'vote creator should be sender') - }) - - it('throws when voting on debate', async () => { - try { - await votingApp.voteYay(1) - } catch (error) { - return assertThrow(error) - } - assert.fail('should have thrown before') - }) - - it('voting on voting time does a state transition and votes', async () => { - await votingApp.mock_setBlockNumber(startBlock) - await votingApp.voteYay(1, { from: accounts[0] }) - await votingApp.voteNay(1, { from: accounts[1] }) - - const [state, voteCreator, voteAddress, voteCreatedBlock, voteStartsBlock, voteEndsBlock, yays, nays, totalQuorum] = await votingApp.getVoteStatus(1) - assert.equal(state, states.voting, 'state should be voting') - assert.equal(yays, 30, 'yay votes should have been added') - assert.equal(nays, 35, 'nay votes should have been added') - - assert.equal(totalQuorum, 65, 'quorum should be assigned tokens') - }) - - it('re-voting modifies vote', async () => { - await votingApp.mock_setBlockNumber(startBlock) - await votingApp.voteYay(1) - await votingApp.voteNay(1) - const [state, voteCreator, voteAddress, voteCreatedBlock, voteStartsBlock, voteEndsBlock, yays, nays] = await votingApp.getVoteStatus(1) - - assert.equal(yays, 0, 'yay votes should have been modified') - assert.equal(nays, 30, 'nay votes should have been modified') - assert.equal(state, states.voting, 'state should be voting') - }) - - it('closes voting after final block', async () => { - await votingApp.mock_setBlockNumber(finalBlock + 1) - await votingApp.transitionStateIfChanged(1) - - const [state] = await votingApp.getVoteStatus(1) - assert.equal(state, states.closed, 'state should be closed') - }) - }) -}) diff --git a/test/kernel_acl.js b/test/kernel_acl.js new file mode 100644 index 000000000..44f564c58 --- /dev/null +++ b/test/kernel_acl.js @@ -0,0 +1,253 @@ +const { assertRevert } = require('./helpers/assertThrow') +const Kernel = artifacts.require('Kernel') +const KernelProxy = artifacts.require('KernelProxy') +const { getBlockNumber } = require('./helpers/web3') +const assertEvent = require('./helpers/assertEvent') + +const DAOFactory = artifacts.require('DAOFactory') +const ACL = artifacts.require('ACL') + +const getSig = x => web3.sha3(x).slice(0, 10) + +contract('Kernel ACL', accounts => { + let kernel, app, factory, acl = {} + + const permissionsRoot = accounts[0] + const granted = accounts[1] + const child = accounts[2] + + let role = null + + before(async () => { + factory = await DAOFactory.new() + }) + + beforeEach(async () => { + const receipt = await factory.newDAO(permissionsRoot) + app = receipt.logs.filter(l => l.event == 'DeployDAO')[0].args.dao + + kernel = Kernel.at(app) + + // events for kernel.createPermission permission + //assertEvent(receipt, 'SetPermission') + //assertEvent(receipt, 'ChangePermissionManager') + + role = await kernel.APP_MANAGER_ROLE() + acl = ACL.at(await kernel.acl()) + }) + + it('cannot initialize ACL outside of Kernel', async () => { + const acl = await ACL.new() + return assertRevert(async () => { + await acl.initialize('0x1234') + }) + }) + + it('has correct initialization block', async () => { + assert.equal(await kernel.getInitializationBlock(), await getBlockNumber(), 'initialization block should be correct') + }) + + it('throws on reinitialization', async () => { + return assertRevert(async () => { + await kernel.initialize(accounts[0], accounts[0]) + }) + }) + + + it('actions cannot be performed by default', async () => { + assert.isFalse(await acl.hasPermission(permissionsRoot, app, role)) + }) + + it('actions cannot be performed if uninitialized', async () => { + const newKernelProxy = await KernelProxy.new(await factory.baseKernel()) + const newKernel = Kernel.at(newKernelProxy.address) + return assertRevert(async () => { + const result = await newKernel.hasPermission(permissionsRoot, app, role, '0x00') + }) + }) + + it('protected actions fail if not allowed', async () => { + return assertRevert(async () => { + await kernel.setApp('0x0', '0x1234', accounts[0]) + }) + }) + + it('create permission action can be performed by root by default', async () => { + const createPermissionRole = await acl.CREATE_PERMISSIONS_ROLE() + assert.isTrue(await acl.hasPermission(permissionsRoot, acl.address, createPermissionRole)) + }) + + it('cannot create permissions without permission', async () => { + return assertRevert(async () => { + await acl.createPermission(granted, app, role, granted, { from: accounts[8] }) + }) + }) + + context('creating permission', () => { + beforeEach(async () => { + const receipt = await acl.createPermission(granted, app, role, granted, { from: permissionsRoot }) + assertEvent(receipt, 'SetPermission') + assertEvent(receipt, 'ChangePermissionManager') + }) + + it('can grant permission with params', async () => { + // app id != 0 (kernel) + // param hash 0x68b4adfe8175b29530f1c715f147337823f4ae55693be119bef69129637d681f + const argId = '0x00' // arg 0 + const op = '02' // not equal + const value = '000000000000000000000000000000000000000000000000000000000000' // namespace 0 + const param = new web3.BigNumber(argId + op + value) + + const r1 = await acl.grantPermissionP(accounts[3], app, role, [param], { from: granted }) + // grants again without re-saving params + const r2 = await acl.grantPermissionP(accounts[4], app, role, [param], { from: granted }) + + assert.isBelow(r2.receipt.gasUsed, r1.receipt.gasUsed, 'should have used less gas because of cache') + // Allow setting code for namespace other than 0 + const receipt = await kernel.setApp('0x121212', '0x00', accounts[4], { from: accounts[4] }) + + assertEvent(receipt, 'SetApp') + return assertRevert(async () => { + // Fail if setting code for appId 0 + await kernel.setApp('0x0', '0x0', accounts[4], { from: accounts[3] }) + }) + }) + + it('can grant a public permission', async () => { + const anyEntity = "0xffffffffffffffffffffffffffffffffffffffff" + + await acl.grantPermission(anyEntity, app, role, { from: granted }) + // many entities can succesfully perform action + await kernel.setApp('0x121212', '0x00', accounts[4], { from: accounts[4] }) + await kernel.setApp('0x121212', '0x00', accounts[6], { from: accounts[6] }) + await kernel.setApp('0x121212', '0x00', accounts[8], { from: accounts[8] }) + assert.isTrue(await acl.hasPermission(accounts[6], app, role), 'should have perm') + }) + + it('fails granting existing permission instance', async () => { + await acl.grantPermission(accounts[8], app, role, { from: granted }) + return assertRevert(async () => { + await acl.grantPermission(accounts[8], app, role, { from: granted }) + }) + }) + + it('fails revoking non-granted permission', async () => { + await acl.grantPermission(accounts[8], app, role, { from: granted }) + await acl.revokePermission(accounts[8], app, role, { from: granted }) + return assertRevert(async () => { + await acl.revokePermission(accounts[8], app, role, { from: granted }) + }) + }) + + it('returns created permission', async () => { + const allowed = await acl.hasPermission(granted, app, role) + const manager = await acl.getPermissionManager(app, role) + + assert.isTrue(allowed, 'entity should be allowed to perform role actions') + assert.equal(manager, granted, 'permission parent should be correct') + }) + + it('can perform action', async () => { + assert.isTrue(await acl.hasPermission(granted, app, role)) + }) + + it('can execute action', async () => { + const receipt = await kernel.setApp('0x1234', '0x1234', accounts[0], { from: granted }) + assertEvent(receipt, 'SetApp') + }) + + it('root cannot revoke permission', async () => { + return assertRevert(async () => { + await acl.revokePermission(granted, app, role, { from: permissionsRoot }) + }) + }) + + it('root cannot re-create permission', async () => { + return assertRevert(async () => { + await acl.createPermission(granted, app, role, granted, { from: permissionsRoot }) + }) + }) + + it('root cannot grant permission', async () => { + return assertRevert(async () => { + await acl.grantPermission(granted, app, role, { from: permissionsRoot }) + }) + }) + + it('root cannot grant permission', async () => { + return assertRevert(async () => { + await acl.grantPermission(granted, app, role, { from: permissionsRoot }) + }) + }) + + context('transferring managership', () => { + const newManager = accounts[8] + + beforeEach(async () => { + const receipt = await acl.setPermissionManager(newManager, app, role, { from: granted }) + assertEvent(receipt, 'ChangePermissionManager') + }) + + it('changes manager', async () => { + const manager = await acl.getPermissionManager(app, role) + assert.equal(manager, newManager, 'manager should have changed') + }) + + it('can grant permission', async () => { + const receipt = await acl.grantPermission(newManager, app, role, { from: newManager }) + assertEvent(receipt, 'SetPermission') + }) + + it('old manager lost power', async () => { + return assertRevert(async () => { + await acl.grantPermission(newManager, app, role, { from: granted }) + }) + }) + }) + + context('self-revokes permission', () => { + beforeEach(async () => { + const receipt = await acl.revokePermission(granted, app, role, { from: granted }) + assertEvent(receipt, 'SetPermission') + }) + + it('can no longer perform action', async () => { + assert.isFalse(await acl.hasPermission(granted, app, role)) + }) + + it('permissions root cannot re-create', async () => { + return assertRevert(async () => { + await acl.createPermission(granted, app, role, granted, { from: permissionsRoot }) + }) + }) + + it('permission manager can grant the permission', async () => { + await acl.grantPermission(granted, app, role, { from: granted }) + assert.isTrue(await acl.hasPermission(granted, app, role)) + }) + }) + + context('re-grants to child', () => { + beforeEach(async () => { + const receipt = await acl.grantPermission(child, app, role, { from: granted }) + assertEvent(receipt, 'SetPermission') + }) + + it('child entity can perform action', async () => { + assert.isTrue(await acl.hasPermission(child, app, role)) + }) + + it('child cannot re-grant permission', async () => { + return assertRevert(async () => { + await acl.grantPermission(accounts[7], app, role, { from: child }) + }) + }) + + it('parent can revoke permission', async () => { + const receipt = await acl.revokePermission(child, app, role, { from: granted }) + assert.isFalse(await acl.hasPermission(child, app, role)) + assertEvent(receipt, 'SetPermission') + }) + }) + }) +}) diff --git a/test/kernel_apps.js b/test/kernel_apps.js new file mode 100644 index 000000000..2ff7ba230 --- /dev/null +++ b/test/kernel_apps.js @@ -0,0 +1,286 @@ +const { assertRevert } = require('./helpers/assertThrow') +const { hash } = require('eth-ens-namehash') +const Kernel = artifacts.require('Kernel') +const AppProxyUpgradeable = artifacts.require('AppProxyUpgradeable') +const AppProxyPinned = artifacts.require('AppProxyPinned') +const AppStub = artifacts.require('AppStub') +const AppStub2 = artifacts.require('AppStub2') +const DAOFactory = artifacts.require('DAOFactory') +const ACL = artifacts.require('ACL') + +const getSig = x => web3.sha3(x).slice(0, 10) + +const keccak256 = require('js-sha3').keccak_256 +const APP_BASE_NAMESPACE = '0x'+keccak256('base') + +contract('Kernel apps', accounts => { + let factory, acl, kernel, app, appProxy, appCode1, appCode2 = {} + + const permissionsRoot = accounts[0] + const appId = hash('stub.aragonpm.test') + const zeroAddr = '0x0000000000000000000000000000000000000000' + + before(async () => { + factory = await DAOFactory.new() + appCode1 = await AppStub.new() + appCode2 = await AppStub2.new() + }) + + beforeEach(async () => { + const receipt = await factory.newDAO(permissionsRoot) + app = receipt.logs.filter(l => l.event == 'DeployDAO')[0].args.dao + + kernel = Kernel.at(app) + acl = ACL.at(await kernel.acl()) + + const r = await kernel.APP_MANAGER_ROLE() + await acl.createPermission(permissionsRoot, kernel.address, r, permissionsRoot) + + code1 = await AppStub.new() + code2 = await AppStub2.new() + }) + + it('fails if initializing on constructor before setting app code', async () => { + const initializationPayload = code1.contract.initialize.getData() + + return assertRevert(async () => { + await AppProxyUpgradeable.new(kernel.address, appId, initializationPayload) + }) + }) + + context('upgradeable proxies', () => { + it('fails if code hasnt been set and initializes', async () => { + return assertRevert(async () => { + await AppProxyUpgradeable.new(kernel.address, appId, appCode1.contract.initialize.getData(), { gas: 5e6 }) + }) + }) + + it('doesnt fail if code hasnt been set and doesnt initialize', async () => { + await AppProxyUpgradeable.new(kernel.address, appId, '0x', { gas: 5e6 }) + }) + + context('initializing on proxy constructor', () => { + beforeEach(async () => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + + const initializationPayload = appCode1.contract.initialize.getData() + appProxy = await AppProxyUpgradeable.new(kernel.address, appId, initializationPayload, { gas: 5e6 }) + app = AppStub.at(appProxy.address) + }) + + it('fails if kernel addr is not a kernel', async () => { + return assertRevert(async () => { + await AppProxyUpgradeable.new('0x1234', appId, '0x', { gas: 5e6 }) + }) + }) + + it('fails if kernel addr is 0', async () => { + return assertRevert(async () => { + await AppProxyUpgradeable.new('0x0', appId, '0x', { gas: 5e6 }) + }) + }) + + it('fails if init fails', async () => { + const badInit = '0x1234' + return assertRevert(async () => { + await AppProxyUpgradeable.new(kernel.address, appId, badInit, { gas: 5e6 }) + }) + }) + + it('was initialized on constructor', async () => { + assert.isAbove(await app.getInitializationBlock(), 0, 'app should have been initialized') + }) + + it('is upgradeable', async () => { + assert.isTrue(await appProxy.isUpgradeable.call(), 'appproxy should have be upgradeable') + }) + + it('cannot reinitialize', async () => { + return assertRevert(async () => { + await app.initialize() + }) + }) + + it('should return values', async () => { + assert.equal(await app.stringTest(), 'hola', 'string test') + }) + }) + + context('not initializing on proxy constructor', () => { + beforeEach(async () => { + const initializationPayload = '0x' // dont initialize + appProxy = await AppProxyUpgradeable.new(kernel.address, appId, initializationPayload) + app = AppStub.at(appProxy.address) + + // assign app permissions + const r2 = await appCode1.ROLE() + await acl.createPermission(permissionsRoot, appProxy.address, r2, permissionsRoot) + }) + + it('throws if using app without reference in kernel', async () => { + return assertRevert(async () => { + await app.setValue(10) + }) + }) + + context('setting app code in kernel', async () => { + beforeEach(async () => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + }) + + it('can initialize', async () => { + await app.initialize() + + assert.isAbove(await app.getInitializationBlock(), 0, 'app should have been initialized') + }) + + it('app call works if sent from authed entity', async () => { + await app.setValue(10) + assert.equal(await app.getValue(), 10, 'should have returned correct value') + }) + + it('fails when called by unauthorized entity', async () => { + return assertRevert(async () => { + await app.setValue(10, { from: accounts[1] }) + }) + }) + + it('fails if updated app is not a contract', async () => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, '0x1234') + return assertRevert(async () => { + await app.setValue(10) + }) + }) + + it('can update app code and storage is preserved', async () => { + await app.setValue(10) + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode2.address) + // app2 returns the double of the value in storage + assert.equal(await app.getValue(), 20, 'app 2 should have returned correct value') + }) + + it('can update app code and removed functions throw', async () => { + await app.setValue(10) + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode2.address) + return assertRevert(async () => { + await app.setValue(10) + }) + }) + }) + }) + }) + + context('pinned proxies', () => { + beforeEach(async () => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + + const initializationPayload = appCode1.contract.initialize.getData() + appProxy = await AppProxyPinned.new(kernel.address, appId, initializationPayload, { gas: 5e6 }) + app = AppStub.at(appProxy.address) + + // assign app permissions + const r2 = await appCode1.ROLE() + await acl.createPermission(permissionsRoot, appProxy.address, r2, permissionsRoot) + }) + + it('fails if code hasnt been set on deploy', async () => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, '0x0') + return assertRevert(async () => { + await AppProxyPinned.new(kernel.address, appId, '0x', { gas: 5e6 }) + }) + }) + + it('is not upgradeable', async () => { + assert.isFalse(await appProxy.isUpgradeable.call(), 'appproxy should not be upgradeable') + }) + + it('can update app code and pinned proxy continues using former version', async () => { + await app.setValue(10) + await app.setValue(11) + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode2.address) + + // app2 would return the double of the value in storage + assert.equal(await app.getValue(), 11, 'app 2 should have returned correct value') + }) + }) + + context('new app instances', () => { + const appSetId = web3.sha3(APP_BASE_NAMESPACE + appId.substring(2), { encoding: 'hex' }) + + it('creates a new upgradeable app proxy instance', async () => { + const receipt = await kernel.newAppInstance(appId, appCode1.address) + const appProxy = AppProxyUpgradeable.at(receipt.logs.filter(l => l.event == 'NewAppProxy')[0].args.proxy) + assert.isTrue(await appProxy.isUpgradeable.call(), 'new appProxy instance should be upgradeable') + assert.equal(await appProxy.kernel(), kernel.address, "new appProxy instance's kernel should be set to the originating kernel") + assert.equal(await appProxy.getCode(), appCode1.address, 'new appProxy instance should be resolving to implementation address') + }) + + it('sets the app base when not previously registered', async() => { + assert.equal(zeroAddr, await kernel.getApp(appSetId)) + + const appProxy = await kernel.newAppInstance(appId, appCode1.address) + assert.equal(appCode1.address, await kernel.getApp(appSetId)) + }) + + it("doesn't set the app base when already set", async() => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + const receipt = await kernel.newAppInstance(appId, appCode1.address) + assert.isFalse(receipt.logs.includes(l => l.event == 'SetApp')) + }) + + it("doesn't set the app base if not given", async() => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + assert.equal(appCode1.address, await kernel.getApp(appSetId)) + + const appProxy = await kernel.newAppInstance(appId, '0x0') + assert.equal(appCode1.address, await kernel.getApp(appSetId)) + }) + + it('fails if the given app base is different than the existing one', async() => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + return assertRevert(async () => { + await kernel.newAppInstance(appId, appCode2.address) + }) + }) + }) + + context('new pinned app instances', () => { + const appSetId = web3.sha3(APP_BASE_NAMESPACE + appId.substring(2), { encoding: 'hex' }) + + it('creates a new non upgradeable app proxy instance', async () => { + const receipt = await kernel.newPinnedAppInstance(appId, appCode1.address) + const appProxy = AppProxyPinned.at(receipt.logs.filter(l => l.event == 'NewAppProxy')[0].args.proxy) + assert.isFalse(await appProxy.isUpgradeable.call(), 'new appProxy instance should be not upgradeable') + assert.equal(await appProxy.kernel(), kernel.address, "new appProxy instance's kernel should be set to the originating kernel") + assert.equal(await appProxy.getCode(), appCode1.address, 'new appProxy instance should be resolving to implementation address') + }) + + it('sets the app base when not previously registered', async() => { + assert.equal(zeroAddr, await kernel.getApp(appSetId)) + + const appProxy = await kernel.newPinnedAppInstance(appId, appCode1.address) + assert.equal(appCode1.address, await kernel.getApp(appSetId)) + }) + + it("doesn't set the app base when already set", async() => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + const receipt = await kernel.newPinnedAppInstance(appId, appCode1.address) + assert.isFalse(receipt.logs.includes(l => l.event == 'SetApp')) + }) + + it("doesn't set the app base if not given", async() => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + assert.equal(appCode1.address, await kernel.getApp(appSetId)) + + const appProxy = await kernel.newPinnedAppInstance(appId, '0x0') + assert.equal(appCode1.address, await kernel.getApp(appSetId)) + }) + + it('fails if the given app base is different than the existing one', async() => { + await kernel.setApp(APP_BASE_NAMESPACE, appId, appCode1.address) + return assertRevert(async () => { + await kernel.newPinnedAppInstance(appId, appCode2.address) + }) + }) + }) +}) diff --git a/test/kernel_upgrade.js b/test/kernel_upgrade.js new file mode 100644 index 000000000..59ea96724 --- /dev/null +++ b/test/kernel_upgrade.js @@ -0,0 +1,62 @@ +const { assertRevert } = require('./helpers/assertThrow') +const Kernel = artifacts.require('Kernel') +const KernelProxy = artifacts.require('KernelProxy') +const UpgradedKernel = artifacts.require('UpgradedKernel') +const DAOFactory = artifacts.require('DAOFactory') +const ACL = artifacts.require('ACL') + +contract('Kernel Upgrade', accounts => { + let kernel, namespace, kernelId = {} + + const permissionsRoot = accounts[0] + + before(async () => { + factory = await DAOFactory.new() + }) + + beforeEach(async () => { + const receipt = await factory.newDAO(permissionsRoot) + app = receipt.logs.filter(l => l.event == 'DeployDAO')[0].args.dao + + kernel = Kernel.at(app) + acl = ACL.at(await kernel.acl()) + + const r = await kernel.APP_MANAGER_ROLE() + + namespace = await kernel.CORE_NAMESPACE() + kernelId = await kernel.KERNEL_APP_ID() + }) + + it('fails to upgrade kernel without permission', async () => { + return assertRevert(async () => { + await kernel.setApp(namespace, kernelId, accounts[0]) + }) + }) + + it('fails when calling is upgraded on old version', async () => { + return assertRevert(async () => { + await UpgradedKernel.at(kernel.address).isUpgraded() + }) + }) + + it('successfully upgrades kernel', async () => { + const role = await kernel.APP_MANAGER_ROLE() + await acl.createPermission(permissionsRoot, kernel.address, role, permissionsRoot, { from: permissionsRoot }) + + const upgradedImpl = await UpgradedKernel.new() + await kernel.setApp(namespace, kernelId, upgradedImpl.address) + + assert.isTrue(await UpgradedKernel.at(kernel.address).isUpgraded(), 'kernel should have been upgraded') + }) + + it('fails if upgrading to kernel that is not a contract', async () => { + const role = await kernel.APP_MANAGER_ROLE() + await acl.createPermission(permissionsRoot, kernel.address, role, permissionsRoot, { from: permissionsRoot }) + + const upgradedImpl = await UpgradedKernel.new() + + return assertRevert(async () => { + await kernel.setApp(namespace, kernelId, '0x1234') + }) + }) +}) diff --git a/test/mini_me_token.js b/test/mini_me_token.js new file mode 100644 index 000000000..b2e281d76 --- /dev/null +++ b/test/mini_me_token.js @@ -0,0 +1,137 @@ +const { getBlockNumber, getBlock, getBalance } = require('./helpers/web3') +const { assertRevert } = require('./helpers/assertThrow') +const MiniMeToken = artifacts.require('MiniMeToken') +const MiniMeTokenFactory = artifacts.require('MiniMeTokenFactory') + +contract('MiniMeToken', accounts => { + const from = accounts[0] + let factory = {} + let token = {} + let clone1 = {} + let clone2 = {} + + it('should deploy contracts', async () => { + factory = await MiniMeTokenFactory.new() + token = await MiniMeToken.new( + factory.address, + 0, + 0, + 'MiniMe Test Token', + 18, + 'MMT', + true) + + assert.ok(token) + }) + + context('create, destroy, and claim tokens', () => { + it('should generate tokens', async () => { + await token.generateTokens(accounts[1], 100) + assert.equal(await token.totalSupply(), 100, 'total supply generated should be 100') + assert.equal(await token.balanceOf(accounts[1]), 100, 'accounts[1] balance should be 100') + }) + + it('should be able to destroy tokens', async() => { + await token.destroyTokens(accounts[1], 20) + + let block = await getBlockNumber() + + assert.equal(await token.totalSupply(), 80, 'total supply should be at 80') + assert.equal(await token.totalSupplyAt(block - 1), 100, 'total supply should be 100 in previous block') + assert.equal(await token.balanceOf(accounts[1]), 80, 'should have destroyed 20 tokens from orignal amount') + + return assertRevert(async () => { + await token.destroyTokens(accounts[2], 100) + }) + }) + }) + + context('test multi-transfer and disabling', () => { + it('token should be able to transfer from account 1 to account 2', async () => { + await token.transferFrom(accounts[1], accounts[2], 10) + + let block = await getBlockNumber() + + assert.equal(await token.totalSupply(), 80, 'total supply should still be at 80') + assert.equal(await token.balanceOf(accounts[1]), 70, 'accounts[1] should have updated balance of 60') + assert.equal(await token.balanceOf(accounts[2]), 10, 'accounts[2] should have a balance of 10') + assert.equal(await token.balanceOfAt(accounts[1], block - 1), 80, 'accounts[1] balance should be 80 in previous block') + }) + + it('token should be able to transfer from account 2 to account 3', async () => { + await token.transferFrom(accounts[2], accounts[3], 5) + + let block = await getBlockNumber() + + assert.equal(await token.totalSupply(), 80, 'total supply should still be at 80') + assert.equal(await token.balanceOf(accounts[2]), 5, 'accounts[2] should have updated balance of 5') + assert.equal(await token.balanceOf(accounts[3]), 5, 'accounts[3] should have a balance of 5') + assert.equal(await token.balanceOfAt(accounts[2], block - 1), 10, 'accounts[2] balance should be 10 in previous block') + }) + + it('check transfer from controller', async () => { + await token.transfer(accounts[2], 5) + assert.equal(await token.balanceOf(accounts[2]), 5, 'accounts[2] should now have 10 tokens') + + assert.ok(await token.transfer(accounts[1], 0)) + }) + + it('claim tokens', async () => { + assert.ok(await token.claimTokens(0x0)) + assert.ok(await token.claimTokens(token.address)) + return assertRevert(async () => { + await token.transfer(token.address, 5) + }) + }) + + it('disable transfers', async () => { + token.enableTransfers(false) + return assertRevert(async () => { + await token.transfer(accounts[3], 5) + }) + }) + + it('approve tokens for spending', async () => { + await token.enableTransfers(true) + assert.ok(await token.approve(accounts[3], 10)) + assert.equal(await token.allowance(accounts[0], accounts[3]), 10, 'should have an allowance') + await token.transferFrom(accounts[3], accounts[4], 5) + let allowance = await token.allowance(accounts[0], accounts[3]) + + assert.equal(allowance, 10, 'should now have an allowance of 5') + + await token.enableTransfers(false) + return assertRevert(async () => { + await token.approve(accounts[2], 10) + }) + }) + }) + + + context('test all cloning', () => { + it('should be able to clone token', async () => { + clone1 = await MiniMeToken.new(await token.createCloneToken("MMT2", 18, "MMT2", 0, false)) + assert.equal(await clone1.totalSupply(), 0, 'should have 0 tokens') + }) + + it('generate some clone tokens', async () => { + await clone1.generateTokens(accounts[0], 1000) + + let block = await getBlockNumber() + + assert.equal(await clone1.totalSupplyAt(block - 1), 0, 'previous supply should be 0 for cloned token') + assert.equal(await clone1.balanceOfAt(accounts[0], block), 1000, 'cloned token controller should have balance of 1000') + assert.equal(await clone1.balanceOfAt(accounts[0], block - 1), 0, 'cloned token controller should have previous balance of 0') + }) + + it('cloned token transfers', async() => { + await clone1.transferFrom(accounts[0], accounts[1], 100) + + let block = await getBlockNumber() + + assert.equal(await clone1.balanceOf(accounts[0]), 900, 'clone token controller should only have 900 tokens after transfer') + assert.equal(await clone1.balanceOfAt(accounts[0], block - 1), 1000, 'clone token controller should have 1000 in the past block') + assert.equal(await clone1.balanceOf(accounts[1]), 100, 'transferee should now have 100 tokens') + }) + }) +}) diff --git a/test/mocks/AppStub.sol b/test/mocks/AppStub.sol new file mode 100644 index 000000000..98f4596a5 --- /dev/null +++ b/test/mocks/AppStub.sol @@ -0,0 +1,31 @@ +pragma solidity 0.4.18; + +import "../../contracts/apps/AragonApp.sol"; + +contract AppSt { + uint a; + string public stringTest; +} + +contract AppStub is AragonApp, AppSt { + bytes32 constant public ROLE = bytes32(1); + + function initialize() onlyInit { + initialized(); + stringTest = "hola"; + } + + function setValue(uint i) auth(ROLE) { + a = i; + } + + function getValue() constant returns (uint) { + return a; + } +} + +contract AppStub2 is AragonApp, AppSt { + function getValue() constant returns (uint){ + return a * 2; + } +} diff --git a/test/mocks/BylawOracleMock.sol b/test/mocks/BylawOracleMock.sol deleted file mode 100644 index 7577415f5..000000000 --- a/test/mocks/BylawOracleMock.sol +++ /dev/null @@ -1,16 +0,0 @@ -pragma solidity ^0.4.8; - -import "../../contracts/apps/bylaws/BylawOracle.sol"; - -contract BylawOracleMock is BylawOracle { - bool allows; - - function changeAllow(bool _allows) { - allows = _allows; - } - - function canPerformAction(address sender, bytes data, address token, uint256 value) returns (bool ok, uint256 actionId) { - sender;data;token;value; //silence warning - return (allows, 0); - } -} diff --git a/test/mocks/Delegator.sol b/test/mocks/Delegator.sol new file mode 100644 index 000000000..11bbf0536 --- /dev/null +++ b/test/mocks/Delegator.sol @@ -0,0 +1,36 @@ +pragma solidity 0.4.18; + +import "../../contracts/evmscript/executors/DelegateScript.sol"; +import "./Executor.sol"; + + +contract Delegator is ExecutorStorage, DelegateScriptTarget { + function exec() public { + randomNumber += 1234; + } + + function execReturnValue(uint i) public pure returns (uint) { return i; } +} + +contract FailingDelegator is DelegateScriptTarget { + function exec() public { revert(); } +} + + +contract FailingDeployment { + function FailingDeployment() { revert(); } +} + + +contract ProtectionModifierKernel is ExecutorStorage, DelegateScriptTarget { + function exec() public { + kernel = IKernel(0x1234); + } +} + + +contract ProtectionModifierAppId is ExecutorStorage, DelegateScriptTarget { + function exec() public { + appId = bytes32(123456); + } +} diff --git a/test/mocks/ERC677Stub.sol b/test/mocks/ERC677Stub.sol new file mode 100644 index 000000000..f15c41bd2 --- /dev/null +++ b/test/mocks/ERC677Stub.sol @@ -0,0 +1,19 @@ +pragma solidity 0.4.18; + +import "../../contracts/lib/erc677/ERC677Receiver.sol"; + +contract ERC677Stub is ERC677Receiver { + address public token; + address public from; + uint256 public amount; + bytes public data; + + function tokenFallback(address _from, uint256 _amount, bytes _data) external returns (bool success) { + token = msg.sender; + from = _from; + amount = _amount; + data = _data; + + return true; + } +} diff --git a/test/mocks/EncodeMock.sol b/test/mocks/EncodeMock.sol new file mode 100644 index 000000000..c35136167 --- /dev/null +++ b/test/mocks/EncodeMock.sol @@ -0,0 +1,17 @@ +pragma solidity 0.4.18; + +contract EncodeMockInterface { + function gogo(bytes a, bytes b, address[] c); +} + +contract EncodeMock { + bytes public result; + + function exec(bytes a, bytes b, address[] c) { + EncodeMockInterface(this).gogo(a, b, c); + } + + function () { + result = msg.data; + } +} diff --git a/test/mocks/ExecutionTarget.sol b/test/mocks/ExecutionTarget.sol new file mode 100644 index 000000000..d78974baa --- /dev/null +++ b/test/mocks/ExecutionTarget.sol @@ -0,0 +1,21 @@ +pragma solidity 0.4.18; + + +contract ExecutionTarget { + uint public counter; + + function execute() { + counter += 1; + Executed(counter); + } + + function failExecute() { + revert(); + } + + function setCounter(uint x) { + counter = x; + } + + event Executed(uint x); +} diff --git a/test/mocks/Executor.sol b/test/mocks/Executor.sol new file mode 100644 index 000000000..68fe38efb --- /dev/null +++ b/test/mocks/Executor.sol @@ -0,0 +1,33 @@ +pragma solidity 0.4.18; + +import "../../contracts/apps/AragonApp.sol"; + + +contract ExecutorStorage is AragonApp { + uint256 public randomNumber; +} + +// TODO: Rename +contract Executor is ExecutorStorage { + function execute(bytes script) { + runScript(script, new bytes(0), new address[](0)); + } + + function executeWithBan(bytes script, address[] memory blacklist) { + runScript(script, new bytes(0), blacklist); + } + + function executeWithIO(bytes script, bytes input, address[] memory blacklist) returns (bytes) { + return runScript(script, input, blacklist); + } + + /* + function getActionsCount(bytes script) constant returns (uint256) { + return getScriptActionsCount(script); + } + + function getAction(bytes script, uint256 i) constant returns (address, bytes) { + return getScriptAction(script, i); + } + */ +} diff --git a/test/mocks/IndividualSaleMock.sol b/test/mocks/IndividualSaleMock.sol deleted file mode 100644 index 36a56a38f..000000000 --- a/test/mocks/IndividualSaleMock.sol +++ /dev/null @@ -1,19 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../contracts/apps/ownership/sales/IndividualSale.sol"; - -contract IndividualSaleMock is IndividualSale { - uint64 mock_block; - - function IndividualSaleMock() { - mock_setBlockNumber(uint64(block.number)); - } - - function mock_setBlockNumber(uint64 blockNumber) { - mock_block = blockNumber; - } - - function getBlockNumber() internal returns (uint64) { - return mock_block; - } -} diff --git a/test/mocks/MockedApp.sol b/test/mocks/MockedApp.sol deleted file mode 100644 index 184e097e8..000000000 --- a/test/mocks/MockedApp.sol +++ /dev/null @@ -1,22 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../contracts/apps/Application.sol"; - -contract MockedApp is Application { - bool public didStuff; - - function MockedApp(address dao_addr) Application(dao_addr) {} - - function doStuff() onlyDAO { - didStuff = true; - } - - function unprotectedDoStuff() { - didStuff = true; - } - - function canHandlePayload(bytes p) constant returns (bool) { - p; // silence warning - return true; // can handle all the payloads - } -} diff --git a/test/mocks/MockedOrgan.sol b/test/mocks/MockedOrgan.sol deleted file mode 100644 index 22c29ae51..000000000 --- a/test/mocks/MockedOrgan.sol +++ /dev/null @@ -1,33 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../contracts/organs/IOrgan.sol"; - -contract MockedOrgan is IOrgan { - function organWasInstalled() {} - - function mock_setNumber(uint256 i) payable { - storageSet(sha3(0xbeef), i); - storageSet(sha3(0xbeaf), uint256(dao_msg().sender)); - } - - function mock_getNumber() constant returns (uint256) { - return storageGet(sha3(0xbeef)); - } - - function mock_getSender() constant returns (address) { - return address(storageGet(sha3(0xbeaf))); - } - - function canHandlePayload(bytes _payload) public returns (bool) { - _payload; // silence warning - return true; - } - - function recover(bytes32 r, bytes32 s, uint8 v) constant returns (address) { - return ecrecover(hashit(), v, r, s); - } - - function hashit() constant returns (bytes32) { - return sha3(0); - } -} diff --git a/test/mocks/PublicSaleMock.sol b/test/mocks/PublicSaleMock.sol deleted file mode 100644 index c402321f5..000000000 --- a/test/mocks/PublicSaleMock.sol +++ /dev/null @@ -1,19 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../contracts/apps/ownership/sales/PublicSale.sol"; - -contract PublicSaleMock is PublicSale { - uint64 mock_block; - - function PublicSaleMock() { - mock_setBlockNumber(uint64(block.number)); - } - - function mock_setBlockNumber(uint64 blockNumber) { - mock_block = blockNumber; - } - - function getBlockNumber() internal returns (uint64) { - return mock_block; - } -} diff --git a/test/mocks/StandardTokenMock.sol b/test/mocks/StandardTokenMock.sol new file mode 100644 index 000000000..19bce022b --- /dev/null +++ b/test/mocks/StandardTokenMock.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.4.11; + + +import '../../contracts/lib/zeppelin/token/StandardToken.sol'; + + +// mock class using StandardToken +contract StandardTokenMock is StandardToken { + + function StandardTokenMock(address initialAccount, uint256 initialBalance) { + balances[initialAccount] = initialBalance; + totalSupply = initialBalance; + } + +} diff --git a/test/mocks/UpgradedKernel.sol b/test/mocks/UpgradedKernel.sol new file mode 100644 index 000000000..ea268f5d2 --- /dev/null +++ b/test/mocks/UpgradedKernel.sol @@ -0,0 +1,11 @@ +pragma solidity 0.4.18; + +import "../../contracts/kernel/Kernel.sol"; + +contract UpgradedKernel is Kernel { + // just adds one more function to the kernel implementation. + // calling this function on the previous instance will fail + function isUpgraded() constant returns (bool) { + return true; + } +} diff --git a/test/mocks/VariablePriceSaleMock.sol b/test/mocks/VariablePriceSaleMock.sol deleted file mode 100644 index 231b4b3f5..000000000 --- a/test/mocks/VariablePriceSaleMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../contracts/apps/ownership/sales/VariablePriceSale.sol"; - -contract VariablePriceSaleMock is VariablePriceSale { - uint64 mock_block; - - function VariablePriceSaleMock() { - mock_setBlockNumber(uint64(block.number)); - } - - function mock_setBlockNumber(uint64 blockNumber) { - mock_block = blockNumber; - - if (periods.length > 0) transitionIfNeeded(); - } - - function getBlockNumber() internal returns (uint64) { - return mock_block; - } -} diff --git a/test/mocks/VotingAppMock.sol b/test/mocks/VotingAppMock.sol deleted file mode 100644 index 26bf03a48..000000000 --- a/test/mocks/VotingAppMock.sol +++ /dev/null @@ -1,19 +0,0 @@ -pragma solidity ^0.4.13; - -import "../../contracts/apps/basic-governance/VotingApp.sol"; - -contract VotingAppMock is VotingApp { - function VotingAppMock(address dao) VotingApp(dao) { - mock_block = uint64(block.number); - } - - uint64 mock_block; - - function mock_setBlockNumber(uint64 blockNumber) { - mock_block = blockNumber; - } - - function getBlockNumber() internal returns (uint64) { - return mock_block; - } -} diff --git a/test/zeppelin_StandardToken.js b/test/zeppelin_StandardToken.js new file mode 100644 index 000000000..3a47bd9ce --- /dev/null +++ b/test/zeppelin_StandardToken.js @@ -0,0 +1,134 @@ +'use strict'; + +const assertJump = function(error) { + assert.isAbove(error.message.search('revert'), -1, 'Revert should have occurred'); +} + +var StandardTokenMock = artifacts.require('./helpers/StandardTokenMock.sol'); + +contract('StandardToken', function(accounts) { + + let token; + + beforeEach(async function() { + token = await StandardTokenMock.new(accounts[0], 100); + }); + + it('should return the correct totalSupply after construction', async function() { + let totalSupply = await token.totalSupply(); + + assert.equal(totalSupply, 100); + }); + + it('should return the correct allowance amount after approval', async function() { + let token = await StandardTokenMock.new(); + await token.approve(accounts[1], 100); + let allowance = await token.allowance(accounts[0], accounts[1]); + + assert.equal(allowance, 100); + }); + + it('should return correct balances after transfer', async function() { + let token = await StandardTokenMock.new(accounts[0], 100); + await token.transfer(accounts[1], 100); + let balance0 = await token.balanceOf(accounts[0]); + assert.equal(balance0, 0); + + let balance1 = await token.balanceOf(accounts[1]); + assert.equal(balance1, 100); + }); + + it('should throw an error when trying to transfer more than balance', async function() { + let token = await StandardTokenMock.new(accounts[0], 100); + try { + await token.transfer(accounts[1], 101); + assert.fail('should have thrown before'); + } catch(error) { + assertJump(error); + } + }); + + it('should return correct balances after transfering from another account', async function() { + let token = await StandardTokenMock.new(accounts[0], 100); + await token.approve(accounts[1], 100); + await token.transferFrom(accounts[0], accounts[2], 100, {from: accounts[1]}); + + let balance0 = await token.balanceOf(accounts[0]); + assert.equal(balance0, 0); + + let balance1 = await token.balanceOf(accounts[2]); + assert.equal(balance1, 100); + + let balance2 = await token.balanceOf(accounts[1]); + assert.equal(balance2, 0); + }); + + it('should throw an error when trying to transfer more than allowed', async function() { + await token.approve(accounts[1], 99); + try { + await token.transferFrom(accounts[0], accounts[2], 100, {from: accounts[1]}); + assert.fail('should have thrown before'); + } catch (error) { + assertJump(error); + } + }); + + it('should throw an error when trying to transferFrom more than _from has', async function() { + let balance0 = await token.balanceOf(accounts[0]); + await token.approve(accounts[1], 99); + try { + await token.transferFrom(accounts[0], accounts[2], balance0+1, {from: accounts[1]}); + assert.fail('should have thrown before'); + } catch (error) { + assertJump(error); + } + }); + + describe('validating allowance updates to spender', function() { + let preApproved; + + it('should start with zero', async function() { + preApproved = await token.allowance(accounts[0], accounts[1]); + preApproved = preApproved.toNumber() + assert.equal(preApproved, 0); + }) + + it('should increase by 50 then decrease by 10', async function() { + await token.increaseApproval(accounts[1], 50); + let postIncrease = await token.allowance(accounts[0], accounts[1]); + assert.equal(preApproved + 50, postIncrease, 'postincrease should be correct'); + await token.decreaseApproval(accounts[1], 10); + let postDecrease = await token.allowance(accounts[0], accounts[1]); + assert.equal(postIncrease.toNumber() - 10, postDecrease, 'post decrease should be correct'); + }) + }); + + it('should increase by 50 then set to 0 when decreasing by more than 50', async function() { + await token.approve(accounts[1], 50); + await token.decreaseApproval(accounts[1], 60); + let postDecrease = await token.allowance(accounts[0], accounts[1]); + assert.equal(postDecrease, 0, 'postdecrease should be 0'); +}); + + it('should throw an error when trying to transfer to 0x0', async function() { + let token = await StandardTokenMock.new(accounts[0], 100); + try { + let transfer = await token.transfer(0x0, 100); + assert.fail('should have thrown before'); + } catch(error) { + assertJump(error); + } + }); + + it('should throw an error when trying to transferFrom to 0x0', async function() { + let token = await StandardTokenMock.new(accounts[0], 100); + await token.approve(accounts[1], 100); + try { + let transfer = await token.transferFrom(accounts[0], 0x0, 100, {from: accounts[1]}); + assert.fail('should have thrown before'); + } catch(error) { + assertJump(error); + } + }); + +}); diff --git a/truffle-config.js b/truffle-config.js new file mode 100644 index 000000000..fd365909c --- /dev/null +++ b/truffle-config.js @@ -0,0 +1,50 @@ +var HDWalletProvider = require('truffle-hdwallet-provider') + +const mnemonic = 'stumble story behind hurt patient ball whisper art swift tongue ice alien'; + +let ropstenProvider, kovanProvider = {} + +if (process.env.LIVE_NETWORKS) { + ropstenProvider = new HDWalletProvider(mnemonic, 'https://ropsten.infura.io/') + kovanProvider = new HDWalletProvider(mnemonic, 'https://kovan.infura.io') +} + +const mochaGasSettings = { + reporter: 'eth-gas-reporter', + reporterOptions : { + currency: 'USD', + gasPrice: 21 + } +} + +const mocha = process.env.GAS_REPORTER ? mochaGasSettings : {} + +module.exports = { + networks: { + rpc: { + network_id: 15, + host: 'localhost', + port: 8545, + gas: 50e6, + }, + ropsten: { + network_id: 3, + provider: ropstenProvider, + gas: 4.712e6, + }, + kovan: { + network_id: 42, + provider: kovanProvider, + gas: 6.9e6, + }, + coverage: { + host: "localhost", + network_id: "*", + port: 8555, + gas: 0xffffffffff, + gasPrice: 0x01 + }, + }, + build: {}, + mocha, +} diff --git a/truffle.js b/truffle.js deleted file mode 100644 index 114541f70..000000000 --- a/truffle.js +++ /dev/null @@ -1,66 +0,0 @@ -require('babel-register'); -require('babel-polyfill'); - -var HDWalletProvider = require('truffle-hdwallet-provider'); - -const mnemonic = 'stumble story behind hurt patient ball whisper art swift tongue ice alien'; - -let developmentProvider, ropstenProvider, kovanProvider = {} - -if (!process.env.SOLIDITY_COVERAGE){ - developmentProvider = require('ethereumjs-testrpc').provider({ gasLimit: 1e8, network_id: 15 }) -} - -if (process.env.LIVE_NETWORKS) { - ropstenProvider = new HDWalletProvider(mnemonic, 'https://ropsten.infura.io/') - kovanProvider = new HDWalletProvider(mnemonic, 'https://kovan.aragon.one') -} - -module.exports = { - networks: { - development: { - network_id: 15, - provider: developmentProvider, - gas: 9e6, - }, - testrpc: { - network_id: 15, - host: 'localhost', - port: 8545, - gas: 1e8, - }, - ropsten: { - network_id: 3, - provider: ropstenProvider, - gas: 4.712e6, - }, - kovan: { - network_id: 42, - provider: kovanProvider, - gas: 4.6e6, - }, - /* - kovan2: { - network_id: 42, - host: 'localhost', - port: 8545, - gas: 4e6, - from: '0x0031edb4846bab2ededd7f724e58c50762a45cb2', - },ha - */ - development46: { - network_id: 15, - host: 'localhost', - port: 8546, - gas: 1e8, - }, - coverage: { - host: "localhost", - network_id: "*", - port: 8555, - gas: 0xffffffffff, - gasPrice: 0x01 - }, - }, - build: {}, -}