diff --git a/.solhint.json b/.solhint.json new file mode 100644 index 00000000..7a6ac265 --- /dev/null +++ b/.solhint.json @@ -0,0 +1,10 @@ +{ + "extends": "default", + "rules": { + "indent": ["error", 4], + + "compiler-fixed": false, + "no-simple-event-func-name": false, + "two-lines-top-level-separator": false + } + } diff --git a/.soliumignore b/.soliumignore deleted file mode 100644 index 1e430d8c..00000000 --- a/.soliumignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -docs diff --git a/.soliumrc.json b/.soliumrc.json deleted file mode 100644 index 2d56642f..00000000 --- a/.soliumrc.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "solium:all", - "plugins": [ - "security" - ], - "rules": { - "quotes": [ - "error", - "double" - ], - "indentation": [ - "error", - 4 - ], - "arg-overflow": [ - "warning", - 5 - ], - "error-reason": [ - "off" - ] - } -} diff --git a/.travis.yml b/.travis.yml index 45808871..da9959d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,24 +3,29 @@ dist: trusty language: node_js node_js: - - "10.14.1" + - "10.14.2" before_install: - - sudo apt-get update -qq - - sudo apt-get install software-properties-common -y -qq - - sudo add-apt-repository -y ppa:ethereum/ethereum - - sudo add-apt-repository -y ppa:ethereum/ethereum-dev - - sudo apt-get update -qq - - sudo apt-get install geth -y -qq install: - npm ci - rm -rf build/ # remove any remaining artifacts from a previous build - truffle version -script: - - npm run test - - npm run lint - - npm run solium +jobs: + include: + - stage: tests + name: "Unit tests" + script: npm run test + + - stage: tests + name: "Solidity Lint" + script: npm run solhint + + - stage: tests + name: "JS Lint" + script: npm run lint + + notifications: slack: daostack:fGuaFPsiQiV5mgmzRcSzbYqw diff --git a/README.md b/README.md index b8bde720..d24be1cf 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Available commands while developing: - `npm run build` - Compile all contracts to the `build/` folder. - `npm run test` - This will run ganache-cli, compile, migrate and run all tests. - `npm run lint` - Check all JavaScript code for style & good practices. -- `npm run solium` - Check all Solidity code for style & good practices. +- `npm run solhint` - Check all Solidity code for style & good practices. - `npm run docs:` - See [this](docs#contributing-to-arc-docs) for details. ### Docker diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol index 71126546..137745f9 100644 --- a/contracts/Migrations.sol +++ b/contracts/Migrations.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; contract Migrations { diff --git a/contracts/controller/Avatar.sol b/contracts/controller/Avatar.sol index 2a753ea6..4ee0ee45 100644 --- a/contracts/controller/Avatar.sol +++ b/contracts/controller/Avatar.sol @@ -1,9 +1,9 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/Reputation.sol"; import "./DAOToken.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; @@ -11,7 +11,7 @@ import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; * @title An Avatar holds tokens, reputation and ether for a controller */ contract Avatar is Ownable { - using SafeERC20 for StandardToken; + using SafeERC20 for ERC20; string public orgName; DAOToken public nativeToken; @@ -21,15 +21,14 @@ contract Avatar is Ownable { event SendEther(uint256 _amountInWei, address indexed _to); event ExternalTokenTransfer(address indexed _externalToken, address indexed _to, uint256 _value); event ExternalTokenTransferFrom(address indexed _externalToken, address _from, address _to, uint256 _value); - event ExternalTokenIncreaseApproval(StandardToken indexed _externalToken, address _spender, uint256 _addedValue); - event ExternalTokenDecreaseApproval(StandardToken indexed _externalToken, address _spender, uint256 _subtractedValue); + event ExternalTokenApproval(ERC20 indexed _externalToken, address _spender, uint256 _value); event ReceiveEther(address indexed _sender, uint256 _value); /** * @dev the constructor takes organization name, native token and reputation system and creates an avatar for a controller */ - constructor(string _orgName, DAOToken _nativeToken, Reputation _nativeReputation) public { + constructor(string memory _orgName, DAOToken _nativeToken, Reputation _nativeReputation) public { orgName = _orgName; nativeToken = _nativeToken; nativeReputation = _nativeReputation; @@ -38,7 +37,7 @@ contract Avatar is Ownable { /** * @dev enables an avatar to receive ethers */ - function() public payable { + function() external payable { emit ReceiveEther(msg.sender, msg.value); } @@ -48,20 +47,12 @@ contract Avatar is Ownable { * @param _data ABI-encoded contract call to call `_contract` address. * @return the return bytes of the called contract's function. */ - function genericCall(address _contract,bytes _data) public onlyOwner { - emit GenericCall(_contract,_data); - // solium-disable-next-line security/no-low-level-calls - bool result = _contract.call(_data); - // solium-disable-next-line security/no-inline-assembly - assembly { - // Copy the returned data. - returndatacopy(0, 0, returndatasize) - - switch result - // call returns 0 on error. - case 0 { revert(0, returndatasize) } - default { return(0, returndatasize) } - } + function genericCall(address _contract, bytes memory _data) public onlyOwner returns(bytes memory) { + emit GenericCall(_contract, _data); + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returnValue) = _contract.call(_data); + require(success); + return returnValue; } /** @@ -70,7 +61,7 @@ contract Avatar is Ownable { * @param _to send the ethers to this address * @return bool which represents success */ - function sendEther(uint256 _amountInWei, address _to) public onlyOwner returns(bool) { + function sendEther(uint256 _amountInWei, address payable _to) public onlyOwner returns(bool) { _to.transfer(_amountInWei); emit SendEther(_amountInWei, _to); return true; @@ -83,11 +74,11 @@ contract Avatar is Ownable { * @param _value the amount of tokens to transfer * @return bool which represents success */ - function externalTokenTransfer(StandardToken _externalToken, address _to, uint256 _value) + function externalTokenTransfer(ERC20 _externalToken, address _to, uint256 _value) public onlyOwner returns(bool) { _externalToken.safeTransfer(_to, _value); - emit ExternalTokenTransfer(_externalToken, _to, _value); + emit ExternalTokenTransfer(address(_externalToken), _to, _value); return true; } @@ -100,7 +91,7 @@ contract Avatar is Ownable { * @return bool which represents success */ function externalTokenTransferFrom( - StandardToken _externalToken, + ERC20 _externalToken, address _from, address _to, uint256 _value @@ -108,39 +99,23 @@ contract Avatar is Ownable { public onlyOwner returns(bool) { _externalToken.safeTransferFrom(_from, _to, _value); - emit ExternalTokenTransferFrom(_externalToken, _from, _to, _value); - return true; - } - - /** - * @dev increase approval for the spender address to spend a specified amount of tokens - * on behalf of msg.sender. - * @param _externalToken the address of the Token Contract - * @param _spender address - * @param _addedValue the amount of ether (in Wei) which the approval is referring to. - * @return bool which represents a success - */ - function externalTokenIncreaseApproval(StandardToken _externalToken, address _spender, uint256 _addedValue) - public onlyOwner returns(bool) - { - require(_externalToken.increaseApproval(_spender, _addedValue),"increase approval must succeed"); - emit ExternalTokenIncreaseApproval(_externalToken, _spender, _addedValue); + emit ExternalTokenTransferFrom(address(_externalToken), _from, _to, _value); return true; } /** - * @dev decrease approval for the spender address to spend a specified amount of tokens + * @dev externalTokenApproval approve the spender address to spend a specified amount of tokens * on behalf of msg.sender. * @param _externalToken the address of the Token Contract * @param _spender address - * @param _subtractedValue the amount of ether (in Wei) which the approval is referring to. + * @param _value the amount of ether (in Wei) which the approval is referring to. * @return bool which represents a success */ - function externalTokenDecreaseApproval(StandardToken _externalToken, address _spender, uint256 _subtractedValue ) + function externalTokenApproval(ERC20 _externalToken, address _spender, uint256 _value) public onlyOwner returns(bool) { - require(_externalToken.decreaseApproval(_spender, _subtractedValue),"decrease approval must succeed"); - emit ExternalTokenDecreaseApproval(_externalToken,_spender, _subtractedValue); + require(_externalToken.approve(_spender, _value), "approve must succeed"); + emit ExternalTokenApproval(_externalToken, _spender, _value); return true; } diff --git a/contracts/controller/Controller.sol b/contracts/controller/Controller.sol index 93488c4a..7250b7bd 100644 --- a/contracts/controller/Controller.sol +++ b/contracts/controller/Controller.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./Avatar.sol"; import "../globalConstraints/GlobalConstraintInterface.sol"; @@ -57,57 +57,66 @@ contract Controller is ControllerInterface { event MintTokens (address indexed _sender, address indexed _beneficiary, uint256 _amount); event RegisterScheme (address indexed _sender, address indexed _scheme); event UnregisterScheme (address indexed _sender, address indexed _scheme); - event UpgradeController(address indexed _oldController,address _newController); - event AddGlobalConstraint(address indexed _globalConstraint, bytes32 _params,GlobalConstraintInterface.CallPhase _when); - event RemoveGlobalConstraint(address indexed _globalConstraint ,uint256 _index,bool _isPre); + event UpgradeController(address indexed _oldController, address _newController); - constructor( Avatar _avatar) public - { + event AddGlobalConstraint( + address indexed _globalConstraint, + bytes32 _params, + GlobalConstraintInterface.CallPhase _when); + + event RemoveGlobalConstraint(address indexed _globalConstraint, uint256 _index, bool _isPre); + + constructor( Avatar _avatar) public { avatar = _avatar; nativeToken = avatar.nativeToken(); nativeReputation = avatar.nativeReputation(); - schemes[msg.sender] = Scheme({paramsHash: bytes32(0),permissions: bytes4(0x1F)}); + schemes[msg.sender] = Scheme({paramsHash: bytes32(0), permissions: bytes4(0x0000001F)}); } // Do not allow mistaken calls: + // solhint-disable-next-line payable-fallback function() external { revert(); } // Modifiers: modifier onlyRegisteredScheme() { - require(schemes[msg.sender].permissions&bytes4(1) == bytes4(1)); + require(schemes[msg.sender].permissions&bytes4(0x00000001) == bytes4(0x00000001)); _; } modifier onlyRegisteringSchemes() { - require(schemes[msg.sender].permissions&bytes4(2) == bytes4(2)); + require(schemes[msg.sender].permissions&bytes4(0x00000002) == bytes4(0x00000002)); _; } modifier onlyGlobalConstraintsScheme() { - require(schemes[msg.sender].permissions&bytes4(4) == bytes4(4)); + require(schemes[msg.sender].permissions&bytes4(0x00000004) == bytes4(0x00000004)); _; } modifier onlyUpgradingScheme() { - require(schemes[msg.sender].permissions&bytes4(8) == bytes4(8)); + require(schemes[msg.sender].permissions&bytes4(0x00000008) == bytes4(0x00000008)); _; } modifier onlyGenericCallScheme() { - require(schemes[msg.sender].permissions&bytes4(16) == bytes4(16)); + require(schemes[msg.sender].permissions&bytes4(0x00000010) == bytes4(0x00000010)); _; } modifier onlySubjectToConstraint(bytes32 func) { uint256 idx; - for (idx = 0;idx 0) - require(totalSupply_.add(_amount) <= cap); - return super.mint(_to, _amount); + require(totalSupply().add(_amount) <= cap); + _mint(_to, _amount); + return true; } } diff --git a/contracts/controller/UController.sol b/contracts/controller/UController.sol index e2deba4e..f3f29afa 100644 --- a/contracts/controller/UController.sol +++ b/contracts/controller/UController.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./Avatar.sol"; import "../globalConstraints/GlobalConstraintInterface.sol"; @@ -62,12 +62,12 @@ contract UController is ControllerInterface { mapping(address=>bool) public tokens; - event MintReputation (address indexed _sender, address indexed _to, uint256 _amount,address indexed _avatar); - event BurnReputation (address indexed _sender, address indexed _from, uint256 _amount,address indexed _avatar); + event MintReputation (address indexed _sender, address indexed _to, uint256 _amount, address indexed _avatar); + event BurnReputation (address indexed _sender, address indexed _from, uint256 _amount, address indexed _avatar); event MintTokens (address indexed _sender, address indexed _beneficiary, uint256 _amount, address indexed _avatar); - event RegisterScheme (address indexed _sender, address indexed _scheme,address indexed _avatar); + event RegisterScheme (address indexed _sender, address indexed _scheme, address indexed _avatar); event UnregisterScheme (address indexed _sender, address indexed _scheme, address indexed _avatar); - event UpgradeController(address indexed _oldController,address _newController,address _avatar); + event UpgradeController(address indexed _oldController, address _newController, address _avatar); event AddGlobalConstraint( address indexed _globalConstraint, @@ -75,8 +75,13 @@ contract UController is ControllerInterface { GlobalConstraintInterface.CallPhase _when, address indexed _avatar ); - event RemoveGlobalConstraint(address indexed _globalConstraint ,uint256 _index,bool _isPre,address indexed _avatar); + event RemoveGlobalConstraint( + address indexed _globalConstraint, + uint256 _index, + bool _isPre, + address indexed _avatar + ); /** * @dev newOrganization set up a new organization with default daoCreator. @@ -89,54 +94,59 @@ contract UController is ControllerInterface { require(!organizations[address(_avatar)].exist); require(_avatar.owner() == address(this)); //To guaranty uniqueness for the reputation systems. - require(!reputations[_avatar.nativeReputation()]); + require(!reputations[address(_avatar.nativeReputation())]); //To guaranty uniqueness for the reputation systems. - require(!tokens[_avatar.nativeToken()]); + require(!tokens[address(_avatar.nativeToken())]); organizations[address(_avatar)].exist = true; organizations[address(_avatar)].nativeToken = _avatar.nativeToken(); organizations[address(_avatar)].nativeReputation = _avatar.nativeReputation(); - reputations[_avatar.nativeReputation()] = true; - tokens[_avatar.nativeToken()] = true; - organizations[address(_avatar)].schemes[msg.sender] = Scheme({paramsHash: bytes32(0),permissions: bytes4(0x1F)}); - emit RegisterScheme(msg.sender, msg.sender,_avatar); + reputations[address(_avatar.nativeReputation())] = true; + tokens[address(_avatar.nativeToken())] = true; + organizations[address(_avatar)].schemes[msg.sender] = + Scheme({paramsHash: bytes32(0), permissions: bytes4(0x0000001f)}); + emit RegisterScheme(msg.sender, msg.sender, address(_avatar)); } // Modifiers: modifier onlyRegisteredScheme(address avatar) { - require(organizations[avatar].schemes[msg.sender].permissions&bytes4(1) == bytes4(1)); + require(organizations[avatar].schemes[msg.sender].permissions&bytes4(0x00000001) == bytes4(0x00000001)); _; } modifier onlyRegisteringSchemes(address avatar) { - require(organizations[avatar].schemes[msg.sender].permissions&bytes4(2) == bytes4(2)); + require(organizations[avatar].schemes[msg.sender].permissions&bytes4(0x00000002) == bytes4(0x00000002)); _; } modifier onlyGlobalConstraintsScheme(address avatar) { - require(organizations[avatar].schemes[msg.sender].permissions&bytes4(4) == bytes4(4)); + require(organizations[avatar].schemes[msg.sender].permissions&bytes4(0x00000004) == bytes4(0x00000004)); _; } modifier onlyUpgradingScheme(address _avatar) { - require(organizations[_avatar].schemes[msg.sender].permissions&bytes4(8) == bytes4(8)); + require(organizations[_avatar].schemes[msg.sender].permissions&bytes4(0x00000008) == bytes4(0x00000008)); _; } modifier onlyGenericCallScheme(address _avatar) { - require(organizations[_avatar].schemes[msg.sender].permissions&bytes4(16) == bytes4(16)); + require(organizations[_avatar].schemes[msg.sender].permissions&bytes4(0x00000010) == bytes4(0x00000010)); _; } - modifier onlySubjectToConstraint(bytes32 func,address _avatar) { + modifier onlySubjectToConstraint(bytes32 func, address _avatar) { uint256 idx; GlobalConstraint[] memory globalConstraintsPre = organizations[_avatar].globalConstraintsPre; GlobalConstraint[] memory globalConstraintsPost = organizations[_avatar].globalConstraintsPost; - for (idx = 0;idxParameters) public parameters; - /** * @dev adding a new set of parameters * @param _token the token to add to the params. * @param _cap the cap to check the total supply against. * @return the calculated parameters hash */ - function setParameters(StandardToken _token, uint256 _cap) public returns(bytes32) { + function setParameters(ERC20 _token, uint256 _cap) public returns(bytes32) { bytes32 paramsHash = getParametersHash(_token, _cap); parameters[paramsHash].token = _token; parameters[paramsHash].cap = _cap; @@ -39,7 +38,7 @@ contract TokenCapGC { * @param _cap the cap to check the total supply against. * @return the calculated parameters hash */ - function getParametersHash(StandardToken _token, uint256 _cap) public pure returns(bytes32) { + function getParametersHash(ERC20 _token, uint256 _cap) public pure returns(bytes32) { return (keccak256(abi.encodePacked(_token, _cap))); } @@ -58,10 +57,10 @@ contract TokenCapGC { * @return bool which represents a success */ function post(address, bytes32 _paramsHash, bytes32) public view returns(bool) { - if ((parameters[_paramsHash].token != StandardToken(0)) && - ( parameters[_paramsHash].token.totalSupply() > parameters[_paramsHash].cap)) { + if ((parameters[_paramsHash].token != ERC20(0)) && + (parameters[_paramsHash].token.totalSupply() > parameters[_paramsHash].cap)) { return false; - } + } return true; } diff --git a/contracts/libs/RealMath.sol b/contracts/libs/RealMath.sol index efea9d51..fad31391 100644 --- a/contracts/libs/RealMath.sol +++ b/contracts/libs/RealMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; /** * RealMath: fixed-point math library, based on fractional and integer parts. @@ -22,59 +22,58 @@ library RealMath { /** * How many total bits are there? */ - int256 constant REAL_BITS = 256; + int256 constant private REAL_BITS = 256; /** * How many fractional bits are there? */ - int256 constant REAL_FBITS = 40; + int256 constant private REAL_FBITS = 40; /** * How many integer bits are there? */ - int256 constant REAL_IBITS = REAL_BITS - REAL_FBITS; + int256 constant private REAL_IBITS = REAL_BITS - REAL_FBITS; /** * What's the first non-fractional bit */ - int256 constant REAL_ONE = int256(1) << REAL_FBITS; + int256 constant private REAL_ONE = int256(1) << REAL_FBITS; /** * What's the last fractional bit? */ - int256 constant REAL_HALF = REAL_ONE >> 1; + int256 constant private REAL_HALF = REAL_ONE >> 1; /** * What's two? Two is pretty useful. */ - int256 constant REAL_TWO = REAL_ONE << 1; + int256 constant private REAL_TWO = REAL_ONE << 1; /** * And our logarithms are based on ln(2). */ - int256 constant REAL_LN_TWO = 762123384786; + int256 constant private REAL_LN_TWO = 762123384786; /** * It is also useful to have Pi around. */ - int256 constant REAL_PI = 3454217652358; + int256 constant private REAL_PI = 3454217652358; /** * And half Pi, to save on divides. - * TODO: That might not be how the compiler handles constants. + * TODO: That might not be how the compiler handles constant privates. */ - int256 constant REAL_HALF_PI = 1727108826179; + int256 constant private REAL_HALF_PI = 1727108826179; /** * And two pi, which happens to be odd in its most accurate representation. */ - int256 constant REAL_TWO_PI = 6908435304715; + int256 constant private REAL_TWO_PI = 6908435304715; /** * What's the sign bit? */ - int256 constant SIGN_MASK = int256(1) << 255; - + int256 constant private SIGN_MASK = int256(1) << 255; /** * Convert an integer to a real. Preserves sign. @@ -184,7 +183,6 @@ library RealMath { // Now we have some fancy math things (like pow and trig stuff). This isn't // in the RealMath that was deployed with the original Macroverse // deployment, so it needs to be linked into your contract statically. - /** * Raise a number to a positive integer power in O(log power) time. * See @@ -237,6 +235,7 @@ library RealMath { /** * Given a number with one bit set, finds the index of that bit. */ + // solhint-disable-next-line code-complexity function findbit(uint256 val) internal pure returns (uint8 index) { index = 0; // We and the value with alternating bit patters of various pitches to find it. @@ -313,7 +312,7 @@ library RealMath { * Note that it is potentially possible to get an un-converged value; lack * of convergence does not throw. */ - function lnLimited(int256 realArg, int maxIterations) internal pure returns (int256) { + function lnLimited(int256 realArg, int256 maxIterations) internal pure returns (int256) { if (realArg <= 0) { // Outside of acceptable domain revert(); @@ -374,7 +373,7 @@ library RealMath { * Note that it is potentially possible to get an un-converged value; lack * of convergence does not throw. */ - function expLimited(int256 realArg, int maxIterations) internal pure returns (int256) { + function expLimited(int256 realArg, int256 maxIterations) internal pure returns (int256) { // We will accumulate the result here int256 realResult = 0; @@ -441,7 +440,7 @@ library RealMath { if (realBase < 0) { // It's a negative base to a non-integer power. - // In general pow(-x^y) is undefined, unless y is an int or some + // In general pow(-x^y) is undefined, unless y is an int256 or some // weird rational-number-based relationship holds. revert(); } @@ -471,7 +470,8 @@ library RealMath { // We sum from large to small iteration so that we can have higher powers in later terms for (int216 iteration = maxIterations - 1; iteration >= 0; iteration--) { - accumulator = REAL_ONE - mul(div(mul(realArg, realArg), toReal((2 * iteration + 2) * (2 * iteration + 3))), accumulator); + accumulator = REAL_ONE - mul(div(mul(realArg, realArg), + toReal((2 * iteration + 2) * (2 * iteration + 3))), accumulator); // We can't stop early; we need to make it to the first term. } diff --git a/contracts/schemes/Auction4Reputation.sol b/contracts/schemes/Auction4Reputation.sol index f8c1df0c..bc1d779a 100644 --- a/contracts/schemes/Auction4Reputation.sol +++ b/contracts/schemes/Auction4Reputation.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import { RealMath } from "../libs/RealMath.sol"; @@ -35,7 +35,7 @@ contract Auction4Reputation is Ownable { uint256 public auctionReputationReward; uint256 public auctionPeriod; uint256 public redeemEnableTime; - StandardToken public token; + ERC20 public token; address public wallet; /** @@ -52,6 +52,8 @@ contract Auction4Reputation is Ownable { * redeem reputation can be done after this time. * @param _token the bidding token * @param _wallet the address of the wallet the token will be transfer to. + * Please note that _wallet address should be a trusted account. + * Normally this address should be set as the DAO's avatar address. */ function initialize( Avatar _avatar, @@ -60,11 +62,11 @@ contract Auction4Reputation is Ownable { uint256 _auctionPeriod, uint256 _numberOfAuctions, uint256 _redeemEnableTime, - StandardToken _token, + ERC20 _token, address _wallet) - external - onlyOwner - { + external + onlyOwner + { require(avatar == Avatar(0), "can be called only one time"); require(_avatar != Avatar(0), "avatar cannot be zero"); require(_numberOfAuctions > 0, "number of auctions cannot be zero"); @@ -90,7 +92,7 @@ contract Auction4Reputation is Ownable { * @return uint256 reputation rewarded */ function redeem(address _beneficiary, uint256 _auctionId) public returns(uint256 reputation) { - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(now > redeemEnableTime, "now > redeemEnableTime"); Auction storage auction = auctions[_auctionId]; uint256 bid = auction.bids[_beneficiary]; @@ -100,7 +102,9 @@ contract Auction4Reputation is Ownable { reputation = uint256(repRelation.div(int216(auction.totalBid).toReal()).fromReal()); // check that the reputation is sum zero reputationRewardLeft = reputationRewardLeft.sub(reputation); - require(ControllerInterface(avatar.owner()).mintReputation(reputation, _beneficiary, avatar), "mint reputation should success"); + require( + ControllerInterface(avatar.owner()) + .mintReputation(reputation, _beneficiary, address(avatar)), "mint reputation should success"); emit Redeem(_auctionId, _beneficiary, reputation); } @@ -111,12 +115,12 @@ contract Auction4Reputation is Ownable { */ function bid(uint256 _amount) public returns(uint256 auctionId) { require(_amount > 0, "bidding amount should be > 0"); - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(now <= auctionsEndTime, "bidding should be within the allowed bidding period"); - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(now >= auctionsStartTime, "bidding is enable only after bidding auctionsStartTime"); - require(token.transferFrom(msg.sender, this, _amount), "transferFrom should success"); - // solium-disable-next-line security/no-block-members + require(token.transferFrom(msg.sender, address(this), _amount), "transferFrom should success"); + // solhint-disable-next-line not-rely-on-time auctionId = (now - auctionsStartTime) / auctionPeriod; Auction storage auction = auctions[auctionId]; auction.totalBid = auction.totalBid.add(_amount); @@ -130,7 +134,7 @@ contract Auction4Reputation is Ownable { * @param _auctionId auction id * @return uint */ - function getBid(address _bidder,uint256 _auctionId) public view returns(uint) { + function getBid(address _bidder, uint256 _auctionId) public view returns(uint256) { return auctions[_auctionId].bids[_bidder]; } @@ -139,10 +143,10 @@ contract Auction4Reputation is Ownable { * can be called only after auctionsEndTime */ function transferToWallet() public { - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(now > auctionsEndTime, "now > auctionsEndTime"); - uint256 tokenBalance = token.balanceOf(this); - require(token.transfer(wallet,tokenBalance), "transfer should success"); + uint256 tokenBalance = token.balanceOf(address(this)); + require(token.transfer(wallet, tokenBalance), "transfer should success"); } } diff --git a/contracts/schemes/ExternalLocking4Reputation.sol b/contracts/schemes/ExternalLocking4Reputation.sol index a47e9b79..982681fd 100644 --- a/contracts/schemes/ExternalLocking4Reputation.sol +++ b/contracts/schemes/ExternalLocking4Reputation.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./Locking4Reputation.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; @@ -41,7 +41,7 @@ contract ExternalLocking4Reputation is Locking4Reputation, Ownable { uint256 _claimingEndTime, uint256 _redeemEnableTime, address _externalLockingContract, - string _getBalanceFuncSignature) + string calldata _getBalanceFuncSignature) external onlyOwner { @@ -69,27 +69,24 @@ contract ExternalLocking4Reputation is Locking4Reputation, Ownable { if (_beneficiary == address(0)) { beneficiary = msg.sender; } else { - require(registrar[_beneficiary],"beneficiary should be register"); + require(registrar[_beneficiary], "beneficiary should be register"); beneficiary = _beneficiary; } require(externalLockers[beneficiary] == false, "claiming twice for the same beneficiary is not allowed"); externalLockers[beneficiary] = true; - // solium-disable-next-line security/no-low-level-calls - bool result = externalLockingContract.call(abi.encodeWithSignature(getBalanceFuncSignature, beneficiary)); + (bool result, bytes memory returnValue) = + // solhint-disable-next-line avoid-call-value,avoid-low-level-calls + externalLockingContract.call(abi.encodeWithSignature(getBalanceFuncSignature, beneficiary)); + require(result, "call to external contract should success"); uint256 lockedAmount; - // solium-disable-next-line security/no-inline-assembly + // solhint-disable-next-line no-inline-assembly assembly { - returndatacopy(0, 0, returndatasize) - switch result - // call returns 0 on error. - case 0 { revert(0, returndatasize) } - default { lockedAmount := mload(0) } + lockedAmount := mload(add(returnValue, add(0x20, 0))) } - - return super._lock(lockedAmount, 1, beneficiary,1,1); + return super._lock(lockedAmount, 1, beneficiary, 1, 1); } - /** + /** * @dev register function * register for external locking claim */ diff --git a/contracts/schemes/FixedReputationAllocation.sol b/contracts/schemes/FixedReputationAllocation.sol index a8e02624..9f6c5a60 100644 --- a/contracts/schemes/FixedReputationAllocation.sol +++ b/contracts/schemes/FixedReputationAllocation.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../controller/ControllerInterface.sol"; import { RealMath } from "../libs/RealMath.sol"; @@ -51,9 +51,12 @@ contract FixedReputationAllocation is Ownable { require(isEnable, "require to be enable"); require(beneficiaries[_beneficiary], "require _beneficiary to exist in the beneficiaries map"); beneficiaries[_beneficiary] = false; - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(now > redeemEnableTime, "require now > redeemEnableTime"); - require(ControllerInterface(avatar.owner()).mintReputation(beneficiaryReward, _beneficiary, avatar), "mint reputation should success"); + require( + ControllerInterface( + avatar.owner()) + .mintReputation(beneficiaryReward, _beneficiary, address(avatar)), "mint reputation failed"); emit Redeem(_beneficiary, beneficiaryReward); @@ -79,7 +82,7 @@ contract FixedReputationAllocation is Ownable { * @dev add addBeneficiaries function * @param _beneficiaries addresses */ - function addBeneficiaries(address[] _beneficiaries) public onlyOwner { + function addBeneficiaries(address[] memory _beneficiaries) public onlyOwner { for (uint256 i = 0; i < _beneficiaries.length; i++) { addBeneficiary(_beneficiaries[i]); } diff --git a/contracts/schemes/Forwarder.sol b/contracts/schemes/Forwarder.sol index a3ee36c6..4806c37d 100644 --- a/contracts/schemes/Forwarder.sol +++ b/contracts/schemes/Forwarder.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../controller/ControllerInterface.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; @@ -17,21 +17,13 @@ contract Forwarder is Ownable { /** * @dev forwardCall forward a call to the dao controller */ + // solhint-disable-next-line no-complex-fallback,payable-fallback function () external onlyOwner { - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(expirationTime > now, "expirationTime > now"); - // solium-disable-next-line security/no-low-level-calls - bool result = avatar.owner().call(msg.data); - // solium-disable-next-line security/no-inline-assembly - assembly { - // Copy the returned data. - returndatacopy(0, 0, returndatasize) - - switch result - // call returns 0 on error. - case 0 { revert(0, returndatasize) } - default { return(0, returndatasize) } - } + // solhint-disable-next-line avoid-low-level-calls + (bool result,) = avatar.owner().call(msg.data); + require(result); } /** @@ -51,7 +43,7 @@ contract Forwarder is Ownable { * @return bool */ function unregisterSelf() public returns(bool) { - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(expirationTime <= now, "expirationTime <= now"); return ControllerInterface(avatar.owner()).unregisterSelf(address(avatar)); } diff --git a/contracts/schemes/Locking4Reputation.sol b/contracts/schemes/Locking4Reputation.sol index 4edc5ded..15834d94 100644 --- a/contracts/schemes/Locking4Reputation.sol +++ b/contracts/schemes/Locking4Reputation.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../controller/ControllerInterface.sol"; import { RealMath } from "../libs/RealMath.sol"; @@ -46,7 +46,7 @@ contract Locking4Reputation { * @return uint256 reputation rewarded */ function redeem(address _beneficiary) public returns(uint256 reputation) { - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(block.timestamp > redeemEnableTime, "now > redeemEnableTime"); require(scores[_beneficiary] > 0, "score should be > 0"); uint256 score = scores[_beneficiary]; @@ -56,7 +56,10 @@ contract Locking4Reputation { //check that the reputation is sum zero reputationRewardLeft = reputationRewardLeft.sub(reputation); - require(ControllerInterface(avatar.owner()).mintReputation(reputation, _beneficiary, avatar), "mint reputation should success"); + require( + ControllerInterface( + avatar.owner()) + .mintReputation(reputation, _beneficiary, address(avatar)), "mint reputation should success"); emit Redeem(_beneficiary, reputation); } @@ -72,7 +75,7 @@ contract Locking4Reputation { require(locker.amount > 0, "amount should be > 0"); amount = locker.amount; locker.amount = 0; - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(block.timestamp > locker.releaseTime, "check the lock period pass"); totalLockedLeft = totalLockedLeft.sub(amount); @@ -100,22 +103,22 @@ contract Locking4Reputation { require(_amount > 0, "locking amount should be > 0"); require(_period <= maxLockingPeriod, "locking period should be <= maxLockingPeriod"); require(_period > 0, "locking period should be > 0"); - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(now <= lockingEndTime, "lock should be within the allowed locking period"); - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time require(now >= lockingStartTime, "lock should start after lockingStartTime"); - lockingId = keccak256(abi.encodePacked(this, lockingsCounter)); + lockingId = keccak256(abi.encodePacked(address(this), lockingsCounter)); lockingsCounter = lockingsCounter.add(1); Locker storage locker = lockers[_locker][lockingId]; locker.amount = _amount; - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time locker.releaseTime = now + _period; totalLocked = totalLocked.add(_amount); totalLockedLeft = totalLocked; uint256 score = _period.mul(_amount).mul(_numerator).div(_denominator); - require(score>0,"score must me > 0"); + require(score > 0, "score must me > 0"); scores[_locker] = scores[_locker].add(score); totalScore = totalScore.add(score); diff --git a/contracts/schemes/LockingEth4Reputation.sol b/contracts/schemes/LockingEth4Reputation.sol index 84b75a64..c0054bff 100644 --- a/contracts/schemes/LockingEth4Reputation.sol +++ b/contracts/schemes/LockingEth4Reputation.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./Locking4Reputation.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; @@ -47,7 +47,7 @@ contract LockingEth4Reputation is Locking4Reputation, Ownable { * @param _lockingId the locking id * @return bool */ - function release(address _beneficiary, bytes32 _lockingId) public returns(bool) { + function release(address payable _beneficiary, bytes32 _lockingId) public returns(bool) { uint256 amount = super._release(_beneficiary, _lockingId); _beneficiary.transfer(amount); @@ -60,7 +60,7 @@ contract LockingEth4Reputation is Locking4Reputation, Ownable { * @return lockingId the unique Id */ function lock(uint256 _period) public payable returns(bytes32 lockingId) { - return super._lock(msg.value, _period, msg.sender,1,1); + return super._lock(msg.value, _period, msg.sender, 1, 1); } } diff --git a/contracts/schemes/LockingToken4Reputation.sol b/contracts/schemes/LockingToken4Reputation.sol index 46819fb5..d492193f 100644 --- a/contracts/schemes/LockingToken4Reputation.sol +++ b/contracts/schemes/LockingToken4Reputation.sol @@ -1,9 +1,9 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./Locking4Reputation.sol"; import "./PriceOracleInterface.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; /** @@ -14,7 +14,7 @@ contract LockingToken4Reputation is Locking4Reputation, Ownable { PriceOracleInterface public priceOracleContract; // lockingId => token - mapping(bytes32 => StandardToken) public lockedTokens; + mapping(bytes32 => ERC20) public lockedTokens; event LockToken(bytes32 indexed _lockingId, address indexed _token, uint256 _numerator, uint256 _denominator); @@ -59,7 +59,7 @@ contract LockingToken4Reputation is Locking4Reputation, Ownable { * @param _lockingId the locking id * @return bool */ - function release(address _beneficiary,bytes32 _lockingId) public returns(bool) { + function release(address _beneficiary, bytes32 _lockingId) public returns(bool) { uint256 amount = super._release(_beneficiary, _lockingId); require(lockedTokens[_lockingId].transfer(_beneficiary, amount), "transfer should success"); @@ -73,22 +73,22 @@ contract LockingToken4Reputation is Locking4Reputation, Ownable { * @param _token the token to lock - this should be whitelisted at the priceOracleContract * @return lockingId */ - function lock(uint256 _amount, uint256 _period,StandardToken _token) public returns(bytes32 lockingId) { + function lock(uint256 _amount, uint256 _period, ERC20 _token) public returns(bytes32 lockingId) { uint256 numerator; uint256 denominator; - (numerator,denominator) = priceOracleContract.getPrice(address(_token)); + (numerator, denominator) = priceOracleContract.getPrice(address(_token)); - require(numerator > 0,"numerator should be > 0"); - require(denominator > 0,"denominator should be > 0"); + require(numerator > 0, "numerator should be > 0"); + require(denominator > 0, "denominator should be > 0"); require(_token.transferFrom(msg.sender, address(this), _amount), "transferFrom should success"); - lockingId = super._lock(_amount, _period, msg.sender,numerator,denominator); + lockingId = super._lock(_amount, _period, msg.sender, numerator, denominator); lockedTokens[lockingId] = _token; - emit LockToken(lockingId,address(_token),numerator,denominator); + emit LockToken(lockingId, address(_token), numerator, denominator); } } diff --git a/contracts/schemes/PriceOracleInterface.sol b/contracts/schemes/PriceOracleInterface.sol index ad59145d..075822b4 100644 --- a/contracts/schemes/PriceOracleInterface.sol +++ b/contracts/schemes/PriceOracleInterface.sol @@ -1,7 +1,7 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; interface PriceOracleInterface { - function getPrice(address token) external view returns (uint, uint); + function getPrice(address token) external view returns (uint, uint); } diff --git a/contracts/test/ARCDebug.sol b/contracts/test/ARCDebug.sol index cf0c9259..f7cb2e89 100644 --- a/contracts/test/ARCDebug.sol +++ b/contracts/test/ARCDebug.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/GenesisProtocol.sol"; import "@daostack/infra/contracts/votingMachines/AbsoluteVote.sol"; @@ -13,7 +13,7 @@ import "@daostack/infra/contracts/test/GenesisProtocolCallbacksMock.sol"; contract ARCDebug { event LogAddress(address _msg); - event LogInt(int _msg); + event LogInt(int256 _msg); event LogString(string _msg); event LogUint(uint256 _msg); event LogBytes(bytes _msg); diff --git a/contracts/test/ARCGenesisProtocolCallbacksMock.sol b/contracts/test/ARCGenesisProtocolCallbacksMock.sol index 8022ea59..11ac81b4 100644 --- a/contracts/test/ARCGenesisProtocolCallbacksMock.sol +++ b/contracts/test/ARCGenesisProtocolCallbacksMock.sol @@ -1,14 +1,15 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../votingMachines/VotingMachineCallbacks.sol"; contract ARCVotingMachineCallbacksMock is VotingMachineCallbacks { - function propose(bytes32 _proposalId,Avatar _avatar,address _votingMachine) public { - proposalsInfo[_proposalId] = ProposalInfo( - {blockNumber:block.number, + function propose(bytes32 _proposalId, Avatar _avatar, address _votingMachine) public { + proposalsInfo[_proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:_votingMachine}); + votingMachine:_votingMachine + }); } } diff --git a/contracts/test/ActionMock.sol b/contracts/test/ActionMock.sol index e461679e..0f00dbf7 100644 --- a/contracts/test/ActionMock.sol +++ b/contracts/test/ActionMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../controller/Avatar.sol"; @@ -6,7 +6,8 @@ import "../controller/Avatar.sol"; contract ActionMock { event WithoutReturnValue(address _addr); - function test(uint256 _a,address _b,bytes32 _c) public view returns(uint) { + + function test(uint256 _a, address _b, bytes32 _c) public view returns(uint256) { require(_a == 7); require(_b == address(this)); require(_c == 0x1234000000000000000000000000000000000000000000000000000000000000); @@ -14,12 +15,12 @@ contract ActionMock { } function test2(address _addr) public view returns(bool) { - require(msg.sender == _addr,"the caller must be equal to _addr"); + require(msg.sender == _addr, "the caller must be equal to _addr"); return true; } function withoutReturnValue(address _addr) public { - require(msg.sender == _addr,"the caller must be equal to _addr"); + require(msg.sender == _addr, "the caller must be equal to _addr"); emit WithoutReturnValue(_addr); } diff --git a/contracts/test/ERC20Mock.sol b/contracts/test/ERC20Mock.sol new file mode 100644 index 00000000..680eb39f --- /dev/null +++ b/contracts/test/ERC20Mock.sol @@ -0,0 +1,12 @@ +pragma solidity ^0.5.2; + +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; + + +// mock class using ERC20 +contract ERC20Mock is ERC20 { + + constructor(address initialAccount, uint256 initialBalance) public { + _mint(initialAccount, initialBalance); + } +} diff --git a/contracts/test/ERC827TokenMock.sol b/contracts/test/ERC827TokenMock.sol index 1854e6cf..f8f07a60 100644 --- a/contracts/test/ERC827TokenMock.sol +++ b/contracts/test/ERC827TokenMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.23; +pragma solidity ^0.5.2; import "../token/ERC827/ERC827Token.sol"; @@ -8,8 +8,7 @@ import "../token/ERC827/ERC827Token.sol"; contract ERC827TokenMock is ERC827Token { constructor(address initialAccount, uint256 initialBalance) public { - balances[initialAccount] = initialBalance; - totalSupply_ = initialBalance; + _mint(initialAccount, initialBalance); } } diff --git a/contracts/test/ExternalTokenLockerMock.sol b/contracts/test/ExternalTokenLockerMock.sol index fcb02b68..c6eb729d 100644 --- a/contracts/test/ExternalTokenLockerMock.sol +++ b/contracts/test/ExternalTokenLockerMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; contract ExternalTokenLockerMock { diff --git a/contracts/test/GlobalConstraintMock.sol b/contracts/test/GlobalConstraintMock.sol index b6665d3d..196cbda1 100644 --- a/contracts/test/GlobalConstraintMock.sol +++ b/contracts/test/GlobalConstraintMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../globalConstraints/GlobalConstraintInterface.sol"; @@ -9,11 +9,12 @@ contract GlobalConstraintMock { bool pre; bool post; } + mapping (bytes32=>TestParam) public testParams; - GlobalConstraintInterface.CallPhase public currentCallPhase ; + GlobalConstraintInterface.CallPhase public currentCallPhase; - function setConstraint(bytes32 method,bool pre,bool post) public returns(bool) { + function setConstraint(bytes32 method, bool pre, bool post) public returns(bool) { testParams[method].pre = pre; testParams[method].post = post; @@ -22,9 +23,9 @@ contract GlobalConstraintMock { } else { if (!pre) { currentCallPhase = GlobalConstraintInterface.CallPhase.Pre; - } else if (!post) { - currentCallPhase = GlobalConstraintInterface.CallPhase.Post; - } + } else if (!post) { + currentCallPhase = GlobalConstraintInterface.CallPhase.Post; + } } return true; } @@ -33,7 +34,7 @@ contract GlobalConstraintMock { return testParams[method].pre; } - function post(address, bytes32 , bytes32 method) public view returns(bool) { + function post(address, bytes32, bytes32 method) public view returns(bool) { return testParams[method].post; } diff --git a/contracts/test/PriceOracleMock.sol b/contracts/test/PriceOracleMock.sol index 1db57b88..47926f9a 100644 --- a/contracts/test/PriceOracleMock.sol +++ b/contracts/test/PriceOracleMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../schemes/PriceOracleInterface.sol"; @@ -9,16 +9,16 @@ contract PriceOracleMock is PriceOracleInterface { uint256 numerator; uint256 denominator; } + // user => amount mapping (address => Price) public tokenPrices; - function getPrice(address token) public view returns (uint, uint) { Price memory price = tokenPrices[token]; return (price.numerator, price.denominator); } - function setTokenPrice(address token,uint256 numerator,uint256 denominator) public { - tokenPrices[token] = Price(numerator,denominator); + function setTokenPrice(address token, uint256 numerator, uint256 denominator) public { + tokenPrices[token] = Price(numerator, denominator); } } diff --git a/contracts/test/StandardTokenMock.sol b/contracts/test/StandardTokenMock.sol deleted file mode 100644 index e632b09a..00000000 --- a/contracts/test/StandardTokenMock.sol +++ /dev/null @@ -1,13 +0,0 @@ -pragma solidity ^0.4.25; - -import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; - - -// mock class using StandardToken -contract StandardTokenMock is StandardToken { - - constructor(address initialAccount, uint256 initialBalance) public { - balances[initialAccount] = initialBalance; - totalSupply_ = initialBalance; - } -} diff --git a/contracts/test/UniversalSchemeMock.sol b/contracts/test/UniversalSchemeMock.sol index a5cc8f40..7475d896 100644 --- a/contracts/test/UniversalSchemeMock.sol +++ b/contracts/test/UniversalSchemeMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../universalSchemes/UniversalScheme.sol"; import "../controller/ControllerInterface.sol"; @@ -6,26 +6,18 @@ import "../controller/ControllerInterface.sol"; contract UniversalSchemeMock is UniversalScheme { - constructor() public { - } - - function genericCall(address _avatar,address _contract,uint256 _a,address _b,bytes32 _c) - public returns(bytes32) + function genericCall(Avatar _avatar, address _contract, uint256 _a, address _b, bytes32 _c) + public returns(bytes memory) { - address controller = Avatar(_avatar).owner(); - return ControllerInterface(controller).genericCall(_contract,abi.encodeWithSignature("test(uint256,address,bytes32)",_a,_b,_c),_avatar); + address controller = _avatar.owner(); + return ControllerInterface(controller).genericCall( + _contract, abi.encodeWithSignature("test(uint256,address,bytes32)", _a, _b, _c), _avatar); } - function genericCallDirect(address _avatar,address _contract,uint256 _a,address _b,bytes32 _c) - public returns(bytes32) + function genericCallDirect(Avatar _avatar, address _contract, uint256 _a, address _b, bytes32 _c) + public returns(bytes memory) { - Avatar(_avatar).genericCall(_contract,abi.encodeWithSignature("test(uint256,address,bytes32)",_a,_b,_c)); - // solium-disable-next-line security/no-inline-assembly - assembly { - // Copy the returned data. - returndatacopy(0, 0, returndatasize) - return(0, returndatasize) - } + return _avatar.genericCall(_contract, abi.encodeWithSignature("test(uint256,address,bytes32)", _a, _b, _c)); } } diff --git a/contracts/token/ERC827/ERC827.sol b/contracts/token/ERC827/ERC827.sol index 773a1958..7d1f6931 100644 --- a/contracts/token/ERC827/ERC827.sol +++ b/contracts/token/ERC827/ERC827.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; @@ -12,10 +12,13 @@ import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; */ contract ERC827 is ERC20 { - function approveAndCall(address _spender,uint256 _value,bytes _data) public payable returns(bool); + function approveAndCall(address _spender, uint256 _value, bytes memory _data) public payable returns(bool); - function transferAndCall(address _to,uint256 _value,bytes _data) public payable returns(bool); + function transferAndCall(address _to, uint256 _value, bytes memory _data) public payable returns(bool); - function transferFromAndCall(address _from,address _to,uint256 _value,bytes _data) public payable returns(bool); + function transferFromAndCall(address _from, address _to, uint256 _value, bytes memory _data) + public + payable + returns(bool); } diff --git a/contracts/token/ERC827/ERC827Token.sol b/contracts/token/ERC827/ERC827Token.sol index 499d169a..5e8f5652 100644 --- a/contracts/token/ERC827/ERC827Token.sol +++ b/contracts/token/ERC827/ERC827Token.sol @@ -1,9 +1,9 @@ /* solium-disable security/no-low-level-calls */ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./ERC827.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; /** @@ -11,9 +11,9 @@ import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; * * @dev Implementation the ERC827, following the ERC20 standard with extra * methods to transfer value and data and execute calls in transfers and - * approvals. Uses OpenZeppelin StandardToken. + * approvals. Uses OpenZeppelin ERC20. */ -contract ERC827Token is ERC827, StandardToken { +contract ERC827Token is ERC20, ERC827 { /** * @dev Addition to ERC20 token methods. It allows to @@ -32,7 +32,7 @@ contract ERC827Token is ERC827, StandardToken { function approveAndCall( address _spender, uint256 _value, - bytes _data + bytes memory _data ) public payable @@ -42,8 +42,9 @@ contract ERC827Token is ERC827, StandardToken { super.approve(_spender, _value); - // solium-disable-next-line security/no-call-value - require(_spender.call.value(msg.value)(_data)); + // solhint-disable-next-line avoid-call-value + (bool success,) = _spender.call.value(msg.value)(_data); + require(success); return true; } @@ -59,7 +60,7 @@ contract ERC827Token is ERC827, StandardToken { function transferAndCall( address _to, uint256 _value, - bytes _data + bytes memory _data ) public payable @@ -69,8 +70,9 @@ contract ERC827Token is ERC827, StandardToken { super.transfer(_to, _value); - // solium-disable-next-line security/no-call-value - require(_to.call.value(msg.value)(_data)); + // solhint-disable-next-line avoid-call-value + (bool success,) = _to.call.value(msg.value)(_data); + require(success); return true; } @@ -87,7 +89,7 @@ contract ERC827Token is ERC827, StandardToken { address _from, address _to, uint256 _value, - bytes _data + bytes memory _data ) public payable returns (bool) { @@ -95,13 +97,14 @@ contract ERC827Token is ERC827, StandardToken { super.transferFrom(_from, _to, _value); - // solium-disable-next-line security/no-call-value - require(_to.call.value(msg.value)(_data)); + // solhint-disable-next-line avoid-call-value + (bool success,) = _to.call.value(msg.value)(_data); + require(success); return true; } /** - * @dev Addition to StandardToken methods. Increase the amount of tokens that + * @dev Addition to ERC20 methods. Increase the amount of tokens that * an owner allowed to a spender and execute a call with the sent data. * 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 @@ -114,7 +117,7 @@ contract ERC827Token is ERC827, StandardToken { function increaseApprovalAndCall( address _spender, uint256 _addedValue, - bytes _data + bytes memory _data ) public payable @@ -122,16 +125,17 @@ contract ERC827Token is ERC827, StandardToken { { require(_spender != address(this)); - super.increaseApproval(_spender, _addedValue); + super.increaseAllowance(_spender, _addedValue); - // solium-disable-next-line security/no-call-value - require(_spender.call.value(msg.value)(_data)); + // solhint-disable-next-line avoid-call-value + (bool success,) = _spender.call.value(msg.value)(_data); + require(success); return true; } /** - * @dev Addition to StandardToken methods. Decrease the amount of tokens that + * @dev Addition to ERC20 methods. Decrease the amount of tokens that * an owner allowed to a spender and execute a call with the sent data. * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until @@ -144,7 +148,7 @@ contract ERC827Token is ERC827, StandardToken { function decreaseApprovalAndCall( address _spender, uint256 _subtractedValue, - bytes _data + bytes memory _data ) public payable @@ -152,10 +156,11 @@ contract ERC827Token is ERC827, StandardToken { { require(_spender != address(this)); - super.decreaseApproval(_spender, _subtractedValue); + super.decreaseAllowance(_spender, _subtractedValue); - // solium-disable-next-line security/no-call-value - require(_spender.call.value(msg.value)(_data)); + // solhint-disable-next-line avoid-call-value + (bool success,) = _spender.call.value(msg.value)(_data); + require(success); return true; } diff --git a/contracts/universalSchemes/ContributionReward.sol b/contracts/universalSchemes/ContributionReward.sol index 27d1d9c0..d581419f 100644 --- a/contracts/universalSchemes/ContributionReward.sol +++ b/contracts/universalSchemes/ContributionReward.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol"; import "@daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol"; @@ -12,7 +12,7 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * him with token, reputation, ether or any combination. */ -contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalExecuteInterface { +contract ContributionReward is UniversalScheme, VotingMachineCallbacks, ProposalExecuteInterface { using SafeMath for uint; event NewContributionProposal( @@ -20,25 +20,43 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx bytes32 indexed _proposalId, address indexed _intVoteInterface, bytes32 _contributionDescription, - int _reputationChange, + int256 _reputationChange, uint[5] _rewards, - StandardToken _externalToken, + ERC20 _externalToken, address _beneficiary ); - event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId,int _param); - event RedeemReputation(address indexed _avatar, bytes32 indexed _proposalId, address indexed _beneficiary,int _amount); - event RedeemEther(address indexed _avatar, bytes32 indexed _proposalId, address indexed _beneficiary,uint256 _amount); - event RedeemNativeToken(address indexed _avatar, bytes32 indexed _proposalId, address indexed _beneficiary,uint256 _amount); - event RedeemExternalToken(address indexed _avatar, bytes32 indexed _proposalId, address indexed _beneficiary,uint256 _amount); + + event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); + + event RedeemReputation( + address indexed _avatar, + bytes32 indexed _proposalId, + address indexed _beneficiary, + int256 _amount); + + event RedeemEther(address indexed _avatar, + bytes32 indexed _proposalId, + address indexed _beneficiary, + uint256 _amount); + + event RedeemNativeToken(address indexed _avatar, + bytes32 indexed _proposalId, + address indexed _beneficiary, + uint256 _amount); + + event RedeemExternalToken(address indexed _avatar, + bytes32 indexed _proposalId, + address indexed _beneficiary, + uint256 _amount); // A struct holding the data for a contribution proposal struct ContributionProposal { uint256 nativeTokenReward; // Reward asked in the native token of the organization. - int reputationChange; // Organization reputation reward requested. + int256 reputationChange; // Organization reputation reward requested. uint256 ethReward; - StandardToken externalToken; + ERC20 externalToken; uint256 externalTokenReward; - address beneficiary; + address payable beneficiary; uint256 periodLength; uint256 numberOfPeriods; uint256 executionTime; @@ -51,10 +69,12 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx // A mapping from hashes to parameters (use to store a particular configuration on the controller) // A contribution fee can be in the organization token or the scheme token or a combination struct Parameters { - uint256 orgNativeTokenFee; // a fee (in the organization's token) that is to be paid for submitting a contribution + // a fee (in the organization's token) that is to be paid for submitting a contribution + uint256 orgNativeTokenFee; bytes32 voteApproveParams; IntVoteInterface intVote; } + // A mapping from hashes to parameters (use to store a particular configuration on the controller) mapping(bytes32=>Parameters) public parameters; @@ -63,16 +83,16 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * @param _proposalId the ID of the voting in the voting machine * @param _param a parameter of the voting result, 1 yes and 2 is no. */ - function executeProposal(bytes32 _proposalId,int _param) external onlyVotingMachine(_proposalId) returns(bool) { + function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { ProposalInfo memory proposal = proposalsInfo[_proposalId]; require(organizationsProposals[address(proposal.avatar)][_proposalId].executionTime == 0); require(organizationsProposals[address(proposal.avatar)][_proposalId].beneficiary != address(0)); // Check if vote was successful: if (_param == 1) { - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time organizationsProposals[address(proposal.avatar)][_proposalId].executionTime = now; } - emit ProposalExecuted(address(proposal.avatar), _proposalId,_param); + emit ProposalExecuted(address(proposal.avatar), _proposalId, _param); return true; } @@ -103,7 +123,8 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * @param _intVote the voting machine used to approve a contribution * @return a hash of the parameters */ - // TODO: These fees are messy. Better to have a _fee and _feeToken pair, just as in some other contract (which one?) with some sane default + // TODO: These fees are messy. Better to have a _fee and _feeToken pair, + //just as in some other contract (which one?) with some sane default function getParametersHash( uint256 _orgNativeTokenFee, bytes32 _voteApproveParams, @@ -130,44 +151,33 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx function proposeContributionReward( Avatar _avatar, bytes32 _contributionDescriptionHash, - int _reputationChange, - uint[5] _rewards, - StandardToken _externalToken, - address _beneficiary - ) public - returns(bytes32) + int256 _reputationChange, + uint[5] memory _rewards, + ERC20 _externalToken, + address payable _beneficiary + ) + public + returns(bytes32) { - require(((_rewards[3] > 0) || (_rewards[4] == 1)),"periodLength equal 0 require numberOfPeriods to be 1"); - if (_rewards[4] > 0) { - //check that numberOfPeriods * _reputationChange will not overflow - assert((int(_rewards[4]) * _reputationChange) / int(_rewards[4]) == _reputationChange); - //check that numberOfPeriods * tokenReward will not overflow - assert((_rewards[4] * _rewards[0]) / _rewards[4] == _rewards[0]); - //check that numberOfPeriods * ethReward will not overflow - assert((_rewards[4] * _rewards[1]) / _rewards[4] == _rewards[1]); - //check that numberOfPeriods * texternalTokenReward will not overflow - assert((_rewards[4] * _rewards[2]) / _rewards[4] == _rewards[2]); - } + validateProposalParams(_rewards, _reputationChange); Parameters memory controllerParams = parameters[getParametersFromController(_avatar)]; // Pay fees for submitting the contribution: if (controllerParams.orgNativeTokenFee > 0) { - _avatar.nativeToken().transferFrom(msg.sender, _avatar, controllerParams.orgNativeTokenFee); + _avatar.nativeToken().transferFrom(msg.sender, address(_avatar), controllerParams.orgNativeTokenFee); } bytes32 contributionId = controllerParams.intVote.propose( - 2, - controllerParams.voteApproveParams, - msg.sender, - _avatar + 2, + controllerParams.voteApproveParams, + msg.sender, + address(_avatar) ); - // Check beneficiary is not null: - address beneficiary = _beneficiary; + address payable beneficiary = _beneficiary; if (beneficiary == address(0)) { beneficiary = msg.sender; } - // Set the struct: ContributionProposal memory proposal = ContributionProposal({ nativeTokenReward: _rewards[0], reputationChange: _reputationChange, @@ -178,14 +188,14 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx periodLength: _rewards[3], numberOfPeriods: _rewards[4], executionTime: 0, - redeemedPeriods:[uint(0),uint(0),uint(0),uint(0)] + redeemedPeriods:[uint(0), uint(0), uint(0), uint(0)] }); - organizationsProposals[_avatar][contributionId] = proposal; + organizationsProposals[address(_avatar)][contributionId] = proposal; emit NewContributionProposal( - _avatar, + address(_avatar), contributionId, - controllerParams.intVote, + address(controllerParams.intVote), _contributionDescriptionHash, _reputationChange, _rewards, @@ -193,13 +203,11 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx beneficiary ); - proposalsInfo[contributionId] = ProposalInfo( - {blockNumber:block.number, + proposalsInfo[contributionId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:controllerParams.intVote}); - // vote for this proposal - controllerParams.intVote.ownerVote(contributionId, 1, msg.sender); // Automatically votes `yes` in the name of the opener. - + votingMachine:address(controllerParams.intVote) + }); return contributionId; } @@ -209,24 +217,28 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * @param _avatar address of the controller * @return reputation the redeemed reputation. */ - function redeemReputation(bytes32 _proposalId, address _avatar) public returns(int reputation) { + function redeemReputation(bytes32 _proposalId, Avatar _avatar) public returns(int256 reputation) { - ContributionProposal memory _proposal = organizationsProposals[_avatar][_proposalId]; - ContributionProposal storage proposal = organizationsProposals[_avatar][_proposalId]; + ContributionProposal memory _proposal = organizationsProposals[address(_avatar)][_proposalId]; + ContributionProposal storage proposal = organizationsProposals[address(_avatar)][_proposalId]; require(proposal.executionTime != 0); - uint256 periodsToPay = getPeriodsToPay(_proposalId,_avatar,0); + uint256 periodsToPay = getPeriodsToPay(_proposalId, address(_avatar), 0); //set proposal reward to zero to prevent reentrancy attack. proposal.reputationChange = 0; reputation = int(periodsToPay) * _proposal.reputationChange; - if (reputation > 0 ) { - require(ControllerInterface(Avatar(_avatar).owner()).mintReputation(uint(reputation), _proposal.beneficiary,_avatar)); - } else if (reputation < 0 ) { - require(ControllerInterface(Avatar(_avatar).owner()).burnReputation(uint(reputation*(-1)), _proposal.beneficiary,_avatar)); + if (reputation > 0) { + require( + ControllerInterface( + _avatar.owner()).mintReputation(uint(reputation), _proposal.beneficiary, address(_avatar))); + } else if (reputation < 0) { + require( + ControllerInterface( + _avatar.owner()).burnReputation(uint(reputation*(-1)), _proposal.beneficiary, address(_avatar))); } if (reputation != 0) { proposal.redeemedPeriods[0] = proposal.redeemedPeriods[0].add(periodsToPay); - emit RedeemReputation(_avatar,_proposalId,_proposal.beneficiary,reputation); + emit RedeemReputation(address(_avatar), _proposalId, _proposal.beneficiary, reputation); } //restore proposal reward. proposal.reputationChange = _proposal.reputationChange; @@ -238,20 +250,20 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * @param _avatar address of the controller * @return amount the redeemed nativeToken. */ - function redeemNativeToken(bytes32 _proposalId, address _avatar) public returns(uint256 amount) { + function redeemNativeToken(bytes32 _proposalId, Avatar _avatar) public returns(uint256 amount) { - ContributionProposal memory _proposal = organizationsProposals[_avatar][_proposalId]; - ContributionProposal storage proposal = organizationsProposals[_avatar][_proposalId]; + ContributionProposal memory _proposal = organizationsProposals[address(_avatar)][_proposalId]; + ContributionProposal storage proposal = organizationsProposals[address(_avatar)][_proposalId]; require(proposal.executionTime != 0); - uint256 periodsToPay = getPeriodsToPay(_proposalId,_avatar,1); + uint256 periodsToPay = getPeriodsToPay(_proposalId, address(_avatar), 1); //set proposal rewards to zero to prevent reentrancy attack. proposal.nativeTokenReward = 0; amount = periodsToPay.mul(_proposal.nativeTokenReward); if (amount > 0) { - require(ControllerInterface(Avatar(_avatar).owner()).mintTokens(amount, _proposal.beneficiary,_avatar)); + require(ControllerInterface(_avatar.owner()).mintTokens(amount, _proposal.beneficiary, address(_avatar))); proposal.redeemedPeriods[1] = proposal.redeemedPeriods[1].add(periodsToPay); - emit RedeemNativeToken(_avatar,_proposalId,_proposal.beneficiary,amount); + emit RedeemNativeToken(address(_avatar), _proposalId, _proposal.beneficiary, amount); } //restore proposal reward. @@ -264,20 +276,20 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * @param _avatar address of the controller * @return amount ether redeemed amount */ - function redeemEther(bytes32 _proposalId, address _avatar) public returns(uint256 amount) { + function redeemEther(bytes32 _proposalId, Avatar _avatar) public returns(uint256 amount) { - ContributionProposal memory _proposal = organizationsProposals[_avatar][_proposalId]; - ContributionProposal storage proposal = organizationsProposals[_avatar][_proposalId]; + ContributionProposal memory _proposal = organizationsProposals[address(_avatar)][_proposalId]; + ContributionProposal storage proposal = organizationsProposals[address(_avatar)][_proposalId]; require(proposal.executionTime != 0); - uint256 periodsToPay = getPeriodsToPay(_proposalId,_avatar,2); + uint256 periodsToPay = getPeriodsToPay(_proposalId, address(_avatar), 2); //set proposal rewards to zero to prevent reentrancy attack. proposal.ethReward = 0; amount = periodsToPay.mul(_proposal.ethReward); if (amount > 0) { - require(ControllerInterface(Avatar(_avatar).owner()).sendEther(amount, _proposal.beneficiary,_avatar)); + require(ControllerInterface(_avatar.owner()).sendEther(amount, _proposal.beneficiary, _avatar)); proposal.redeemedPeriods[2] = proposal.redeemedPeriods[2].add(periodsToPay); - emit RedeemEther(_avatar,_proposalId,_proposal.beneficiary,amount); + emit RedeemEther(address(_avatar), _proposalId, _proposal.beneficiary, amount); } //restore proposal reward. @@ -290,21 +302,24 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * @param _avatar address of the controller * @return amount the external token redeemed amount */ - function redeemExternalToken(bytes32 _proposalId, address _avatar) public returns(uint256 amount) { + function redeemExternalToken(bytes32 _proposalId, Avatar _avatar) public returns(uint256 amount) { - ContributionProposal memory _proposal = organizationsProposals[_avatar][_proposalId]; - ContributionProposal storage proposal = organizationsProposals[_avatar][_proposalId]; + ContributionProposal memory _proposal = organizationsProposals[address(_avatar)][_proposalId]; + ContributionProposal storage proposal = organizationsProposals[address(_avatar)][_proposalId]; require(proposal.executionTime != 0); - uint256 periodsToPay = getPeriodsToPay(_proposalId,_avatar,3); + uint256 periodsToPay = getPeriodsToPay(_proposalId, address(_avatar), 3); //set proposal rewards to zero to prevent reentrancy attack. proposal.externalTokenReward = 0; - if (proposal.externalToken != address(0) && _proposal.externalTokenReward > 0) { + if (proposal.externalToken != ERC20(0) && _proposal.externalTokenReward > 0) { amount = periodsToPay.mul(_proposal.externalTokenReward); if (amount > 0) { - require(ControllerInterface(Avatar(_avatar).owner()).externalTokenTransfer(_proposal.externalToken, _proposal.beneficiary, amount,_avatar)); + require( + ControllerInterface( + _avatar.owner()) + .externalTokenTransfer(_proposal.externalToken, _proposal.beneficiary, amount, _avatar)); proposal.redeemedPeriods[3] = proposal.redeemedPeriods[3].add(periodsToPay); - emit RedeemExternalToken(_avatar,_proposalId,_proposal.beneficiary,amount); + emit RedeemExternalToken(address(_avatar), _proposalId, _proposal.beneficiary, amount); } } //restore proposal reward. @@ -322,25 +337,25 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * whatToRedeem[3] - ExternalToken * @return result boolean array for each redeem type. */ - function redeem(bytes32 _proposalId, address _avatar,bool[4] _whatToRedeem) + function redeem(bytes32 _proposalId, Avatar _avatar, bool[4] memory _whatToRedeem) public - returns(int reputationReward,uint256 nativeTokenReward,uint256 etherReward,uint256 externalTokenReward) + returns(int256 reputationReward, uint256 nativeTokenReward, uint256 etherReward, uint256 externalTokenReward) { if (_whatToRedeem[0]) { - reputationReward = redeemReputation(_proposalId,_avatar); + reputationReward = redeemReputation(_proposalId, _avatar); } if (_whatToRedeem[1]) { - nativeTokenReward = redeemNativeToken(_proposalId,_avatar); + nativeTokenReward = redeemNativeToken(_proposalId, _avatar); } if (_whatToRedeem[2]) { - etherReward = redeemEther(_proposalId,_avatar); + etherReward = redeemEther(_proposalId, _avatar); } if (_whatToRedeem[3]) { - externalTokenReward = redeemExternalToken(_proposalId,_avatar); + externalTokenReward = redeemExternalToken(_proposalId, _avatar); } } @@ -356,14 +371,14 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * 3 - ExternalToken * @return periods left to be paid. */ - function getPeriodsToPay(bytes32 _proposalId, address _avatar,uint256 _redeemType) public view returns (uint) { - require(_redeemType <= 3,"should be in the redeemedPeriods range"); + function getPeriodsToPay(bytes32 _proposalId, address _avatar, uint256 _redeemType) public view returns (uint256) { + require(_redeemType <= 3, "should be in the redeemedPeriods range"); ContributionProposal memory _proposal = organizationsProposals[_avatar][_proposalId]; if (_proposal.executionTime == 0) return 0; uint256 periodsFromExecution; if (_proposal.periodLength > 0) { - // solium-disable-next-line security/no-block-members + // solhint-disable-next-line not-rely-on-time periodsFromExecution = (now.sub(_proposal.executionTime))/(_proposal.periodLength); } uint256 periodsToPay; @@ -386,24 +401,43 @@ contract ContributionReward is UniversalScheme,VotingMachineCallbacks,ProposalEx * 3 - ExternalToken * @return redeemed period. */ - function getRedeemedPeriods(bytes32 _proposalId, address _avatar,uint256 _redeemType) public view returns (uint) { + function getRedeemedPeriods(bytes32 _proposalId, address _avatar, uint256 _redeemType) + public + view + returns (uint256) { return organizationsProposals[_avatar][_proposalId].redeemedPeriods[_redeemType]; } - function getProposalEthReward(bytes32 _proposalId, address _avatar) public view returns (uint) { + function getProposalEthReward(bytes32 _proposalId, address _avatar) public view returns (uint256) { return organizationsProposals[_avatar][_proposalId].ethReward; } - function getProposalExternalTokenReward(bytes32 _proposalId, address _avatar) public view returns (uint) { + function getProposalExternalTokenReward(bytes32 _proposalId, address _avatar) public view returns (uint256) { return organizationsProposals[_avatar][_proposalId].externalTokenReward; } function getProposalExternalToken(bytes32 _proposalId, address _avatar) public view returns (address) { - return organizationsProposals[_avatar][_proposalId].externalToken; + return address(organizationsProposals[_avatar][_proposalId].externalToken); } - function getProposalExecutionTime(bytes32 _proposalId, address _avatar) public view returns (uint) { + function getProposalExecutionTime(bytes32 _proposalId, address _avatar) public view returns (uint256) { return organizationsProposals[_avatar][_proposalId].executionTime; } + function validateProposalParams(uint[5] memory _rewards, int256 _reputationChange) private pure { + require(((_rewards[3] > 0) || (_rewards[4] == 1)), "periodLength equal 0 require numberOfPeriods to be 1"); + if (_rewards[4] > 0) { + // This is the only case of overflow not detected by the check below + require(!(int(_rewards[4]) == -1 && _reputationChange == (-2**255))); + //check that numberOfPeriods * _reputationChange will not overflow + require((int(_rewards[4]) * _reputationChange) / int(_rewards[4]) == _reputationChange); + //check that numberOfPeriods * tokenReward will not overflow + require((_rewards[4] * _rewards[0]) / _rewards[4] == _rewards[0]); + //check that numberOfPeriods * ethReward will not overflow + require((_rewards[4] * _rewards[1]) / _rewards[4] == _rewards[1]); + //check that numberOfPeriods * texternalTokenReward will not overflow + require((_rewards[4] * _rewards[2]) / _rewards[4] == _rewards[2]); + } + } + } diff --git a/contracts/universalSchemes/DaoCreator.sol b/contracts/universalSchemes/DaoCreator.sol index 9c156fb2..07696a7e 100644 --- a/contracts/universalSchemes/DaoCreator.sol +++ b/contracts/universalSchemes/DaoCreator.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./UniversalScheme.sol"; import "../controller/UController.sol"; @@ -13,8 +13,8 @@ contract ControllerCreator { function create(Avatar _avatar) public returns(address) { Controller controller = new Controller(_avatar); - controller.registerScheme(msg.sender,bytes32(0),bytes4(0x1F),address(_avatar)); - controller.unregisterScheme(this,address(_avatar)); + controller.registerScheme(msg.sender, bytes32(0), bytes4(0x0000001f), address(_avatar)); + controller.unregisterScheme(address(this), address(_avatar)); return address(controller); } } @@ -30,7 +30,8 @@ contract DaoCreator { event NewOrg (address _avatar); event InitialSchemesSet (address _avatar); - ControllerCreator controllerCreator; + + ControllerCreator private controllerCreator; constructor(ControllerCreator _controllerCreator) public { controllerCreator = _controllerCreator; @@ -49,29 +50,30 @@ contract DaoCreator { */ function addFounders ( Avatar _avatar, - address[] _founders, - uint[] _foundersTokenAmount, - uint[] _foundersReputationAmount - ) - external - returns(bool) - { + address[] calldata _founders, + uint[] calldata _foundersTokenAmount, + uint[] calldata _foundersReputationAmount + ) + external + returns(bool) + { require(_founders.length == _foundersTokenAmount.length); require(_founders.length == _foundersReputationAmount.length); require(_founders.length > 0); require(locks[address(_avatar)] == msg.sender); // Mint token and reputation for founders: - for (uint256 i = 0 ; i < _founders.length ; i++ ) { + for (uint256 i = 0; i < _founders.length; i++) { require(_founders[i] != address(0)); if (_foundersTokenAmount[i] > 0) { - ControllerInterface(_avatar.owner()).mintTokens(_foundersTokenAmount[i],_founders[i],address(_avatar)); + ControllerInterface( + _avatar.owner()).mintTokens(_foundersTokenAmount[i], _founders[i], address(_avatar)); } if (_foundersReputationAmount[i] > 0) { - ControllerInterface(_avatar.owner()).mintReputation(_foundersReputationAmount[i],_founders[i],address(_avatar)); + ControllerInterface( + _avatar.owner()).mintReputation(_foundersReputationAmount[i], _founders[i], address(_avatar)); } } return true; - } /** @@ -90,18 +92,18 @@ contract DaoCreator { * @return The address of the avatar of the controller */ function forgeOrg ( - string _orgName, - string _tokenName, - string _tokenSymbol, - address[] _founders, - uint[] _foundersTokenAmount, - uint[] _foundersReputationAmount, + string calldata _orgName, + string calldata _tokenName, + string calldata _tokenSymbol, + address[] calldata _founders, + uint[] calldata _foundersTokenAmount, + uint[] calldata _foundersReputationAmount, UController _uController, uint256 _cap - ) - external - returns(address) - { + ) + external + returns(address) + { //The call for the private function is needed to bypass a deep stack issues return _forgeOrg( _orgName, @@ -123,9 +125,9 @@ contract DaoCreator { */ function setSchemes ( Avatar _avatar, - address[] _schemes, - bytes32[] _params, - bytes4[] _permissions + address[] calldata _schemes, + bytes32[] calldata _params, + bytes4[] calldata _permissions ) external { @@ -134,11 +136,11 @@ contract DaoCreator { require(locks[address(_avatar)] == msg.sender); // register initial schemes: ControllerInterface controller = ControllerInterface(_avatar.owner()); - for ( uint256 i = 0 ; i < _schemes.length ; i++ ) { - controller.registerScheme(_schemes[i], _params[i], _permissions[i],address(_avatar)); + for (uint256 i = 0; i < _schemes.length; i++) { + controller.registerScheme(_schemes[i], _params[i], _permissions[i], address(_avatar)); } // Unregister self: - controller.unregisterScheme(this,address(_avatar)); + controller.unregisterScheme(address(this), address(_avatar)); // Remove lock: delete locks[address(_avatar)]; emit InitialSchemesSet(address(_avatar)); @@ -160,12 +162,12 @@ contract DaoCreator { * @return The address of the avatar of the controller */ function _forgeOrg ( - string _orgName, - string _tokenName, - string _tokenSymbol, - address[] _founders, - uint[] _foundersTokenAmount, - uint[] _foundersReputationAmount, + string memory _orgName, + string memory _tokenName, + string memory _tokenSymbol, + address[] memory _founders, + uint[] memory _foundersTokenAmount, + uint[] memory _foundersReputationAmount, UController _uController, uint256 _cap ) private returns(address) @@ -174,34 +176,34 @@ contract DaoCreator { require(_founders.length == _foundersTokenAmount.length); require(_founders.length == _foundersReputationAmount.length); require(_founders.length > 0); - DAOToken nativeToken = new DAOToken(_tokenName, _tokenSymbol,_cap); + DAOToken nativeToken = new DAOToken(_tokenName, _tokenSymbol, _cap); Reputation nativeReputation = new Reputation(); Avatar avatar = new Avatar(_orgName, nativeToken, nativeReputation); ControllerInterface controller; // Mint token and reputation for founders: - for (uint256 i = 0 ; i < _founders.length ; i++ ) { + for (uint256 i = 0; i < _founders.length; i++) { require(_founders[i] != address(0)); if (_foundersTokenAmount[i] > 0) { - nativeToken.mint(_founders[i],_foundersTokenAmount[i]); + nativeToken.mint(_founders[i], _foundersTokenAmount[i]); } if (_foundersReputationAmount[i] > 0) { - nativeReputation.mint(_founders[i],_foundersReputationAmount[i]); + nativeReputation.mint(_founders[i], _foundersReputationAmount[i]); } } // Create Controller: if (UController(0) == _uController) { controller = ControllerInterface(controllerCreator.create(avatar)); - avatar.transferOwnership(controller); + avatar.transferOwnership(address(controller)); } else { controller = _uController; - avatar.transferOwnership(controller); + avatar.transferOwnership(address(controller)); _uController.newOrganization(avatar); } // Transfer ownership: - nativeToken.transferOwnership(controller); - nativeReputation.transferOwnership(controller); + nativeToken.transferOwnership(address(controller)); + nativeReputation.transferOwnership(address(controller)); locks[address(avatar)] = msg.sender; diff --git a/contracts/universalSchemes/GenericScheme.sol b/contracts/universalSchemes/GenericScheme.sol index 8320df6b..661b5a23 100644 --- a/contracts/universalSchemes/GenericScheme.sol +++ b/contracts/universalSchemes/GenericScheme.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol"; import "@daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol"; @@ -11,13 +11,20 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * @dev A scheme for proposing and executing calls to an arbitrary function * on a specific contract on behalf of the organization avatar. */ -contract GenericScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecuteInterface { +contract GenericScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecuteInterface { event NewCallProposal( address indexed _avatar, bytes32 indexed _proposalId, bytes callData ); - event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId,int _param); + + event ProposalExecuted( + address indexed _avatar, + bytes32 indexed _proposalId, + int256 _param, + bytes _genericCallReturnValue + ); + event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); // Details of a voting proposal: @@ -29,7 +36,6 @@ contract GenericScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute // A mapping from the organization (Avatar) address to the saved data of the organization: mapping(address=>mapping(bytes32=>CallProposal)) public organizationsProposals; - struct Parameters { IntVoteInterface intVote; bytes32 voteParams; @@ -44,28 +50,23 @@ contract GenericScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute * @param _proposalId the ID of the voting in the voting machine * @param _param a parameter of the voting result, 1 yes and 2 is no. */ - function executeProposal(bytes32 _proposalId,int _param) external onlyVotingMachine(_proposalId) returns(bool) { - address avatar = proposalsInfo[_proposalId].avatar; - Parameters memory params = parameters[getParametersFromController(Avatar(avatar))]; + function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { + Avatar avatar = proposalsInfo[_proposalId].avatar; + Parameters memory params = parameters[getParametersFromController(avatar)]; // Save proposal to memory and delete from storage: - CallProposal memory proposal = organizationsProposals[avatar][_proposalId]; - require(proposal.exist,"must be a live proposal"); - delete organizationsProposals[avatar][_proposalId]; - emit ProposalDeleted(avatar, _proposalId); - bool retVal = true; + CallProposal memory proposal = organizationsProposals[address(avatar)][_proposalId]; + require(proposal.exist, "must be a live proposal"); + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); + bytes memory genericCallReturnValue; // Check decision: if (_param == 1) { // Define controller and get the params: ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); - if (controller.genericCall( - params.contractToCall, - proposal.callData, - avatar) == bytes32(0)) { - retVal = false; - } - } - emit ProposalExecuted(avatar, _proposalId,_param); - return retVal; + genericCallReturnValue = controller.genericCall(params.contractToCall, proposal.callData, avatar); + } + emit ProposalExecuted(address(avatar), _proposalId, _param, genericCallReturnValue); + return true; } /** @@ -80,7 +81,7 @@ contract GenericScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute address _contractToCall ) public returns(bytes32) { - bytes32 paramsHash = getParametersHash(_voteParams, _intVote,_contractToCall); + bytes32 paramsHash = getParametersHash(_voteParams, _intVote, _contractToCall); parameters[paramsHash].voteParams = _voteParams; parameters[paramsHash].intVote = _intVote; parameters[paramsHash].contractToCall = _contractToCall; @@ -99,7 +100,7 @@ contract GenericScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute address _contractToCall ) public pure returns(bytes32) { - return keccak256(abi.encodePacked(_voteParams, _intVote,_contractToCall)); + return keccak256(abi.encodePacked(_voteParams, _intVote, _contractToCall)); } /** @@ -109,24 +110,25 @@ contract GenericScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute * @param _avatar avatar of the organization * @return an id which represents the proposal */ - function proposeCall(Avatar _avatar, bytes _callData) + function proposeCall(Avatar _avatar, bytes memory _callData) public returns(bytes32) { Parameters memory params = parameters[getParametersFromController(_avatar)]; IntVoteInterface intVote = params.intVote; - bytes32 proposalId = intVote.propose(2, params.voteParams,msg.sender,_avatar); + bytes32 proposalId = intVote.propose(2, params.voteParams, msg.sender, address(_avatar)); - organizationsProposals[_avatar][proposalId] = CallProposal({ + organizationsProposals[address(_avatar)][proposalId] = CallProposal({ callData: _callData, exist: true }); - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:params.intVote}); - emit NewCallProposal(_avatar,proposalId,_callData); + votingMachine:address(params.intVote) + }); + emit NewCallProposal(address(_avatar), proposalId, _callData); return proposalId; } @@ -136,8 +138,8 @@ contract GenericScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute * @return address the address of the contract this scheme is calling to * on behalf of the avatar */ - function getContractToCall(address _avatar) public view returns(address) { - return parameters[getParametersFromController(Avatar(_avatar))].contractToCall; + function getContractToCall(Avatar _avatar) public view returns(address) { + return parameters[getParametersFromController(_avatar)].contractToCall; } } diff --git a/contracts/universalSchemes/GlobalConstraintRegistrar.sol b/contracts/universalSchemes/GlobalConstraintRegistrar.sol index 2be16fd9..be2bfcf6 100644 --- a/contracts/universalSchemes/GlobalConstraintRegistrar.sol +++ b/contracts/universalSchemes/GlobalConstraintRegistrar.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol"; import "@daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol"; @@ -11,7 +11,7 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * @title A scheme to manage global constraint for organizations * @dev The scheme is used to register or remove new global constraints */ -contract GlobalConstraintRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecuteInterface { +contract GlobalConstraintRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExecuteInterface { event NewGlobalConstraintsProposal( address indexed _avatar, bytes32 indexed _proposalId, @@ -20,13 +20,15 @@ contract GlobalConstraintRegistrar is UniversalScheme,VotingMachineCallbacks,Pro bytes32 _params, bytes32 _voteToRemoveParams ); + event RemoveGlobalConstraintsProposal( address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, address _gc ); - event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId,int _param); + + event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); // The struct that holds the information of a global constraint proposed to be added or removed. @@ -57,31 +59,31 @@ contract GlobalConstraintRegistrar is UniversalScheme,VotingMachineCallbacks,Pro * @param _param a parameter of the voting result, 1 yes and 2 is no. * @return bool which represents a successful of the function. */ - function executeProposal(bytes32 _proposalId,int _param) external onlyVotingMachine(_proposalId) returns(bool) { - address avatar = proposalsInfo[_proposalId].avatar; + function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { + Avatar avatar = proposalsInfo[_proposalId].avatar; bool retVal = true; // Check if vote was successful: - GCProposal memory proposal = organizationsProposals[avatar][_proposalId]; + GCProposal memory proposal = organizationsProposals[address(avatar)][_proposalId]; require(proposal.gc != address(0)); - delete organizationsProposals[avatar][_proposalId]; - emit ProposalDeleted(avatar,_proposalId); + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); - if (_param == 1 ) { + if (_param == 1) { // Define controller and get the params: - ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); + ControllerInterface controller = ControllerInterface(avatar.owner()); // Adding a GC if (proposal.proposalType == 1) { - retVal = controller.addGlobalConstraint(proposal.gc, proposal.params,avatar); - voteToRemoveParams[avatar][proposal.gc] = proposal.voteToRemoveParams; - } + retVal = controller.addGlobalConstraint(proposal.gc, proposal.params, address(avatar)); + voteToRemoveParams[address(avatar)][proposal.gc] = proposal.voteToRemoveParams; + } // Removing a GC if (proposal.proposalType == 2) { - retVal = controller.removeGlobalConstraint(proposal.gc,avatar); - } + retVal = controller.removeGlobalConstraint(proposal.gc, address(avatar)); + } } - emit ProposalExecuted(avatar, _proposalId,_param); + emit ProposalExecuted(address(avatar), _proposalId, _param); return retVal; } @@ -132,7 +134,7 @@ contract GlobalConstraintRegistrar is UniversalScheme,VotingMachineCallbacks,Pro Parameters memory votingParams = parameters[getParametersFromController(_avatar)]; IntVoteInterface intVote = votingParams.intVote; - bytes32 proposalId = intVote.propose(2, votingParams.voteRegisterParams,msg.sender,_avatar); + bytes32 proposalId = intVote.propose(2, votingParams.voteRegisterParams, msg.sender, address(_avatar)); GCProposal memory proposal = GCProposal({ gc: _gc, @@ -141,20 +143,20 @@ contract GlobalConstraintRegistrar is UniversalScheme,VotingMachineCallbacks,Pro voteToRemoveParams: _voteToRemoveParams }); - organizationsProposals[_avatar][proposalId] = proposal; + organizationsProposals[address(_avatar)][proposalId] = proposal; emit NewGlobalConstraintsProposal( - _avatar, + address(_avatar), proposalId, - intVote, + address(intVote), _gc, _params, _voteToRemoveParams ); - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:intVote}); - intVote.ownerVote(proposalId, 1, msg.sender); // Automatically votes `yes` in the name of the opener. + votingMachine:address(intVote) + }); return proposalId; } @@ -165,11 +167,16 @@ contract GlobalConstraintRegistrar is UniversalScheme,VotingMachineCallbacks,Pro * @return bytes32 -the proposal id */ function proposeToRemoveGC(Avatar _avatar, address _gc) public returns(bytes32) { - Controller controller = Controller(Avatar(_avatar).owner()); - require(controller.isGlobalConstraintRegistered(_gc,address(_avatar))); + Controller controller = Controller(_avatar.owner()); + require(controller.isGlobalConstraintRegistered(_gc, address(_avatar))); Parameters memory params = parameters[getParametersFromController(_avatar)]; IntVoteInterface intVote = params.intVote; - bytes32 proposalId = intVote.propose(2, voteToRemoveParams[_avatar][_gc],msg.sender,_avatar); + bytes32 proposalId = intVote.propose( + 2, + voteToRemoveParams[address(_avatar)][_gc], + msg.sender, + address(_avatar) + ); GCProposal memory proposal = GCProposal({ gc: _gc, @@ -178,13 +185,13 @@ contract GlobalConstraintRegistrar is UniversalScheme,VotingMachineCallbacks,Pro voteToRemoveParams: 0 }); - organizationsProposals[_avatar][proposalId] = proposal; - emit RemoveGlobalConstraintsProposal(_avatar, proposalId, intVote, _gc); - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + organizationsProposals[address(_avatar)][proposalId] = proposal; + emit RemoveGlobalConstraintsProposal(address(_avatar), proposalId, address(intVote), _gc); + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:intVote}); - intVote.ownerVote(proposalId, 1, msg.sender); // Automatically votes `yes` in the name of the opener. + votingMachine:address(intVote) + }); return proposalId; } } diff --git a/contracts/universalSchemes/OrganizationRegister.sol b/contracts/universalSchemes/OrganizationRegister.sol index 798f50d3..ac758606 100644 --- a/contracts/universalSchemes/OrganizationRegister.sol +++ b/contracts/universalSchemes/OrganizationRegister.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./UniversalScheme.sol"; @@ -14,7 +14,7 @@ contract OrganizationRegister is UniversalScheme { struct Parameters { uint256 fee; - StandardToken token; + ERC20 token; address beneficiary; } @@ -26,7 +26,6 @@ contract OrganizationRegister is UniversalScheme { event OrgAdded( address indexed _registry, address indexed _org); event Promotion( address indexed _registry, address indexed _org, uint256 _amount); - /** * @dev Hash the parameters, save if needed and return the hash value * @param _token - the token to pay for register or promotion an address. @@ -34,9 +33,9 @@ contract OrganizationRegister is UniversalScheme { * @param _beneficiary - the beneficiary payment address * @return bytes32 -the parameters hash */ - function setParameters(StandardToken _token, uint256 _fee, address _beneficiary) public returns(bytes32) { + function setParameters(ERC20 _token, uint256 _fee, address _beneficiary) public returns(bytes32) { bytes32 paramsHash = getParametersHash(_token, _fee, _beneficiary); - if (parameters[paramsHash].token == address(0)) { + if (parameters[paramsHash].token == ERC20(0)) { parameters[paramsHash].token = _token; parameters[paramsHash].fee = _fee; parameters[paramsHash].beneficiary = _beneficiary; @@ -51,7 +50,7 @@ contract OrganizationRegister is UniversalScheme { * @param _beneficiary - the beneficiary payment address * @return bytes32 -the parameters hash */ - function getParametersHash(StandardToken _token, uint256 _fee, address _beneficiary) + function getParametersHash(ERC20 _token, uint256 _fee, address _beneficiary) public pure returns(bytes32) { return (keccak256(abi.encodePacked(_token, _fee, _beneficiary))); @@ -71,13 +70,14 @@ contract OrganizationRegister is UniversalScheme { { Parameters memory params = parameters[getParametersFromController(_avatar)]; // Pay promotion, if the org was not listed the minimum is the fee: - require((organizationsRegistry[_avatar][_record] > 0) || (_amount >= params.fee)); + require((organizationsRegistry[address(_avatar)][_record] > 0) || (_amount >= params.fee)); require(params.token.transferFrom(msg.sender, params.beneficiary, _amount)); - if (organizationsRegistry[_avatar][_record] == 0) { - emit OrgAdded(_avatar, _record); + if (organizationsRegistry[address(_avatar)][_record] == 0) { + emit OrgAdded(address(_avatar), _record); } - organizationsRegistry[_avatar][_record] = organizationsRegistry[_avatar][_record].add(_amount); - emit Promotion(_avatar, _record, _amount); + organizationsRegistry[address(_avatar)][_record] = + organizationsRegistry[address(_avatar)][_record].add(_amount); + emit Promotion(address(_avatar), _record, _amount); } } diff --git a/contracts/universalSchemes/SchemeRegistrar.sol b/contracts/universalSchemes/SchemeRegistrar.sol index 14a4bf25..3402b579 100644 --- a/contracts/universalSchemes/SchemeRegistrar.sol +++ b/contracts/universalSchemes/SchemeRegistrar.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol"; import "@daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol"; @@ -11,7 +11,7 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * @dev The SchemeRegistrar is used for registering and unregistering schemes at organizations */ -contract SchemeRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecuteInterface { +contract SchemeRegistrar is UniversalScheme, VotingMachineCallbacks, ProposalExecuteInterface { event NewSchemeProposal( address indexed _avatar, bytes32 indexed _proposalId, @@ -20,12 +20,14 @@ contract SchemeRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecu bytes32 _parametersHash, bytes4 _permissions ); + event RemoveSchemeProposal(address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, address _scheme ); - event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId,int _param); + + event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); // a SchemeProposal is a proposal to add or remove a scheme to/from the an organization @@ -45,6 +47,7 @@ contract SchemeRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecu bytes32 voteRemoveParams; IntVoteInterface intVote; } + mapping(bytes32=>Parameters) public parameters; /** @@ -52,27 +55,32 @@ contract SchemeRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecu * @param _proposalId the ID of the voting in the voting machine * @param _param a parameter of the voting result, 1 yes and 2 is no. */ - function executeProposal(bytes32 _proposalId,int _param) external onlyVotingMachine(_proposalId) returns(bool) { - address avatar = proposalsInfo[_proposalId].avatar; - SchemeProposal memory proposal = organizationsProposals[avatar][_proposalId]; + function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { + Avatar avatar = proposalsInfo[_proposalId].avatar; + SchemeProposal memory proposal = organizationsProposals[address(avatar)][_proposalId]; require(proposal.scheme != address(0)); - delete organizationsProposals[avatar][_proposalId]; - emit ProposalDeleted(avatar,_proposalId); + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); if (_param == 1) { // Define controller and get the params: - ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); + ControllerInterface controller = ControllerInterface(avatar.owner()); // Add a scheme: if (proposal.proposalType == 1) { - require(controller.registerScheme(proposal.scheme, proposal.parametersHash, proposal.permissions,avatar)); + require(controller.registerScheme( + proposal.scheme, + proposal.parametersHash, + proposal.permissions, + address(avatar)) + ); } // Remove a scheme: - if ( proposal.proposalType == 2 ) { - require(controller.unregisterScheme(proposal.scheme,avatar)); + if (proposal.proposalType == 2) { + require(controller.unregisterScheme(proposal.scheme, address(avatar))); } - } - emit ProposalExecuted(avatar, _proposalId,_param); + } + emit ProposalExecuted(address(avatar), _proposalId, _param); return true; } @@ -127,7 +135,7 @@ contract SchemeRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecu 2, controllerParams.voteRegisterParams, msg.sender, - _avatar + address(_avatar) ); SchemeProposal memory proposal = SchemeProposal({ @@ -137,20 +145,18 @@ contract SchemeRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecu permissions: _permissions }); emit NewSchemeProposal( - _avatar, + address(_avatar), proposalId, - controllerParams.intVote, + address(controllerParams.intVote), _scheme, _parametersHash, _permissions ); - organizationsProposals[_avatar][proposalId] = proposal; - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + organizationsProposals[address(_avatar)][proposalId] = proposal; + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:controllerParams.intVote}); - - // vote for this proposal - controllerParams.intVote.ownerVote(proposalId, 1, msg.sender); // Automatically votes `yes` in the name of the opener. + votingMachine:address(controllerParams.intVote) + }); return proposalId; } @@ -169,17 +175,16 @@ contract SchemeRegistrar is UniversalScheme,VotingMachineCallbacks,ProposalExecu Parameters memory params = parameters[paramsHash]; IntVoteInterface intVote = params.intVote; - bytes32 proposalId = intVote.propose(2, params.voteRemoveParams,msg.sender,_avatar); + bytes32 proposalId = intVote.propose(2, params.voteRemoveParams, msg.sender, address(_avatar)); - organizationsProposals[_avatar][proposalId].proposalType = 2; - organizationsProposals[_avatar][proposalId].scheme = _scheme; - emit RemoveSchemeProposal(_avatar, proposalId, intVote, _scheme); - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + organizationsProposals[address(_avatar)][proposalId].proposalType = 2; + organizationsProposals[address(_avatar)][proposalId].scheme = _scheme; + emit RemoveSchemeProposal(address(_avatar), proposalId, address(intVote), _scheme); + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:params.intVote}); - // vote for this proposal - intVote.ownerVote(proposalId, 1, msg.sender); // Automatically votes `yes` in the name of the opener. + votingMachine:address(params.intVote) + }); return proposalId; } } diff --git a/contracts/universalSchemes/SimpleICO.sol b/contracts/universalSchemes/SimpleICO.sol deleted file mode 100644 index cbb8691d..00000000 --- a/contracts/universalSchemes/SimpleICO.sol +++ /dev/null @@ -1,246 +0,0 @@ -pragma solidity ^0.4.25; - -import "./UniversalScheme.sol"; -import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "openzeppelin-solidity/contracts/lifecycle/Destructible.sol"; - - -/** - * @title An avatar contract for ICO. - * @dev Allow people to donate by simply sending ether to an address. - */ -contract MirrorContractICO is Destructible { - Avatar public organization; // The organization address (the avatar) - SimpleICO public simpleICO; // The ICO contract address - /** - * @dev Constructor, setting the organization and ICO scheme. - * @param _organization The organization's avatar. - * @param _simpleICO The ICO Scheme. - */ - constructor(Avatar _organization, SimpleICO _simpleICO) public { - organization = _organization; - simpleICO = _simpleICO; - } - - /** - * @dev Fallback function, when ether is sent it will donate to the ICO. - * The ether will be returned if the donation is failed. - */ - function () public payable { - // Not to waste gas, if no value. - require(msg.value != 0); - - // Return ether if couldn't donate. - require(simpleICO.donate.value(msg.value)(organization, msg.sender) != 0); - } -} - - -/** - * @title SimpleICO scheme. - * @dev A universal scheme to allow organizations to open a simple ICO and get donations. - */ -contract SimpleICO is UniversalScheme { - using SafeMath for uint; - - // Struct holding the data for each organization - struct Organization { - bytes32 paramsHash; // Save the parameters approved by the org to open the ICO, so reuse of ICO will not change. - address avatarContractICO; // Avatar is a contract for users that want to send ether without calling a function. - uint256 totalEthRaised; - bool isHalted; // The admin of the ICO can halt the ICO at any time, and also resume it. - } - - // A mapping from hashes to parameters (use to store a particular configuration on the controller) - struct Parameters { - uint256 cap; // Cap in Eth - uint256 price; // Price represents Tokens per 1 Eth - uint256 startBlock; - uint256 endBlock; - address beneficiary; // all funds received will be transferred to this address. - address admin; // The admin can halt or resume ICO. - } - - // A mapping from the organization (Avatar) address to the saved data of the organization: - mapping(address=>Organization) public organizationsICOInfo; - - mapping(bytes32=>Parameters) public parameters; - - event DonationReceived(address indexed organization, address indexed _beneficiary, uint256 _incomingEther, uint256 indexed _tokensAmount); - - /** - * @dev Hash the parameters, save them if necessary, and return the hash value - * @param _cap the ico cap - * @param _price represents Tokens per 1 Eth - * @param _startBlock ico start block - * @param _endBlock ico end - * @param _beneficiary the ico ether beneficiary - * @param _admin the address of the ico admin which can hold and resume the ICO. - * @return bytes32 -the params hash - */ - function setParameters( - uint256 _cap, - uint256 _price, - uint256 _startBlock, - uint256 _endBlock, - address _beneficiary, - address _admin - ) - public - returns(bytes32) - { - require(_cap != 0); - bytes32 paramsHash = getParametersHash( - _cap, - _price, - _startBlock, - _endBlock, - _beneficiary, - _admin - ); - if (parameters[paramsHash].cap == 0) { - parameters[paramsHash] = Parameters({ - cap: _cap, - price: _price, - startBlock: _startBlock, - endBlock:_endBlock, - beneficiary:_beneficiary, - admin:_admin - }); - } - return paramsHash; - } - - /** - * @dev Hash the parameters and return the hash value - * @param _cap the ico cap - * @param _price represents Tokens per 1 Eth - * @param _startBlock ico start block - * @param _endBlock ico end - * @param _beneficiary the ico ether beneficiary - * @param _admin the address of the ico admin which can hold and resume the ICO. - * @return bytes32 -the params hash - */ - function getParametersHash( - uint256 _cap, - uint256 _price, - uint256 _startBlock, - uint256 _endBlock, - address _beneficiary, - address _admin - ) - public - pure - returns(bytes32) - { - return (keccak256( - abi.encodePacked( - _cap, - _price, - _startBlock, - _endBlock, - _beneficiary, - _admin - ))); - } - - /** - * @dev start an ICO - * @param _avatar The Avatar's of the organization - */ - function start(address _avatar) public { - require(!isActive(_avatar)); - Organization memory org; - org.paramsHash = getParametersFromController(Avatar(_avatar)); - require(parameters[org.paramsHash].cap != 0); - org.avatarContractICO = new MirrorContractICO(Avatar(_avatar), this); - organizationsICOInfo[_avatar] = org; - } - - /** - * @dev Allowing admin to halt an ICO. - * @param _avatar The Avatar's of the organization - */ - function haltICO(address _avatar) public { - require(msg.sender == parameters[organizationsICOInfo[_avatar].paramsHash].admin); - organizationsICOInfo[_avatar].isHalted = true; - } - - /** - * @dev Allowing admin to reopen an ICO. - * @param _avatar The Avatar's of the organization - */ - function resumeICO(address _avatar) public { - require(msg.sender == parameters[organizationsICOInfo[_avatar].paramsHash].admin); - organizationsICOInfo[_avatar].isHalted = false; - } - - /** - * @dev Check is an ICO is active (halted is still considered active). Active ICO: - * 1. The organization is registered. - * 2. The ICO didn't reach it's cap yet. - * 3. The current block isn't bigger than the "endBlock" & Smaller then the "startBlock" - * @param _avatar The Avatar's of the organization - * @return bool which represents a successful of the function - */ - function isActive(address _avatar) public view returns(bool) { - Organization memory org = organizationsICOInfo[_avatar]; - Parameters memory params = parameters[org.paramsHash]; - - if (org.totalEthRaised >= params.cap) { - return false; - } - if (block.number >= params.endBlock) { - return false; - } - if (block.number <= params.startBlock) { - return false; - } - return true; - } - - /** - * @dev Donating ethers to get tokens. - * If the donation is higher than the remaining ethers in the "cap", - * The donator will get the change in ethers. - * @param _avatar The Avatar's of the organization. - * @param _beneficiary The donator's address - which will receive the ICO's tokens. - * @return uint256 number of tokens minted for the donation. - */ - function donate(Avatar _avatar, address _beneficiary) public payable returns(uint) { - Organization memory org = organizationsICOInfo[_avatar]; - Parameters memory params = parameters[org.paramsHash]; - - // Check ICO is active: - require(isActive(_avatar)); - - // Check ICO is not halted: - require(!org.isHalted); - - - uint256 incomingEther; - uint256 change; - - // Compute how much tokens to buy: - if ( msg.value > (params.cap).sub(org.totalEthRaised) ) { - incomingEther = (params.cap).sub(org.totalEthRaised); - change = (msg.value).sub(incomingEther); - } else { - incomingEther = msg.value; - } - - uint256 tokens = incomingEther.mul(params.price); - // Update total raised, call event and return amount of tokens bought: - organizationsICOInfo[_avatar].totalEthRaised += incomingEther; - // Send ether to the defined address, mint, and send change to beneficiary: - params.beneficiary.transfer(incomingEther); - - require(ControllerInterface(_avatar.owner()).mintTokens(tokens, _beneficiary,address(_avatar))); - if (change != 0) { - _beneficiary.transfer(change); - } - emit DonationReceived(_avatar, _beneficiary, incomingEther, tokens); - return tokens; - } -} diff --git a/contracts/universalSchemes/UniversalScheme.sol b/contracts/universalSchemes/UniversalScheme.sol index 65bcfd1f..5db488ad 100644 --- a/contracts/universalSchemes/UniversalScheme.sol +++ b/contracts/universalSchemes/UniversalScheme.sol @@ -1,10 +1,10 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "./UniversalSchemeInterface.sol"; import "../controller/ControllerInterface.sol"; import "../controller/Avatar.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; contract UniversalScheme is Ownable, UniversalSchemeInterface { @@ -23,7 +23,8 @@ contract UniversalScheme is Ownable, UniversalSchemeInterface { * @dev get the parameters for the current scheme from the controller */ function getParametersFromController(Avatar _avatar) internal view returns(bytes32) { - require(ControllerInterface(_avatar.owner()).isSchemeRegistered(this,address(_avatar)),"scheme is not registered"); - return ControllerInterface(_avatar.owner()).getSchemeParameters(this,address(_avatar)); + require(ControllerInterface(_avatar.owner()).isSchemeRegistered(address(this), address(_avatar)), + "scheme is not registered"); + return ControllerInterface(_avatar.owner()).getSchemeParameters(address(this), address(_avatar)); } } diff --git a/contracts/universalSchemes/UniversalSchemeInterface.sol b/contracts/universalSchemes/UniversalSchemeInterface.sol index 82abb2f9..3b218fc0 100644 --- a/contracts/universalSchemes/UniversalSchemeInterface.sol +++ b/contracts/universalSchemes/UniversalSchemeInterface.sol @@ -1,9 +1,9 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../controller/Controller.sol"; import "../controller/Avatar.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; contract UniversalSchemeInterface { diff --git a/contracts/universalSchemes/UpgradeScheme.sol b/contracts/universalSchemes/UpgradeScheme.sol index dbd11db3..2ec40a25 100644 --- a/contracts/universalSchemes/UpgradeScheme.sol +++ b/contracts/universalSchemes/UpgradeScheme.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol"; import "@daostack/infra/contracts/votingMachines/ProposalExecuteInterface.sol"; @@ -11,13 +11,15 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * @dev The scheme is used to upgrade the controller of an organization to a new controller. */ -contract UpgradeScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecuteInterface { +contract UpgradeScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecuteInterface { + event NewUpgradeProposal( address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, address _newController ); + event ChangeUpgradeSchemeProposal( address indexed _avatar, bytes32 indexed _proposalId, @@ -25,7 +27,8 @@ contract UpgradeScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute address _newUpgradeScheme, bytes32 _params ); - event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId,int _param); + + event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); // Details of an upgrade proposal: @@ -51,33 +54,34 @@ contract UpgradeScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute * @param _proposalId the ID of the voting in the voting machine * @param _param a parameter of the voting result, 1 yes and 2 is no. */ - function executeProposal(bytes32 _proposalId,int _param) external onlyVotingMachine(_proposalId) returns(bool) { - address avatar = proposalsInfo[_proposalId].avatar; - UpgradeProposal memory proposal = organizationsProposals[avatar][_proposalId]; + function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { + Avatar avatar = proposalsInfo[_proposalId].avatar; + UpgradeProposal memory proposal = organizationsProposals[address(avatar)][_proposalId]; require(proposal.proposalType != 0); - delete organizationsProposals[avatar][_proposalId]; - emit ProposalDeleted(avatar,_proposalId); + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); // Check if vote was successful: if (_param == 1) { // Define controller and get the params: - ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); + ControllerInterface controller = ControllerInterface(avatar.owner()); // Upgrading controller: if (proposal.proposalType == 1) { - require(controller.upgradeController(proposal.upgradeContract,avatar)); + require(controller.upgradeController(proposal.upgradeContract, avatar)); } // Changing upgrade scheme: if (proposal.proposalType == 2) { - bytes4 permissions = controller.getSchemePermissions(this,avatar); - - require(controller.registerScheme(proposal.upgradeContract, proposal.params, permissions,avatar)); - if (proposal.upgradeContract != address(this) ) { - require(controller.unregisterSelf(avatar)); - } - } + bytes4 permissions = controller.getSchemePermissions(address(this), address(avatar)); + require( + controller.registerScheme(proposal.upgradeContract, proposal.params, permissions, address(avatar)) + ); + if (proposal.upgradeContract != address(this)) { + require(controller.unregisterSelf(address(avatar))); + } + } } - emit ProposalExecuted(avatar, _proposalId,_param); + emit ProposalExecuted(address(avatar), _proposalId, _param); return true; } @@ -117,19 +121,19 @@ contract UpgradeScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute returns(bytes32) { Parameters memory params = parameters[getParametersFromController(_avatar)]; - bytes32 proposalId = params.intVote.propose(2, params.voteParams,msg.sender,_avatar); + bytes32 proposalId = params.intVote.propose(2, params.voteParams, msg.sender, address(_avatar)); UpgradeProposal memory proposal = UpgradeProposal({ proposalType: 1, upgradeContract: _newController, params: bytes32(0) }); - organizationsProposals[_avatar][proposalId] = proposal; - emit NewUpgradeProposal(_avatar, proposalId, params.intVote, _newController); - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + organizationsProposals[address(_avatar)][proposalId] = proposal; + emit NewUpgradeProposal(address(_avatar), proposalId, address(params.intVote), _newController); + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:params.intVote}); - params.intVote.ownerVote(proposalId, 1, msg.sender); // Automatically votes `yes` in the name of the proposal submitter.*/ + votingMachine:address(params.intVote) + }); return proposalId; } @@ -150,28 +154,28 @@ contract UpgradeScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute { Parameters memory params = parameters[getParametersFromController(_avatar)]; IntVoteInterface intVote = params.intVote; - bytes32 proposalId = intVote.propose(2, params.voteParams,msg.sender,_avatar); - require(organizationsProposals[_avatar][proposalId].proposalType == 0); + bytes32 proposalId = intVote.propose(2, params.voteParams, msg.sender, address(_avatar)); + require(organizationsProposals[address(_avatar)][proposalId].proposalType == 0); UpgradeProposal memory proposal = UpgradeProposal({ proposalType: 2, upgradeContract: _scheme, params: _params }); - organizationsProposals[_avatar][proposalId] = proposal; + organizationsProposals[address(_avatar)][proposalId] = proposal; emit ChangeUpgradeSchemeProposal( - _avatar, + address(_avatar), proposalId, - params.intVote, + address(params.intVote), _scheme, _params ); - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:intVote}); - intVote.ownerVote(proposalId, 1, msg.sender); // Automatically votes `yes` in the name of the opener. + votingMachine:address(intVote) + }); return proposalId; } } diff --git a/contracts/universalSchemes/VestingScheme.sol b/contracts/universalSchemes/VestingScheme.sol index 09c6d414..ef6da524 100644 --- a/contracts/universalSchemes/VestingScheme.sol +++ b/contracts/universalSchemes/VestingScheme.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol"; import "@daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol"; @@ -11,10 +11,10 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * @dev Can be used without organization just as a vesting component. */ -contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecuteInterface { +contract VestingScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecuteInterface { using SafeMath for uint; - event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId,int _param); + event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param); event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); event AgreementProposal(address indexed _avatar, bytes32 indexed _proposalId); event NewVestedAgreement(uint256 indexed _agreementId); @@ -24,10 +24,9 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute event AgreementCancel(uint256 indexed _agreementId); event Collect(uint256 indexed _agreementId); - // The data for each vested agreement: struct Agreement { - StandardToken token; + ERC20 token; address beneficiary; address returnOnCancelAddress; uint256 startingBlock; @@ -42,7 +41,6 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute mapping(address=>bool) signaturesReceived; } - struct Parameters { bytes32 voteParams; IntVoteInterface intVote; @@ -77,25 +75,25 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute * @param _param a parameter of the voting result, 1 yes and 2 is no. * @return bool which represents a successful of the function */ - function executeProposal(bytes32 _proposalId,int _param) external onlyVotingMachine(_proposalId) returns(bool) { - address avatar = proposalsInfo[_proposalId].avatar; - Agreement memory proposedAgreement = organizationsProposals[avatar][_proposalId]; + function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { + Avatar avatar = proposalsInfo[_proposalId].avatar; + Agreement memory proposedAgreement = organizationsProposals[address(avatar)][_proposalId]; require(proposedAgreement.periodLength > 0); - delete organizationsProposals[avatar][_proposalId]; - emit ProposalDeleted(avatar,_proposalId); + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); // Check if vote was successful: if (_param == 1) { // Define controller and mint tokens, check minting actually took place: - ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); + ControllerInterface controller = ControllerInterface(avatar.owner()); uint256 tokensToMint = proposedAgreement.amountPerPeriod.mul(proposedAgreement.numOfAgreedPeriods); - require(controller.mintTokens(tokensToMint, this,avatar)); + require(controller.mintTokens(tokensToMint, address(this), address(avatar))); agreements[agreementsCounter] = proposedAgreement; agreementsCounter++; // Log the new agreement: emit ProposedVestedAgreement(agreementsCounter-1, _proposalId); } - emit ProposalExecuted(avatar,_proposalId,_param); + emit ProposalExecuted(address(avatar), _proposalId, _param); return true; } @@ -122,7 +120,7 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute uint256 _numOfAgreedPeriods, uint256 _cliffInPeriods, uint256 _signaturesReqToCancel, - address[] _signersArray, + address[] calldata _signersArray, Avatar _avatar ) external @@ -130,34 +128,31 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute { // Open voting: Parameters memory params = parameters[getParametersFromController(_avatar)]; - bytes32 proposalId = params.intVote.propose(2, params.voteParams,msg.sender,_avatar); + bytes32 proposalId = params.intVote.propose(2, params.voteParams, msg.sender, address(_avatar)); require(_signaturesReqToCancel <= _signersArray.length); require(_periodLength > 0); require(_numOfAgreedPeriods > 0, "Number of Agreed Periods must be greater than 0"); // Write the signers mapping: - for (uint256 cnt = 0; cnt<_signersArray.length; cnt++) { - organizationsProposals[_avatar][proposalId].signers[_signersArray[cnt]] = true; + for (uint256 cnt = 0; cnt < _signersArray.length; cnt++) { + organizationsProposals[address(_avatar)][proposalId].signers[_signersArray[cnt]] = true; } // Write parameters: - organizationsProposals[_avatar][proposalId].token = Avatar(_avatar).nativeToken(); - organizationsProposals[_avatar][proposalId].beneficiary = _beneficiary; - organizationsProposals[_avatar][proposalId].returnOnCancelAddress = _returnOnCancelAddress; - organizationsProposals[_avatar][proposalId].startingBlock = _startingBlock; - organizationsProposals[_avatar][proposalId].amountPerPeriod = _amountPerPeriod; - organizationsProposals[_avatar][proposalId].periodLength = _periodLength; - organizationsProposals[_avatar][proposalId].numOfAgreedPeriods = _numOfAgreedPeriods; - organizationsProposals[_avatar][proposalId].cliffInPeriods = _cliffInPeriods; - organizationsProposals[_avatar][proposalId].signaturesReqToCancel = _signaturesReqToCancel; - - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + organizationsProposals[address(_avatar)][proposalId].token = Avatar(_avatar).nativeToken(); + organizationsProposals[address(_avatar)][proposalId].beneficiary = _beneficiary; + organizationsProposals[address(_avatar)][proposalId].returnOnCancelAddress = _returnOnCancelAddress; + organizationsProposals[address(_avatar)][proposalId].startingBlock = _startingBlock; + organizationsProposals[address(_avatar)][proposalId].amountPerPeriod = _amountPerPeriod; + organizationsProposals[address(_avatar)][proposalId].periodLength = _periodLength; + organizationsProposals[address(_avatar)][proposalId].numOfAgreedPeriods = _numOfAgreedPeriods; + organizationsProposals[address(_avatar)][proposalId].cliffInPeriods = _cliffInPeriods; + organizationsProposals[address(_avatar)][proposalId].signaturesReqToCancel = _signaturesReqToCancel; + + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:params.intVote}); - - params.intVote.ownerVote(proposalId, 1, msg.sender); // Automatically votes `yes` in the name of the opener. - - // Log: - emit AgreementProposal(_avatar, proposalId); + votingMachine:address(params.intVote) + }); + emit AgreementProposal(address(_avatar), proposalId); return proposalId; } @@ -176,7 +171,7 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute * @return uint256 the agreement index. */ function createVestedAgreement( - StandardToken _token, + ERC20 _token, address _beneficiary, address _returnOnCancelAddress, uint256 _startingBlock, @@ -185,17 +180,17 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute uint256 _numOfAgreedPeriods, uint256 _cliffInPeriods, uint256 _signaturesReqToCancel, - address[] _signersArray + address[] calldata _signersArray ) external - returns(uint) + returns(uint256) { require(_signaturesReqToCancel <= _signersArray.length); require(_periodLength > 0); require(_numOfAgreedPeriods > 0, "Number of Agreed Periods must be greater than 0"); // Collect funds: uint256 totalAmount = _amountPerPeriod.mul(_numOfAgreedPeriods); - require(_token.transferFrom(msg.sender, this, totalAmount)); + require(_token.transferFrom(msg.sender, address(this), totalAmount)); // Write parameters: agreements[agreementsCounter].token = _token; @@ -209,7 +204,7 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute agreements[agreementsCounter].signaturesReqToCancel = _signaturesReqToCancel; // Write the signers mapping: - for (uint256 cnt = 0; cnt<_signersArray.length; cnt++) { + for (uint256 cnt = 0; cnt < _signersArray.length; cnt++) { agreements[agreementsCounter].signers[_signersArray[cnt]] = true; } @@ -260,13 +255,13 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute Agreement storage agreement = agreements[_agreementId]; // Check attempt to double sign: - require(! agreement.signaturesReceived[msg.sender]); + require(!agreement.signaturesReceived[msg.sender]); // Sign: agreement.signaturesReceived[msg.sender] = true; agreement.signaturesReceivedCounter++; - emit SignToCancelAgreement(_agreementId,msg.sender); + emit SignToCancelAgreement(_agreementId, msg.sender); // Check if threshold crossed: if (agreement.signaturesReceivedCounter == agreement.signaturesReqToCancel) { @@ -288,7 +283,7 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute agreement.signaturesReceived[msg.sender] = false; agreement.signaturesReceivedCounter--; - emit RevokeSignToCancelAgreement(_agreementId,msg.sender); + emit RevokeSignToCancelAgreement(_agreementId, msg.sender); } /** @@ -324,7 +319,7 @@ contract VestingScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecute */ function cancelAgreement(uint256 _agreementId) internal { Agreement memory agreement = agreements[_agreementId]; - delete agreements[_agreementId]; + delete agreements[_agreementId]; uint256 periodsLeft = agreement.numOfAgreedPeriods.sub(agreement.collectedPeriods); uint256 tokensLeft = periodsLeft.mul(agreement.amountPerPeriod); require(agreement.token.transfer(agreement.returnOnCancelAddress, tokensLeft)); diff --git a/contracts/universalSchemes/VoteInOrganizationScheme.sol b/contracts/universalSchemes/VoteInOrganizationScheme.sol index e2c44e63..e939904e 100644 --- a/contracts/universalSchemes/VoteInOrganizationScheme.sol +++ b/contracts/universalSchemes/VoteInOrganizationScheme.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "@daostack/infra/contracts/votingMachines/IntVoteInterface.sol"; import "@daostack/infra/contracts/votingMachines/VotingMachineCallbacksInterface.sol"; @@ -10,31 +10,30 @@ import "../votingMachines/VotingMachineCallbacks.sol"; * @title VoteInOrganizationScheme. * @dev A scheme to allow an organization to vote in a proposal. */ -contract VoteInOrganizationScheme is UniversalScheme,VotingMachineCallbacks,ProposalExecuteInterface { +contract VoteInOrganizationScheme is UniversalScheme, VotingMachineCallbacks, ProposalExecuteInterface { event NewVoteProposal( address indexed _avatar, bytes32 indexed _proposalId, address indexed _intVoteInterface, IntVoteInterface _originalIntVote, bytes32 _originalProposalId, - uint256 _originalNumOfChoices + uint256 _vote ); - event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId,int _param); + + event ProposalExecuted(address indexed _avatar, bytes32 indexed _proposalId, int256 _param, bytes _callReturnValue); event ProposalDeleted(address indexed _avatar, bytes32 indexed _proposalId); - event VoteOnBehalf(bytes32[] _params); // Details of a voting proposal: struct VoteProposal { IntVoteInterface originalIntVote; bytes32 originalProposalId; - uint256 originalNumOfChoices; + uint256 vote; bool exist; } // A mapping from the organization (Avatar) address to the saved data of the organization: mapping(address=>mapping(bytes32=>VoteProposal)) public organizationsProposals; - struct Parameters { IntVoteInterface intVote; bytes32 voteParams; @@ -49,35 +48,30 @@ contract VoteInOrganizationScheme is UniversalScheme,VotingMachineCallbacks,Prop * @param _param a parameter of the voting result, 1 yes and 2 is no. * @return bool which represents a successful of the function */ - function executeProposal(bytes32 _proposalId,int _param) external onlyVotingMachine(_proposalId) returns(bool) { - address avatar = proposalsInfo[_proposalId].avatar; + function executeProposal(bytes32 _proposalId, int256 _param) external onlyVotingMachine(_proposalId) returns(bool) { + Avatar avatar = proposalsInfo[_proposalId].avatar; // Save proposal to memory and delete from storage: - VoteProposal memory proposal = organizationsProposals[avatar][_proposalId]; + VoteProposal memory proposal = organizationsProposals[address(avatar)][_proposalId]; require(proposal.exist); - delete organizationsProposals[avatar][_proposalId]; - emit ProposalDeleted(avatar, _proposalId); - bool retVal = true; + delete organizationsProposals[address(avatar)][_proposalId]; + emit ProposalDeleted(address(avatar), _proposalId); + bytes memory callReturnValue; // If no decision do nothing: - if (_param != 0) { - // Define controller and get the params: - int param = _param; - if (param > int(proposal.originalNumOfChoices)) { - param = 0; - } + if (_param == 1) { - ControllerInterface controller = ControllerInterface(Avatar(avatar).owner()); - if (controller.genericCall( - address(proposal.originalIntVote), - abi.encodeWithSignature("vote(bytes32,uint256,address)", - proposal.originalProposalId, - uint(param), - address(this)), - avatar) == bytes32(0)) { - retVal = false; - } - } - emit ProposalExecuted(avatar, _proposalId,_param); - return retVal; + ControllerInterface controller = ControllerInterface(avatar.owner()); + callReturnValue = controller.genericCall( + address(proposal.originalIntVote), + abi.encodeWithSignature("vote(bytes32,uint256,uint256,address)", + proposal.originalProposalId, + proposal.vote, + 0, + address(this)), + avatar + ); + } + emit ProposalExecuted(address(avatar), _proposalId, _param, callReturnValue); + return true; } /** @@ -117,43 +111,41 @@ contract VoteInOrganizationScheme is UniversalScheme,VotingMachineCallbacks,Prop * @param _avatar avatar of the organization * @param _originalIntVote the other organization voting machine * @param _originalProposalId the other organization proposal id + * @param _vote - which value to vote in the destination organization * @return an id which represents the proposal */ - function proposeVote(Avatar _avatar, IntVoteInterface _originalIntVote, bytes32 _originalProposalId) + function proposeVote(Avatar _avatar, IntVoteInterface _originalIntVote, bytes32 _originalProposalId, uint256 _vote) public returns(bytes32) { - uint256 originalNumOfChoices = _originalIntVote.getNumberOfChoices(_originalProposalId); Parameters memory params = parameters[getParametersFromController(_avatar)]; IntVoteInterface intVote = params.intVote; + (uint256 minVote, uint256 maxVote) = _originalIntVote.getAllowedRangeOfChoices(); + require(_vote <= maxVote && _vote >= minVote, "vote should be in the allowed range"); + require(_vote <= _originalIntVote.getNumberOfChoices(_originalProposalId), + "vote should be <= original proposal number of choices"); - uint256 proposalNumberOfChoices = originalNumOfChoices; - if (intVote.isAbstainAllow()) { - //The voting choices can be in the range of 0 - originalNumOfChoices+1 . - //vote 0 - for not to vote in the other organization. - //vote originalNumOfChoices+1 to vote 0 in the other organization. - proposalNumberOfChoices += 1; - } - bytes32 proposalId = intVote.propose(proposalNumberOfChoices, params.voteParams,msg.sender,_avatar); + bytes32 proposalId = intVote.propose(2, params.voteParams, msg.sender, address(_avatar)); - organizationsProposals[_avatar][proposalId] = VoteProposal({ + organizationsProposals[address(_avatar)][proposalId] = VoteProposal({ originalIntVote: _originalIntVote, originalProposalId: _originalProposalId, - originalNumOfChoices: originalNumOfChoices, + vote:_vote, exist: true }); emit NewVoteProposal( - _avatar, + address(_avatar), proposalId, - params.intVote, + address(params.intVote), _originalIntVote, _originalProposalId, - originalNumOfChoices + _vote ); - proposalsInfo[proposalId] = ProposalInfo( - {blockNumber:block.number, + proposalsInfo[proposalId] = ProposalInfo({ + blockNumber:block.number, avatar:_avatar, - votingMachine:intVote}); + votingMachine:address(intVote) + }); return proposalId; } } diff --git a/contracts/utils/Redeemer.sol b/contracts/utils/Redeemer.sol index da682378..c05e4ebe 100644 --- a/contracts/utils/Redeemer.sol +++ b/contracts/utils/Redeemer.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../universalSchemes/ContributionReward.sol"; import "@daostack/infra/contracts/votingMachines/GenesisProtocol.sol"; @@ -10,7 +10,7 @@ contract Redeemer { ContributionReward public contributionReward; GenesisProtocol public genesisProtocol; - constructor(address _contributionReward,address _genesisProtocol) public { + constructor(address _contributionReward, address _genesisProtocol) public { contributionReward = ContributionReward(_contributionReward); genesisProtocol = GenesisProtocol(_genesisProtocol); } @@ -28,10 +28,8 @@ contract Redeemer { * @param _beneficiary beneficiary * @return gpRewards array * gpRewards[0] - stakerTokenAmount - * gpRewards[1] - stakerReputationAmount - * gpRewards[2] - voterTokenAmount - * gpRewards[3] - voterReputationAmount - * gpRewards[4] - proposerReputationAmount + * gpRewards[1] - voterReputationAmount + * gpRewards[2] - proposerReputationAmount * @return gpDaoBountyReward array * gpDaoBountyReward[0] - staker dao bounty reward - * will be zero for the case there is not enough tokens in avatar for the reward. @@ -40,66 +38,69 @@ contract Redeemer { * @return winningVote * 1 - executed or closed and the winning vote is YES * 2 - executed or closed and the winning vote is NO - * @return int crReputationReward Reputation - from ContributionReward - * @return int crNativeTokenReward NativeTokenReward - from ContributionReward - * @return int crEthReward Ether - from ContributionReward - * @return int crExternalTokenReward ExternalToken - from ContributionReward + * @return int256 crReputationReward Reputation - from ContributionReward + * @return int256 crNativeTokenReward NativeTokenReward - from ContributionReward + * @return int256 crEthReward Ether - from ContributionReward + * @return int256 crExternalTokenReward ExternalToken - from ContributionReward */ - function redeem(bytes32 _proposalId,address _avatar,address _beneficiary) + function redeem(bytes32 _proposalId, Avatar _avatar, address _beneficiary) external - returns(uint[5] gpRewards, - uint[2] gpDaoBountyReward, + returns(uint[3] memory gpRewards, + uint[2] memory gpDaoBountyReward, bool executed, uint256 winningVote, - int crReputationReward, + int256 crReputationReward, uint256 crNativeTokenReward, uint256 crEthReward, uint256 crExternalTokenReward) { GenesisProtocol.ProposalState pState = genesisProtocol.state(_proposalId); - // solium-disable-next-line operator-whitespace - if ((pState == GenesisProtocol.ProposalState.PreBoosted)|| - (pState == GenesisProtocol.ProposalState.Boosted)|| - (pState == GenesisProtocol.ProposalState.QuietEndingPeriod)) { + + if ((pState == GenesisProtocolLogic.ProposalState.Queued)|| + (pState == GenesisProtocolLogic.ProposalState.PreBoosted)|| + (pState == GenesisProtocolLogic.ProposalState.Boosted)|| + (pState == GenesisProtocolLogic.ProposalState.QuietEndingPeriod)) { executed = genesisProtocol.execute(_proposalId); } pState = genesisProtocol.state(_proposalId); - if ((pState == GenesisProtocol.ProposalState.Executed) || - (pState == GenesisProtocol.ProposalState.Closed)) { - gpRewards = genesisProtocol.redeem(_proposalId,_beneficiary); - (gpDaoBountyReward[0],gpDaoBountyReward[1]) = genesisProtocol.redeemDaoBounty(_proposalId,_beneficiary); + if ((pState == GenesisProtocolLogic.ProposalState.Executed) || + (pState == GenesisProtocolLogic.ProposalState.ExpiredInQueue)) { + gpRewards = genesisProtocol.redeem(_proposalId, _beneficiary); + (gpDaoBountyReward[0], gpDaoBountyReward[1]) = genesisProtocol.redeemDaoBounty(_proposalId, _beneficiary); winningVote = genesisProtocol.winningVote(_proposalId); //redeem from contributionReward only if it executed - if (contributionReward.getProposalExecutionTime(_proposalId,_avatar) > 0) { - (crReputationReward,crNativeTokenReward,crEthReward,crExternalTokenReward) = contributionRewardRedeem(_proposalId,_avatar); + if (contributionReward.getProposalExecutionTime(_proposalId, address(_avatar)) > 0) { + (crReputationReward, crNativeTokenReward, crEthReward, crExternalTokenReward) = + contributionRewardRedeem(_proposalId, _avatar); } } } - function contributionRewardRedeem(bytes32 _proposalId,address _avatar) + function contributionRewardRedeem(bytes32 _proposalId, Avatar _avatar) private - returns (int reputation,uint256 nativeToken,uint256 eth,uint256 externalToken) + returns (int256 reputation, uint256 nativeToken, uint256 eth, uint256 externalToken) { bool[4] memory whatToRedeem; whatToRedeem[0] = true; //reputation whatToRedeem[1] = true; //nativeToken - uint256 periodsToPay = contributionReward.getPeriodsToPay(_proposalId,_avatar,2); - uint256 ethReward = contributionReward.getProposalEthReward(_proposalId,_avatar); - uint256 externalTokenReward = contributionReward.getProposalExternalTokenReward(_proposalId,_avatar); - address externalTokenAddress = contributionReward.getProposalExternalToken(_proposalId,_avatar); + uint256 periodsToPay = contributionReward.getPeriodsToPay(_proposalId, address(_avatar), 2); + uint256 ethReward = contributionReward.getProposalEthReward(_proposalId, address(_avatar)); + uint256 externalTokenReward = contributionReward.getProposalExternalTokenReward(_proposalId, address(_avatar)); + address externalTokenAddress = contributionReward.getProposalExternalToken(_proposalId, address(_avatar)); ethReward = periodsToPay.mul(ethReward); - if ((ethReward == 0) || (_avatar.balance < ethReward)) { + if ((ethReward == 0) || (address(_avatar).balance < ethReward)) { whatToRedeem[2] = false; } else { whatToRedeem[2] = true; } - periodsToPay = contributionReward.getPeriodsToPay(_proposalId,_avatar,3); + periodsToPay = contributionReward.getPeriodsToPay(_proposalId, address(_avatar), 3); externalTokenReward = periodsToPay.mul(externalTokenReward); - if ((externalTokenReward == 0) || (StandardToken(externalTokenAddress).balanceOf(_avatar) < externalTokenReward)) { + if ((externalTokenReward == 0) || + (ERC20(externalTokenAddress).balanceOf(address(_avatar)) < externalTokenReward)) { whatToRedeem[3] = false; } else { whatToRedeem[3] = true; } - (reputation,nativeToken,eth,externalToken) = contributionReward.redeem(_proposalId,_avatar,whatToRedeem); + (reputation, nativeToken, eth, externalToken) = contributionReward.redeem(_proposalId, _avatar, whatToRedeem); } } diff --git a/contracts/votingMachines/VotingMachineCallbacks.sol b/contracts/votingMachines/VotingMachineCallbacks.sol index b7d7c7a6..f36c02a6 100644 --- a/contracts/votingMachines/VotingMachineCallbacks.sol +++ b/contracts/votingMachines/VotingMachineCallbacks.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.25; +pragma solidity ^0.5.2; import "../universalSchemes/UniversalScheme.sol"; import "@daostack/infra/contracts/votingMachines/GenesisProtocol.sol"; @@ -13,46 +13,39 @@ contract VotingMachineCallbacks is VotingMachineCallbacksInterface { } modifier onlyVotingMachine(bytes32 _proposalId) { - require(msg.sender == proposalsInfo[_proposalId].votingMachine,"only VotingMachine"); + require(msg.sender == proposalsInfo[_proposalId].votingMachine, "only VotingMachine"); _; } - //proposalId -> ProposalInfo - mapping(bytes32 => ProposalInfo ) proposalsInfo; - function getTotalReputationSupply(bytes32 _proposalId) external view returns(uint256) { - ProposalInfo memory proposal = proposalsInfo[_proposalId]; - if (proposal.avatar == Avatar(0)) { - return 0; - } - return proposal.avatar.nativeReputation().totalSupplyAt(proposal.blockNumber); - } + //proposalId -> ProposalInfo + mapping(bytes32 => ProposalInfo ) public proposalsInfo; - function mintReputation(uint256 _amount,address _beneficiary,bytes32 _proposalId) external onlyVotingMachine(_proposalId) returns(bool) { + function mintReputation(uint256 _amount, address _beneficiary, bytes32 _proposalId) + external + onlyVotingMachine(_proposalId) + returns(bool) + { Avatar avatar = proposalsInfo[_proposalId].avatar; if (avatar == Avatar(0)) { return false; } - return ControllerInterface(avatar.owner()).mintReputation(_amount,_beneficiary,address(avatar)); + return ControllerInterface(avatar.owner()).mintReputation(_amount, _beneficiary, address(avatar)); } - function burnReputation(uint256 _amount,address _beneficiary,bytes32 _proposalId) external onlyVotingMachine(_proposalId) returns(bool) { + function burnReputation(uint256 _amount, address _beneficiary, bytes32 _proposalId) + external + onlyVotingMachine(_proposalId) + returns(bool) + { Avatar avatar = proposalsInfo[_proposalId].avatar; if (avatar == Avatar(0)) { return false; } - return ControllerInterface(avatar.owner()).burnReputation(_amount,_beneficiary,address(avatar)); - } - - function reputationOf(address _owner,bytes32 _proposalId) external view returns(uint) { - ProposalInfo memory proposal = proposalsInfo[_proposalId]; - if (proposal.avatar == Avatar(0)) { - return 0; - } - return proposal.avatar.nativeReputation().balanceOfAt(_owner,proposal.blockNumber); + return ControllerInterface(avatar.owner()).burnReputation(_amount, _beneficiary, address(avatar)); } function stakingTokenTransfer( - StandardToken _stakingToken, + ERC20 _stakingToken, address _beneficiary, uint256 _amount, bytes32 _proposalId) @@ -64,14 +57,30 @@ contract VotingMachineCallbacks is VotingMachineCallbacksInterface { if (avatar == Avatar(0)) { return false; } - return ControllerInterface(avatar.owner()).externalTokenTransfer(_stakingToken,_beneficiary,_amount,address(avatar)); + return ControllerInterface(avatar.owner()).externalTokenTransfer(_stakingToken, _beneficiary, _amount, avatar); } - function balanceOfStakingToken(StandardToken _stakingToken,bytes32 _proposalId) external view returns(uint) { + function balanceOfStakingToken(ERC20 _stakingToken, bytes32 _proposalId) external view returns(uint256) { Avatar avatar = proposalsInfo[_proposalId].avatar; if (proposalsInfo[_proposalId].avatar == Avatar(0)) { return 0; } return _stakingToken.balanceOf(address(avatar)); } + + function getTotalReputationSupply(bytes32 _proposalId) external view returns(uint256) { + ProposalInfo memory proposal = proposalsInfo[_proposalId]; + if (proposal.avatar == Avatar(0)) { + return 0; + } + return proposal.avatar.nativeReputation().totalSupplyAt(proposal.blockNumber); + } + + function reputationOf(address _owner, bytes32 _proposalId) external view returns(uint256) { + ProposalInfo memory proposal = proposalsInfo[_proposalId]; + if (proposal.avatar == Avatar(0)) { + return 0; + } + return proposal.avatar.nativeReputation().balanceOfAt(_owner, proposal.blockNumber); + } } diff --git a/docs/generated_docs/controller/DAOToken.md b/docs/generated_docs/controller/DAOToken.md index 426f5f20..03f5f78a 100644 --- a/docs/generated_docs/controller/DAOToken.md +++ b/docs/generated_docs/controller/DAOToken.md @@ -148,7 +148,7 @@ Returns: --- ### increaseApproval(address,uint256,bytes) > -> Addition to StandardToken methods. Increase the amount of tokens that an owner allowed to a spender and execute a call with the sent data. * 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 +> Addition to ERC20 methods. Increase the amount of tokens that an owner allowed to a spender and execute a call with the sent data. * 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 **Execution cost**: No bound available @@ -383,7 +383,7 @@ Returns: --- ### decreaseApproval(address,uint256,bytes) > -> Addition to StandardToken methods. Decrease the amount of tokens that an owner allowed to a spender and execute a call with the sent data. * approve should be called when allowed[_spender] == 0. To decrement allowed value is better to use this function to avoid 2 calls (and wait until the first transaction is mined) From MonolithDAO Token.sol +> Addition to ERC20 methods. Decrease the amount of tokens that an owner allowed to a spender and execute a call with the sent data. * approve should be called when allowed[_spender] == 0. To decrement allowed value is better to use this function to avoid 2 calls (and wait until the first transaction is mined) From MonolithDAO Token.sol **Execution cost**: No bound available diff --git a/migrations/2_deploy_organization.js b/migrations/2_deploy_organization.js index 216a68e1..623d8b4c 100644 --- a/migrations/2_deploy_organization.js +++ b/migrations/2_deploy_organization.js @@ -5,11 +5,12 @@ var UController = artifacts.require('./UController.sol'); var DaoCreator = artifacts.require('./DaoCreator.sol'); var GlobalConstraintRegistrar = artifacts.require('./GlobalConstraintRegistrar.sol'); var SchemeRegistrar = artifacts.require('./SchemeRegistrar.sol'); -var SimpleICO = artifacts.require('./SimpleICO.sol'); var AbsoluteVote = artifacts.require('./AbsoluteVote.sol'); var ContributionReward = artifacts.require('./ContributionReward.sol'); var UpgradeScheme = artifacts.require('./UpgradeScheme.sol'); var ControllerCreator = artifacts.require('./ControllerCreator.sol'); +const NULL_ADDRESS = '0x0000000000000000000000000000000000000000'; + // TEST_ORGANIZATION ORG parameters: const orgName = "TEST_ORGANIZATION"; @@ -42,7 +43,7 @@ module.exports = async function(deployer) { await web3.eth.getAccounts(function(err,res) { accounts = res; }); founders[0] = accounts[0]; var returnedParams = await daoCreatorInst.forgeOrg(orgName, tokenName, tokenSymbol, founders, - initTokenInWei, initRepInWei,0,cap,{gas: constants.ARC_GAS_LIMIT}); + initTokenInWei, initRepInWei,NULL_ADDRESS,cap,{gas: constants.ARC_GAS_LIMIT}); var AvatarInst = await Avatar.at(returnedParams.logs[0].args._avatar); await deployer.deploy(AbsoluteVote,{gas: constants.ARC_GAS_LIMIT}); // Deploy AbsoluteVote: @@ -57,14 +58,11 @@ module.exports = async function(deployer) { await deployer.deploy(GlobalConstraintRegistrar); var globalConstraintRegistrarInst = await GlobalConstraintRegistrar.deployed(); - await deployer.deploy(SimpleICO); - var simpleICOInst = await SimpleICO.deployed(); - await deployer.deploy(ContributionReward); var contributionRewardInst = await ContributionReward.deployed(); // Voting parameters and schemes params: - var voteParametersHash = await AbsoluteVoteInst.getParametersHash(votePrec, true); + var voteParametersHash = await AbsoluteVoteInst.getParametersHash(votePrec, NULL_ADDRESS); await schemeRegistrarInst.setParameters(voteParametersHash, voteParametersHash, AbsoluteVoteInst.address); var schemeRegisterParams = await schemeRegistrarInst.getParametersHash(voteParametersHash, voteParametersHash, AbsoluteVoteInst.address); @@ -73,18 +71,15 @@ module.exports = async function(deployer) { await upgradeSchemeInst.setParameters(voteParametersHash, AbsoluteVoteInst.address); var schemeUpgradeParams = await upgradeSchemeInst.getParametersHash(voteParametersHash, AbsoluteVoteInst.address); - await simpleICOInst.setParameters(1000, 1, 1, 2, web3.eth.accounts[0], web3.eth.accounts[0]); - var simpleICOParams = await simpleICOInst.getParametersHash(1000, 1, 1, 2, web3.eth.accounts[0], web3.eth.accounts[0]); await contributionRewardInst.setParameters(10,voteParametersHash, AbsoluteVoteInst.address); var contributionRewardParams = await contributionRewardInst.getParametersHash(10,voteParametersHash, AbsoluteVoteInst.address); var schemesArray = [schemeRegistrarInst.address, globalConstraintRegistrarInst.address, upgradeSchemeInst.address, - simpleICOInst.address, contributionRewardInst.address]; - const paramsArray = [schemeRegisterParams, schemeGCRegisterParams, schemeUpgradeParams,simpleICOParams,contributionRewardParams]; - const permissionArray = ['0x0000001F', '0x00000005', '0x0000000a','0x00000001','0x00000001']; + const paramsArray = [schemeRegisterParams, schemeGCRegisterParams, schemeUpgradeParams,contributionRewardParams]; + const permissionArray = ['0x0000001F', '0x00000005', '0x0000000a','0x00000001']; // set DAOstack initial schmes: await daoCreatorInst.setSchemes( diff --git a/package-lock.json b/package-lock.json index 8bdef2ce..119b0fb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,15 @@ { "name": "@daostack/arc", - "version": "0.0.0-alpha.58", + "version": "0.0.1-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", - "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "requires": { - "@babel/highlight": "7.0.0-beta.44" + "@babel/highlight": "^7.0.0" } }, "@babel/generator": { @@ -64,14 +63,13 @@ } }, "@babel/highlight": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", - "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "js-tokens": "^4.0.0" } }, "@babel/template": { @@ -86,11 +84,37 @@ "lodash": "^4.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, "babylon": { "version": "7.0.0-beta.44", "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "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 } } }, @@ -112,6 +136,26 @@ "lodash": "^4.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, "babylon": { "version": "7.0.0-beta.44", "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", @@ -127,16 +171,10 @@ "ms": "^2.1.1" } }, - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "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 } } @@ -161,12 +199,12 @@ } }, "@daostack/infra": { - "version": "0.0.0-alpha.10", - "resolved": "https://registry.npmjs.org/@daostack/infra/-/infra-0.0.0-alpha.10.tgz", - "integrity": "sha512-E78ppDfl/WsDNk3WqYwfjjPzhQI8BG/IwtilqDyqIlsyL2SoLmd1pYw9b1u9gc1ByaqbwV/k8ksO8clsobxYNw==", + "version": "0.0.1-rc.3", + "resolved": "https://registry.npmjs.org/@daostack/infra/-/infra-0.0.1-rc.3.tgz", + "integrity": "sha512-Q2qu02QzsqRF7PTL5rqskQ3Hp0AOpcb6czqLbHaaLspCDzSCSrEsJeVEBZzRSI4C6SrC56sH0xMsBOKN9dMWRw==", "requires": { "ethereumjs-abi": "^0.6.5", - "openzeppelin-solidity": "1.12.0" + "openzeppelin-solidity": "github:OpenZeppelin/openzeppelin-solidity#4b8fcbcee16437d8a29bc0e5bb328b2a1547f996" } }, "@soldoc/markdown": { @@ -207,10 +245,9 @@ } }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==" }, "acorn-globals": { "version": "3.1.0", @@ -230,32 +267,19 @@ } }, "acorn-jsx": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==" }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-keywords": { @@ -293,39 +317,47 @@ "ansi-escapes": { "version": "3.1.0", "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } }, + "antlr4": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.1.tgz", + "integrity": "sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==" + }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, + "optional": true, "requires": { "micromatch": "^2.1.5", "normalize-path": "^2.0.0" } }, + "app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -335,6 +367,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, + "optional": true, "requires": { "arr-flatten": "^1.0.1" } @@ -365,7 +398,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "dev": true, + "optional": true }, "asap": { "version": "2.0.6", @@ -379,6 +413,11 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", @@ -444,6 +483,12 @@ "js-tokens": "^3.0.2" }, "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", @@ -463,9 +508,24 @@ "supports-color": "^2.0.0" } }, + "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 + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } @@ -496,6 +556,23 @@ "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "babel-eslint": { @@ -512,11 +589,47 @@ "eslint-visitor-keys": "^1.0.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.44", + "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", + "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0-beta.44" + } + }, + "@babel/highlight": { + "version": "7.0.0-beta.44", + "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", + "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" + } + }, "babylon": { "version": "7.0.0-beta.44", "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.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 } } }, @@ -1019,6 +1132,29 @@ "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" + }, + "dependencies": { + "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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "babel-types": { @@ -1042,8 +1178,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1152,7 +1287,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1163,6 +1297,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, + "optional": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -1194,11 +1329,12 @@ } }, "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", + "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", "requires": { - "js-sha3": "^0.3.1" + "js-sha3": "^0.6.1", + "safe-buffer": "^5.1.1" } }, "buffer-from": { @@ -1247,7 +1383,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, "requires": { "callsites": "^0.2.0" } @@ -1255,8 +1390,7 @@ "callsites": { "version": "0.2.0", "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" }, "camelcase": { "version": "3.0.0", @@ -1278,7 +1412,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1295,10 +1428,9 @@ } }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "charm": { "version": "0.1.2", @@ -1311,6 +1443,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, + "optional": true, "requires": { "anymatch": "^1.3.0", "async-each": "^1.0.0", @@ -1335,8 +1468,7 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" }, "class-utils": { "version": "0.3.6", @@ -1384,21 +1516,10 @@ } } }, - "cli": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/cli/-/cli-0.11.3.tgz", - "integrity": "sha1-ewzT3pkORSklZnwNuv/cn38qmhU=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.0.5" - } - }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -1412,6 +1533,12 @@ "chalk": "^1.1.3" }, "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", @@ -1431,9 +1558,18 @@ "supports-color": "^2.0.0" } }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } @@ -1442,8 +1578,7 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "cliui": { "version": "3.2.0", @@ -1454,6 +1589,43 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wrap-ansi": "^2.0.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 + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "co": { @@ -1482,7 +1654,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -1490,20 +1661,18 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "colors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", + "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==" }, "component-emitter": { "version": "1.2.1", @@ -1514,12 +1683,11 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "resolved": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { @@ -1573,9 +1741,9 @@ "dev": true }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz", + "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg==", "dev": true }, "core-util-is": { @@ -1610,9 +1778,9 @@ } }, "cron": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cron/-/cron-1.5.0.tgz", - "integrity": "sha512-j7zMFLrcSta53xqOvETUt8ge+PM14GtF47gEGJJeVlM6qP24/eWHSgtiWiEiKBR2sHS8xZaBQZq4D7vFXg8dcQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.6.0.tgz", + "integrity": "sha512-8OkXbeK3qF42ndzkIkCo3zfCDg2TxGjQiCQqVE+ZFFHa4vAcw0PdBc5i/6aJ9FppLncyKZmDuZdJ9/uuXEYZaw==", "dev": true, "requires": { "moment-timezone": "^0.5.x" @@ -1625,26 +1793,39 @@ "dev": true, "requires": { "cross-spawn": "^5.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.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, + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -1671,8 +1852,7 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "deep-metrics": { "version": "0.0.1", @@ -1773,7 +1953,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, "requires": { "esutils": "^2.0.2" } @@ -1817,11 +1996,11 @@ "shimmer": "^1.2.0" } }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==", - "dev": true + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "optional": true }, "error-ex": { "version": "1.3.2", @@ -1865,8 +2044,7 @@ "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 + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { "version": "4.19.1", @@ -1914,48 +2092,173 @@ "text-table": "~0.2.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "acorn-jsx": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "ms": "^2.1.1" + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } } }, - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", - "dev": true + "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.0" + } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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": { - "ansi-regex": "^3.0.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } - } - } - }, - "eslint-config-defaults": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-defaults/-/eslint-config-defaults-9.0.0.tgz", - "integrity": "sha1-oJCtwTspNeP0OzzQSKknAWVOWtU=", + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "espree": { + "version": "3.5.4", + "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "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 + }, + "regexpp": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + } + } + }, + "eslint-config-defaults": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-defaults/-/eslint-config-defaults-9.0.0.tgz", + "integrity": "sha1-oJCtwTspNeP0OzzQSKknAWVOWtU=", "dev": true }, "eslint-config-standard": { @@ -1972,6 +2275,23 @@ "requires": { "debug": "^2.6.9", "resolve": "^1.5.0" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-module-utils": { @@ -1982,6 +2302,23 @@ "requires": { "debug": "^2.6.8", "pkg-dir": "^1.0.0" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-plugin-import": { @@ -2002,6 +2339,15 @@ "resolve": "^1.6.0" }, "dependencies": { + "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" + } + }, "doctrine": { "version": "1.5.0", "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -2033,6 +2379,12 @@ "strip-bom": "^3.0.0" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -2083,6 +2435,12 @@ "semver": "5.3.0" }, "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, "semver": { "version": "5.3.0", "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", @@ -2117,42 +2475,52 @@ "dev": true }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==" + }, "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" }, "espree": { - "version": "3.5.4", - "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esprima-extract-comments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esprima-extract-comments/-/esprima-extract-comments-1.1.0.tgz", + "integrity": "sha512-sBQUnvJwpeE9QnPrxh7dpI/dp67erYG4WXEAreAMoelPRpMR7NWb4YtwRPn9b+H1uLQKl/qS8WYmyaljTpjIsw==", + "optional": true, + "requires": { + "esprima": "^4.0.0" + } }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, "requires": { "estraverse": "^4.0.0" } @@ -2161,7 +2529,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, "requires": { "estraverse": "^4.1.0" } @@ -2169,14 +2536,12 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "ethereumjs-abi": { "version": "0.6.5", @@ -2227,19 +2592,27 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, + "optional": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -2249,6 +2622,7 @@ "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, + "optional": true, "requires": { "fill-range": "^2.1.0" } @@ -2281,13 +2655,12 @@ } }, "external-editor": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, @@ -2296,27 +2669,40 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, + "optional": true, "requires": { "is-extglob": "^1.0.0" } }, - "fast-deep-equal": { + "extract-comments": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "resolved": "https://registry.npmjs.org/extract-comments/-/extract-comments-1.1.0.tgz", + "integrity": "sha512-dzbZV2AdSSVW/4E7Ti5hZdHWbA+Z80RJsJhr5uiL10oyjl/gy7/o+HI1HwK4/WSZhlq4SNKU3oUzXlM13Qx02Q==", + "optional": true, + "requires": { + "esprima-extract-comments": "^1.1.0", + "parse-code-context": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fclone": { "version": "1.0.11", @@ -2328,7 +2714,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -2337,7 +2722,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, "requires": { "flat-cache": "^1.2.1", "object-assign": "^4.0.1" @@ -2347,13 +2731,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "dev": true, + "optional": true }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, + "optional": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", @@ -2376,7 +2762,6 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, "requires": { "circular-json": "^0.3.1", "graceful-fs": "^4.1.2", @@ -2395,6 +2780,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, + "optional": true, "requires": { "for-in": "^1.0.1" } @@ -2428,8 +2814,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.4", @@ -2969,49 +3354,42 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "ganache-cli": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.2.3.tgz", - "integrity": "sha512-+FYzINouw+yHHG6bT8m6O5xCw5NP6rpSL2keChKlcwgRRFz8SrZS6Q26iJ7ixBp6bk+UMMua8IPZgNFizbdZlQ==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.2.5.tgz", + "integrity": "sha512-E4SP8QNeuc2N/ojFoCK+08OYHX8yrtGeFtipZmJPPTQ6U8Hmq3JcbXZDxQfChPQUY5mtbRSwptJa4EtiQyJjAQ==", "dev": true, "requires": { "bn.js": "4.11.8", - "ganache-core": "^2.3.1", - "source-map-support": "^0.5.3", - "yargs": "^11.0.0" + "source-map-support": "0.5.9", + "yargs": "11.1.0" }, "dependencies": { "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "bundled": true, "dev": true }, "bn.js": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "bundled": true, "dev": true }, "buffer-from": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "bundled": true, "dev": true }, "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "bundled": true, "dev": true }, "cliui": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "bundled": true, "dev": true, "requires": { "string-width": "^2.1.1", @@ -3021,14 +3399,12 @@ }, "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=", + "bundled": true, "dev": true }, "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=", + "bundled": true, "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -3038,14 +3414,12 @@ }, "decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "bundled": true, "dev": true }, "execa": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "bundled": true, "dev": true, "requires": { "cross-spawn": "^5.0.1", @@ -3059,5815 +3433,45 @@ }, "find-up": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "bundled": true, "dev": true, "requires": { "locate-path": "^2.0.0" } }, - "ganache-core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.3.1.tgz", - "integrity": "sha512-I4t4P+LYUZRnGbxDseqSa5vIJ8C5e35vw5Fr7f2iMMN6jmO5TVjWWgNib60G2iL+XTbYUFmou040hHxrTaNtnA==", - "dev": true, - "requires": { - "abstract-leveldown": "3.0.0", - "async": "2.6.1", - "bip39": "2.5.0", - "bn.js": "4.11.8", - "cachedown": "1.0.0", - "clone": "2.1.2", - "debug": "3.1.0", - "encoding-down": "5.0.4", - "eth-sig-util": "2.0.2", - "ethereumjs-abi": "0.6.5", - "ethereumjs-account": "2.0.5", - "ethereumjs-block": "1.2.2", - "ethereumjs-tx": "1.3.7", - "ethereumjs-util": "5.2.0", - "ethereumjs-vm": "2.4.0", - "ethereumjs-wallet": "0.6.2", - "heap": "0.2.6", - "level-sublevel": "6.6.4", - "levelup": "3.1.1", - "lodash": "4.17.10", - "merkle-patricia-tree": "2.3.1", - "seedrandom": "2.4.4", - "tmp": "0.0.33", - "web3": "1.0.0-beta.35", - "web3-provider-engine": "14.1.0", - "websocket": "1.0.26" - }, - "dependencies": { - "abstract-leveldown": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz", - "integrity": "sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", - "dev": true, - "optional": true - }, - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "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.4.0" - } - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true - }, - "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.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "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.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "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": "^6.22.0", - "babel-types": "^6.24.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.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "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-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": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "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.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "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.22.0", - "babel-types": "^6.24.1" - } - }, - "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.22.0", - "babel-types": "^6.24.1" - } - }, - "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.22.0", - "babel-types": "^6.24.1" - } - }, - "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-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": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "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.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.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.22.0", - "babel-template": "^6.24.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.22.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.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "http://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-exponentiation-operator": { - "version": "6.13.0", - "resolved": "http://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-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-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.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.22.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.22.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.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.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "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.22.0", - "babel-template": "^6.24.1" - } - }, - "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.22.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.22.0", - "babel-types": "^6.24.1" - } - }, - "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.22.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.22.0", - "babel-types": "^6.24.1" - } - }, - "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.22.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.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "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.22.0", - "babel-template": "^6.24.1" - } - }, - "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.22.0", - "babel-template": "^6.24.1" - } - }, - "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.22.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.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "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.22.0", - "babel-types": "^6.24.1" - } - }, - "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.22.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.22.0", - "babel-types": "^6.24.1" - } - }, - "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.22.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.22.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.22.0", - "regexpu-core": "^2.0.0" - } - }, - "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.8.0", - "babel-runtime": "^6.22.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.0" - } - }, - "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.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^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.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "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.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.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.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "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.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "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.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "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" - } - } - } - }, - "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" - } - }, - "babelify": { - "version": "7.3.0", - "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", - "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", - "dev": true, - "requires": { - "babel-core": "^6.0.14", - "object-assign": "^4.0.0" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "dev": true, - "requires": { - "precond": "0.2" - } - }, - "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": "3.0.5", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz", - "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true, - "optional": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bindings": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", - "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" - }, - "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.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1", - "safe-buffer": "^5.0.1", - "unorm": "^1.3.3" - } - }, - "bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bl": { - "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true, - "optional": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - }, - "dependencies": { - "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" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "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.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "optional": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "optional": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "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" - } - }, - "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, - "optional": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "dev": true, - "optional": true, - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dev": true, - "optional": true, - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "optional": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "optional": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "bytewise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz", - "integrity": "sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4=", - "dev": true, - "requires": { - "bytewise-core": "^1.2.2", - "typewise": "^1.0.3" - } - }, - "bytewise-core": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz", - "integrity": "sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI=", - "dev": true, - "requires": { - "typewise-core": "^1.2" - } - }, - "cachedown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cachedown/-/cachedown-1.0.0.tgz", - "integrity": "sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=", - "dev": true, - "requires": { - "abstract-leveldown": "^2.4.1", - "lru-cache": "^3.2.0" - }, - "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.0" - } - } - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000907", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000907.tgz", - "integrity": "sha512-No5sQ/OB2Nmka8MNOOM6nJx+Hxt6MQ6h7t7kgJFu9oTuwjykyKRSBP/+i/QAyFHxeHB+ddE0Da1CG5ihx9oehQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "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" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "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, - "optional": true, - "requires": { - "bs58": "^2.0.1", - "create-hash": "^1.1.1" - }, - "dependencies": { - "bs58": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", - "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=", - "dev": true, - "optional": true - } - } - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "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 - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.3.tgz", - "integrity": "sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw==", - "dev": true, - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - } - }, - "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, - "optional": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "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" - } - }, - "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" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "dev": true, - "optional": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "optional": true - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "optional": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true, - "optional": true - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "optional": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, - "optional": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true, - "optional": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "optional": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "optional": 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 - }, - "deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dev": true, - "requires": { - "abstract-leveldown": "~2.6.0" - }, - "dependencies": { - "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.0" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - }, - "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - } - } - }, - "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 - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "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, - "optional": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "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.2", - "create-hmac": "^1.1.4" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", - "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", - "dev": true - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "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.13" - } - }, - "encoding-down": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", - "integrity": "sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==", - "dev": true, - "requires": { - "abstract-leveldown": "^5.0.0", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "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 - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eth-block-tracker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz", - "integrity": "sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==", - "dev": true, - "requires": { - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "eth-json-rpc-infura": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-3.1.2.tgz", - "integrity": "sha512-IuK5Iowfs6taluA/3Okmu6EfZcFMq6MQuyrUL1PrCoJstuuBr3TvVeSy3keDyxfbrjFB34nCo538I8G+qMtsbw==", - "dev": true, - "requires": { - "cross-fetch": "^2.1.1", - "eth-json-rpc-middleware": "^1.5.0", - "json-rpc-engine": "^3.4.0", - "json-rpc-error": "^2.0.0", - "tape": "^4.8.0" - } - }, - "eth-json-rpc-middleware": { - "version": "1.6.0", - "resolved": "http://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", - "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", - "dev": true, - "requires": { - "async": "^2.5.0", - "eth-query": "^2.1.2", - "eth-tx-summary": "^3.1.2", - "ethereumjs-block": "^1.6.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.2", - "ethereumjs-vm": "^2.1.0", - "fetch-ponyfill": "^4.0.0", - "json-rpc-engine": "^3.6.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "tape": "^4.6.3" - }, - "dependencies": { - "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-block": { - "version": "1.7.1", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - } - } - }, - "eth-lib": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", - "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "keccakjs": "^0.2.1", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha1-1nQdkAAQa1FRDHLbktY2VFam2l4=", - "dev": true, - "requires": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "eth-sig-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-2.0.2.tgz", - "integrity": "sha512-tB6E8jf/aZQ943bo3+iojl8xRe3Jzcl+9OT6v8K7kWis6PdIX19SB2vYvN849cB9G9m/XLjYFK381SgdbsnpTA==", - "dev": true, - "requires": { - "ethereumjs-abi": "0.6.5", - "ethereumjs-util": "^5.1.1" - } - }, - "eth-tx-summary": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/eth-tx-summary/-/eth-tx-summary-3.2.3.tgz", - "integrity": "sha512-1gZpA5fKarJOVSb5OUlPnhDQuIazqAkI61zlVvf5LdG47nEgw+/qhyZnuj3CUdE/TLTKuRzPLeyXLjaB4qWTRQ==", - "dev": true, - "requires": { - "async": "^2.1.2", - "bn.js": "^4.11.8", - "clone": "^2.0.0", - "concat-stream": "^1.5.1", - "end-of-stream": "^1.1.0", - "eth-query": "^2.0.2", - "ethereumjs-block": "^1.4.1", - "ethereumjs-tx": "^1.1.1", - "ethereumjs-util": "^5.0.1", - "ethereumjs-vm": "2.3.4", - "through2": "^2.0.3", - "treeify": "^1.0.1", - "web3-provider-engine": "^13.3.2" - }, - "dependencies": { - "eth-block-tracker": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-2.3.1.tgz", - "integrity": "sha512-NamWuMBIl8kmkJFVj8WzGatySTzQPQag4Xr677yFxdVtIxACFbL/dQowk0MzEqIKk93U1TwY3MjVU6mOcwZnKA==", - "dev": true, - "requires": { - "async-eventemitter": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "eth-query": "^2.1.0", - "ethereumjs-tx": "^1.3.3", - "ethereumjs-util": "^5.1.3", - "ethjs-util": "^0.1.3", - "json-rpc-engine": "^3.6.0", - "pify": "^2.3.0", - "tape": "^4.6.3" - }, - "dependencies": { - "async-eventemitter": { - "version": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "from": "github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c", - "dev": true, - "requires": { - "async": "^2.4.0" - } - } - } - }, - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "dev": true, - "requires": { - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" - } - } - } - }, - "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": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" - } - }, - "ethereumjs-block": { - "version": "1.7.1", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "ethereumjs-vm": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.3.4.tgz", - "integrity": "sha512-Y4SlzNDqxrCO58jhp98HdnZVdjOqB+HC0hoU+N/DEp1aU+hFkRX/nru5F7/HkQRPIlA6aJlQp/xIA6xZs1kspw==", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereum-common": "0.2.0", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~1.7.0", - "ethereumjs-util": "^5.1.3", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.1.2", - "rustbn.js": "~0.1.1", - "safe-buffer": "^5.1.1" - } - }, - "fs-extra": { - "version": "0.30.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "rustbn.js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.1.2.tgz", - "integrity": "sha512-bAkNqSHYdJdFsBC7Z11JgzYktL31HIpB2o70jZcGiL1U1TVtPyvaVhDrGWwS8uZtaqwW2k6NOPGZCqW/Dgh5Lg==", - "dev": true - }, - "web3-provider-engine": { - "version": "13.8.0", - "resolved": "http://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz", - "integrity": "sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ==", - "dev": true, - "requires": { - "async": "^2.5.0", - "clone": "^2.0.0", - "eth-block-tracker": "^2.2.2", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.1", - "ethereumjs-vm": "^2.0.2", - "fetch-ponyfill": "^4.0.0", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.67.0", - "semaphore": "^1.0.3", - "solc": "^0.4.2", - "tape": "^4.4.0", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - } - } - } - }, - "ethereum-common": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.16.tgz", - "integrity": "sha1-mh4Wnq00q3XgifUMpRK/0PvRJlU=", - "dev": true - }, - "ethereumjs-abi": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz", - "integrity": "sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE=", - "dev": true, - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^4.3.0" - }, - "dependencies": { - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "http://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "dev": true, - "requires": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "ethereumjs-block": { - "version": "1.2.2", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.2.2.tgz", - "integrity": "sha1-LsdTSlkCG47JuDww5JaQxuuu3aE=", - "dev": true, - "requires": { - "async": "^1.5.2", - "ethereum-common": "0.0.16", - "ethereumjs-tx": "^1.0.0", - "ethereumjs-util": "^4.0.1", - "merkle-patricia-tree": "^2.1.2" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "ethereumjs-util": { - "version": "4.5.0", - "resolved": "http://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", - "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", - "dev": true, - "requires": { - "bn.js": "^4.8.0", - "create-hash": "^1.1.2", - "keccakjs": "^0.2.0", - "rlp": "^2.0.0", - "secp256k1": "^3.0.1" - } - } - } - }, - "ethereumjs-common": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-0.4.1.tgz", - "integrity": "sha512-ywYGsOeGCsMNWso5Y4GhjWI24FJv9FK7+VyVKiQgXg8ZRDPXJ7F/kJ1CnjtkjTvDF4e0yqU+FWswlqR3bmZQ9Q==", - "dev": true - }, - "ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "dev": true, - "requires": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - }, - "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.2.0", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", - "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", - "requires": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "ethjs-util": "^0.1.3", - "keccak": "^1.0.2", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "ethereumjs-vm": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.4.0.tgz", - "integrity": "sha512-MJ4lCWa5c6LhahhhvoDKW+YGjK00ZQn0RHHLh4L+WaH1k6Qv7/q3uTluew6sJGNCZdlO0yYMDXYW9qyxLHKlgQ==", - "dev": true, - "requires": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~1.7.0", - "ethereumjs-common": "~0.4.0", - "ethereumjs-util": "^5.2.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.1.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "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-block": { - "version": "1.7.1", - "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "dev": true, - "requires": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - } - } - }, - "ethereumjs-wallet": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.2.tgz", - "integrity": "sha512-DHEKPV9lYORM7dL8602dkb+AgdfzCYz2lxpdYQoD3OwG355LLDuivW9rGuLpDMCry/ORyBYV6n+QCo/71SwACg==", - "dev": true, - "optional": true, - "requires": { - "aes-js": "^3.1.1", - "bs58check": "^2.1.2", - "ethereumjs-util": "^5.2.0", - "hdkey": "^1.0.0", - "safe-buffer": "^5.1.2", - "scrypt.js": "^0.2.0", - "utf8": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", - "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "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" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "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": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "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 - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "optional": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fetch-ponyfill": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", - "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", - "dev": true, - "requires": { - "node-fetch": "~1.7.1" - }, - "dependencies": { - "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.11", - "is-stream": "^1.0.1" - } - } - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "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" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "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.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "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.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0" - } - }, - "fs-promise": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", - "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", - "dev": true, - "optional": true, - "requires": { - "any-promise": "^1.3.0", - "fs-extra": "^2.0.0", - "mz": "^2.6.0", - "thenify-all": "^1.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "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 - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "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" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "dev": true, - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "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 - }, - "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": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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.0.0" - } - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "dev": true, - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hdkey": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.0.tgz", - "integrity": "sha512-E7aU8pNlWUJbXGjTz/+lKf1LkMcA3hUrC5ZleeizrmLSd++kvf8mSOe3q8CmBDA9j4hdfXO5iY6hGiTUCOV2jQ==", - "dev": true, - "optional": true, - "requires": { - "coinstring": "^2.0.0", - "safe-buffer": "^5.1.1", - "secp256k1": "^3.0.1" - } - }, - "heap": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.6.tgz", - "integrity": "sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.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=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=", - "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.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "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": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "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-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.0" - } - }, - "is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "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-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true, - "optional": true - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "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-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "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.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "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 - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=", - "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 - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "json-rpc-engine": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz", - "integrity": "sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==", - "dev": true, - "requires": { - "async": "^2.0.1", - "babel-preset-env": "^1.7.0", - "babelify": "^7.3.0", - "json-rpc-error": "^2.0.0", - "promise-to-callback": "^1.0.0", - "safe-event-emitter": "^1.0.1" - } - }, - "json-rpc-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-rpc-error/-/json-rpc-error-2.0.0.tgz", - "integrity": "sha1-p6+cICg4tekFxyUOVH8a/3cligI=", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, - "json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha1-uknZat7RRE27jaPSA3SKy7zeyMg=", - "dev": true - }, - "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.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "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 - }, - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keccak": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", - "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", - "requires": { - "bindings": "^1.2.1", - "inherits": "^2.0.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - }, - "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.1.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.9" - } - }, - "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" - } - }, - "level-codec": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.0.tgz", - "integrity": "sha512-OIpVvjCcZNP5SdhcNupnsI1zo5Y9Vpm+k/F1gfG5kXrtctlrwanisakweJtE0uA0OpLukRfOQae+Fg0M5Debhg==", - "dev": true - }, - "level-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.0.tgz", - "integrity": "sha512-AmY4HCp9h3OiU19uG+3YWkdELgy05OTP/r23aNHaQKWv8DO787yZgsEuGVkoph40uwN+YdUKnANlrxSsoOaaxg==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "level-iterator-stream": { - "version": "1.3.1", - "resolved": "http://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - }, - "dependencies": { - "level-errors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.1.2.tgz", - "integrity": "sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==", - "dev": true, - "requires": { - "errno": "~0.1.1" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, - "level-post": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/level-post/-/level-post-1.0.7.tgz", - "integrity": "sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==", - "dev": true, - "requires": { - "ltgt": "^2.1.2" - } - }, - "level-sublevel": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-6.6.4.tgz", - "integrity": "sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==", - "dev": true, - "requires": { - "bytewise": "~1.1.0", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0", - "level-iterator-stream": "^2.0.3", - "ltgt": "~2.1.1", - "pull-defer": "^0.2.2", - "pull-level": "^2.0.3", - "pull-stream": "^3.6.8", - "typewiselite": "~1.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "level-iterator-stream": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz", - "integrity": "sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.5", - "xtend": "^4.0.0" - } - }, - "ltgt": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.1.3.tgz", - "integrity": "sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ=", - "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.15", - "xtend": "~2.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "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": "3.1.1", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-3.1.1.tgz", - "integrity": "sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==", - "dev": true, - "requires": { - "deferred-leveldown": "~4.0.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~3.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "abstract-leveldown": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz", - "integrity": "sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==", - "dev": true, - "requires": { - "xtend": "~4.0.0" - } - }, - "deferred-leveldown": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz", - "integrity": "sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==", - "dev": true, - "requires": { - "abstract-leveldown": "~5.0.0", - "inherits": "^2.0.3" - } - }, - "level-iterator-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz", - "integrity": "sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "xtend": "^4.0.0" - } - } - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "looper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-2.0.0.tgz", - "integrity": "sha1-Zs0Md0rz1P7axTeU90LbVtqPCew=", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "dev": true, - "requires": { - "pseudomap": "^1.0.1" - } - }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", - "dev": true - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "optional": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "optional": true - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha1-tOThkhdGZP+65BNhqlAPMRnv4hU=", - "dev": true, - "requires": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "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.0" - } - } - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merkle-patricia-tree": { - "version": "2.3.1", - "resolved": "http://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz", - "integrity": "sha512-Qp9Mpb3xazznXzzGQBqHbqCpT2AR9joUOHYYPiQjYCarrdCPCnLWXo4BFv77y4xN26KR224xoU1n/qYY7RYYgw==", - "dev": true, - "requires": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "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.1" - } - }, - "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.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "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, - "optional": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true - }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, - "requires": { - "mime-db": "~1.37.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "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.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "*" - } - }, - "mock-fs": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.7.0.tgz", - "integrity": "sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA==", - "dev": true, - "optional": true - }, - "mout": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/mout/-/mout-0.11.1.tgz", - "integrity": "sha1-ujYR318OWx/7/QEWa48C0fX6K5k=", - "dev": true, - "optional": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "optional": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.10.0", - "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" - }, - "nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "node-fetch": { - "version": "2.1.2", - "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", - "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.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "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 - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "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.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "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 - }, - "oboe": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", - "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", - "dev": true, - "requires": { - "http-https": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://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": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", - "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-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "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.2.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "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.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "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.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true, - "optional": 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 - }, - "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.0" - } - }, - "precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha1-XSp0kBC/tn2WNZj805YHRqaP7vc=", - "dev": true, - "requires": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - } - }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" - } - }, - "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 - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pull-cat": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/pull-cat/-/pull-cat-1.1.11.tgz", - "integrity": "sha1-tkLdElXaN2pwa220+pYvX9t0wxs=", - "dev": true - }, - "pull-defer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/pull-defer/-/pull-defer-0.2.3.tgz", - "integrity": "sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==", - "dev": true - }, - "pull-level": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pull-level/-/pull-level-2.0.4.tgz", - "integrity": "sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==", - "dev": true, - "requires": { - "level-post": "^1.0.7", - "pull-cat": "^1.1.9", - "pull-live": "^1.0.1", - "pull-pushable": "^2.0.0", - "pull-stream": "^3.4.0", - "pull-window": "^2.1.4", - "stream-to-pull-stream": "^1.7.1" - } - }, - "pull-live": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pull-live/-/pull-live-1.0.1.tgz", - "integrity": "sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU=", - "dev": true, - "requires": { - "pull-cat": "^1.1.9", - "pull-stream": "^3.4.0" - } - }, - "pull-pushable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pull-pushable/-/pull-pushable-2.2.0.tgz", - "integrity": "sha1-Xy867UethpGfAbEqLpnW8b13ZYE=", - "dev": true - }, - "pull-stream": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.9.tgz", - "integrity": "sha512-hJn4POeBrkttshdNl0AoSCVjMVSuBwuHocMerUdoZ2+oIUzrWHFTwJMlbHND7OiKLVgvz6TFj8ZUVywUMXccbw==", - "dev": true - }, - "pull-window": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/pull-window/-/pull-window-2.1.4.tgz", - "integrity": "sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA=", - "dev": true, - "requires": { - "looper": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "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.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "optional": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "randomhex": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/randomhex/-/randomhex-0.1.5.tgz", - "integrity": "sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU=", - "dev": true - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.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.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "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.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "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.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "http://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" - } - }, - "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.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "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.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "dev": true, - "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=", - "dev": true, - "requires": { - "through": "~2.3.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.1.0.tgz", - "integrity": "sha512-93U7IKH5j7nmXFVg19MeNBGzQW5uXW1pmCuKY8veeKIhYTE32C2d0mOegfiIAfXcHOKJjjPlJisn8iHDF5AezA==", - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "dev": true, - "requires": { - "events": "^3.0.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "scrypt": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", - "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.0.8" - } - }, - "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, - "optional": true, - "requires": { - "scrypt": "^6.0.2", - "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, - "optional": true, - "requires": { - "pbkdf2": "^3.0.3" - } - }, - "secp256k1": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.5.2.tgz", - "integrity": "sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ==", - "requires": { - "bindings": "^1.2.1", - "bip66": "^1.1.3", - "bn.js": "^4.11.3", - "create-hash": "^1.1.2", - "drbg.js": "^1.0.1", - "elliptic": "^6.2.3", - "nan": "^2.2.1", - "safe-buffer": "^5.1.0" - } - }, - "seedrandom": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", - "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", - "dev": true - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.8.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 - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "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" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dev": true, - "requires": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - } - }, - "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, - "optional": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "sha3": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.2.tgz", - "integrity": "sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=", - "dev": true, - "requires": { - "nan": "2.10.0" - } - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "dev": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "solc": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.24.tgz", - "integrity": "sha512-2xd7Cf1HeVwrIb6Bu1cwY2/TaLRodrppCq3l7rhLimFQgmxptXhTC3+/wesVLpB09F1A2kZgvbMOgH7wvhFnBQ==", - "dev": true, - "requires": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", - "dev": true - }, - "sshpk": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", - "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stream-to-pull-stream": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.2.tgz", - "integrity": "sha1-dXYJrhzr0zx0MtSvvjH/eGULnd4=", - "dev": true, - "requires": { - "looper": "^3.0.0", - "pull-stream": "^3.2.3" - }, - "dependencies": { - "looper": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", - "integrity": "sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k=", - "dev": true - } - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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.5.0", - "function-bind": "^1.0.2" - } - }, - "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 - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "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.0" - } - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "optional": true, - "requires": { - "is-natural-number": "^4.0.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" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "swarm-js": { - "version": "0.1.37", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", - "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", - "dev": true, - "optional": true, - "requires": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "decompress": "^4.0.0", - "eth-lib": "^0.1.26", - "fs-extra": "^2.1.2", - "fs-promise": "^2.0.0", - "got": "^7.1.0", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar.gz": "^1.0.5", - "xhr-request-promise": "^0.1.2" - } - }, - "tape": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz", - "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==", - "dev": true, - "requires": { - "deep-equal": "~1.0.1", - "defined": "~1.0.0", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.2", - "has": "~1.0.3", - "inherits": "~2.0.3", - "minimist": "~1.2.0", - "object-inspect": "~1.6.0", - "resolve": "~1.7.1", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.1.2", - "through": "~2.3.8" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "tar": { - "version": "2.2.1", - "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "tar.gz": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", - "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", - "dev": true, - "optional": true, - "requires": { - "bluebird": "^2.9.34", - "commander": "^2.8.1", - "fstream": "^1.0.8", - "mout": "^0.11.0", - "tar": "^2.1.1" - }, - "dependencies": { - "bluebird": { - "version": "2.11.0", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true, - "optional": true - } - } - }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true - }, - "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 - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typewise": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz", - "integrity": "sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE=", - "dev": true, - "requires": { - "typewise-core": "^1.2.0" - } - }, - "typewise-core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz", - "integrity": "sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU=", - "dev": true - }, - "typewiselite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typewiselite/-/typewiselite-1.0.0.tgz", - "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=", - "dev": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "unbzip2-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz", - "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^3.0.1", - "through": "^2.3.6" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", - "dev": true, - "optional": true - }, - "buffer": { - "version": "3.6.0", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "dev": true, - "optional": true, - "requires": { - "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - } - } - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "unorm": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz", - "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=", - "dev": true - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true, - "optional": 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 - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "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.2.0" - } - }, - "web3": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.0.0-beta.35.tgz", - "integrity": "sha512-xwDmUhvTcHQvvNnOPcPZZgCxKUsI2e+GbHy7JkTK3/Rmnutazy8x7fsAXT9myw7V1qpi3GgLoZ3fkglSUbg1Mg==", - "dev": true, - "optional": true, - "requires": { - "web3-bzz": "1.0.0-beta.35", - "web3-core": "1.0.0-beta.35", - "web3-eth": "1.0.0-beta.35", - "web3-eth-personal": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35", - "web3-shh": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-bzz": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.0.0-beta.35.tgz", - "integrity": "sha512-BhAU0qhlr8zltm4gs/+P1gki2VkxHJaM2Rrh4DGesDW0lzwufRoNvWFlwx1bKHoFPWNbSmm9PRkHOYOINL/Tgw==", - "dev": true, - "optional": true, - "requires": { - "got": "7.1.0", - "swarm-js": "0.1.37", - "underscore": "1.8.3" - } - }, - "web3-core": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.0.0-beta.35.tgz", - "integrity": "sha512-ayGavbgVk4KL9Y88Uv411fBJ0SVgVfKhKEBweKYzmP0zOqneMzWt6YsyD1n6kRvjAbqA0AfUPEOKyMNjcx2tjw==", - "dev": true, - "requires": { - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-requestmanager": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-core-helpers": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.35.tgz", - "integrity": "sha512-APOu3sEsamyqWt//8o4yq9KF25/uqGm+pQShson/sC4gKzmfJB07fLo2ond0X30E8fIqAPeVCotPXQxGciGUmA==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-eth-iban": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-core-method": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.0.0-beta.35.tgz", - "integrity": "sha512-jidImCide8q0GpfsO4L73qoHrbkeWgwU3uOH5DKtJtv0ccmG086knNMRgryb/o9ZgetDWLmDEsJnHjBSoIwcbA==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-promievent": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-core-promievent": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.35.tgz", - "integrity": "sha512-GvqXqKq07OmHuVi5uNRg6k79a1/CI0ViCC+EtNv4CORHtDRmYEt5Bvdv6z6FJEiaaQkD0lKbFwNhLxutx7HItw==", - "dev": true, - "requires": { - "any-promise": "1.3.0", - "eventemitter3": "1.1.1" - } - }, - "web3-core-requestmanager": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.35.tgz", - "integrity": "sha512-S+zW2h17ZZQU9oe3yaCJE0E7aJS4C3Kf4kGPDv+nXjW0gKhQQhgVhw1Doq/aYQGqNSWJp7f1VHkz5gQWwg6RRg==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35", - "web3-providers-http": "1.0.0-beta.35", - "web3-providers-ipc": "1.0.0-beta.35", - "web3-providers-ws": "1.0.0-beta.35" - } - }, - "web3-core-subscriptions": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.35.tgz", - "integrity": "sha512-gXzLrWvcGkGiWq1y33Z4Y80XI8XMrwowiQJkrPSjQ81K5PBKquOGwcMffLaKcwdmEy/NpsOXDeFo3eLE1Ghvvw==", - "dev": true, - "requires": { - "eventemitter3": "1.1.1", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35" - } - }, - "web3-eth": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.0.0-beta.35.tgz", - "integrity": "sha512-04mcb2nGPXThawuuYICPOxv0xOHofvQKsjZeIq+89nyOC8DQMGTAErDkGyMHQYtjpth5XDhic0wuEsA80AmFZA==", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-eth-abi": "1.0.0-beta.35", - "web3-eth-accounts": "1.0.0-beta.35", - "web3-eth-contract": "1.0.0-beta.35", - "web3-eth-iban": "1.0.0-beta.35", - "web3-eth-personal": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-eth-abi": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.35.tgz", - "integrity": "sha512-KUDC+EtFFYG8z01ZleKrASdjj327/rtWHzEt6RWsEj7bBa0bGp9nEh+nqdZx/Sdgz1O8tnfFzJlrRcXpfr1vGg==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "web3-eth-accounts": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.35.tgz", - "integrity": "sha512-duIgRsfht/0kAW/eQ0X9lKtVIykbETrnM2H7EnvplCzPHtQLodpib4o9JXfh9n6ZDgdDC7cuJoiVB9QJg089ew==", - "dev": true, - "optional": true, - "requires": { - "any-promise": "1.3.0", - "crypto-browserify": "3.12.0", - "eth-lib": "0.2.7", - "scrypt.js": "0.2.0", - "underscore": "1.8.3", - "uuid": "2.0.1", - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - }, - "dependencies": { - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "optional": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "uuid": { - "version": "2.0.1", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", - "dev": true, - "optional": true - } - } - }, - "web3-eth-contract": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.35.tgz", - "integrity": "sha512-foPohOg5O1UCGKGZOIs+kQK5IZdV2QQ7pAWwNxH8WHplUA+fre1MurXNpoxknUmH6mYplFhXjqgYq2MsrBpHrA==", - "dev": true, - "optional": true, - "requires": { - "underscore": "1.8.3", - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-promievent": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-eth-abi": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-eth-iban": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.35.tgz", - "integrity": "sha512-H5wkcNcAIc+h/WoDIKv7ZYmrM2Xqu3O7jBQl1IWo73EDVQji+AoB2i3J8tuwI1yZRInRwrfpI3Zuwuf54hXHmQ==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "web3-utils": "1.0.0-beta.35" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - } - } - }, - "web3-eth-personal": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.35.tgz", - "integrity": "sha512-AcM9nnlxu7ZRRxPvkrFB9eLxMM4A2cPfj2aCg21Wb2EpMnhR+b/O1cT33k7ApRowoMpM+T9M8vx2oPNwXfaCOQ==", - "dev": true, - "requires": { - "web3-core": "1.0.0-beta.35", - "web3-core-helpers": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-net": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.0.0-beta.35.tgz", - "integrity": "sha512-bbwaQ/KohGjIJ6HAKbZ6KrklCAaG6/B7hIbAbVLSFLxF+Yz9lmAgQYaDInpidpC/NLb3WOmcbRF+P77J4qMVIA==", - "dev": true, - "requires": { - "web3-core": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-utils": "1.0.0-beta.35" - } - }, - "web3-provider-engine": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.1.0.tgz", - "integrity": "sha512-vGZtqhSUzGTiMGhJXNnB/aRDlrPZLhLnBZ2NPArkZtr8XSrwg9m08tw4+PuWg5za0TJuoE/vuPQc501HddZZWw==", - "dev": true, - "requires": { - "async": "^2.5.0", - "backoff": "^2.5.0", - "clone": "^2.0.0", - "cross-fetch": "^2.1.0", - "eth-block-tracker": "^3.0.0", - "eth-json-rpc-infura": "^3.1.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-block": "^1.2.2", - "ethereumjs-tx": "^1.2.0", - "ethereumjs-util": "^5.1.5", - "ethereumjs-vm": "^2.3.4", - "json-rpc-error": "^2.0.0", - "json-stable-stringify": "^1.0.1", - "promise-to-callback": "^1.0.0", - "readable-stream": "^2.2.9", - "request": "^2.85.0", - "semaphore": "^1.0.3", - "ws": "^5.1.1", - "xhr": "^2.2.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA=", - "dev": true, - "requires": { - "ethereumjs-util": "^5.1.1" - }, - "dependencies": { - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" - } - } - } - }, - "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", - "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "requires": { - "bn.js": "^4.10.0", - "ethereumjs-util": "^5.0.0" - } - }, - "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } - } - }, - "web3-providers-http": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.0.0-beta.35.tgz", - "integrity": "sha512-DcIMFq52Fb08UpWyZ3ZlES6NsNqJnco4hBS/Ej6eOcASfuUayPI+GLkYVZsnF3cBYqlH+DOKuArcKSuIxK7jIA==", - "dev": true, - "requires": { - "web3-core-helpers": "1.0.0-beta.35", - "xhr2-cookies": "1.1.0" - } - }, - "web3-providers-ipc": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.35.tgz", - "integrity": "sha512-iB0FG0HcpUnayfa8pn4guqEQ4Y1nrroi/jffdtQgFkrNt0sD3fMSwwC0AbmECqj3tDLl0e1slBR0RENll+ZF0g==", - "dev": true, - "requires": { - "oboe": "2.1.3", - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35" - } - }, - "web3-providers-ws": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.35.tgz", - "integrity": "sha512-Cx64NgDStynKaUGDIIOfaCd0fZusL8h5avKTkdTjUu2aHhFJhZoVBGVLhoDtUaqZGWIZGcBJOoVf2JkGUOjDRQ==", - "dev": true, - "requires": { - "underscore": "1.8.3", - "web3-core-helpers": "1.0.0-beta.35" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "websocket": { - "version": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "from": "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2", - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" - } - } - } - }, - "web3-shh": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.0.0-beta.35.tgz", - "integrity": "sha512-8qSonk/x0xabERS9Sr6AIADN/Ty+5KwARkkGIfSYHKqFpdMDz+76F7cUCxtoCZoS8K04xgZlDKYe0TJXLYA0Fw==", - "dev": true, - "optional": true, - "requires": { - "web3-core": "1.0.0-beta.35", - "web3-core-method": "1.0.0-beta.35", - "web3-core-subscriptions": "1.0.0-beta.35", - "web3-net": "1.0.0-beta.35" - } - }, - "web3-utils": { - "version": "1.0.0-beta.35", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.0.0-beta.35.tgz", - "integrity": "sha512-Dq6f0SOKj3BDFRgOPnE6ALbzBDCKVIW8mKWVf7tGVhTDHf+wQaWwQSC3aArFSqdExB75BPBPyDpuMTNszhljpA==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "eth-lib": "0.1.27", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randomhex": "0.1.5", - "underscore": "1.8.3", - "utf8": "2.1.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=", - "dev": true - }, - "utf8": { - "version": "2.1.1", - "resolved": "http://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", - "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", - "dev": true - } - } - }, - "websocket": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.26.tgz", - "integrity": "sha512-fjcrYDPIQxpTnqFQ9JjxUQcdvR89MFAOjPBlF+vjOt49w/XW4fJknUoMz/mDIn2eK1AdslVojcaOxOqyZZV8rw==", - "dev": true, - "requires": { - "debug": "^2.2.0", - "nan": "^2.3.3", - "typedarray-to-buffer": "^3.1.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "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" - } - } - } - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true - }, - "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": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "dev": true, - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dev": true, - "requires": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "xhr-request-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", - "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", - "dev": true, - "requires": { - "xhr-request": "^1.0.1" - } - }, - "xhr2-cookies": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", - "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", - "dev": true, - "requires": { - "cookiejar": "^2.1.1" - } - }, - "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 - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" - }, - "yargs": { - "version": "4.8.1", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "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.1", - "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": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "optional": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } - }, "get-caller-file": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "bundled": true, "dev": true }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "bundled": true, "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=", + "bundled": true, "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=", + "bundled": true, "dev": true }, "is-stream": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "bundled": true, "dev": true }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "bundled": true, "dev": true }, "lcid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "bundled": true, "dev": true, "requires": { "invert-kv": "^1.0.0" @@ -8875,8 +3479,7 @@ }, "locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "bundled": true, "dev": true, "requires": { "p-locate": "^2.0.0", @@ -8884,19 +3487,17 @@ } }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.4", + "bundled": true, "dev": true, "requires": { "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, "mem": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "bundled": true, "dev": true, "requires": { "mimic-fn": "^1.0.0" @@ -8904,14 +3505,12 @@ }, "mimic-fn": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "bundled": true, "dev": true }, "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=", + "bundled": true, "dev": true, "requires": { "path-key": "^2.0.0" @@ -8919,14 +3518,12 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "bundled": true, "dev": true }, "os-locale": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "bundled": true, "dev": true, "requires": { "execa": "^0.7.0", @@ -8936,14 +3533,12 @@ }, "p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "bundled": true, "dev": true }, "p-limit": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "bundled": true, "dev": true, "requires": { "p-try": "^1.0.0" @@ -8951,8 +3546,7 @@ }, "p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "bundled": true, "dev": true, "requires": { "p-limit": "^1.1.0" @@ -8960,50 +3554,42 @@ }, "p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "bundled": true, "dev": true }, "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "bundled": true, "dev": true }, "path-key": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "bundled": true, "dev": true }, "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "bundled": true, "dev": true }, "require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "bundled": true, "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=", + "bundled": true, "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=", + "bundled": true, "dev": true }, "shebang-command": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "bundled": true, "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -9011,26 +3597,22 @@ }, "shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "bundled": true, "dev": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true }, "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "bundled": true, "dev": true }, "source-map-support": { "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "bundled": true, "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -9039,8 +3621,7 @@ }, "string-width": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "bundled": true, "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -9049,8 +3630,7 @@ }, "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -9058,14 +3638,12 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "bundled": true, "dev": true }, "which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "bundled": true, "dev": true, "requires": { "isexe": "^2.0.0" @@ -9073,14 +3651,12 @@ }, "which-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "bundled": true, "dev": true }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "bundled": true, "dev": true, "requires": { "string-width": "^1.0.1", @@ -9089,14 +3665,12 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "bundled": true, "dev": true }, "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=", + "bundled": true, "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -9104,8 +3678,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -9115,8 +3688,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -9126,20 +3698,17 @@ }, "y18n": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "bundled": true, "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.0.2", + "bundled": true, "dev": true }, "yargs": { "version": "11.1.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "bundled": true, "dev": true, "requires": { "cliui": "^4.0.0", @@ -9158,8 +3727,7 @@ }, "yargs-parser": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "bundled": true, "dev": true, "requires": { "camelcase": "^4.1.0" @@ -9195,7 +3763,6 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9210,6 +3777,7 @@ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, + "optional": true, "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" @@ -9225,16 +3793,14 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==" }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "growl": { "version": "1.10.3", @@ -9258,13 +3824,20 @@ "dev": true, "requires": { "ansi-regex": "^2.0.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 + } } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.0", @@ -9342,9 +3915,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -9386,28 +3959,24 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -9419,56 +3988,36 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.0.4", + "external-editor": "^3.0.0", "figures": "^2.0.0", - "lodash": "^4.3.0", + "lodash": "^4.17.10", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", + "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "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 - }, - "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" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==" }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.0.0" } } } @@ -9495,14 +4044,14 @@ "dev": true }, "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -9547,7 +4096,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -9583,13 +4132,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true + "dev": true, + "optional": 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, + "optional": true, "requires": { "is-primitive": "^2.0.0" } @@ -9634,13 +4185,9 @@ } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "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=" }, "is-glob": { "version": "2.0.1", @@ -9656,6 +4203,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" } @@ -9687,19 +4235,20 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true + "dev": true, + "optional": 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 + "dev": true, + "optional": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-regex": { "version": "1.0.4", @@ -9752,28 +4301,22 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, + "optional": true, "requires": { "isarray": "1.0.0" } }, "js-sha3": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.3.1.tgz", - "integrity": "sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM=" - }, - "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 + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", + "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=" }, "js-stringify": { "version": "1.0.2", @@ -9782,16 +4325,14 @@ "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 + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9804,16 +4345,14 @@ "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 + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "json-stringify-safe": { "version": "5.0.1", @@ -9855,13 +4394,25 @@ "array-includes": "^3.0.3" } }, + "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.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, "keccakjs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", - "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", + "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", "requires": { - "browserify-sha3": "^0.0.1", - "sha3": "^1.1.0" + "browserify-sha3": "^0.0.4", + "sha3": "^1.2.2" } }, "kind-of": { @@ -9907,7 +4458,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -9947,8 +4497,7 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.assign": { "version": "4.2.0", @@ -9996,13 +4545,13 @@ } }, "lru-cache": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", - "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", - "yallist": "^3.0.2" + "yallist": "^2.1.2" } }, "map-cache": { @@ -10024,7 +4573,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true + "dev": true, + "optional": true }, "md5.js": { "version": "1.3.5", @@ -10062,6 +4612,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, + "optional": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -10081,8 +4632,7 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimalistic-assert": { "version": "1.0.1", @@ -10098,7 +4648,6 @@ "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.7" } @@ -10106,8 +4655,7 @@ "minimist": { "version": "0.0.8", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mixin-deep": { "version": "1.3.1", @@ -10134,7 +4682,6 @@ "version": "0.5.1", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -10192,6 +4739,12 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -10204,9 +4757,9 @@ } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz", + "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==", "dev": true }, "moment-timezone": { @@ -10219,16 +4772,14 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "nan": { "version": "2.10.0", @@ -10277,8 +4828,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "needle": { "version": "2.2.4", @@ -10289,8 +4839,30 @@ "debug": "^2.1.2", "iconv-lite": "^0.4.4", "sax": "^1.2.4" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -10348,8 +4920,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -10401,6 +4972,7 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, + "optional": true, "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" @@ -10427,7 +4999,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -10436,21 +5007,18 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } }, "openzeppelin-solidity": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-1.12.0.tgz", - "integrity": "sha512-WlorzMXIIurugiSdw121RVD5qA3EfSI7GybTn+/Du0mPNgairjt29NpVTAaH8eLjAeAwlw46y7uQKy0NYem/gA==" + "version": "github:OpenZeppelin/openzeppelin-solidity#4b8fcbcee16437d8a29bc0e5bb328b2a1547f996", + "from": "github:OpenZeppelin/openzeppelin-solidity#release-v2.1.0-solc-0.5" }, "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.4", @@ -10484,8 +5052,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "output-file-sync": { "version": "1.1.2", @@ -10528,11 +5095,18 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "parse-code-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-code-context/-/parse-code-context-1.0.0.tgz", + "integrity": "sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA==", + "optional": true + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, + "optional": true, "requires": { "glob-base": "^0.3.0", "is-dotfile": "^1.0.0", @@ -10573,20 +5147,17 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.6", @@ -10605,12 +5176,6 @@ "pinkie-promise": "^2.0.0" } }, - "pegjs": { - "version": "0.10.0", - "resolved": "http://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", - "dev": true - }, "pidusage": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pidusage/-/pidusage-1.2.0.tgz", @@ -10650,8 +5215,7 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, "pm2": { "version": "2.10.4", @@ -10690,6 +5254,12 @@ "yamljs": "^0.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=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -10848,7 +5418,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -10868,7 +5438,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -11082,6 +5652,12 @@ "to-regex": "^3.0.2" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "shelljs": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", @@ -11115,9 +5691,18 @@ "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", "dev": true }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } @@ -11143,12 +5728,6 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, @@ -11169,12 +5748,6 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, @@ -11218,12 +5791,6 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, @@ -11236,14 +5803,42 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "dev": true, + "optional": true + }, + "prettier": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.3.tgz", + "integrity": "sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==", + "optional": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "requires": { + "fast-diff": "^1.1.2" + } + }, + "prettier-plugin-solidity": { + "version": "1.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.0.0-alpha.12.tgz", + "integrity": "sha512-H5SqMHv1jttrm8h8JwVIm+f3BAXLGvqgxfXioUfPl7x0Rw+3KZaQ53bW2DBpJG7NefJxnUKq5dZrWZkclqp9AA==", + "optional": true, + "requires": { + "emoji-regex": "^7.0.1", + "escape-string-regexp": "^1.0.5", + "extract-comments": "^1.1.0", + "prettier": "^1.15.2", + "solidity-parser-antlr": "^0.3.1", + "string-width": "^2.1.1" + } }, "private": { "version": "0.1.8", @@ -11258,10 +5853,9 @@ "dev": true }, "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { "version": "7.3.1", @@ -11432,11 +6026,17 @@ "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=", "dev": true }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, + "optional": true, "requires": { "is-number": "^4.0.0", "kind-of": "^6.0.0", @@ -11447,13 +6047,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true + "dev": true, + "optional": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "optional": true } } }, @@ -11554,6 +6156,15 @@ } } }, + "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" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -11589,7 +6200,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -11609,7 +6220,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -11786,6 +6397,12 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -11826,6 +6443,7 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, + "optional": true, "requires": { "is-equal-shallow": "^0.1.3" } @@ -11841,14 +6459,13 @@ } }, "regexpp": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, "regexpu-core": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { @@ -11929,26 +6546,24 @@ "version": "1.0.3", "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, "requires": { "caller-path": "^0.1.0", "resolve-from": "^1.0.0" } }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" }, "resolve-url": { "version": "0.2.1", @@ -11960,7 +6575,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -11985,7 +6599,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -12000,9 +6613,9 @@ } }, "rlp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.1.0.tgz", - "integrity": "sha512-93U7IKH5j7nmXFVg19MeNBGzQW5uXW1pmCuKY8veeKIhYTE32C2d0mOegfiIAfXcHOKJjjPlJisn8iHDF5AezA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.1.tgz", + "integrity": "sha512-nqB/qy+YjXdp/zj1CjCiDwfLMBPv/XFDol0ir/7O/+Ix90++rvi+QoK1CDJcn8JoqCu2WrPPeRucu4qyIDzALg==", "requires": { "safe-buffer": "^5.1.1" } @@ -12011,7 +6624,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "^2.1.0" } @@ -12041,6 +6653,14 @@ "rx-lite": "*" } }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -12058,8 +6678,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sax": { "version": "1.2.4", @@ -12068,9 +6687,9 @@ "dev": true }, "secp256k1": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.5.2.tgz", - "integrity": "sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.6.0.tgz", + "integrity": "sha512-a+oKfu2XWhq6Zzj7TexlYpwdnCEtJUUdLaujUclplPkV+INdMaV9D+81wYldm/g4/2PTFoNYZf/+0rHhTPgzjQ==", "requires": { "bindings": "^1.2.1", "bip66": "^1.1.3", @@ -12085,8 +6704,7 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "set-blocking": { "version": "2.0.0", @@ -12138,7 +6756,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -12146,8 +6763,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { "version": "0.8.3", @@ -12169,8 +6785,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", @@ -12179,20 +6794,13 @@ "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", + "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.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 - } } }, "snapdragon": { @@ -12211,6 +6819,15 @@ "use": "^3.1.0" }, "dependencies": { + "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" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -12228,6 +6845,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -12303,18 +6926,6 @@ "kind-of": "^3.2.0" } }, - "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.1", - "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz", - "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=", - "dev": true - }, "solc": { "version": "0.4.25", "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.25.tgz", @@ -12325,209 +6936,159 @@ "memorystream": "^0.3.1", "require-from-string": "^1.1.0", "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "dependencies": { - "fs-extra": { - "version": "0.30.0", - "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "yargs": { - "version": "4.8.1", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true, - "requires": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "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.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - } - } - }, - "solc-cli": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/solc-cli/-/solc-cli-0.3.0.tgz", - "integrity": "sha1-1Xqpn7djSIa9tDFetlh0BDlhPQ8=", - "dev": true, - "requires": { - "babel-polyfill": "^6.9.1", - "cli": "^0.11.2", - "glob": "^7.0.3", - "mkdirp": "^0.5.1" - } - }, - "solium": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/solium/-/solium-1.1.8.tgz", - "integrity": "sha512-fn0lusM6of14CytIDDHK73SGjn6NsVTaCVJjaKCKJyqKhT00rH/hDtvnIeZ2ZTD9z/xaXd4Js2brW3az6AV9RA==", - "dev": true, - "requires": { - "ajv": "^5.2.2", - "chokidar": "^1.6.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "eol": "^0.9.1", - "js-string-escape": "^1.0.1", - "lodash": "^4.14.2", - "sol-digger": "0.0.2", - "sol-explore": "1.6.1", - "solium-plugin-security": "0.1.1", - "solparse": "2.2.5", - "text-table": "^0.2.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 - }, - "solparse": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", - "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", - "dev": true, - "requires": { - "mocha": "^4.0.1", - "pegjs": "^0.10.0", - "yargs": "^10.0.3" + "yargs": "^4.7.1" }, "dependencies": { "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=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "fs-extra": { + "version": "0.30.0", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "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": { - "locate-path": "^2.0.0" + "number-is-nan": "^1.0.0" } }, - "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 - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "graceful-fs": "^4.1.6" } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^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.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "version": "4.8.1", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "^4.0.0", + "cliui": "^3.2.0", "decamelize": "^1.1.1", - "find-up": "^2.1.0", "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "lodash.assign": "^4.0.3", + "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": "^2.0.0", - "which-module": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "yargs-parser": "^2.4.1" } - }, - "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" + } + } + }, + "solhint": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-1.5.0.tgz", + "integrity": "sha512-D4vmV9hlBRcBEdCap6kHUKtBOjKJbC6JhvsoGrcTKW6+WHRDkbpif35R1Enzd0+OvvIC2UReMwK85dSqrqUSoQ==", + "requires": { + "antlr4": "4.7.1", + "commander": "2.18.0", + "eslint": "^5.6.0", + "fast-diff": "^1.1.2", + "glob": "7.1.3", + "ignore": "^4.0.6", + "lodash": "^4.17.11", + "prettier": "^1.14.3", + "prettier-linter-helpers": "^1.0.0", + "prettier-plugin-solidity": "^1.0.0-alpha.4" + }, + "dependencies": { + "eslint": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.11.1.tgz", + "integrity": "sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.5.3", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "imurmurhash": "^0.1.4", + "inquirer": "^6.1.0", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.0.2", + "text-table": "^0.2.0" } } } }, + "solidity-parser-antlr": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/solidity-parser-antlr/-/solidity-parser-antlr-0.3.3.tgz", + "integrity": "sha512-RNUc18pjf7DLWs//WF+V+VnvrbetEbNFUYxm2JFbXU62G9WSu+nVyDxV5r+FG4wu8jom17vLdM/3I7bMBGfZ9g==", + "optional": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -12563,9 +7124,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -12589,9 +7150,9 @@ } }, "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "split-string": { @@ -12605,9 +7166,8 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "static-extend": { "version": "0.1.2", @@ -12631,14 +7191,12 @@ } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string_decoder": { @@ -12651,12 +7209,11 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^3.0.0" } }, "strip-bom": { @@ -12677,82 +7234,41 @@ "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=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz", + "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==", "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "2.0.0", "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "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 - }, - "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" - } - } } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "through": { "version": "2.3.8", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -12818,16 +7334,66 @@ "dev": true }, "truffle": { - "version": "5.0.0-beta.1", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.0.0-beta.1.tgz", - "integrity": "sha512-U9vNwUAX0kb+pgpUWsWDFQeU2XeCHYm4swVxQdRi37mDQCOedEVgiE+Lr87LNQMAIuAY+8sG/9KF7HwVks0ncQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-5.0.0.tgz", + "integrity": "sha512-la0TJu+E59Ut62i6cGY0sugeubglDqH5w49a7IrpxZ1nnsDqv6qWB3ibiyYiCp/jr+iI0bLtcr3DKkfQjVDd+g==", "dev": true, "requires": { + "app-module-path": "^2.2.0", "mocha": "^4.1.0", "original-require": "1.0.1", - "solc": "0.4.25" + "solc": "0.5.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "solc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.5.0.tgz", + "integrity": "sha512-mdLHDl9WeYrN+FIKcMc9PlPfnA9DG9ur5QpCDKcv6VC4RINAsTF4EMuXMZMKoQTvZhtLyJIVH/BZ+KU830Z8Xg==", + "dev": true, + "requires": { + "fs-extra": "^0.30.0", + "keccak": "^1.0.2", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "yargs": "^11.0.0" + } + } } }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, "tv4": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", @@ -12838,7 +7404,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, "requires": { "prelude-ls": "~1.1.2" } @@ -13009,6 +7574,14 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -13110,6 +7683,23 @@ "semver": "^5.0.1", "shimmer": "^1.0.0", "uuid": "^3.0.1" + }, + "dependencies": { + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "when": { @@ -13122,7 +7712,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -13160,8 +7749,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "wrap-ansi": { "version": "2.1.0", @@ -13171,19 +7759,54 @@ "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.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 + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, "requires": { "mkdirp": "^0.5.1" } @@ -13195,9 +7818,9 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yamljs": { @@ -13230,12 +7853,6 @@ "yargs-parser": "^9.0.2" }, "dependencies": { - "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", @@ -13262,12 +7879,6 @@ "locate-path": "^2.0.0" } }, - "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 - }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -13279,25 +7890,6 @@ "mem": "^1.1.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" - } - }, - "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" - } - }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", diff --git a/package.json b/package.json index d3a7696f..47e76e25 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@daostack/arc", - "version": "0.0.0-alpha.58", + "version": "0.0.1-rc.1", "description": "A platform for building DAOs", "files": [ "contracts/", @@ -20,7 +20,7 @@ "start": "pm2 start truffle -- serve", "lint": "eslint .", "lint --fix": "eslint --fix .", - "solium": "solium --dir ./contracts/", + "solhint": "solhint contracts/**/*.sol", "truffle": "truffle", "build": "rimraf build && truffle compile", "docs:update": "soldoc -q -o docs/generated_docs", @@ -52,10 +52,7 @@ "pug": "^2.0.0-rc.4", "rimraf": "^2.6.2", "run-with-ganache": "^0.1.1", - "solc": "^0.4.24", - "solc-cli": "^0.3.0", - "solium": "^1.1.8", - "truffle": "5.0.0-beta.1", + "truffle": "5.0.0", "uint32": "^0.2.1" }, "repository": { @@ -72,7 +69,7 @@ "arc" ], "engines": { - "node": ">=10.14.1" + "node": ">=10.14.2" }, "author": "DAOstack (https://www.daostack.io)", "license": "GPL-3.0", @@ -81,11 +78,12 @@ }, "homepage": "https://daostack.io", "dependencies": { - "@daostack/infra": "0.0.0-alpha.10", + "@daostack/infra": "^0.0.1-rc.3", "ethereumjs-abi": "^0.6.5", - "openzeppelin-solidity": "1.12.0" + "openzeppelin-solidity": "github:OpenZeppelin/openzeppelin-solidity#release-v2.1.0-solc-0.5", + "solhint": "^1.5.0" }, "peerDependencies": { - "ganache-cli": "^6.2.3" + "ganache-cli": "^6.2.5" } } diff --git a/test/auction4reputation.js b/test/auction4reputation.js index 9730d941..c757bf7a 100644 --- a/test/auction4reputation.js +++ b/test/auction4reputation.js @@ -2,7 +2,7 @@ const helpers = require('./helpers'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); const constants = require('./constants'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); var Auction4Reputation = artifacts.require("./Auction4Reputation.sol"); @@ -14,9 +14,10 @@ const setup = async function (accounts, _redeemEnableTime = 3000, _initialize = true) { var testSetup = new helpers.TestSetup(); - testSetup.biddingToken = await StandardTokenMock.new(accounts[0], web3.utils.toWei('100', "ether")); + testSetup.biddingToken = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); + testSetup.org = await helpers.setupOrganization(testSetup.daoCreator,accounts[0],1000,1000); testSetup.auctionsEndTime = (await web3.eth.getBlock("latest")).timestamp + _auctionsEndTime; testSetup.auctionsStartTime = (await web3.eth.getBlock("latest")).timestamp + _auctionsStartTime; diff --git a/test/avatar.js b/test/avatar.js index ed00bb76..4fcd2204 100644 --- a/test/avatar.js +++ b/test/avatar.js @@ -1,6 +1,6 @@ const helpers = require('./helpers'); const Avatar = artifacts.require("./Avatar.sol"); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const ActionMock = artifacts.require('./test/ActionMock.sol'); const UniversalSchemeMock = artifacts.require('./test/UniversalSchemeMock.sol'); @@ -81,7 +81,7 @@ contract('Avatar', accounts => { it("externalTokenTransfer ", async () => { avatar = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100); let balanceAvatar = await standardToken.balanceOf(avatar.address); assert.equal(balanceAvatar, 100); var tx = await avatar.externalTokenTransfer(standardToken.address,accounts[1],50); @@ -93,14 +93,14 @@ contract('Avatar', accounts => { assert.equal(balance1, 50); }); - it("externalTokenTransferFrom & externalTokenIncreaseApproval", async () => { + it("externalTokenTransferFrom & externalTokenApproval", async () => { var tx; var to = accounts[1]; avatar = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); - tx = await avatar.externalTokenIncreaseApproval(standardToken.address,avatar.address,50); + var standardToken = await ERC20Mock.new(avatar.address, 100); + tx = await avatar.externalTokenApproval(standardToken.address,avatar.address,50); assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "ExternalTokenIncreaseApproval"); + assert.equal(tx.logs[0].event, "ExternalTokenApproval"); tx = await avatar.externalTokenTransferFrom(standardToken.address,avatar.address,to,50); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "ExternalTokenTransferFrom"); @@ -109,31 +109,4 @@ contract('Avatar', accounts => { let balanceTo = await standardToken.balanceOf(to); assert.equal(balanceTo, 50); }); - - it("externalTokenTransferFrom & externalTokenDecreaseApproval", async () => { - var tx; - var to = accounts[1]; - avatar = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); - tx = await avatar.externalTokenIncreaseApproval(standardToken.address,avatar.address,50); - tx = await avatar.externalTokenDecreaseApproval(standardToken.address,avatar.address,50); - assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "ExternalTokenDecreaseApproval"); - try{ - await avatar.externalTokenTransferFrom(standardToken.address,avatar.address,to,50); - assert(false,"externalTokenTransferFrom should fail due to decrease approval "); - } - catch(ex){ - helpers.assertVMException(ex); - } - tx = await avatar.externalTokenIncreaseApproval(standardToken.address,avatar.address,50); - tx = await avatar.externalTokenTransferFrom(standardToken.address,avatar.address,to,50); - assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "ExternalTokenTransferFrom"); - let balanceAvatar = await standardToken.balanceOf(avatar.address); - assert.equal(balanceAvatar, 50); - let balanceTo = await standardToken.balanceOf(to); - assert.equal(balanceTo, 50); - }); - }); diff --git a/test/contributionreward.js b/test/contributionreward.js index 99ec4355..54cfe058 100644 --- a/test/contributionreward.js +++ b/test/contributionreward.js @@ -1,7 +1,7 @@ import * as helpers from './helpers'; const constants = require('./constants'); const ContributionReward = artifacts.require("./ContributionReward.sol"); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); const Avatar = artifacts.require("./Avatar.sol"); @@ -53,7 +53,7 @@ const setupContributionRewardParams = async function( var contributionRewardParams = new ContributionRewardParams(); contributionRewardParams.orgNativeTokenFee = orgNativeTokenFee; if (genesisProtocol === true) { - contributionRewardParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,avatar,0); + contributionRewardParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,avatar,helpers.NULL_ADDRESS); await contributionReward.setParameters( contributionRewardParams.orgNativeTokenFee, contributionRewardParams.votingMachine.params, @@ -62,7 +62,7 @@ const setupContributionRewardParams = async function( contributionRewardParams.votingMachine.params, contributionRewardParams.votingMachine.genesisProtocol.address); } else { - contributionRewardParams.votingMachine = await helpers.setupAbsoluteVote(true,50,contributionReward.address); + contributionRewardParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50,contributionReward.address); await contributionReward.setParameters(contributionRewardParams.orgNativeTokenFee, contributionRewardParams.votingMachine.params, contributionRewardParams.votingMachine.absoluteVote.address); @@ -76,7 +76,7 @@ const setupContributionRewardParams = async function( const setup = async function (accounts,orgNativeTokenFee=0,genesisProtocol = false,tokenAddress=0) { var testSetup = new helpers.TestSetup(); testSetup.fee = 10; - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); + testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); testSetup.contributionReward = await ContributionReward.new(); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); @@ -155,24 +155,9 @@ contract('ContributionReward', accounts => { assert.equal(balance.toNumber(),balanceBefore.toNumber()); }); - it("proposeContributionReward check owner vote", async() => { - var testSetup = await setup(accounts); - var periodLength = 1; - var tx = await testSetup.contributionReward.proposeContributionReward(testSetup.org.avatar.address, - web3.utils.asciiToHex("description"), - 0, - [0,0,0,periodLength,0], - testSetup.standardTokenMock.address, - accounts[0], - {from: web3.utils.toChecksumAddress(accounts[0])} - ); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.contributionRewardParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); - }); - it("proposeContributionReward check beneficiary==0", async() => { var testSetup = await setup(accounts); - var beneficiary = 0; + var beneficiary = helpers.NULL_ADDRESS; var periodLength = 1; var tx = await testSetup.contributionReward.proposeContributionReward(testSetup.org.avatar.address, web3.utils.asciiToHex("description"), @@ -196,7 +181,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var organizationProposal = await testSetup.contributionReward.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.notEqual(organizationProposal[8],0);//executionTime }); @@ -215,7 +200,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); tx = await testSetup.contributionReward.redeem(proposalId,testSetup.org.avatar.address,[true,false,false,false]); assert.equal(tx.logs.length, 1); @@ -240,7 +225,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); tx = await testSetup.contributionReward.redeem(proposalId,testSetup.org.avatar.address,[false,true,false,false]); var tokens = await testSetup.org.token.balanceOf(accounts[1]); @@ -266,7 +251,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); await testSetup.contributionReward.redeem(proposalId,testSetup.org.avatar.address,[false,false,true,false]); var eth = await web3.eth.getBalance(otherAvatar.address); @@ -295,7 +280,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); await testSetup.contributionReward.redeem(proposalId,testSetup.org.avatar.address,[false,false,false,true]); var tokens = await testSetup.standardTokenMock.balanceOf(otherAvatar.address); @@ -324,7 +309,7 @@ contract('ContributionReward', accounts => { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); var organizationProposal = await testSetup.contributionReward.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[5],otherAvatar.address);//beneficiary - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); try { await testSetup.contributionReward.redeem(proposalId,testSetup.org.avatar.address,[true,true,true,true]); @@ -354,7 +339,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); await checkRedeemedPeriods(testSetup,proposalId,0,0,0,0); @@ -452,7 +437,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.increaseTime(periodLength+1); tx = await testSetup.contributionReward.redeem(proposalId,testSetup.org.avatar.address,[true,false,false,false]); assert.equal(tx.logs.length, 1); @@ -512,7 +497,7 @@ contract('ContributionReward', accounts => { }); it("execute proposeContributionReward via genesisProtocol and redeem using Redeemer", async function() { - var standardTokenMock = await StandardTokenMock.new(accounts[0],1000); + var standardTokenMock = await ERC20Mock.new(accounts[0],1000); var testSetup = await setup(accounts,0,true,standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; @@ -529,17 +514,14 @@ contract('ContributionReward', accounts => { testSetup.standardTokenMock.address, otherAvatar.address ); - //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,{from:accounts[0]}); - + await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await helpers.increaseTime(periodLength+1); var arcUtils = await Redeemer.new(testSetup.contributionReward.address,testSetup.contributionRewardParams.votingMachine.genesisProtocol.address); - var redeemRewards = await arcUtils.redeem.call(proposalId,testSetup.org.avatar.address,accounts[0]); - assert.equal(redeemRewards[0][3],100); //redeemRewards[0] gpRewards - assert.equal(redeemRewards[0][4],61); + assert.equal(redeemRewards[0][1],100); //redeemRewards[0] gpRewards + assert.equal(redeemRewards[0][2],60); assert.equal(redeemRewards[1][0],0); //daoBountyRewards assert.equal(redeemRewards[1][1],0); //daoBountyRewards assert.equal(redeemRewards[2],false); //isExecuted @@ -558,12 +540,11 @@ contract('ContributionReward', accounts => { var reputation = await testSetup.org.reputation.balanceOf(accounts[0]); var reputationGainAsVoter = 0; var proposingRepRewardConstA=60; - var proposingRepRewardConstB=1; - var reputationGainAsProposer = (proposingRepRewardConstA*1000 + proposingRepRewardConstB*1000)/1000; + var reputationGainAsProposer = proposingRepRewardConstA; assert.equal(reputation, 1000+reputationGainAsVoter + reputationGainAsProposer); }); it("execute proposeContributionReward via genesisProtocol and redeem using Redeemer for negative proposal", async function() { - var standardTokenMock = await StandardTokenMock.new(accounts[0],1000); + var standardTokenMock = await ERC20Mock.new(accounts[0],1000); var testSetup = await setup(accounts,0,true,standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; @@ -582,7 +563,7 @@ contract('ContributionReward', accounts => { ); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,2,0,{from:accounts[0]}); + await testSetup.contributionRewardParams.votingMachine.genesisProtocol.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[0]}); await helpers.increaseTime(periodLength+1); var arcUtils = await Redeemer.new(testSetup.contributionReward.address,testSetup.contributionRewardParams.votingMachine.genesisProtocol.address); await arcUtils.redeem(proposalId,testSetup.org.avatar.address,accounts[0]); @@ -625,6 +606,7 @@ contract('ContributionReward', accounts => { //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + await testSetup.contributionRewardParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); tx = await testSetup.contributionReward.redeem(proposalId,testSetup.org.avatar.address,[true,false,false,false]); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "RedeemReputation"); diff --git a/test/controller.js b/test/controller.js index 52787b7e..2661df4d 100644 --- a/test/controller.js +++ b/test/controller.js @@ -5,7 +5,7 @@ const Avatar = artifacts.require("./Avatar.sol"); const DAOToken = artifacts.require("./DAOToken.sol"); const GlobalConstraintMock = artifacts.require('./test/GlobalConstraintMock.sol'); const ActionMock = artifacts.require('./test/ActionMock.sol'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); var constants = require('../test/constants'); @@ -378,7 +378,7 @@ contract('Controller', accounts => { it("externalTokenTransfer", async () => { //External transfer token from avatar contract to other address controller = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100); let balanceAvatar = await standardToken.balanceOf(avatar.address); assert.equal(balanceAvatar, 100); await avatar.transferOwnership(controller.address); @@ -397,20 +397,20 @@ contract('Controller', accounts => { assert.equal(balance1, 50); }); - it("externalTokenTransferFrom & ExternalTokenIncreaseApproval", async () => { + it("externalTokenTransferFrom & ExternalTokenApproval", async () => { var tx; var to = accounts[1]; controller = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100); await avatar.transferOwnership(controller.address); - tx = await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - await avatar.getPastEvents('ExternalTokenIncreaseApproval', { + tx = await controller.externalTokenApproval(standardToken.address,avatar.address,50,avatar.address); + await avatar.getPastEvents('ExternalTokenApproval', { filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 fromBlock: tx.blockNumber, toBlock: 'latest' }) .then(function(events){ - assert.equal(events[0].event,"ExternalTokenIncreaseApproval"); + assert.equal(events[0].event,"ExternalTokenApproval"); }); tx = await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); await avatar.getPastEvents('ExternalTokenTransferFrom', { @@ -427,46 +427,6 @@ contract('Controller', accounts => { assert.equal(balanceTo, 50); }); - it("externalTokenTransferFrom & externalTokenDecreaseApproval", async () => { - var tx; - var to = accounts[1]; - controller = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); - await avatar.transferOwnership(controller.address); - await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - tx = await controller.externalTokenDecreaseApproval(standardToken.address,avatar.address,50,avatar.address); - await avatar.getPastEvents('ExternalTokenDecreaseApproval', { - filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 - fromBlock: tx.blockNumber, - toBlock: 'latest' - }) - .then(function(events){ - assert.equal(events[0].event,"ExternalTokenDecreaseApproval"); - }); - try{ - await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - assert(false,"externalTokenTransferFrom should fail due to decrease approval "); - } - catch(ex){ - helpers.assertVMException(ex); - } - await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - tx= await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - await avatar.getPastEvents('ExternalTokenTransferFrom', { - filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 - fromBlock: tx.blockNumber, - toBlock: 'latest' - }) - .then(function(events){ - assert.equal(events[0].event,"ExternalTokenTransferFrom"); - }); - let balanceAvatar = await standardToken.balanceOf(avatar.address); - assert.equal(balanceAvatar, 50); - let balanceTo = await standardToken.balanceOf(to); - assert.equal(balanceTo, 50); - }); - - it("globalConstraints mintReputation add & remove", async () => { await setup(accounts); var globalConstraints = await constraint("mintReputation"); @@ -593,7 +553,7 @@ contract('Controller', accounts => { it("globalConstraints externalTokenTransfer add & remove", async () => { controller = await setup(accounts); var globalConstraints = await constraint("externalTokenTransfer"); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100); let balanceAvatar = await standardToken.balanceOf(avatar.address); assert.equal(balanceAvatar, 100); await avatar.transferOwnership(controller.address); @@ -632,17 +592,17 @@ contract('Controller', accounts => { }); - it("globalConstraints externalTokenTransferFrom , externalTokenIncreaseApproval , externalTokenDecreaseApproval", async () => { + it("globalConstraints externalTokenTransferFrom , externalTokenApproval", async () => { var tx; var to = accounts[1]; controller = await setup(accounts); - var globalConstraints = await constraint("externalTokenIncreaseApproval"); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var globalConstraints = await constraint("externalTokenApproval"); + var standardToken = await ERC20Mock.new(avatar.address, 100); await avatar.transferOwnership(controller.address); try { - await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - assert(false,"externalTokenIncreaseApproval should fail due to the global constraint "); + await controller.externalTokenApproval(standardToken.address,avatar.address,50,avatar.address); + assert(false,"externalTokenApproval should fail due to the global constraint "); } catch(ex){ helpers.assertVMException(ex); @@ -651,14 +611,14 @@ contract('Controller', accounts => { var globalConstraintsCount =await controller.globalConstraintsCount(avatar.address); assert.equal(globalConstraintsCount[0],0); - tx = await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - await avatar.getPastEvents('ExternalTokenIncreaseApproval', { + tx = await controller.externalTokenApproval(standardToken.address,avatar.address,50,avatar.address); + await avatar.getPastEvents('ExternalTokenApproval', { filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 fromBlock: tx.blockNumber, toBlock: 'latest' }) .then(function(events){ - assert.equal(events[0].event,"ExternalTokenIncreaseApproval"); + assert.equal(events[0].event,"ExternalTokenApproval"); }); globalConstraints = await constraint("externalTokenTransferFrom"); try { @@ -671,39 +631,6 @@ contract('Controller', accounts => { await controller.removeGlobalConstraint(globalConstraints.address,avatar.address); globalConstraintsCount =await controller.globalConstraintsCount(avatar.address); assert.equal(globalConstraintsCount[0],0); - - globalConstraints = await constraint("externalTokenDecreaseApproval"); - try { - await controller.externalTokenDecreaseApproval(standardToken.address,avatar.address,50,avatar.address); - assert(false,"externalTokenDecreaseApproval should fail due to the global constraint "); - } - catch(ex){ - helpers.assertVMException(ex); - } - await controller.removeGlobalConstraint(globalConstraints.address,avatar.address); - await controller.externalTokenDecreaseApproval(standardToken.address,avatar.address,50,avatar.address); - try { - await await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - assert(false,"externalTokenTransferFrom should fail due to decrease approval "); - } - catch(ex){ - helpers.assertVMException(ex); - } - - await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - tx = await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - await avatar.getPastEvents('ExternalTokenTransferFrom', { - filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 - fromBlock: tx.blockNumber, - toBlock: 'latest' - }) - .then(function(events){ - assert.equal(events[0].event,"ExternalTokenTransferFrom"); - }); - let balanceAvatar = await standardToken.balanceOf(avatar.address); - assert.equal(balanceAvatar, 50); - let balanceTo = await standardToken.balanceOf(to); - assert.equal(balanceTo, 50); }); diff --git a/test/daocreator.js b/test/daocreator.js index 443ba11f..097eb914 100644 --- a/test/daocreator.js +++ b/test/daocreator.js @@ -6,7 +6,7 @@ const DaoCreator = artifacts.require("./DaoCreator.sol"); const Avatar = artifacts.require("./Avatar.sol"); const Controller = artifacts.require("./Controller.sol"); const UController = artifacts.require("./UController.sol"); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const UniversalSchemeMock = artifacts.require('./test/UniversalSchemeMock.sol'); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); @@ -15,7 +15,7 @@ var avatar,token,reputation,daoCreator,uController,controllerCreator; const setup = async function (accounts,founderToken,founderReputation,useUController=false,cap=0) { controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); - var uControllerAddress = 0; + var uControllerAddress = helpers.NULL_ADDRESS; if (useUController){ uController = await UController.new({gas:constants.ARC_GAS_LIMIT}); uControllerAddress = uController.address; @@ -107,7 +107,7 @@ contract('DaoCreator', function(accounts) { it("setSchemes increase approval for scheme and register org in scheme", async function() { var amountToMint = 10; await setup(accounts,amountToMint,amountToMint); - var standardTokenMock = await StandardTokenMock.new(avatar.address, 100); + var standardTokenMock = await ERC20Mock.new(avatar.address, 100); var universalSchemeMock = await UniversalSchemeMock.new(); var allowance = await standardTokenMock.allowance(avatar.address,universalSchemeMock.address); assert.equal(allowance,0); @@ -119,7 +119,7 @@ contract('DaoCreator', function(accounts) { it("setSchemes increase approval for scheme without fee", async function() { var amountToMint = 10; await setup(accounts,amountToMint,amountToMint); - var standardTokenMock = await StandardTokenMock.new(accounts[0], 100); + var standardTokenMock = await ERC20Mock.new(accounts[0], 100); var allowance = await standardTokenMock.allowance(avatar.address,accounts[1]); assert.equal(allowance,0); @@ -225,7 +225,7 @@ contract('DaoCreator', function(accounts) { it("setSchemes with universal controller increase approval for scheme and register org in scheme", async function() { var amountToMint = 10; await setup(accounts,amountToMint,amountToMint,true); - var standardTokenMock = await StandardTokenMock.new(avatar.address, 100); + var standardTokenMock = await ERC20Mock.new(avatar.address, 100); var universalSchemeMock = await UniversalSchemeMock.new(); var allowance = await standardTokenMock.allowance(avatar.address,universalSchemeMock.address); assert.equal(allowance,0); @@ -238,7 +238,7 @@ contract('DaoCreator', function(accounts) { it("setSchemes with universal controller increase approval for scheme without fee", async function() { var amountToMint = 10; await setup(accounts,amountToMint,amountToMint,true); - var standardTokenMock = await StandardTokenMock.new(accounts[0], 100); + var standardTokenMock = await ERC20Mock.new(accounts[0], 100); var allowance = await standardTokenMock.allowance(avatar.address,accounts[1]); assert.equal(allowance,0); @@ -290,9 +290,9 @@ contract('DaoCreator', function(accounts) { var amountToMint = 10; var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); - var uControllerAddress = 0; + var uControllerAddress = helpers.NULL_ADDRESS; try { - await daoCreator.forgeOrg("testOrg","TEST","TST",[accounts[0]],[amountToMint],[],uControllerAddress,0,{gas:constants.ARC_GAS_LIMIT}); + await daoCreator.forgeOrg("testOrg","TEST","TST",[accounts[0]],[amountToMint],[],uControllerAddress,helpers.NULL_ADDRESS,{gas:constants.ARC_GAS_LIMIT}); assert(false,"should revert because reputation array size is 0"); } catch(ex){ @@ -300,7 +300,7 @@ contract('DaoCreator', function(accounts) { } try { - await daoCreator.forgeOrg("testOrg","TEST","TST",[accounts[0],0],[amountToMint,amountToMint],[amountToMint,amountToMint],uControllerAddress,0,{gas:constants.ARC_GAS_LIMIT}); + await daoCreator.forgeOrg("testOrg","TEST","TST",[accounts[0],helpers.NULL_ADDRESS],[amountToMint,amountToMint],[amountToMint,amountToMint],uControllerAddress,0,{gas:constants.ARC_GAS_LIMIT}); assert(false,"should revert because account is 0"); } catch(ex){ diff --git a/test/daotoken.js b/test/daotoken.js index 135e604b..4300c66b 100644 --- a/test/daotoken.js +++ b/test/daotoken.js @@ -61,15 +61,15 @@ contract('DAOToken', accounts => { assert.equal(totalSupply.toNumber(), newSupply.toNumber()); }); - it("log the Mint event on mint", async () => { + it("log the Transfer event on mint", async () => { const token = await DAOToken.new(testTokenName,testTokenSymbol,0); const tx = await token.mint(accounts[1], 1000, { from: accounts[0] }); - assert.equal(tx.logs.length, 2); - assert.equal(tx.logs[0].event, "Mint"); + assert.equal(tx.logs.length, 1); + assert.equal(tx.logs[0].event, "Transfer"); assert.equal(tx.logs[0].args.to, accounts[1]); - assert.equal(tx.logs[0].args.amount.toNumber(), 1000); + assert.equal(tx.logs[0].args.value.toNumber(), 1000); }); it("mint should be reflected in totalSupply", async () => { diff --git a/test/forwarder.js b/test/forwarder.js index 080164af..64ee5e0e 100644 --- a/test/forwarder.js +++ b/test/forwarder.js @@ -2,7 +2,7 @@ const helpers = require('./helpers'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); const constants = require('./constants'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); var Forwarder = artifacts.require("./Forwarder.sol"); var ControllerInterface = artifacts.require("./ControllerInterface.sol"); @@ -10,7 +10,7 @@ const setup = async function (accounts, _expirationTime = 300) { var testSetup = new helpers.TestSetup(); - testSetup.biddingToken = await StandardTokenMock.new(accounts[0], web3.utils.toWei('100', "ether")); + testSetup.biddingToken = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); testSetup.org = await helpers.setupOrganization(testSetup.daoCreator,accounts[0],1000,1000); diff --git a/test/genericscheme.js b/test/genericscheme.js index cf6c411e..f920e942 100644 --- a/test/genericscheme.js +++ b/test/genericscheme.js @@ -4,7 +4,7 @@ const AbsoluteVote = artifacts.require('./AbsoluteVote.sol'); const GenericScheme = artifacts.require('./GenericScheme.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); -const StandardTokenMock = artifacts.require("./StandardTokenMock.sol"); +const ERC20Mock = artifacts.require("./ERC20Mock.sol"); const ActionMock = artifacts.require("./ActionMock.sol"); @@ -23,12 +23,12 @@ const setupGenericSchemeParams = async function( ) { var genericSchemeParams = new GenericSchemeParams(); if (genesisProtocol === true){ - genericSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,tokenAddress,0,0); + genericSchemeParams.votingMachine = await helpers.setupGenesisProtocol(accounts,tokenAddress,0,helpers.NULL_ADDRESS); await genericScheme.setParameters(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.genesisProtocol.address,contractToCall); genericSchemeParams.paramsHash = await genericScheme.getParametersHash(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.genesisProtocol.address,contractToCall); } else { - genericSchemeParams.votingMachine = await helpers.setupAbsoluteVote(true,50,genericScheme.address); + genericSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50,genericScheme.address); await genericScheme.setParameters(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.absoluteVote.address,contractToCall); genericSchemeParams.paramsHash = await genericScheme.getParametersHash(genericSchemeParams.votingMachine.params,genericSchemeParams.votingMachine.absoluteVote.address,contractToCall); } @@ -38,7 +38,7 @@ const setupGenericSchemeParams = async function( const setup = async function (accounts,contractToCall = 0,reputationAccount=0,genesisProtocol = false,tokenAddress=0) { var testSetup = new helpers.TestSetup(); - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); + testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); testSetup.genericScheme = await GenericScheme.new(); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); @@ -97,7 +97,7 @@ contract('genericScheme', function(accounts) { var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock); var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]}); + await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal.callData,null); @@ -111,7 +111,7 @@ contract('genericScheme', function(accounts) { var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); var organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],callData); - await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.genericScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal.callData,null);//new contract address @@ -120,11 +120,11 @@ contract('genericScheme', function(accounts) { it("execute proposeVote -positive decision - check action", async function() { var actionMock =await ActionMock.new(); var testSetup = await setup(accounts,actionMock.address); - var callData = await createCallToActionMock(0,actionMock); + var callData = await createCallToActionMock(helpers.NULL_ADDRESS,actionMock); var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); try { - await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert(false, "should revert in actionMock because msg.sender is not the _addr param at actionMock"); } catch(error) { helpers.assertVMException(error); @@ -138,19 +138,19 @@ contract('genericScheme', function(accounts) { var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,encodeABI); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.genericSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); }); it("execute proposeVote -positive decision - check action - with GenesisProtocol", async function() { var actionMock =await ActionMock.new(); - var standardTokenMock = await StandardTokenMock.new(accounts[0],1000); + var standardTokenMock = await ERC20Mock.new(accounts[0],1000); var testSetup = await setup(accounts,actionMock.address,0,true,standardTokenMock.address); var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock); var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,{from:accounts[2]}); + tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.genericScheme.getPastEvents('ProposalExecuted', { fromBlock: tx.blockNumber, toBlock: 'latest' @@ -163,13 +163,13 @@ contract('genericScheme', function(accounts) { it("execute proposeVote -negative decision - check action - with GenesisProtocol", async function() { var actionMock =await ActionMock.new(); - var standardTokenMock = await StandardTokenMock.new(accounts[0],1000); + var standardTokenMock = await ERC20Mock.new(accounts[0],1000); var testSetup = await setup(accounts,actionMock.address,0,true,standardTokenMock.address); var callData = await createCallToActionMock(testSetup.org.avatar.address,actionMock); var tx = await testSetup.genericScheme.proposeCall(testSetup.org.avatar.address,callData); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,2,0,{from:accounts[2]}); + tx = await testSetup.genericSchemeParams.votingMachine.genesisProtocol.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.genericScheme.getPastEvents('ProposalExecuted', { fromBlock: tx.blockNumber, toBlock: 'latest' diff --git a/test/globalconstraintregistrar.js b/test/globalconstraintregistrar.js index 1760ed1c..039f8275 100644 --- a/test/globalconstraintregistrar.js +++ b/test/globalconstraintregistrar.js @@ -4,7 +4,7 @@ const GlobalConstraintRegistrar = artifacts.require("./GlobalConstraintRegistrar const GlobalConstraintMock = artifacts.require('./test/GlobalConstraintMock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const Controller = artifacts.require("./Controller.sol"); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); @@ -23,13 +23,13 @@ const setupGlobalConstraintRegistrarParams = async function( ) { var globalConstraintRegistrarParams = new GlobalConstraintRegistrarParams(); if (genesisProtocol === true) { - globalConstraintRegistrarParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,0,0); + globalConstraintRegistrarParams.votingMachine = await helpers.setupGenesisProtocol(accounts,token,0,helpers.NULL_ADDRESS); await globalConstraintRegistrar.setParameters(globalConstraintRegistrarParams.votingMachine.params, globalConstraintRegistrarParams.votingMachine.genesisProtocol.address); globalConstraintRegistrarParams.paramsHash = await globalConstraintRegistrar.getParametersHash(globalConstraintRegistrarParams.votingMachine.params, globalConstraintRegistrarParams.votingMachine.genesisProtocol.address); } else { - globalConstraintRegistrarParams.votingMachine = await helpers.setupAbsoluteVote(true,50,globalConstraintRegistrar.address); + globalConstraintRegistrarParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50,globalConstraintRegistrar.address); await globalConstraintRegistrar.setParameters(globalConstraintRegistrarParams.votingMachine.params, globalConstraintRegistrarParams.votingMachine.absoluteVote.address); globalConstraintRegistrarParams.paramsHash = await globalConstraintRegistrar.getParametersHash(globalConstraintRegistrarParams.votingMachine.params, @@ -74,7 +74,7 @@ contract('GlobalConstraintRegistrar', accounts => { "0x1234", "0x1235"); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var voteToRemoveParams = await testSetup.globalConstraintRegistrar.voteToRemoveParams(testSetup.org.avatar.address, globalConstraintMock.address); assert.equal(voteToRemoveParams, "0x1235000000000000000000000000000000000000000000000000000000000000"); }); @@ -104,43 +104,88 @@ contract('GlobalConstraintRegistrar', accounts => { assert.equal(tx.logs[0].event, "NewGlobalConstraintsProposal"); }); - it("proposeGlobalConstraint check owner vote", async function() { + it("execute proposeGlobalConstraint ", async function() { + var testSetup = await setup(accounts); + var controller = await Controller.at(await testSetup.org.avatar.owner()); + var globalConstraintMock = await GlobalConstraintMock.new(); + await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); + + + + var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, + globalConstraintMock.address, + "0x1234", + testSetup.globalConstraintRegistrarParams.votingMachine.params); + assert.equal(tx.logs.length, 1); + assert.equal(tx.logs[0].event, "NewGlobalConstraintsProposal"); + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + let gcCount = await controller.globalConstraintsCount(testSetup.org.avatar.address); + assert.equal(gcCount[0],0); + assert.equal(gcCount[1],0); + tx = await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + gcCount = await controller.globalConstraintsCount(testSetup.org.avatar.address); + assert.equal(gcCount[0],1); + }); + + it("proposeToRemoveGC log", async function() { + var testSetup = await setup(accounts); + var globalConstraintMock =await GlobalConstraintMock.new(); + await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); + + var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, + globalConstraintMock.address, + "0x1234", + testSetup.globalConstraintRegistrarParams.votingMachine.params); + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, + globalConstraintMock.address); + assert.equal(tx.logs.length, 1); + assert.equal(tx.logs[0].event, "RemoveGlobalConstraintsProposal"); + }); + + + it("proposeToRemoveGC without registration -should fail", async function() { + var testSetup = await setup(accounts,false); + var globalConstraintMock =await GlobalConstraintMock.new(); + try{ + await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, + globalConstraintMock.address, + ); + assert(false,"proposeGlobalConstraint should fail - due to no registration !"); + }catch(ex){ + helpers.assertVMException(ex); + } + }); + + it("execute proposeToRemoveGC ", async function() { var testSetup = await setup(accounts); + var controller = await Controller.at(await testSetup.org.avatar.owner()); var globalConstraintMock =await GlobalConstraintMock.new(); + await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, globalConstraintMock.address, "0x1234", - "0x1234"); + testSetup.globalConstraintRegistrarParams.votingMachine.params); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); + await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + assert.equal(await controller.isGlobalConstraintRegistered(globalConstraintMock.address,testSetup.org.avatar.address),true); + tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, + globalConstraintMock.address); + assert.equal(tx.logs.length, 1); + assert.equal(tx.logs[0].event, "RemoveGlobalConstraintsProposal"); + proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + let count = await controller.globalConstraintsCount(testSetup.org.avatar.address); + assert.equal(count[0],1); + await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + count = await controller.globalConstraintsCount(testSetup.org.avatar.address); + assert.equal(count[0],0); }); - it("execute proposeGlobalConstraint ", async function() { + it("execute proposeToRemoveGC (same as proposeGlobalConstraint) vote=NO ", async function() { var testSetup = await setup(accounts); var controller = await Controller.at(await testSetup.org.avatar.owner()); - var globalConstraintMock = await GlobalConstraintMock.new(); - await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); - - - - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, - globalConstraintMock.address, - "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); - assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "NewGlobalConstraintsProposal"); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - let gcCount = await controller.globalConstraintsCount(testSetup.org.avatar.address); - assert.equal(gcCount[0],0); - assert.equal(gcCount[1],0); - tx = await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - gcCount = await controller.globalConstraintsCount(testSetup.org.avatar.address); - assert.equal(gcCount[0],1); - }); - - it("proposeToRemoveGC log", async function() { - var testSetup = await setup(accounts); var globalConstraintMock =await GlobalConstraintMock.new(); await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); @@ -149,113 +194,38 @@ contract('GlobalConstraintRegistrar', accounts => { "0x1234", testSetup.globalConstraintRegistrarParams.votingMachine.params); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, - globalConstraintMock.address); - assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "RemoveGlobalConstraintsProposal"); - }); - - - it("proposeToRemoveGC without registration -should fail", async function() { - var testSetup = await setup(accounts,false); - var globalConstraintMock =await GlobalConstraintMock.new(); - try{ - await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, - globalConstraintMock.address, - ); - assert(false,"proposeGlobalConstraint should fail - due to no registration !"); - }catch(ex){ - helpers.assertVMException(ex); - } - }); - - it("proposeToRemoveGC check owner vote", async function() { - var testSetup = await setup(accounts); - var globalConstraintMock =await GlobalConstraintMock.new(); - await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); - - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, - globalConstraintMock.address, - "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, - globalConstraintMock.address, - ); - proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); - }); - - it("execute proposeToRemoveGC ", async function() { - var testSetup = await setup(accounts); - var controller = await Controller.at(await testSetup.org.avatar.owner()); - var globalConstraintMock =await GlobalConstraintMock.new(); - await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); - - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, - globalConstraintMock.address, - "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - assert.equal(await controller.isGlobalConstraintRegistered(globalConstraintMock.address,testSetup.org.avatar.address),true); - tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, - globalConstraintMock.address); - assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "RemoveGlobalConstraintsProposal"); - proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - let count = await controller.globalConstraintsCount(testSetup.org.avatar.address); - assert.equal(count[0],1); - await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - count = await controller.globalConstraintsCount(testSetup.org.avatar.address); - assert.equal(count[0],0); - }); - - it("execute proposeToRemoveGC (same as proposeGlobalConstraint) vote=NO ", async function() { - var testSetup = await setup(accounts); - var controller = await Controller.at(await testSetup.org.avatar.owner()); - var globalConstraintMock =await GlobalConstraintMock.new(); - await globalConstraintMock.setConstraint(web3.utils.asciiToHex("method"),false,false); - - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, - globalConstraintMock.address, - "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]}); - let count = await controller.globalConstraintsCount(testSetup.org.avatar.address); - assert.equal(count[0],0); - }); - - - - - it("proposeToRemoveGC with genesis protocol", async function() { - var standardTokenMock = await StandardTokenMock.new(accounts[0],1000); - var testSetup = await setup(accounts,true,standardTokenMock.address); - var globalConstraintMock =await GlobalConstraintMock.new(); - //genesisProtocol use burn reputation. - await globalConstraintMock.setConstraint(web3.utils.asciiToHex("burnReputation"),true,true); - - var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, - globalConstraintMock.address, - "0x1234", - testSetup.globalConstraintRegistrarParams.votingMachine.params); - - - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,{from:accounts[2]}); - - tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, - globalConstraintMock.address, - ); - proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - var rep = await testSetup.org.reputation.balanceOf(accounts[2]); - - await testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,{from:accounts[2]}); - await helpers.checkVoteInfo(testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol,proposalId,accounts[2],[1,rep.toNumber()]); - }); + await testSetup.globalConstraintRegistrarParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + let count = await controller.globalConstraintsCount(testSetup.org.avatar.address); + assert.equal(count[0],0); + }); + + + + + it("proposeToRemoveGC with genesis protocol", async function() { + var standardTokenMock = await ERC20Mock.new(accounts[0],1000); + var testSetup = await setup(accounts,true,standardTokenMock.address); + var globalConstraintMock =await GlobalConstraintMock.new(); + //genesisProtocol use burn reputation. + await globalConstraintMock.setConstraint(web3.utils.asciiToHex("burnReputation"),true,true); + + var tx = await testSetup.globalConstraintRegistrar.proposeGlobalConstraint(testSetup.org.avatar.address, + globalConstraintMock.address, + "0x1234", + testSetup.globalConstraintRegistrarParams.votingMachine.params); + + + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + await testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + + tx = await testSetup.globalConstraintRegistrar.proposeToRemoveGC(testSetup.org.avatar.address, + globalConstraintMock.address, + ); + proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + var rep = await testSetup.org.reputation.balanceOf(accounts[2]); + + await testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + await helpers.checkVoteInfo(testSetup.globalConstraintRegistrarParams.votingMachine.genesisProtocol,proposalId,accounts[2],[1,rep.toNumber()]); + }); }); diff --git a/test/helpers.js b/test/helpers.js index aea11581..2b968ca1 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -9,13 +9,12 @@ const AbsoluteVote = artifacts.require("./AbsoluteVote.sol"); const constants = require('./constants'); const GenesisProtocol = artifacts.require("./GenesisProtocol.sol"); - +export const MAX_UINT_256 = '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; export const NULL_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000'; export const SOME_HASH = '0x1000000000000000000000000000000000000000000000000000000000000000'; export const NULL_ADDRESS = '0x0000000000000000000000000000000000000000'; export const SOME_ADDRESS = '0x1000000000000000000000000000000000000000'; - export class TestSetup { constructor() { } @@ -121,12 +120,12 @@ export function assertJump(error) { assert.isAbove(error.message.search('invalid JUMP'), -1, 'Invalid JUMP error must be returned' + error.message); } -export const setupAbsoluteVote = async function (isOwnedVote=true, precReq=50 ) { +export const setupAbsoluteVote = async function (voteOnBehalf=NULL_ADDRESS, precReq=50 ) { var votingMachine = new VotingMachine(); votingMachine.absoluteVote = await AbsoluteVote.new(); // register some parameters - await votingMachine.absoluteVote.setParameters( precReq, isOwnedVote); - votingMachine.params = await votingMachine.absoluteVote.getParametersHash( precReq, isOwnedVote); + await votingMachine.absoluteVote.setParameters( precReq, voteOnBehalf); + votingMachine.params = await votingMachine.absoluteVote.getParametersHash( precReq, voteOnBehalf); return votingMachine; }; @@ -134,21 +133,18 @@ export const setupGenesisProtocol = async function ( accounts, token, avatar, - voteOnBehalf = 0, - _preBoostedVoteRequiredPercentage=50, - _preBoostedVotePeriodLimit=60, - _boostedVotePeriodLimit=60, - _thresholdConstA=1, - _thresholdConstB=1, - _minimumStakingFee=0, - _quietEndingPeriod=0, - _proposingRepRewardConstA=60, - _proposingRepRewardConstB=1, - _stakerFeeRatioForVoters=10, - _votersReputationLossRatio=10, - _votersGainRepRatioFromLostRep=80, - _daoBountyConst=15, - _daoBountyLimt=10 + voteOnBehalf = NULL_ADDRESS, + _queuedVoteRequiredPercentage=50, + _queuedVotePeriodLimit=60, + _boostedVotePeriodLimit=60, + _preBoostedVotePeriodLimit =0, + _thresholdConst=2000, + _quietEndingPeriod=0, + _proposingRepReward=60, + _votersReputationLossRatio=10, + _minimumDaoBounty=15, + _daoBountyConst=10, + _activationTime=0 ) { var votingMachine = new VotingMachine(); @@ -157,39 +153,33 @@ export const setupGenesisProtocol = async function ( // set up a reputation system votingMachine.reputationArray = [20, 10 ,70]; // register some parameters - await votingMachine.genesisProtocol.setParameters([_preBoostedVoteRequiredPercentage, - _preBoostedVotePeriodLimit, - _boostedVotePeriodLimit, - _thresholdConstA, - _thresholdConstB, - _minimumStakingFee, - _quietEndingPeriod, - _proposingRepRewardConstA, - _proposingRepRewardConstB, - _stakerFeeRatioForVoters, - _votersReputationLossRatio, - _votersGainRepRatioFromLostRep, - _daoBountyConst, - _daoBountyLimt],voteOnBehalf); - votingMachine.params = await votingMachine.genesisProtocol.getParametersHash([_preBoostedVoteRequiredPercentage, - _preBoostedVotePeriodLimit, - _boostedVotePeriodLimit, - _thresholdConstA, - _thresholdConstB, - _minimumStakingFee, - _quietEndingPeriod, - _proposingRepRewardConstA, - _proposingRepRewardConstB, - _stakerFeeRatioForVoters, - _votersReputationLossRatio, - _votersGainRepRatioFromLostRep, - _daoBountyConst, - _daoBountyLimt],voteOnBehalf); + await votingMachine.genesisProtocol.setParameters([_queuedVoteRequiredPercentage, + _queuedVotePeriodLimit, + _boostedVotePeriodLimit, + _preBoostedVotePeriodLimit, + _thresholdConst, + _quietEndingPeriod, + _proposingRepReward, + _votersReputationLossRatio, + _minimumDaoBounty, + _daoBountyConst, + _activationTime],voteOnBehalf); + votingMachine.params = await votingMachine.genesisProtocol.getParametersHash([_queuedVoteRequiredPercentage, + _queuedVotePeriodLimit, + _boostedVotePeriodLimit, + _preBoostedVotePeriodLimit, + _thresholdConst, + _quietEndingPeriod, + _proposingRepReward, + _votersReputationLossRatio, + _minimumDaoBounty, + _daoBountyConst, + _activationTime],voteOnBehalf); return votingMachine; }; -export const setupOrganizationWithArrays = async function (daoCreator,daoCreatorOwner,founderToken,founderReputation,controller=0,cap=0) { +export const setupOrganizationWithArrays = async function (daoCreator,daoCreatorOwner,founderToken,founderReputation,controller=NULL_ADDRESS,cap=0) { var org = new Organization(); var tx = await daoCreator.forgeOrg("testOrg","TEST","TST",daoCreatorOwner,founderToken,founderReputation,controller,cap,{gas: constants.ARC_GAS_LIMIT}); assert.equal(tx.logs.length, 1); @@ -203,7 +193,7 @@ export const setupOrganizationWithArrays = async function (daoCreator,daoCreator return org; }; -export const setupOrganization = async function (daoCreator,daoCreatorOwner,founderToken,founderReputation,controller=0,cap=0) { +export const setupOrganization = async function (daoCreator,daoCreatorOwner,founderToken,founderReputation,controller=NULL_ADDRESS,cap=0) { var org = new Organization(); var tx = await daoCreator.forgeOrg("testOrg","TEST","TST",[daoCreatorOwner],[founderToken],[founderReputation],controller,cap,{gas: constants.ARC_GAS_LIMIT}); assert.equal(tx.logs.length, 1); @@ -222,9 +212,9 @@ export const checkVoteInfo = async function(absoluteVote,proposalId, voterAddres let voteInfo; voteInfo = await absoluteVote.voteInfo(proposalId, voterAddress); // voteInfo has the following structure - // int vote; + // int256 vote; assert.equal(voteInfo[0].toNumber(), _voteInfo[0]); - // uint reputation; + // uint256 reputation; assert.equal(voteInfo[1].toNumber(), _voteInfo[1]); }; diff --git a/test/lockingtoken4reputation.js b/test/lockingtoken4reputation.js index e28eb012..0aa72c18 100644 --- a/test/lockingtoken4reputation.js +++ b/test/lockingtoken4reputation.js @@ -2,7 +2,7 @@ const helpers = require('./helpers'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); const constants = require('./constants'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); var LockingToken4Reputation = artifacts.require("./LockingToken4Reputation.sol"); const PriceOracleMock = artifacts.require('./test/PriceOracleMock.sol'); @@ -14,8 +14,8 @@ const setup = async function (accounts, _maxLockingPeriod = 6000, _initialize = true) { var testSetup = new helpers.TestSetup(); - testSetup.lockingToken = await StandardTokenMock.new(accounts[0], web3.utils.toWei('100', "ether")); - testSetup.lockingToken2 = await StandardTokenMock.new(accounts[0], web3.utils.toWei('100', "ether")); + testSetup.lockingToken = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); + testSetup.lockingToken2 = await ERC20Mock.new(accounts[0], web3.utils.toWei('100', "ether")); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); testSetup.org = await helpers.setupOrganization(testSetup.daoCreator,accounts[0],1000,1000); diff --git a/test/organizationregister.js b/test/organizationregister.js index 8eadf590..e4a14cf1 100644 --- a/test/organizationregister.js +++ b/test/organizationregister.js @@ -1,7 +1,7 @@ import * as helpers from './helpers'; const constants = require('./constants'); const OrganizationRegister = artifacts.require('./OrganizationRegister.sol'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); @@ -26,7 +26,7 @@ const setupOrganizationRegisterParams = async function( const setup = async function (accounts) { var testSetup = new helpers.TestSetup(); testSetup.fee = 10; - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); + testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); testSetup.organizationRegister = await OrganizationRegister.new(); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); diff --git a/test/schemeregistrar.js b/test/schemeregistrar.js index cdb09bc4..690ef77b 100644 --- a/test/schemeregistrar.js +++ b/test/schemeregistrar.js @@ -1,7 +1,7 @@ import * as helpers from './helpers'; const constants = require('./constants'); const SchemeRegistrar = artifacts.require("./SchemeRegistrar.sol"); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const UniversalScheme = artifacts.require('./UniversalScheme.sol'); const Controller = artifacts.require('./Controller.sol'); @@ -18,7 +18,7 @@ const setupSchemeRegistrarParams = async function( schemeRegistrar, ) { var schemeRegistrarParams = new SchemeRegistrarParams(); - schemeRegistrarParams.votingMachine = await helpers.setupAbsoluteVote(true,50,schemeRegistrar.address); + schemeRegistrarParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50,schemeRegistrar.address); await schemeRegistrar.setParameters(schemeRegistrarParams.votingMachine.params,schemeRegistrarParams.votingMachine.params,schemeRegistrarParams.votingMachine.absoluteVote.address); schemeRegistrarParams.paramsHash = await schemeRegistrar.getParametersHash(schemeRegistrarParams.votingMachine.params,schemeRegistrarParams.votingMachine.params,schemeRegistrarParams.votingMachine.absoluteVote.address); return schemeRegistrarParams; @@ -27,7 +27,7 @@ const setupSchemeRegistrarParams = async function( const setup = async function (accounts) { var testSetup = new helpers.TestSetup(); testSetup.fee = 10; - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); + testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); testSetup.schemeRegistrar = await SchemeRegistrar.new(); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); @@ -56,14 +56,6 @@ contract('SchemeRegistrar', accounts => { assert.equal(tx.logs[0].event, "NewSchemeProposal"); }); - it("proposeScheme check owner vote", async function() { - var testSetup = await setup(accounts); - - var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,testSetup.schemeRegistrar.address,helpers.NULL_HASH,"0x00000000"); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.schemeRegistrarParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); - }); - it("proposeToRemoveScheme log", async function() { var testSetup = await setup(accounts); @@ -72,13 +64,6 @@ contract('SchemeRegistrar', accounts => { assert.equal(tx.logs[0].event, "RemoveSchemeProposal"); }); - it("proposeToRemoveScheme check owner vote", async function() { - var testSetup = await setup(accounts); - - var tx = await testSetup.schemeRegistrar.proposeToRemoveScheme(testSetup.org.avatar.address,testSetup.schemeRegistrar.address); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.schemeRegistrarParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); - }); it("execute proposeScheme and execute -yes - fee > 0 ", async function() { var testSetup = await setup(accounts); @@ -86,7 +71,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000"); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(universalScheme.address,testSetup.org.avatar.address),true); }); @@ -98,7 +83,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); assert.equal(await controller.getSchemePermissions(accounts[0],testSetup.org.avatar.address),"0x00000001"); @@ -111,7 +96,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); assert.equal(await controller.getSchemePermissions(accounts[0],testSetup.org.avatar.address),"0x00000003"); @@ -124,7 +109,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); assert.equal(await controller.getSchemePermissions(accounts[0],testSetup.org.avatar.address),"0x00000003"); @@ -137,7 +122,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); assert.equal(await controller.getSchemePermissions(accounts[0],testSetup.org.avatar.address),"0x00000009"); @@ -150,7 +135,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,permissions); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); assert.equal(await controller.getSchemePermissions(accounts[0],testSetup.org.avatar.address),"0x00000011"); @@ -162,7 +147,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,accounts[0],helpers.NULL_HASH,"0x00000000"); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); assert.equal(await controller.getSchemePermissions(accounts[0],testSetup.org.avatar.address),"0x00000001"); @@ -180,7 +165,7 @@ contract('SchemeRegistrar', accounts => { assert.equal(organizationProposal[2].toNumber(),1);//proposalType //Vote with reputation to trigger execution - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,2,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,2,0,helpers.NULL_ADDRESS,{from:accounts[2]}); var controller = await Controller.at(await testSetup.org.avatar.owner()); //should not register because the decision is "no" assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),false); @@ -197,7 +182,7 @@ contract('SchemeRegistrar', accounts => { var controller = await Controller.at(await testSetup.org.avatar.owner()); assert.equal(await controller.isSchemeRegistered(testSetup.schemeRegistrar.address,testSetup.org.avatar.address),true); //Vote with reputation to trigger execution - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); assert.equal(await controller.isSchemeRegistered(testSetup.schemeRegistrar.address,testSetup.org.avatar.address),false); //check organizationsProposals after execution var organizationProposal = await testSetup.schemeRegistrar.organizationsProposals(testSetup.org.avatar.address,proposalId); @@ -210,7 +195,7 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000"); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); }); it("execute proposeScheme and execute -yes - autoRegisterOrganization==FALSE arc scheme", async function() { @@ -220,6 +205,6 @@ contract('SchemeRegistrar', accounts => { var tx = await testSetup.schemeRegistrar.proposeScheme(testSetup.org.avatar.address,universalScheme.address,helpers.NULL_HASH,"0x00000000"); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.schemeRegistrarParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); }); }); diff --git a/test/simpleico.js b/test/simpleico.js deleted file mode 100644 index 08bab53a..00000000 --- a/test/simpleico.js +++ /dev/null @@ -1,332 +0,0 @@ -const helpers = require('./helpers'); -const constants = require('./constants'); -const DaoCreator = artifacts.require("./DaoCreator.sol"); -const Avatar = artifacts.require("./Avatar.sol"); -const SimpleICO = artifacts.require("./SimpleICO.sol"); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); -const ControllerCreator = artifacts.require("./ControllerCreator.sol"); - - - -const setupSimpleICOParams = async function(accounts, - simpleICO, - org, - cap=10000, - price=1, - startBlock=0, - endBlock=500) { - // Register ICO parameters - let beneficiary = org.avatar.address; - let admin = accounts[0]; - await simpleICO.setParameters(cap, price, startBlock, endBlock, beneficiary, admin); - const paramsHash = await simpleICO.getParametersHash(cap, price, startBlock, endBlock, beneficiary, admin); - return paramsHash; -}; -var daoCreator; -const setupOrganization = async function (daoCreatorOwner,founderToken,founderReputation) { - var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); - daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); - var org = await helpers.setupOrganization(daoCreator,daoCreatorOwner,founderToken,founderReputation); - return org; -}; - -const setup = async function (accounts,cap =10000,price=1) { - var testSetup = new helpers.TestSetup(); - testSetup.beneficiary = accounts[0]; - testSetup.fee =10; - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); - testSetup.simpleICO = await SimpleICO.new(); - testSetup.org = await setupOrganization(accounts[0],1000,1000); - const blockNumber = await web3.eth.getBlockNumber(); - testSetup.paramHash= await setupSimpleICOParams(accounts,testSetup.simpleICO,testSetup.org,cap,price,blockNumber,blockNumber+500); - await daoCreator.setSchemes(testSetup.org.avatar.address,[testSetup.simpleICO.address],[testSetup.paramHash],["0x00000000"]); - return testSetup; -}; - -contract('SimpleICO', accounts => { - - before(function() { - helpers.etherForEveryone(accounts); - }); - - it("simpleICO send ether to contract - should revert", async () => { - var simpleICO = await SimpleICO.new(); - var account1BalanceBefore = await web3.eth.getBalance(accounts[1])/web3.utils.toWei('1', "ether"); - try{ - await web3.eth.sendTransaction({from:accounts[1],to:simpleICO.address, value: web3.utils.toWei('1', "ether")}); - assert(false,"should fail - contract simpleICO should not receive ethers and should revert in this case"); - } - catch(ex){ - helpers.assertVMException(ex); - } - var account1BalanceAfter = await web3.eth.getBalance(accounts[1])/web3.utils.toWei('1', "ether"); - assert.equal(Math.round(account1BalanceAfter),Math.round(account1BalanceBefore)); - }); - - it("simpleICO setParameters", async function() { - var simpleICO = await SimpleICO.new(); - await simpleICO.setParameters(1000,2,0,0,accounts[1],accounts[1]); - var paramHash = await simpleICO.getParametersHash(1000,2,0,0,accounts[1],accounts[1]); - var parameters = await simpleICO.parameters(paramHash); - assert.equal(parameters[0].toNumber(),1000); - }); - - it("simpleICO setParameters with cap zero should revert", async function() { - var simpleICO = await SimpleICO.new(); - - try { - await simpleICO.setParameters(0,2,0,0,accounts[1],accounts[1]); - assert(false,"setParameters with cap zero should revert"); - }catch(ex){ - helpers.assertVMException(ex); - } - - }); - - it("simpleICO isActive ", async function() { - var testSetup = await setup(accounts); - assert.equal(await testSetup.simpleICO.isActive(testSetup.org.avatar.address),false); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - assert.equal(await testSetup.simpleICO.isActive(testSetup.org.avatar.address),true); - }); - - it("simpleICO isActive test start block ", async function() { - var standardTokenMock = await StandardTokenMock.new(accounts[1],100); - var simpleICO = await SimpleICO.new(); - var org = await setupOrganization(accounts[0],1000,1000); - var paramHash= await setupSimpleICOParams(accounts, - simpleICO, - org, - 1000, - 1, - (await web3.eth.getBlockNumber())+100, - (await web3.eth.getBlockNumber())+100+500); - //give some tokens to organization avatar so it could register the universal scheme. - await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); - await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); - await simpleICO.start(org.avatar.address); - assert.equal(await simpleICO.isActive(org.avatar.address),false); - }); - - it("simpleICO isActive test end block ", async function() { - var standardTokenMock = await StandardTokenMock.new(accounts[1],100); - var simpleICO = await SimpleICO.new(); - var org = await setupOrganization(accounts[0],1000,1000); - var paramHash= await setupSimpleICOParams(accounts, - simpleICO, - org, - 1000, - 1, - await web3.eth.getBlockNumber(), - await web3.eth.getBlockNumber()); - //give some tokens to organization avatar so it could register the universal scheme. - await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); - await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); - await simpleICO.start(org.avatar.address); - var isActive = await simpleICO.isActive(org.avatar.address); - assert.equal(isActive,false); - }); - - it("simpleICO isActive test cap ", async function() { - var cap = 2; - var price = 1; - var standardTokenMock = await StandardTokenMock.new(accounts[1],100); - var simpleICO = await SimpleICO.new(); - var org = await setupOrganization(accounts[0],1000,1000); - var paramHash= await setupSimpleICOParams(accounts, - simpleICO, - org, - cap, - price, - await web3.eth.getBlockNumber(), - await web3.eth.getBlockNumber()+500); - //give some tokens to organization avatar so it could register the universal scheme. - await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); - await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); - await simpleICO.start(org.avatar.address); - var donationEther = cap; - await simpleICO.donate(org.avatar.address,accounts[3],{value:donationEther}); - var isActive = await simpleICO.isActive(org.avatar.address); - assert.equal(isActive,false); - }); - - it("simpleICO haltICO ", async function() { - var organization; - var standardTokenMock = await StandardTokenMock.new(accounts[1],100); - var simpleICO = await SimpleICO.new(); - try { - await simpleICO.haltICO(accounts[0]); - assert(false,"haltICO should fail - accounts[0] is not avatar and not registered yet"); - }catch(ex){ - helpers.assertVMException(ex); - } - var org = await setupOrganization(accounts[0],1000,1000); - try { - await simpleICO.haltICO(org.avatar.address); - assert(false,"haltICO should fail - org is not registered yet"); - }catch(ex){ - helpers.assertVMException(ex); - } - var paramHash= await setupSimpleICOParams(accounts,simpleICO,org); - //give some tokens to organization avatar so it could register the universal scheme. - await standardTokenMock.transfer(org.avatar.address,30,{from:accounts[1]}); - await daoCreator.setSchemes(org.avatar.address,[simpleICO.address],[paramHash],["0x8000000F"]); - organization = await simpleICO.organizationsICOInfo(org.avatar.address); - assert.equal(organization[3],false); - await simpleICO.start(org.avatar.address); - organization = await simpleICO.organizationsICOInfo(org.avatar.address); - assert.equal(organization[3],false); - await simpleICO.haltICO(org.avatar.address); - organization = await simpleICO.organizationsICOInfo(org.avatar.address); - assert.equal(organization[3],true); - try{ - await simpleICO.haltICO(org.avatar.address,{from:accounts[1]}); - assert(false,"haltICO should fail - accounts[1] is not admin"); - }catch(ex){ - helpers.assertVMException(ex); - } - }); - it("simpleICO resumeICO ", async function() { - var testSetup = await setup(accounts); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - await testSetup.simpleICO.haltICO(testSetup.org.avatar.address); - var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); - assert.equal(organization[3],true); - await testSetup.simpleICO.resumeICO(testSetup.org.avatar.address); - organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); - assert.equal(organization[3],false); - try{ - await testSetup.simpleICO.resumeICO(testSetup.org.avatar.address,{from:accounts[1]}); - assert(false,"resumeICO should fail - accounts[1] is not admin"); - }catch(ex){ - helpers.assertVMException(ex); - } - }); - it("simpleICO donate log", async function() { - var price = 2; - var testSetup = await setup(accounts,1000,price); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - //do not send ether ..just call donate. - var tx = await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3]); - assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "DonationReceived"); - var avatar = await helpers.getValueFromLogs(tx, 'organization',1); - assert.equal(avatar,testSetup.org.avatar.address); - var _beneficiary = await helpers.getValueFromLogs(tx, '_beneficiary',1); - assert.equal(_beneficiary,accounts[3]); - var _incomingEther = await helpers.getValueFromLogs(tx, '_incomingEther'); - assert.equal(_incomingEther,0); - var _tokensAmount = await helpers.getValueFromLogs(tx, '_tokensAmount',1); - assert.equal(_tokensAmount,0); - var donationEther = 3; - - tx = await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); - assert.equal(tx.logs.length, 1); - assert.equal(tx.logs[0].event, "DonationReceived"); - avatar = await helpers.getValueFromLogs(tx, 'organization',1); - assert.equal(avatar,testSetup.org.avatar.address); - _beneficiary = await helpers.getValueFromLogs(tx, '_beneficiary',1); - assert.equal(_beneficiary,accounts[3]); - _incomingEther = await helpers.getValueFromLogs(tx, '_incomingEther'); - assert.equal(_incomingEther,donationEther); - _tokensAmount = await helpers.getValueFromLogs(tx, '_tokensAmount',1); - assert.equal(_tokensAmount.toNumber(),price*donationEther); - }); - - it("simpleICO donate check transfer", async function() { - var price = 2; - var testSetup = await setup(accounts,1000,price); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - var donationEther = 3; - await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); - var balance = await testSetup.org.token.balanceOf(accounts[3]); - assert.equal(balance.toNumber(),price*donationEther); - }); - it("simpleICO donate check update totalEthRaised", async function() { - var price = 2; - var testSetup = await setup(accounts,1000,price); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - var donationEther = 3; - await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); - var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); - assert.equal(organization[2].toNumber(),donationEther); - }); - - it("simpleICO donate check isActive", async function() { - var price = 2; - var testSetup = await setup(accounts,1000,price); - var donationEther = 3; - try{ - await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); - assert(false,"donate should fail - ico not started yet"); - }catch(ex){ - helpers.assertVMException(ex); - } - }); - it("simpleICO donate check isHalted", async function() { - var price = 2; - var testSetup = await setup(accounts,1000,price); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - await testSetup.simpleICO.haltICO(testSetup.org.avatar.address); - var donationEther = 3; - try{ - await testSetup.simpleICO.donate(testSetup.org.avatar.address,accounts[3],{value:donationEther}); - assert(false,"donate should fail - halted !"); - }catch(ex){ - helpers.assertVMException(ex); - } - }); - it("simpleICO donate check change back", async function() { - - var price = 2; - var cap = 3; - var testSetup = await setup(accounts,cap,price); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - var donationEther = cap+10; - let otherAvatar = await Avatar.new('otheravatar', helpers.NULL_ADDRESS, helpers.NULL_ADDRESS); - var beneficiaryBalance = await web3.eth.getBalance(otherAvatar.address); - assert.equal(beneficiaryBalance,0); - await testSetup.simpleICO.donate(testSetup.org.avatar.address,otherAvatar.address,{value:donationEther}); - var balance = await testSetup.org.token.balanceOf(otherAvatar.address); - assert.equal(balance.toNumber(),price*cap); - beneficiaryBalance = await web3.eth.getBalance(otherAvatar.address); - assert.equal(beneficiaryBalance,10); - }); - - it("simpleICO MirrorContractICO", async function() { - var price = 2; - var cap = 3; - var testSetup = await setup(accounts,cap,price); - await testSetup.simpleICO.start(testSetup.org.avatar.address); - let otherAvatar = await Avatar.new('otheravatar', helpers.NULL_ADDRESS, helpers.NULL_ADDRESS); - var beneficiaryBalance = await web3.eth.getBalance(otherAvatar.address); - assert.equal(beneficiaryBalance,0); - var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); - var mirrorContractICO = organization[1]; - //need more gas for this ... - await web3.eth.sendTransaction({from:accounts[3],to:mirrorContractICO, value:2,gas: 900000 }); - //await simpleICO.donate(org.avatar.address,otherAvatar.address,{value:13}); - var balance = await testSetup.org.token.balanceOf(accounts[3]); - assert.equal(balance.toNumber(),price*2); - - }); - - it("simpleICO MirrorContractICO without start should fail", async function() { - - var price = 2; - var cap = 3; - var testSetup = await setup(accounts,cap,price); - let otherAvatar = await Avatar.new('otheravatar', helpers.NULL_ADDRESS, helpers.NULL_ADDRESS); - var beneficiaryBalance =await web3.eth.getBalance(otherAvatar.address); - assert.equal(beneficiaryBalance,0); - var organization = await testSetup.simpleICO.organizationsICOInfo(testSetup.org.avatar.address); - var mirrorContractICO = organization[1]; - //need more gas for this ... - await web3.eth.sendTransaction({from:accounts[3],to:mirrorContractICO, value:2,gas: 900000 }); - //await simpleICO.donate(org.avatar.address,otherAvatar.address,{value:13}); - var balance = await testSetup.org.token.balanceOf(accounts[3]); - assert.equal(balance.toNumber(),0); - - }); - -}); diff --git a/test/ucontroller.js b/test/ucontroller.js index 1ee46e3b..80638bf3 100644 --- a/test/ucontroller.js +++ b/test/ucontroller.js @@ -3,7 +3,7 @@ const UController = artifacts.require("./UController.sol"); const Reputation = artifacts.require("./Reputation.sol"); const Avatar = artifacts.require("./Avatar.sol"); const DAOToken = artifacts.require("./DAOToken.sol"); -const StandardTokenMock = artifacts.require('./StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./ERC20Mock.sol'); const GlobalConstraintMock = artifacts.require('./test/GlobalConstraintMock.sol'); const ActionMock = artifacts.require('./test/ActionMock.sol'); const UniversalSchemeMock = artifacts.require('./test/UniversalSchemeMock.sol'); @@ -24,7 +24,7 @@ const setup = async function (accounts,permission='0x00000000',registerScheme = if (permission !== '0x00000000'){ await uController.newOrganization(avatar.address,{from:accounts[1]}); await uController.registerScheme(registerScheme,helpers.NULL_HASH,permission,avatar.address,{from:accounts[1]}); - await uController.unregisterSelf(0,{from:accounts[1]}); + await uController.unregisterSelf(avatar.address,{from:accounts[1]}); } else { await uController.newOrganization(avatar.address); @@ -396,7 +396,7 @@ contract('UController',accounts => { it("externalTokenTransfer", async () => { //External transfer token from avatar contract to other address controller = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100); let balanceAvatar = await standardToken.balanceOf(avatar.address); assert.equal(balanceAvatar, 100); var tx = await controller.externalTokenTransfer(standardToken.address,accounts[1],50,avatar.address); @@ -414,19 +414,19 @@ contract('UController',accounts => { assert.equal(balance1, 50); }); - it("externalTokenTransferFrom & ExternalTokenIncreaseApproval", async () => { + it("externalTokenTransferFrom & ExternalTokenApproval", async () => { var tx; var to = accounts[1]; controller = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); - tx = await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - await avatar.getPastEvents('ExternalTokenIncreaseApproval', { + var standardToken = await ERC20Mock.new(avatar.address, 100); + tx = await controller.externalTokenApproval(standardToken.address,avatar.address,50,avatar.address); + await avatar.getPastEvents('ExternalTokenApproval', { filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 fromBlock: tx.blockNumber, toBlock: 'latest' }) .then(function(events){ - assert.equal(events[0].event,"ExternalTokenIncreaseApproval"); + assert.equal(events[0].event,"ExternalTokenApproval"); }); tx = await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); @@ -444,46 +444,6 @@ contract('UController',accounts => { assert.equal(balanceTo, 50); }); - - it("externalTokenTransferFrom & externalTokenDecreaseApproval", async () => { - var tx; - var to = accounts[1]; - controller = await setup(accounts); - var standardToken = await StandardTokenMock.new(avatar.address, 100); - tx = await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - tx = await controller.externalTokenDecreaseApproval(standardToken.address,avatar.address,50,avatar.address); - - await avatar.getPastEvents('ExternalTokenDecreaseApproval', { - filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 - fromBlock: tx.blockNumber, - toBlock: 'latest' - }) - .then(function(events){ - assert.equal(events[0].event,"ExternalTokenDecreaseApproval"); - }); - - try{ - await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - assert(false,"externalTokenTransferFrom should fail due to decrease approval "); - } - catch(ex){ - helpers.assertVMException(ex); - } - tx = await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - tx= await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - await avatar.getPastEvents('ExternalTokenTransferFrom', { - filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 - fromBlock: tx.blockNumber, - toBlock: 'latest' - }) - .then(function(events){ - assert.equal(events[0].event,"ExternalTokenTransferFrom"); - }); - let balanceAvatar = await standardToken.balanceOf(avatar.address); - assert.equal(balanceAvatar, 50); - let balanceTo = await standardToken.balanceOf(to); - assert.equal(balanceTo, 50); - }); it("globalConstraints mintReputation add & remove", async () => { controller = await setup(accounts); var globalConstraints = await constraint("mintReputation"); @@ -634,7 +594,7 @@ contract('UController',accounts => { it("globalConstraints externalTokenTransfer add & remove", async () => { controller = await setup(accounts); var globalConstraints = await constraint("externalTokenTransfer"); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100); let balanceAvatar = await standardToken.balanceOf(avatar.address); assert.equal(balanceAvatar, 100); @@ -664,14 +624,14 @@ contract('UController',accounts => { assert.equal(balance1, 50); }); - it("globalConstraints externalTokenTransferFrom , externalTokenIncreaseApproval , externalTokenDecreaseApproval", async () => { + it("globalConstraints externalTokenTransferFrom , externalTokenApproval", async () => { var tx; var to = accounts[1]; controller = await setup(accounts); - var globalConstraints = await constraint("externalTokenIncreaseApproval"); - var standardToken = await StandardTokenMock.new(avatar.address, 100); + var globalConstraints = await constraint("externalTokenApproval"); + var standardToken = await ERC20Mock.new(avatar.address, 100); try { - await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); + await controller.externalTokenApproval(standardToken.address,avatar.address,50,avatar.address); assert(false,"externalTokenIncreaseApproval should fail due to the global constraint "); } catch(ex){ @@ -682,14 +642,14 @@ contract('UController',accounts => { assert.equal(globalConstraintsCount[0],0); assert.equal(globalConstraintsCount[1],0); - tx = await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - await avatar.getPastEvents('ExternalTokenIncreaseApproval', { + tx = await controller.externalTokenApproval(standardToken.address,avatar.address,50,avatar.address); + await avatar.getPastEvents('ExternalTokenApproval', { filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 fromBlock: tx.blockNumber, toBlock: 'latest' }) .then(function(events){ - assert.equal(events[0].event,"ExternalTokenIncreaseApproval"); + assert.equal(events[0].event,"ExternalTokenApproval"); }); globalConstraints = await constraint("externalTokenTransferFrom"); try { @@ -702,38 +662,5 @@ contract('UController',accounts => { await controller.removeGlobalConstraint(globalConstraints.address,avatar.address); globalConstraintsCount =await controller.globalConstraintsCount(avatar.address); assert.equal(globalConstraintsCount[0],0); - - globalConstraints = await constraint("externalTokenDecreaseApproval"); - try { - await controller.externalTokenDecreaseApproval(standardToken.address,avatar.address,50,avatar.address); - assert(false,"externalTokenDecreaseApproval should fail due to the global constraint "); - } - catch(ex){ - helpers.assertVMException(ex); - } - await controller.removeGlobalConstraint(globalConstraints.address,avatar.address); - await controller.externalTokenDecreaseApproval(standardToken.address,avatar.address,50,avatar.address); - try { - await await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - assert(false,"externalTokenTransferFrom should fail due to decrease approval "); - } - catch(ex){ - helpers.assertVMException(ex); - } - - await controller.externalTokenIncreaseApproval(standardToken.address,avatar.address,50,avatar.address); - tx = await controller.externalTokenTransferFrom(standardToken.address,avatar.address,to,50,avatar.address); - await avatar.getPastEvents('ExternalTokenTransferFrom', { - filter: {_addr: avatar.address}, // Using an array means OR: e.g. 20 or 23 - fromBlock: tx.blockNumber, - toBlock: 'latest' - }) - .then(function(events){ - assert.equal(events[0].event,"ExternalTokenTransferFrom"); - }); - let balanceAvatar = await standardToken.balanceOf(avatar.address); - assert.equal(balanceAvatar, 50); - let balanceTo = await standardToken.balanceOf(to); - assert.equal(balanceTo, 50); }); }); diff --git a/test/upgradescheme.js b/test/upgradescheme.js index 2f6823aa..a5ec7338 100644 --- a/test/upgradescheme.js +++ b/test/upgradescheme.js @@ -3,7 +3,7 @@ const constants = require('./constants'); const Controller = artifacts.require("./Controller.sol"); const AbsoluteVote = artifacts.require('./AbsoluteVote.sol'); const UpgradeScheme = artifacts.require('./UpgradeScheme.sol'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const Avatar = artifacts.require("./Avatar.sol"); const DAOToken = artifacts.require("./DAOToken.sol"); @@ -22,7 +22,7 @@ const setupUpgradeSchemeParams = async function( upgradeScheme, ) { var upgradeSchemeParams = new UpgradeSchemeParams(); - upgradeSchemeParams.votingMachine = await helpers.setupAbsoluteVote(true,50,upgradeScheme.address); + upgradeSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50,upgradeScheme.address); await upgradeScheme.setParameters(upgradeSchemeParams.votingMachine.params,upgradeSchemeParams.votingMachine.absoluteVote.address); upgradeSchemeParams.paramsHash = await upgradeScheme.getParametersHash(upgradeSchemeParams.votingMachine.params,upgradeSchemeParams.votingMachine.absoluteVote.address); return upgradeSchemeParams; @@ -50,7 +50,7 @@ const setupNewController = async function (accounts,permission='0x00000000') { const setup = async function (accounts) { var testSetup = new helpers.TestSetup(); testSetup.fee = 10; - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); + testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); testSetup.upgradeScheme = await UpgradeScheme.new(); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); @@ -91,15 +91,6 @@ contract('UpgradeScheme', accounts => { assert.equal(votingMachine,testSetup.upgradeSchemeParams.votingMachine.absoluteVote.address); }); - it("proposeUpgrade check owner vote", async function() { - var testSetup = await setup(accounts); - - var newController = await setupNewController(accounts); - var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.upgradeSchemeParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); - }); - it("proposeChangeUpgradingScheme log", async function() { var testSetup = await setup(accounts); @@ -110,136 +101,127 @@ contract('UpgradeScheme', accounts => { assert.equal(votingMachine,testSetup.upgradeSchemeParams.votingMachine.absoluteVote.address); }); + it("execute proposal upgrade controller -yes - proposal data delete", async function() { + var testSetup = await setup(accounts); + + var newController = await setupNewController(accounts); + assert.notEqual(newController.address,await testSetup.org.avatar.owner()); + var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address); + //Vote with reputation to trigger execution + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + //check organizationsProposals before execution + var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],newController.address);//new contract address + assert.equal(organizationProposal[2].toNumber(),1);//proposalType + await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + assert.equal(newController.address,await testSetup.org.avatar.owner()); + //check organizationsProposals after execution + organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address + assert.equal(organizationProposal[2],0);//proposalType + }); + + it("execute proposal upgrade controller - no decision (same for update scheme) - proposal data delete", async function() { + var testSetup = await setup(accounts); + + var newController = await setupNewController(accounts); + var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address); + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + //check organizationsProposals before execution + var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],newController.address);//new contract address + assert.equal(organizationProposal[2].toNumber(),1);//proposalType + + //Vote with reputation to trigger execution + await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + //should not upgrade because the decision is "no" + assert.notEqual(newController.address,await testSetup.org.avatar.owner()); + //check organizationsProposals after execution + organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address + assert.equal(organizationProposal[2],0);//proposalType + }); + + it("execute proposal ChangeUpgradingScheme - yes decision - proposal data delete", async function() { + var testSetup = await setup(accounts); + + + var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002"); + //Vote with reputation to trigger execution + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + + //check organizationsProposals before execution + var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],accounts[0]);//new contract address + assert.equal(organizationProposal[2].toNumber(),2);//proposalType + + //check schemes registration before execution + var controller = await Controller.at(await testSetup.org.avatar.owner()); + assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),false); + assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); + + await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + + //check organizationsProposals after execution + organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address + assert.equal(organizationProposal[2],0);//proposalType + + //check if scheme upgraded + assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); + assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),false); + }); + + it("execute proposal ChangeUpgradingScheme - yes decision - check approve increase fee ", async function() { + var testSetup = await setup(accounts); + + + var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002"); + //Vote with reputation to trigger execution + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); + + //check organizationsProposals before execution + var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],accounts[0]);//new contract address + assert.equal(organizationProposal[2].toNumber(),2);//proposalType + + //check schemes registration before execution + var controller = await Controller.at(await testSetup.org.avatar.owner()); + assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),false); + assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); + + await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + + //check organizationsProposals after execution + organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address + assert.equal(organizationProposal[2],0);//proposalType + + //check if scheme upgraded + assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); + assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),false); + }); + + it("execute proposal ChangeUpgradingScheme - yes decision - check upgrade it self. ", async function() { + var testSetup = await setup(accounts); + + + var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,testSetup.upgradeScheme.address,"0x00000002"); + //Vote with reputation to trigger execution + var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - it("proposeChangeUpgradingScheme check owner vote", async function() { - var testSetup = await setup(accounts); - - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002"); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.upgradeSchemeParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); - }); - - it("execute proposal upgrade controller -yes - proposal data delete", async function() { - var testSetup = await setup(accounts); - - var newController = await setupNewController(accounts); - assert.notEqual(newController.address,await testSetup.org.avatar.owner()); - var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address); - //Vote with reputation to trigger execution - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - //check organizationsProposals before execution - var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],newController.address);//new contract address - assert.equal(organizationProposal[2].toNumber(),1);//proposalType - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - assert.equal(newController.address,await testSetup.org.avatar.owner()); - //check organizationsProposals after execution - organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address - assert.equal(organizationProposal[2],0);//proposalType - }); - - it("execute proposal upgrade controller - no decision (same for update scheme) - proposal data delete", async function() { - var testSetup = await setup(accounts); - - var newController = await setupNewController(accounts); - var tx = await testSetup.upgradeScheme.proposeUpgrade(testSetup.org.avatar.address,newController.address); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - //check organizationsProposals before execution - var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],newController.address);//new contract address - assert.equal(organizationProposal[2].toNumber(),1);//proposalType - - //Vote with reputation to trigger execution - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]}); - //should not upgrade because the decision is "no" - assert.notEqual(newController.address,await testSetup.org.avatar.owner()); - //check organizationsProposals after execution - organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address - assert.equal(organizationProposal[2],0);//proposalType - }); - - it("execute proposal ChangeUpgradingScheme - yes decision - proposal data delete", async function() { - var testSetup = await setup(accounts); - - - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002"); - //Vote with reputation to trigger execution - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - - //check organizationsProposals before execution - var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],accounts[0]);//new contract address - assert.equal(organizationProposal[2].toNumber(),2);//proposalType - - //check schemes registration before execution - var controller = await Controller.at(await testSetup.org.avatar.owner()); - assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),false); - assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); - - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - - //check organizationsProposals after execution - organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address - assert.equal(organizationProposal[2],0);//proposalType - - //check if scheme upgraded - assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); - assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),false); - }); - - it("execute proposal ChangeUpgradingScheme - yes decision - check approve increase fee ", async function() { - var testSetup = await setup(accounts); - - - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,accounts[0],"0x00000002"); - //Vote with reputation to trigger execution - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - - //check organizationsProposals before execution - var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],accounts[0]);//new contract address - assert.equal(organizationProposal[2].toNumber(),2);//proposalType - - //check schemes registration before execution - var controller = await Controller.at(await testSetup.org.avatar.owner()); - assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),false); - assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); - - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - - //check organizationsProposals after execution - organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address - assert.equal(organizationProposal[2],0);//proposalType - - //check if scheme upgraded - assert.equal(await controller.isSchemeRegistered(accounts[0],testSetup.org.avatar.address),true); - assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),false); - }); - - it("execute proposal ChangeUpgradingScheme - yes decision - check upgrade it self. ", async function() { - var testSetup = await setup(accounts); - - - var tx = await testSetup.upgradeScheme.proposeChangeUpgradingScheme(testSetup.org.avatar.address,testSetup.upgradeScheme.address,"0x00000002"); - //Vote with reputation to trigger execution - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - - //check schemes registration before execution - var controller = await Controller.at(await testSetup.org.avatar.owner()); - assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); - - await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); - - //check organizationsProposals after execution - var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); - assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address - assert.equal(organizationProposal[2],0);//proposalType + //check schemes registration before execution + var controller = await Controller.at(await testSetup.org.avatar.owner()); + assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); - //schemes should still be registered - assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); - }); + await testSetup.upgradeSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); + + //check organizationsProposals after execution + var organizationProposal = await testSetup.upgradeScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); + assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address + assert.equal(organizationProposal[2],0);//proposalType + + //schemes should still be registered + assert.equal(await controller.isSchemeRegistered(testSetup.upgradeScheme.address,testSetup.org.avatar.address),true); + }); }); diff --git a/test/vestingscheme.js b/test/vestingscheme.js index c4997529..a0a25fe8 100644 --- a/test/vestingscheme.js +++ b/test/vestingscheme.js @@ -2,7 +2,7 @@ import * as helpers from './helpers'; const constants = require('./constants'); const AbsoluteVote = artifacts.require('./AbsoluteVote.sol'); const VestingScheme = artifacts.require('./VestingScheme.sol'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); @@ -16,7 +16,7 @@ const setupVestingSchemeParams = async function( vestingScheme, ) { var vestingSchemeParams = new VestingSchemeParams(); - vestingSchemeParams.votingMachine = await helpers.setupAbsoluteVote(true,50,vestingScheme.address); + vestingSchemeParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50,vestingScheme.address); await vestingScheme.setParameters(vestingSchemeParams.votingMachine.params,vestingSchemeParams.votingMachine.absoluteVote.address); vestingSchemeParams.paramsHash = await vestingScheme.getParametersHash(vestingSchemeParams.votingMachine.params,vestingSchemeParams.votingMachine.absoluteVote.address); return vestingSchemeParams; @@ -25,7 +25,7 @@ const setupVestingSchemeParams = async function( const setup = async function (accounts) { var testSetup = new helpers.TestSetup(); testSetup.fee = 10; - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); + testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); testSetup.vestingScheme = await VestingScheme.new(); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); @@ -77,23 +77,6 @@ contract('VestingScheme', accounts => { assert.equal(avatarAddress,testSetup.org.avatar.address); }); - it("proposeVestingAgreement check owner vote", async function() { - var testSetup = await setup(accounts); - var blockNumber = await (web3.utils.toBN(await web3.eth.getBlockNumber())); - var tx = await testSetup.vestingScheme.proposeVestingAgreement(accounts[0], - accounts[1], - blockNumber, - 15, - 2, - 3, - 11, - 3, - [accounts[0],accounts[1],accounts[2]], - testSetup.org.avatar.address); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await helpers.checkVoteInfo(testSetup.vestingSchemeParams.votingMachine.absoluteVote,proposalId,accounts[0],[1,testSetup.reputationArray[0]]); - }); - it("proposeVestingAgreement check assert _signaturesReqToCancel <= _signersArray.length", async function() { var testSetup = await setup(accounts); var _signaturesReqToCancel = 5; @@ -157,7 +140,7 @@ contract('VestingScheme', accounts => { testSetup.org.avatar.address); //Vote with reputation to trigger execution var proposalId = await helpers.getValueFromLogs(tx, '_proposalId',1); - await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await testSetup.vestingScheme.getPastEvents('ProposedVestedAgreement', { filter: {_proposalId: proposalId}, fromBlock: tx.blockNumber, @@ -188,7 +171,7 @@ contract('VestingScheme', accounts => { //check organizationsProposals before execution var organizationProposal = await testSetup.vestingScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],testSetup.org.token.address);//proposalType - await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.vestingScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address @@ -240,7 +223,7 @@ contract('VestingScheme', accounts => { assert.equal(organizationProposal[0],testSetup.org.token.address); //Vote with reputation to trigger execution - await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]}); + await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.vestingScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address @@ -269,7 +252,7 @@ contract('VestingScheme', accounts => { var organizationProposal = await testSetup.vestingScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],testSetup.org.token.address); assert.equal(await testSetup.org.token.balanceOf(testSetup.vestingScheme.address),0); - await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.vestingSchemeParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.vestingScheme.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address diff --git a/test/voteinorganization.js b/test/voteinorganization.js index ab0cc1c8..11af9977 100644 --- a/test/voteinorganization.js +++ b/test/voteinorganization.js @@ -2,12 +2,13 @@ import * as helpers from './helpers'; const constants = require('./constants'); const AbsoluteVote = artifacts.require('./AbsoluteVote.sol'); const VoteInOrganizationScheme = artifacts.require('./VoteInOrganizationScheme.sol'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); const AbsoluteVoteExecuteMock = artifacts.require("./AbsoluteVoteExecuteMock.sol"); const GenesisProtocolCallbacksMock = artifacts.require("./GenesisProtocolCallbacksMock.sol"); const Reputation = artifacts.require("./Reputation.sol"); +const Controller = artifacts.require("./Controller.sol"); export class VoteInOrganizationParams { constructor() { @@ -23,7 +24,7 @@ const setupVoteInOrganizationParams = async function( ) { var voteInOrganizationParams = new VoteInOrganizationParams(); if (genesisProtocol === true){ - voteInOrganizationParams.votingMachine = await helpers.setupGenesisProtocol(accounts,tokenAddress,avatar,0); + voteInOrganizationParams.votingMachine = await helpers.setupGenesisProtocol(accounts,tokenAddress,avatar,helpers.NULL_ADDRESS); await voteInOrganization.setParameters( voteInOrganizationParams.votingMachine.params, @@ -34,7 +35,7 @@ const setupVoteInOrganizationParams = async function( ); } else { - voteInOrganizationParams.votingMachine = await helpers.setupAbsoluteVote(true,50); + voteInOrganizationParams.votingMachine = await helpers.setupAbsoluteVote(helpers.NULL_ADDRESS,50); await voteInOrganization.setParameters(voteInOrganizationParams.votingMachine.params, voteInOrganizationParams.votingMachine.absoluteVote.address); voteInOrganizationParams.paramsHash = await voteInOrganization.getParametersHash(voteInOrganizationParams.votingMachine.params, @@ -47,11 +48,11 @@ const setupVoteInOrganizationParams = async function( const setup = async function (accounts,reputationAccount=0,genesisProtocol = false,tokenAddress=0) { var testSetup = new helpers.TestSetup(); testSetup.fee = 10; - testSetup.standardTokenMock = await StandardTokenMock.new(accounts[1],100); + testSetup.standardTokenMock = await ERC20Mock.new(accounts[1],100); testSetup.voteInOrganization = await VoteInOrganizationScheme.new(); var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); - testSetup.reputationArray = [20,10,70]; + testSetup.reputationArray = [200,100,700]; if (reputationAccount === 0) { testSetup.org = await helpers.setupOrganizationWithArrays(testSetup.daoCreator,[accounts[0],accounts[1],accounts[2]],[1000,1000,1000],testSetup.reputationArray); } else { @@ -66,8 +67,8 @@ const setup = async function (accounts,reputationAccount=0,genesisProtocol = fal var permissions = "0x00000010"; await testSetup.daoCreator.setSchemes(testSetup.org.avatar.address, - [testSetup.voteInOrganization.address], - [testSetup.voteInOrganizationParams.paramsHash],[permissions]); + [testSetup.voteInOrganization.address,accounts[3]], + [testSetup.voteInOrganizationParams.paramsHash,helpers.NULL_HASH],[permissions,permissions]); return testSetup; }; @@ -93,7 +94,7 @@ contract('VoteInOrganizationScheme', accounts => { var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(testSetup.org.reputation.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address); - var tx = await absoluteVoteExecuteMock.propose(5, + var tx = await absoluteVoteExecuteMock.propose(2, anotherTestSetup.voteInOrganizationParams.votingMachine.params, anotherTestSetup.org.avatar.address, accounts[0],helpers.NULL_ADDRESS); @@ -101,9 +102,10 @@ contract('VoteInOrganizationScheme', accounts => { const proposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - proposalId); + proposalId,1); assert.equal(tx.logs.length, 1); assert.equal(tx.logs[0].event, "NewVoteProposal"); + assert.equal(tx.logs[0].args._vote, 1); }); it("execute proposeVote -no decision - proposal data delete", async function() { @@ -121,9 +123,9 @@ contract('VoteInOrganizationScheme', accounts => { tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - originalProposalId); + originalProposalId,1); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,0,0,{from:accounts[2]}); + await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,0,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution var organizationProposal = await testSetup.voteInOrganization.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address @@ -133,7 +135,10 @@ contract('VoteInOrganizationScheme', accounts => { var testSetup = await setup(accounts); var anotherTestSetup = await setup(accounts); - var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(testSetup.org.reputation.address, + var anotherController = await Controller.at(await anotherTestSetup.org.reputation.owner()); + //mint reputation to avatar in the other dao. + await anotherController.mintReputation(10000,testSetup.org.avatar.address,anotherTestSetup.org.avatar.address,{from:accounts[3]}); + var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(anotherTestSetup.org.reputation.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address); var tx = await absoluteVoteExecuteMock.propose(2, anotherTestSetup.voteInOrganizationParams.votingMachine.params, @@ -144,11 +149,11 @@ contract('VoteInOrganizationScheme', accounts => { tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - originalProposalId); + originalProposalId,1); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); var organizationProposal = await testSetup.voteInOrganization.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address);//new contract address - await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); //check organizationsProposals after execution organizationProposal = await testSetup.voteInOrganization.organizationsProposals(testSetup.org.avatar.address,proposalId); assert.equal(organizationProposal[0],0x0000000000000000000000000000000000000000);//new contract address @@ -169,35 +174,14 @@ contract('VoteInOrganizationScheme', accounts => { const originalProposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal'); tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - originalProposalId); + originalProposalId,1); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.checkVoteInfo(anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote,originalProposalId, testSetup.org.avatar.address, [1, anotherTestSetup.reputationArray[2]]); }); - it("execute proposeVote -positive decision vote orignalNumberOfChoices + 1 - check action", async function() { - var testSetup = await setup(accounts); - - var anotherTestSetup = await setup(accounts,testSetup.org.avatar.address); - var absoluteVoteExecuteMock = await AbsoluteVoteExecuteMock.new(anotherTestSetup.org.reputation.address, - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address); - var tx = await absoluteVoteExecuteMock.propose(2, - anotherTestSetup.voteInOrganizationParams.votingMachine.params, - anotherTestSetup.org.avatar.address, - accounts[0], - helpers.NULL_ADDRESS); - const originalProposalId = await helpers.getProposalId(tx,anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote, 'NewProposal'); - tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, - anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote.address, - originalProposalId); - var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.voteInOrganizationParams.votingMachine.absoluteVote.vote(proposalId,3,0,{from:accounts[2]}); - await helpers.checkVoteInfo(anotherTestSetup.voteInOrganizationParams.votingMachine.absoluteVote,originalProposalId, testSetup.org.avatar.address, [0, anotherTestSetup.reputationArray[2]]); - }); - - it("execute proposeVote -positive decision - check action - with GenesisProtocol", async function() { - var standardTokenMock = await StandardTokenMock.new(accounts[0],1000); + var standardTokenMock = await ERC20Mock.new(accounts[0],1000); var testSetup = await setup(accounts,0,true,standardTokenMock.address); var anotherTestSetup = await setup(accounts,0,true,standardTokenMock.address); @@ -216,9 +200,9 @@ contract('VoteInOrganizationScheme', accounts => { var originalProposalId = await helpers.getValueFromLogs(tx, '_proposalId'); tx = await testSetup.voteInOrganization.proposeVote(testSetup.org.avatar.address, anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol.address, - originalProposalId); + originalProposalId,1); var proposalId = await helpers.getValueFromLogs(tx, '_proposalId'); - await testSetup.voteInOrganizationParams.votingMachine.genesisProtocol.vote(proposalId,1,0,{from:accounts[2]}); + await testSetup.voteInOrganizationParams.votingMachine.genesisProtocol.vote(proposalId,1,0,helpers.NULL_ADDRESS,{from:accounts[2]}); await helpers.checkVoteInfo(anotherTestSetup.voteInOrganizationParams.votingMachine.genesisProtocol,originalProposalId, testSetup.org.avatar.address, [1, 100]); }); }); diff --git a/test/votingmachinecallbacks.js b/test/votingmachinecallbacks.js index 320474dd..88bf0aa5 100644 --- a/test/votingmachinecallbacks.js +++ b/test/votingmachinecallbacks.js @@ -1,6 +1,6 @@ import * as helpers from './helpers'; const constants = require('./constants'); -const StandardTokenMock = artifacts.require('./test/StandardTokenMock.sol'); +const ERC20Mock = artifacts.require('./test/ERC20Mock.sol'); const DaoCreator = artifacts.require("./DaoCreator.sol"); const ControllerCreator = artifacts.require("./ControllerCreator.sol"); const ARCVotingMachineCallbacksMock = artifacts.require("./ARCVotingMachineCallbacksMock.sol"); @@ -11,7 +11,7 @@ const setup = async function (accounts) { var controllerCreator = await ControllerCreator.new({gas: constants.ARC_GAS_LIMIT}); testSetup.daoCreator = await DaoCreator.new(controllerCreator.address,{gas:constants.ARC_GAS_LIMIT}); testSetup.org = await helpers.setupOrganization(testSetup.daoCreator,accounts[0],1000,1000); - testSetup.standardTokenMock = await StandardTokenMock.new(testSetup.org.avatar.address,100); + testSetup.standardTokenMock = await ERC20Mock.new(testSetup.org.avatar.address,100); testSetup.arcVotingMachineCallbacksMock = await ARCVotingMachineCallbacksMock.new(); diff --git a/truffle.js b/truffle.js index d9f37fdd..80d1f6f3 100644 --- a/truffle.js +++ b/truffle.js @@ -36,6 +36,13 @@ module.exports = { port: 8545, gas: 4543760 }, + coverage: { + host: 'localhost', + network_id: '*', // eslint-disable-line camelcase + port: 8555, + gas: 0xfffffffffff, + gasPrice: 0x01, + } }, rpc: { host: "localhost", @@ -49,7 +56,7 @@ module.exports = { }, compilers: { solc: { - version: "0.4.25", // Fetch exact version from solc-bin (default: truffle's version) + version: "0.5.2", // Fetch exact version from solc-bin (default: truffle's version) // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) optimizer: { enabled: true,