From 60299473a24dca5f44d0eefa1bb335169db935b6 Mon Sep 17 00:00:00 2001 From: Vadim Arasev Date: Wed, 9 May 2018 15:32:53 +0300 Subject: [PATCH 1/7] (Feature) Increased Emission Supply - draft contracts --- contracts/EmissionFunds.sol | 49 +++ contracts/VotingToManageEmissionFunds.sol | 365 ++++++++++++++++++++++ contracts/interfaces/IEmissionFunds.sol | 7 + 3 files changed, 421 insertions(+) create mode 100644 contracts/EmissionFunds.sol create mode 100644 contracts/VotingToManageEmissionFunds.sol create mode 100644 contracts/interfaces/IEmissionFunds.sol diff --git a/contracts/EmissionFunds.sol b/contracts/EmissionFunds.sol new file mode 100644 index 0000000..4967160 --- /dev/null +++ b/contracts/EmissionFunds.sol @@ -0,0 +1,49 @@ +pragma solidity ^0.4.23; + +import "./interfaces/IEmissionFunds.sol"; + + +contract EmissionFunds is IEmissionFunds { + address public votingToManageEmissionFunds; + + event SendFundsTo(address indexed receiver, address indexed caller, uint256 value); + event BurnFunds(address indexed burner, uint256 value); + + modifier onlyVotingToManageEmissionFunds() { + require(msg.sender == votingToManageEmissionFunds); + _; + } + + constructor(address _votingToManageEmissionFunds) public { + require(_votingToManageEmissionFunds != address(0)); + votingToManageEmissionFunds = _votingToManageEmissionFunds; + } + + function () external payable {} + + function sendFundsTo(address _receiver) + external + onlyVotingToManageEmissionFunds + returns(bool) + { + uint256 value = _balance(); + emit SendFundsTo(_receiver, msg.sender, value); + // using `send` instead of `transfer` to avoid revert on failure + return _receiver.send(value); + } + + function burnFunds() + external + onlyVotingToManageEmissionFunds + returns(bool) + { + uint256 value = _balance(); + emit BurnFunds(msg.sender, value); + // using `send` instead of `transfer` to avoid revert on failure + return address(0).send(value); + } + + function _balance() private view returns(uint256) { + return address(this).balance; + } +} \ No newline at end of file diff --git a/contracts/VotingToManageEmissionFunds.sol b/contracts/VotingToManageEmissionFunds.sol new file mode 100644 index 0000000..53f17e6 --- /dev/null +++ b/contracts/VotingToManageEmissionFunds.sol @@ -0,0 +1,365 @@ +pragma solidity ^0.4.23; + +import "./SafeMath.sol"; +import "./interfaces/IProxyStorage.sol"; +import "./interfaces/IBallotsStorage.sol"; +import "./interfaces/IKeysManager.sol"; +import "./interfaces/IEmissionFunds.sol"; +import "./eternal-storage/EternalStorage.sol"; + + +contract VotingToManageEmissionFunds is EternalStorage { + using SafeMath for uint256; + + enum QuorumStates {Invalid, InProgress, Sent, Burnt, Frozen} + enum ActionChoice {Invalid, Send, Burn, Freeze} + + event Vote(uint256 indexed id, uint256 decision, address indexed voter, uint256 time, address voterMiningKey); + event BallotFinalized(uint256 indexed id, address indexed voter); + event BallotCreated(uint256 indexed id, uint256 indexed ballotType, address indexed creator); + + modifier onlyOwner() { + require(msg.sender == addressStorage[keccak256("owner")]); + _; + } + + modifier onlyValidVotingKey(address _votingKey) { + IKeysManager keysManager = IKeysManager(getKeysManager()); + require(keysManager.isVotingActive(_votingKey)); + _; + } + + function maxOldMiningKeysDeepCheck() public pure returns(uint8) { + return 25; + } + + function proxyStorage() public view returns(address) { + return addressStorage[keccak256("proxyStorage")]; + } + + function nextBallotId() public view returns(uint256) { + return uintStorage[keccak256("nextBallotId")]; + } + + function initDisabled() public view returns(bool) { + return boolStorage[keccak256("initDisabled")]; + } + + function emissionReleaseTime() public view returns(uint256) { + return uintStorage[keccak256("emissionReleaseTime")]; + } + + function emissionReleaseThreshold() public view returns(uint256) { + return uintStorage[keccak256("emissionReleaseThreshold")]; + } + + function distributionThreshold() public view returns(uint256) { + return uintStorage[keccak256("distributionThreshold")]; + } + + function emissionFunds() public view returns(address) { + return addressStorage[keccak256("emissionFunds")]; + } + + function init( + address _emissionFunds, + uint256 _emissionReleaseTime, + uint256 _emissionReleaseThreshold, + uint256 _distributionThreshold + ) public onlyOwner { + require(!initDisabled()); + require(_emissionFunds != address(0)); + require(_emissionReleaseTime > getTime()); + require(_emissionReleaseThreshold > 0); + require(_distributionThreshold > 0); + require(_emissionReleaseThreshold > _distributionThreshold); + _setCurrentBallotFinalized(true); + _setEmissionReleaseTime(_emissionReleaseTime); + addressStorage[keccak256("emissionFunds")] = _emissionFunds; + uintStorage[keccak256("emissionReleaseThreshold")] = _emissionReleaseThreshold; + uintStorage[keccak256("distributionThreshold")] = _distributionThreshold; + boolStorage[keccak256("initDisabled")] = true; + } + + function createBallotToManageEmissionFunds( + uint256 _startTime, + uint256 _endTime, + address _sendTo, + string memo + ) public onlyValidVotingKey(msg.sender) { + require(_startTime > 0 && _endTime > 0); + require(_endTime > _startTime && _startTime > getTime()); + uint256 releaseTime = emissionReleaseTime(); + require(_startTime > releaseTime); + require(_endTime.sub(releaseTime) <= distributionThreshold()); + require(_sendTo != address(0)); + require(currentBallotFinalized()); + uint256 ballotId = nextBallotId(); + _setStartTime(ballotId, _startTime); + _setEndTime(ballotId, _endTime); + _setSendVotes(ballotId, 0); + _setBurnVotes(ballotId, 0); + _setFreezeVotes(ballotId, 0); + _setIsFinalized(ballotId, false); + _setQuorumState(ballotId, uint8(QuorumStates.InProgress)); + _setSendTo(ballotId, _sendTo); + _setMinThresholdOfVoters(ballotId, getGlobalMinThresholdOfVoters()); + _setCreator(ballotId, getMiningByVotingKey(msg.sender)); + _setMemo(ballotId, memo); + _setCurrentBallotFinalized(false); + emit BallotCreated(ballotId, 6, msg.sender); + _setNextBallotId(ballotId.add(1)); + } + + function vote(uint256 _id, uint8 _choice) public onlyValidVotingKey(msg.sender) { + require(!getIsFinalized(_id)); + require(isValidVote(_id, msg.sender)); + if (_choice == uint(ActionChoice.Send)) { + _setSendVotes(_id, getSendVotes(_id).add(1)); + } else if (_choice == uint(ActionChoice.Burn)) { + _setBurnVotes(_id, getBurnVotes(_id).add(1)); + } else if (_choice == uint(ActionChoice.Freeze)) { + _setFreezeVotes(_id, getFreezeVotes(_id).add(1)); + } else { + revert(); + } + address miningKey = getMiningByVotingKey(msg.sender); + _votersAdd(_id, miningKey); + emit Vote(_id, _choice, msg.sender, getTime(), miningKey); + } + + function finalize(uint256 _id) public onlyValidVotingKey(msg.sender) { + require(_id == nextBallotId().sub(1)); + require(getStartTime(_id) <= getTime()); + require(!isActive(_id)); + require(!getIsFinalized(_id)); + require(!currentBallotFinalized()); + _finalizeBallot(_id); + _setIsFinalized(_id, true); + _setCurrentBallotFinalized(true); + _setEmissionReleaseTime( + emissionReleaseTime().add(emissionReleaseThreshold()) + ); + emit BallotFinalized(_id, msg.sender); + } + + function getBallotsStorage() public view returns(address) { + return IProxyStorage(proxyStorage()).getBallotsStorage(); + } + + function getKeysManager() public view returns(address) { + return IProxyStorage(proxyStorage()).getKeysManager(); + } + + function getGlobalMinThresholdOfVoters() public view returns(uint256) { + IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); + return ballotsStorage.getBallotThreshold(1); + } + + function getTotalVoters(uint256 _id) public view returns(uint256) { + return getSendVotes(_id) + getBurnVotes(_id) + getFreezeVotes(_id); + } + + function getSendVotes(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "sendVotes")]; + } + + function getBurnVotes(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "burnVotes")]; + } + + function getFreezeVotes(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "freezeVotes")]; + } + + function getMinThresholdOfVoters(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "minThresholdOfVoters")]; + } + + function getMiningByVotingKey(address _votingKey) public view returns(address) { + IKeysManager keysManager = IKeysManager(getKeysManager()); + return keysManager.getMiningKeyByVoting(_votingKey); + } + + function getStartTime(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "startTime")]; + } + + function getEndTime(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "endTime")]; + } + + function getIsFinalized(uint256 _id) public view returns(bool) { + return boolStorage[keccak256(_storeName(), _id, "isFinalized")]; + } + + function currentBallotFinalized() public view returns(bool) { + return boolStorage[keccak256("currentBallotFinalized")]; + } + + function getQuorumState(uint256 _id) public view returns(uint8) { + return uint8(uintStorage[keccak256(_storeName(), _id, "quorumState")]); + } + + function getSendTo(uint256 _id) public view returns(address) { + return addressStorage[keccak256(_storeName(), _id, "sendTo")]; + } + + function getCreator(uint256 _id) public view returns(address) { + return addressStorage[keccak256(_storeName(), _id, "creator")]; + } + + function getTime() public view returns(uint256) { + return now; + } + + function isActive(uint256 _id) public view returns(bool) { + bool withinTime = getStartTime(_id) <= getTime() && getTime() <= getEndTime(_id); + return withinTime; + } + + function getMemo(uint256 _id) public view returns(string) { + return stringStorage[keccak256(_storeName(), _id, "memo")]; + } + + function hasMiningKeyAlreadyVoted(uint256 _id, address _miningKey) public view returns(bool) { + return boolStorage[keccak256(_storeName(), _id, "voters", _miningKey)]; + } + + function hasAlreadyVoted(uint256 _id, address _votingKey) public view returns(bool) { + address miningKey = getMiningByVotingKey(_votingKey); + return hasMiningKeyAlreadyVoted(_id, miningKey); + } + + function isValidVote(uint256 _id, address _votingKey) public view returns(bool) { + address miningKey = getMiningByVotingKey(_votingKey); + bool notVoted = !hasAlreadyVoted(_id, _votingKey); + bool oldKeysNotVoted = !areOldMiningKeysVoted(_id, miningKey); + return notVoted && isActive(_id) && oldKeysNotVoted; + } + + function areOldMiningKeysVoted(uint256 _id, address _miningKey) public view returns(bool) { + IKeysManager keysManager = IKeysManager(getKeysManager()); + uint8 maxDeep = maxOldMiningKeysDeepCheck(); + for (uint8 i = 0; i < maxDeep; i++) { + address oldMiningKey = keysManager.getMiningKeyHistory(_miningKey); + if (oldMiningKey == address(0)) { + return false; + } + if (hasMiningKeyAlreadyVoted(_id, oldMiningKey)) { + return true; + } else { + _miningKey = oldMiningKey; + } + } + return false; + } + + function _finalizeBallot(uint256 _id) private { + QuorumStates quorumState = QuorumStates.Frozen; + + if (getTotalVoters(_id) >= getMinThresholdOfVoters(_id)) { + uint256 sendVotesCount = getSendVotes(_id); + uint256 burnVotesCount = getBurnVotes(_id); + uint256 freezeVotesCount = getFreezeVotes(_id); + + if ( + sendVotesCount != burnVotesCount && + burnVotesCount != freezeVotesCount && + sendVotesCount != freezeVotesCount + ) { + uint256 max = 0; + if (sendVotesCount > max) max = sendVotesCount; + if (burnVotesCount > max) max = burnVotesCount; + if (freezeVotesCount > max) max = freezeVotesCount; + if (max == sendVotesCount) quorumState = QuorumStates.Sent; + else if (max == burnVotesCount) quorumState = QuorumStates.Burnt; + } else { + if ( + burnVotesCount == freezeVotesCount && + sendVotesCount > burnVotesCount + ) { + quorumState = QuorumStates.Sent; + } else if ( + sendVotesCount == freezeVotesCount && + burnVotesCount > sendVotesCount + ) { + quorumState = QuorumStates.Burnt; + } + } + } + + _setQuorumState(_id, uint8(quorumState)); + + if (quorumState == QuorumStates.Sent) { + IEmissionFunds(emissionFunds()).sendFundsTo(getSendTo(_id)); + } else if (quorumState == QuorumStates.Burnt) { + IEmissionFunds(emissionFunds()).burnFunds(); + } + } + + function _setNextBallotId(uint256 _id) private { + uintStorage[keccak256("nextBallotId")] = _id; + } + + function _storeName() private pure returns(string) { + return "votingState"; + } + + function _setStartTime(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "startTime")] = _value; + } + + function _setEndTime(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "endTime")] = _value; + } + + function _setSendVotes(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "sendVotes")] = _value; + } + + function _setBurnVotes(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "burnVotes")] = _value; + } + + function _setFreezeVotes(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "freezeVotes")] = _value; + } + + function _setIsFinalized(uint256 _ballotId, bool _value) private { + boolStorage[keccak256(_storeName(), _ballotId, "isFinalized")] = _value; + } + + function _setCurrentBallotFinalized(bool _finalized) private { + boolStorage[keccak256("currentBallotFinalized")] = _finalized; + } + + function _setQuorumState(uint256 _ballotId, uint8 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "quorumState")] = _value; + } + + function _setSendTo(uint256 _ballotId, address _value) private { + addressStorage[keccak256(_storeName(), _ballotId, "sendTo")] = _value; + } + + function _setMinThresholdOfVoters(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "minThresholdOfVoters")] = _value; + } + + function _setCreator(uint256 _ballotId, address _value) private { + addressStorage[keccak256(_storeName(), _ballotId, "creator")] = _value; + } + + function _setMemo(uint256 _ballotId, string _value) private { + stringStorage[keccak256(_storeName(), _ballotId, "memo")] = _value; + } + + function _votersAdd(uint256 _ballotId, address _miningKey) private { + boolStorage[keccak256(_storeName(), _ballotId, "voters", _miningKey)] = true; + } + + function _setEmissionReleaseTime(uint256 _time) private { + uintStorage[keccak256("emissionReleaseTime")] = _time; + } + +} diff --git a/contracts/interfaces/IEmissionFunds.sol b/contracts/interfaces/IEmissionFunds.sol new file mode 100644 index 0000000..c673764 --- /dev/null +++ b/contracts/interfaces/IEmissionFunds.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.4.23; + + +interface IEmissionFunds { + function sendFundsTo(address) external returns(bool); + function burnFunds() external returns(bool); +} \ No newline at end of file From ac1bd72ac715e2f1683350f4864ec6e677474095 Mon Sep 17 00:00:00 2001 From: Vadim Arasev Date: Wed, 9 May 2018 18:44:58 +0300 Subject: [PATCH 2/7] (Fix) Increased Emission Supply - draft contracts --- contracts/EmissionFunds.sol | 18 +++++---- contracts/VotingToManageEmissionFunds.sol | 46 +++++++++++++++-------- contracts/interfaces/IEmissionFunds.sol | 2 +- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/contracts/EmissionFunds.sol b/contracts/EmissionFunds.sol index 4967160..948fb2e 100644 --- a/contracts/EmissionFunds.sol +++ b/contracts/EmissionFunds.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.23; +pragma solidity ^0.4.18; import "./interfaces/IEmissionFunds.sol"; @@ -6,15 +6,15 @@ import "./interfaces/IEmissionFunds.sol"; contract EmissionFunds is IEmissionFunds { address public votingToManageEmissionFunds; - event SendFundsTo(address indexed receiver, address indexed caller, uint256 value); - event BurnFunds(address indexed burner, uint256 value); + event SendFundsTo(address indexed receiver, address indexed caller, uint256 value, bool success); + event BurnFunds(address indexed burner, uint256 value, bool success); modifier onlyVotingToManageEmissionFunds() { require(msg.sender == votingToManageEmissionFunds); _; } - constructor(address _votingToManageEmissionFunds) public { + function EmissionFunds(address _votingToManageEmissionFunds) public { require(_votingToManageEmissionFunds != address(0)); votingToManageEmissionFunds = _votingToManageEmissionFunds; } @@ -27,9 +27,10 @@ contract EmissionFunds is IEmissionFunds { returns(bool) { uint256 value = _balance(); - emit SendFundsTo(_receiver, msg.sender, value); // using `send` instead of `transfer` to avoid revert on failure - return _receiver.send(value); + bool success = _receiver.send(value); + SendFundsTo(_receiver, msg.sender, value, success); + return success; } function burnFunds() @@ -38,9 +39,10 @@ contract EmissionFunds is IEmissionFunds { returns(bool) { uint256 value = _balance(); - emit BurnFunds(msg.sender, value); // using `send` instead of `transfer` to avoid revert on failure - return address(0).send(value); + bool success = address(0).send(value); + BurnFunds(msg.sender, value, success); + return success; } function _balance() private view returns(uint256) { diff --git a/contracts/VotingToManageEmissionFunds.sol b/contracts/VotingToManageEmissionFunds.sol index 53f17e6..55e0258 100644 --- a/contracts/VotingToManageEmissionFunds.sol +++ b/contracts/VotingToManageEmissionFunds.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.23; +pragma solidity ^0.4.18; import "./SafeMath.sol"; import "./interfaces/IProxyStorage.sol"; @@ -49,6 +49,20 @@ contract VotingToManageEmissionFunds is EternalStorage { return uintStorage[keccak256("emissionReleaseTime")]; } + function refreshEmissionReleaseTime() public returns(uint256) { + uint256 releaseTime = emissionReleaseTime(); + uint256 currentTime = getTime(); + if (currentTime > releaseTime) { + uint256 releaseThreshold = emissionReleaseThreshold(); + uint256 diff = currentTime.sub(releaseTime).div(releaseThreshold); + if (diff > 0) { + releaseTime = releaseTime.add(releaseThreshold.mul(diff)); + _setEmissionReleaseTime(releaseTime); + } + } + return releaseTime; + } + function emissionReleaseThreshold() public view returns(uint256) { return uintStorage[keccak256("emissionReleaseThreshold")]; } @@ -73,7 +87,7 @@ contract VotingToManageEmissionFunds is EternalStorage { require(_emissionReleaseThreshold > 0); require(_distributionThreshold > 0); require(_emissionReleaseThreshold > _distributionThreshold); - _setCurrentBallotFinalized(true); + _setLastBallotFinalized(true); _setEmissionReleaseTime(_emissionReleaseTime); addressStorage[keccak256("emissionFunds")] = _emissionFunds; uintStorage[keccak256("emissionReleaseThreshold")] = _emissionReleaseThreshold; @@ -88,12 +102,14 @@ contract VotingToManageEmissionFunds is EternalStorage { string memo ) public onlyValidVotingKey(msg.sender) { require(_startTime > 0 && _endTime > 0); - require(_endTime > _startTime && _startTime > getTime()); - uint256 releaseTime = emissionReleaseTime(); + uint256 currentTime = getTime(); + require(_endTime > _startTime && _startTime > currentTime); + uint256 releaseTime = refreshEmissionReleaseTime(); require(_startTime > releaseTime); + require(currentTime > releaseTime); require(_endTime.sub(releaseTime) <= distributionThreshold()); require(_sendTo != address(0)); - require(currentBallotFinalized()); + require(lastBallotFinalized()); uint256 ballotId = nextBallotId(); _setStartTime(ballotId, _startTime); _setEndTime(ballotId, _endTime); @@ -106,8 +122,8 @@ contract VotingToManageEmissionFunds is EternalStorage { _setMinThresholdOfVoters(ballotId, getGlobalMinThresholdOfVoters()); _setCreator(ballotId, getMiningByVotingKey(msg.sender)); _setMemo(ballotId, memo); - _setCurrentBallotFinalized(false); - emit BallotCreated(ballotId, 6, msg.sender); + _setLastBallotFinalized(false); + BallotCreated(ballotId, 6, msg.sender); _setNextBallotId(ballotId.add(1)); } @@ -125,7 +141,7 @@ contract VotingToManageEmissionFunds is EternalStorage { } address miningKey = getMiningByVotingKey(msg.sender); _votersAdd(_id, miningKey); - emit Vote(_id, _choice, msg.sender, getTime(), miningKey); + Vote(_id, _choice, msg.sender, getTime(), miningKey); } function finalize(uint256 _id) public onlyValidVotingKey(msg.sender) { @@ -133,14 +149,14 @@ contract VotingToManageEmissionFunds is EternalStorage { require(getStartTime(_id) <= getTime()); require(!isActive(_id)); require(!getIsFinalized(_id)); - require(!currentBallotFinalized()); + require(!lastBallotFinalized()); _finalizeBallot(_id); _setIsFinalized(_id, true); - _setCurrentBallotFinalized(true); + _setLastBallotFinalized(true); _setEmissionReleaseTime( emissionReleaseTime().add(emissionReleaseThreshold()) ); - emit BallotFinalized(_id, msg.sender); + BallotFinalized(_id, msg.sender); } function getBallotsStorage() public view returns(address) { @@ -193,8 +209,8 @@ contract VotingToManageEmissionFunds is EternalStorage { return boolStorage[keccak256(_storeName(), _id, "isFinalized")]; } - function currentBallotFinalized() public view returns(bool) { - return boolStorage[keccak256("currentBallotFinalized")]; + function lastBallotFinalized() public view returns(bool) { + return boolStorage[keccak256("lastBallotFinalized")]; } function getQuorumState(uint256 _id) public view returns(uint8) { @@ -330,8 +346,8 @@ contract VotingToManageEmissionFunds is EternalStorage { boolStorage[keccak256(_storeName(), _ballotId, "isFinalized")] = _value; } - function _setCurrentBallotFinalized(bool _finalized) private { - boolStorage[keccak256("currentBallotFinalized")] = _finalized; + function _setLastBallotFinalized(bool _finalized) private { + boolStorage[keccak256("lastBallotFinalized")] = _finalized; } function _setQuorumState(uint256 _ballotId, uint8 _value) private { diff --git a/contracts/interfaces/IEmissionFunds.sol b/contracts/interfaces/IEmissionFunds.sol index c673764..f1626c5 100644 --- a/contracts/interfaces/IEmissionFunds.sol +++ b/contracts/interfaces/IEmissionFunds.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.23; +pragma solidity ^0.4.18; interface IEmissionFunds { From 24969fd9685d3c753d40ebeb06ce3c6962450358 Mon Sep 17 00:00:00 2001 From: Vadim Arasev Date: Fri, 11 May 2018 16:43:32 +0300 Subject: [PATCH 3/7] (Update) Scripts to migrate all contracts Relates to https://github.com/poanetwork/poa-network-consensus-contracts/issues/78 --- scripts/migrate/.gitignore | 2 + scripts/migrate/migrateAll.js | 280 +++++++++++++++++++++++++ scripts/migrate/migrateKeys.js | 119 +++-------- scripts/migrate/migrateMetadataNew.js | 290 ++++++++++++-------------- scripts/migrate/migrateVotings.js | 184 ++++++---------- scripts/migrate/utils/constants.js | 4 + scripts/migrate/utils/utils.js | 95 +++++++++ 7 files changed, 604 insertions(+), 370 deletions(-) create mode 100644 scripts/migrate/.gitignore create mode 100644 scripts/migrate/migrateAll.js create mode 100644 scripts/migrate/utils/constants.js create mode 100644 scripts/migrate/utils/utils.js diff --git a/scripts/migrate/.gitignore b/scripts/migrate/.gitignore new file mode 100644 index 0000000..fea12ca --- /dev/null +++ b/scripts/migrate/.gitignore @@ -0,0 +1,2 @@ +sokol/ +core/ \ No newline at end of file diff --git a/scripts/migrate/migrateAll.js b/scripts/migrate/migrateAll.js new file mode 100644 index 0000000..41079f3 --- /dev/null +++ b/scripts/migrate/migrateAll.js @@ -0,0 +1,280 @@ +const fs = require('fs'); +const Web3 = require('web3'); +const EthereumUtil = require('ethereumjs-util'); +const axios = require('axios'); +const childProcess = require('child_process'); +const utils = require('./utils/utils'); +const constants = require('./utils/constants'); + +process.env.NETWORK = process.env.NETWORK.toLowerCase(); +process.env.CORE_COMMIT = constants.CORE_COMMIT; +process.env.SOKOL_COMMIT = constants.SOKOL_COMMIT; + +const web3 = new Web3(new Web3.providers.HttpProvider("https://" + process.env.NETWORK + ".poa.network")); + +require('chai') + .use(require('chai-as-promised')) + .use(require('chai-bignumber')(web3.BigNumber)) + .should(); + +main(); + +async function main() { + try { + process.env.PRIVATE_KEY = await utils.readPrivateKey(); + + let commit; + if (process.env.NETWORK == 'core') { + commit = process.env.CORE_COMMIT; + } else if (process.env.NETWORK == 'sokol') { + commit = process.env.SOKOL_COMMIT; + } else { + throw new Error("unknown network"); + } + + const key = Buffer.from(process.env.PRIVATE_KEY, 'hex'); + const sender = '0x' + EthereumUtil.privateToAddress(key).toString('hex'); + const chainId = web3.utils.toHex(await web3.eth.net.getId()); + + console.log('Retrieve addresses and ABIs...'); + const contracts = await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/contracts.json'); + const mocAddress = EthereumUtil.toChecksumAddress(contracts.data.MOC); + const poaOldAddress = contracts.data.POA_ADDRESS; + const poaOldAbi = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/PoaNetworkConsensus.abi.json')).data; + console.log(''); + + console.log('PoaNetworkConsensus deploy and migration...'); + const poaOldInstance = new web3.eth.Contract(poaOldAbi, poaOldAddress); + let miningKeys = await poaOldInstance.methods.getValidators().call(); + miningKeys.splice(miningKeys.indexOf(mocAddress), 1); + const poaCompiled = await utils.compile('../../contracts/', 'PoaNetworkConsensus'); + process.env.POA_CONSENSUS_NEW_ADDRESS = await utils.deploy( + 'PoaNetworkConsensus', poaCompiled, sender, key, chainId, [mocAddress, miningKeys] + ); + console.log(` PoaNetworkConsensus address is ${process.env.POA_CONSENSUS_NEW_ADDRESS}`); + const poaNewInstance = new web3.eth.Contract(poaCompiled.abi, process.env.POA_CONSENSUS_NEW_ADDRESS); + + console.log(' PoaNetworkConsensus checking...'); + false.should.be.equal( + await poaNewInstance.methods.isMasterOfCeremonyInitialized().call() + ); + mocAddress.should.be.equal( + await poaNewInstance.methods.masterOfCeremony().call() + ); + (await poaOldInstance.methods.systemAddress().call()).should.be.equal( + await poaNewInstance.methods.systemAddress().call() + ); + miningKeys.unshift(mocAddress); + miningKeys.should.be.deep.equal( + await poaNewInstance.methods.getValidators().call() + ); + (await poaOldInstance.methods.getPendingList().call()).should.be.deep.equal( + await poaNewInstance.methods.getPendingList().call() + ); + (await poaOldInstance.methods.currentValidatorsLength().call()).should.be.equal( + await poaNewInstance.methods.currentValidatorsLength().call() + ); + for (let i = 0; i < miningKeys.length; i++) { + const validatorStateOld = await poaOldInstance.methods.validatorsState(miningKeys[i]).call(); + const validatorStateNew = await poaNewInstance.methods.validatorsState(miningKeys[i]).call(); + validatorStateOld.should.be.deep.equal(validatorStateNew); + } + + console.log('Success'); + console.log(''); + + console.log('ProxyStorage deploy and init...'); + const proxyStorageCompiled = await utils.compile('../../contracts/', 'ProxyStorage'); + const proxyStorageImplAddress = await utils.deploy('ProxyStorage', proxyStorageCompiled, sender, key, chainId); + console.log(` ProxyStorage implementation address is ${proxyStorageImplAddress}`); + let storageCompiled = await utils.compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); + process.env.PROXY_STORAGE_NEW_ADDRESS = await utils.deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [0, proxyStorageImplAddress]); + console.log(` ProxyStorage storage address is ${process.env.PROXY_STORAGE_NEW_ADDRESS}`); + const proxyStorageInstance = new web3.eth.Contract(proxyStorageCompiled.abi, process.env.PROXY_STORAGE_NEW_ADDRESS); + const init = proxyStorageInstance.methods.init(process.env.POA_CONSENSUS_NEW_ADDRESS); + await utils.call(init, sender, process.env.PROXY_STORAGE_NEW_ADDRESS, key, chainId); + const setProxyStorage = poaNewInstance.methods.setProxyStorage(process.env.PROXY_STORAGE_NEW_ADDRESS); + await utils.call(setProxyStorage, sender, process.env.POA_CONSENSUS_NEW_ADDRESS, key, chainId); + + console.log(' ProxyStorage checking...'); + true.should.be.equal( + await proxyStorageInstance.methods.initDisabled().call() + ); + false.should.be.equal( + await proxyStorageInstance.methods.mocInitialized().call() + ); + process.env.POA_CONSENSUS_NEW_ADDRESS.should.be.equal( + await proxyStorageInstance.methods.getPoaConsensus().call() + ); + true.should.be.equal( + await poaNewInstance.methods.isMasterOfCeremonyInitialized().call() + ); + process.env.PROXY_STORAGE_NEW_ADDRESS.should.be.equal( + await poaNewInstance.methods.proxyStorage().call() + ); + + console.log('Success'); + console.log(''); + + const { + keysManagerNewAddress, + keysManagerNewAbi + } = await runExternalScript('./migrateKeys.js'); + + const { + ballotsStorageNewAddress, + ballotsStorageNewAbi, + votingToChangeKeysNewAddress, + votingToChangeKeysNewAbi, + votingToChangeMinThresholdNewAddress, + votingToChangeMinThresholdNewAbi, + votingToChangeProxyNewAddress, + votingToChangeProxyNewAbi + } = await runExternalScript('./migrateVotings.js'); + + console.log('Deploy ValidatorMetadata...'); + const metadataCompiled = await utils.compile('../../contracts/', 'ValidatorMetadata'); + const metadataImplAddress = await utils.deploy('ValidatorMetadata', metadataCompiled, sender, key, chainId); + console.log(' ValidatorMetadata implementation address is ' + metadataImplAddress); + storageCompiled = await utils.compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); + process.env.METADATA_NEW_ADDRESS = await utils.deploy( + 'EternalStorageProxy', storageCompiled, sender, key, chainId, [process.env.PROXY_STORAGE_NEW_ADDRESS, metadataImplAddress] + ); + console.log(` ValidatorMetadata storage address is ${process.env.METADATA_NEW_ADDRESS}`); + console.log('Success'); + console.log(''); + + console.log('ProxyStorage.initializeAddresses...'); + const initializeAddresses = proxyStorageInstance.methods.initializeAddresses( + keysManagerNewAddress, + votingToChangeKeysNewAddress, + votingToChangeMinThresholdNewAddress, + votingToChangeProxyNewAddress, + ballotsStorageNewAddress, + process.env.METADATA_NEW_ADDRESS + ); + await utils.call(initializeAddresses, sender, process.env.PROXY_STORAGE_NEW_ADDRESS, key, chainId); + true.should.be.equal( + await proxyStorageInstance.methods.mocInitialized().call() + ); + keysManagerNewAddress.should.be.equal( + await proxyStorageInstance.methods.getKeysManager().call() + ); + keysManagerNewAddress.should.be.equal( + await poaNewInstance.methods.getKeysManager().call() + ); + votingToChangeKeysNewAddress.should.be.equal( + await proxyStorageInstance.methods.getVotingToChangeKeys().call() + ); + votingToChangeKeysNewAddress.should.be.equal( + await poaNewInstance.methods.getVotingToChangeKeys().call() + ); + votingToChangeMinThresholdNewAddress.should.be.equal( + await proxyStorageInstance.methods.getVotingToChangeMinThreshold().call() + ); + votingToChangeProxyNewAddress.should.be.equal( + await proxyStorageInstance.methods.getVotingToChangeProxy().call() + ); + ballotsStorageNewAddress.should.be.equal( + await proxyStorageInstance.methods.getBallotsStorage().call() + ); + process.env.METADATA_NEW_ADDRESS.should.be.equal( + await proxyStorageInstance.methods.getValidatorMetadata().call() + ); + const keysManagerNewInstance = new web3.eth.Contract(keysManagerNewAbi, keysManagerNewAddress); + const ballotsStorageNewInstance = new web3.eth.Contract(ballotsStorageNewAbi, ballotsStorageNewAddress); + const votingToChangeKeysNewInstance = new web3.eth.Contract(votingToChangeKeysNewAbi, votingToChangeKeysNewAddress); + const votingToChangeMinThresholdNewInstance = new web3.eth.Contract(votingToChangeMinThresholdNewAbi, votingToChangeMinThresholdNewAddress); + const votingToChangeProxyNewInstance = new web3.eth.Contract(votingToChangeProxyNewAbi, votingToChangeProxyNewAddress); + process.env.PROXY_STORAGE_NEW_ADDRESS.should.be.equal( + await keysManagerNewInstance.methods.proxyStorage().call() + ); + process.env.PROXY_STORAGE_NEW_ADDRESS.should.be.equal( + await ballotsStorageNewInstance.methods.proxyStorage().call() + ); + process.env.PROXY_STORAGE_NEW_ADDRESS.should.be.equal( + await votingToChangeKeysNewInstance.methods.proxyStorage().call() + ); + process.env.PROXY_STORAGE_NEW_ADDRESS.should.be.equal( + await votingToChangeMinThresholdNewInstance.methods.proxyStorage().call() + ); + process.env.PROXY_STORAGE_NEW_ADDRESS.should.be.equal( + await votingToChangeProxyNewInstance.methods.proxyStorage().call() + ); + console.log('Success'); + console.log(''); + + await runExternalScript('./migrateMetadataNew.js'); + + console.log('Save contracts.json...'); + const networkPath = `./${process.env.NETWORK}`; + const contractsJSONPath = `${networkPath}/contracts.json`; + const contractsJSONContent = +`{ + "VOTING_TO_CHANGE_KEYS_ADDRESS": "${votingToChangeKeysNewAddress}", + "VOTING_TO_CHANGE_MIN_THRESHOLD_ADDRESS": "${votingToChangeMinThresholdNewAddress}", + "VOTING_TO_CHANGE_PROXY_ADDRESS": "${votingToChangeProxyNewAddress}", + "BALLOTS_STORAGE_ADDRESS": "${ballotsStorageNewAddress}", + "KEYS_MANAGER_ADDRESS": "${keysManagerNewAddress}", + "METADATA_ADDRESS": "${process.env.METADATA_NEW_ADDRESS}", + "PROXY_ADDRESS": "${process.env.PROXY_STORAGE_NEW_ADDRESS}", + "POA_ADDRESS": "${process.env.POA_CONSENSUS_NEW_ADDRESS}", + "MOC": "${mocAddress}" +}`; + if (!fs.existsSync(networkPath)) fs.mkdirSync(networkPath); + fs.writeFileSync(contractsJSONPath, contractsJSONContent); + console.log('Success'); + console.log(''); + + console.log('Save ABIs...'); + const abisPath = `${networkPath}/abis`; + if (!fs.existsSync(abisPath)) fs.mkdirSync(abisPath); + fs.writeFileSync(`${abisPath}/BallotsStorage.abi.json`, JSON.stringify(ballotsStorageNewAbi, null, ' ')); + fs.writeFileSync(`${abisPath}/KeysManager.abi.json`, JSON.stringify(keysManagerNewAbi, null, ' ')); + fs.writeFileSync(`${abisPath}/PoaNetworkConsensus.abi.json`, JSON.stringify(poaCompiled.abi, null, ' ')); + fs.writeFileSync(`${abisPath}/ProxyStorage.abi.json`, JSON.stringify(proxyStorageCompiled.abi, null, ' ')); + fs.writeFileSync(`${abisPath}/ValidatorMetadata.abi.json`, JSON.stringify(metadataCompiled.abi, null, ' ')); + fs.writeFileSync(`${abisPath}/VotingToChangeKeys.abi.json`, JSON.stringify(votingToChangeKeysNewAbi, null, ' ')); + fs.writeFileSync(`${abisPath}/VotingToChangeMinThreshold.abi.json`, JSON.stringify(votingToChangeMinThresholdNewAbi, null, ' ')); + fs.writeFileSync(`${abisPath}/VotingToChangeProxyAddress.abi.json`, JSON.stringify(votingToChangeProxyNewAbi, null, ' ')); + console.log('Success'); + console.log(''); + + console.log(`Deployment and migration to ${process.env.NETWORK.toUpperCase()} network are successful.`); + console.log(`New addresses have been saved to ${contractsJSONPath}`); + console.log(`New ABIs have been saved to ${abisPath}`); + } catch (err) { + console.log('Error: ' + err.message); + } +} + +async function runExternalScript(scriptPath) { + return new Promise((resolve, reject) => { + let invoked = false; + let proc = childProcess.fork(scriptPath); + let returnValue; + + proc.on('error', function (err) { + if (invoked) return; + invoked = true; + reject(err); + }); + + proc.on('message', function (msg) { + returnValue = msg; + }); + + proc.on('exit', function (code) { + if (invoked) return; + invoked = true; + + if (code === 0) { + resolve(returnValue); + } else { + reject(new Error('exit code ' + code)); + } + }); + }); +} + +// NETWORK=sokol node migrateAll diff --git a/scripts/migrate/migrateKeys.js b/scripts/migrate/migrateKeys.js index c575db6..d642d78 100644 --- a/scripts/migrate/migrateKeys.js +++ b/scripts/migrate/migrateKeys.js @@ -1,11 +1,8 @@ -const fs = require('fs'); const Web3 = require('web3'); -const readline = require('readline'); -var Writable = require('stream').Writable; -const EthereumTx = require('ethereumjs-tx'); const EthereumUtil = require('ethereumjs-util'); const axios = require('axios'); -const solc = require('solc'); +const utils = require('./utils/utils'); +const constants = require('./utils/constants'); const NETWORK = process.env.NETWORK; // sokol or core const KEYS_MANAGER_NEW_ADDRESS = process.env.KEYS_MANAGER_NEW_ADDRESS; @@ -20,9 +17,6 @@ require('chai') .use(require('chai-bignumber')(web3.BigNumber)) .should(); -const GAS_PRICE = web3.utils.toWei('1', 'gwei'); -const GAS_LIMIT = 4700000; - let KEYS_MANAGER_OLD_ADDRESS; let POA_CONSENSUS_OLD_ADDRESS; let MOC_ADDRESS; @@ -36,20 +30,20 @@ async function main() { let commit; if (NETWORK == 'core') { - commit = 'fb311a6c475e37bd9ccc0781b369cf14d738f98e'; + commit = process.env.CORE_COMMIT ? process.env.CORE_COMMIT : constants.CORE_COMMIT; } else if (NETWORK == 'sokol') { - commit = '4e020b68a3d477e1c41859c3f0402c0626254529'; + commit = process.env.SOKOL_COMMIT ? process.env.SOKOL_COMMIT : constants.SOKOL_COMMIT; } try { console.log('Retrieve addresses and ABIs...'); - let contracts = await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/contracts.json'); KEYS_MANAGER_OLD_ADDRESS = contracts.data.KEYS_MANAGER_ADDRESS; POA_CONSENSUS_OLD_ADDRESS = contracts.data.POA_ADDRESS; MOC_ADDRESS = contracts.data.MOC; KEYS_MANAGER_OLD_ABI = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/KeysManager.abi.json')).data; POA_CONSENSUS_OLD_ABI = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/PoaNetworkConsensus.abi.json')).data; + console.log(''); } catch (err) { console.log('Cannot read contracts.json'); success = false; @@ -59,8 +53,12 @@ async function main() { if (ONLY_CHECK) { migrateAndCheck(); } else { - readPrivateKey(); + let privateKey = process.env.PRIVATE_KEY; + if (!privateKey) privateKey = await utils.readPrivateKey(); + migrateAndCheck(privateKey); } + } else { + process.exit(1); } } @@ -82,12 +80,18 @@ async function migrateAndCheck(privateKey) { console.log('KeysManager migration...'); } - const implCompiled = await compile('../../contracts/', 'KeysManager'); + const implCompiled = await utils.compile('../../contracts/', 'KeysManager'); if (!contractNewAddress && !ONLY_CHECK) { - const implAddress = await deploy('KeysManager', implCompiled, sender, key, chainId); + const implAddress = await utils.deploy('KeysManager', implCompiled, sender, key, chainId); console.log(` KeysManager implementation address is ${implAddress}`); - const storageCompiled = await compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); - contractNewAddress = await deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [PROXY_STORAGE_NEW_ADDRESS, implAddress]); + const storageCompiled = await utils.compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); + contractNewAddress = await utils.deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [PROXY_STORAGE_NEW_ADDRESS, implAddress]); + if (process.send) { + process.send({ + keysManagerNewAddress: contractNewAddress, + keysManagerNewAbi: implCompiled.abi + }); + } } console.log(` KeysManager storage address is ${contractNewAddress}`); @@ -110,14 +114,14 @@ async function migrateAndCheck(privateKey) { MOC_ADDRESS, KEYS_MANAGER_OLD_ADDRESS ); - await call(init, sender, contractNewAddress, key, chainId); + await utils.call(init, sender, contractNewAddress, key, chainId); console.log(' Migrate initial keys...'); for (let i = 0; i < initialKeys.length; i++) { const migrateInitialKey = keysManagerNewInstance.methods.migrateInitialKey( initialKeys[i] ); - await call(migrateInitialKey, sender, contractNewAddress, key, chainId); + await utils.call(migrateInitialKey, sender, contractNewAddress, key, chainId); } console.log(` Migrate each of ${miningKeys.length} mining key(s)...`); @@ -130,7 +134,7 @@ async function migrateAndCheck(privateKey) { const migrateMiningKey = keysManagerNewInstance.methods.migrateMiningKey( miningKey ); - await call(migrateMiningKey, sender, contractNewAddress, key, chainId); + await utils.call(migrateMiningKey, sender, contractNewAddress, key, chainId); } } @@ -209,85 +213,10 @@ async function migrateAndCheck(privateKey) { } else { console.log('Cannot migrate KeysManager: ' + err.message); } + process.exit(1); } } -async function compile(dir, contractName) { - console.log(` ${contractName} compile...`); - const compiled = solc.compile({ - sources: { - '': fs.readFileSync(dir + contractName + '.sol').toString() - } - }, 1, function (path) { - return {contents: fs.readFileSync(dir + path).toString()} - }); - const abi = JSON.parse(compiled.contracts[':' + contractName].interface); - const bytecode = compiled.contracts[':' + contractName].bytecode; - return {abi: abi, bytecode: bytecode}; -} - -async function deploy(contractName, contractSpec, sender, key, chainId, args) { - console.log(` ${contractName} deploy...`); - const contract = new web3.eth.Contract(contractSpec.abi); - const deploy = await contract.deploy({data: '0x' + contractSpec.bytecode, arguments: args}); - return (await call(deploy, sender, '', key, chainId)).contractAddress; -} - -async function call(method, from, to, key, chainId) { - const estimateGas = await method.estimateGas({ - from: from, - gas: web3.utils.toHex(GAS_LIMIT) - }); - - const nonce = await web3.eth.getTransactionCount(from); - const nonceHex = web3.utils.toHex(nonce); - const data = await method.encodeABI(); - - var tx = new EthereumTx({ - nonce: nonceHex, - gasPrice: web3.utils.toHex(GAS_PRICE), - gasLimit: web3.utils.toHex(estimateGas), - to: to, - value: '0x00', - data: data, - chainId: chainId - }); - - tx.sign(key); - - const serializedTx = tx.serialize(); - - return (await web3.eth.sendSignedTransaction("0x" + serializedTx.toString('hex'))); -} - -async function readPrivateKey() { - var mutableStdout = new Writable({ - write: function(chunk, encoding, callback) { - if (!this.muted) { - process.stdout.write(chunk, encoding); - } - callback(); - } - }); - - mutableStdout.muted = false; - - const readlineInterface = readline.createInterface({ - input: process.stdin, - output: mutableStdout, - terminal: true - }); - - readlineInterface.question('Enter your private key: ', (privateKey) => { - readlineInterface.close(); - console.log(''); - console.log(''); - migrateAndCheck(privateKey); - }); - - mutableStdout.muted = true; -} - // Deploy, init, migrate and check: // NETWORK=sokol POA_CONSENSUS_NEW_ADDRESS=0x03048F666359CFD3C74a1A5b9a97848BF71d5038 PROXY_STORAGE_NEW_ADDRESS=0x3f918617a055d48e90f9fe06c168a75134565190 node migrateKeys diff --git a/scripts/migrate/migrateMetadataNew.js b/scripts/migrate/migrateMetadataNew.js index bb56ab8..7706699 100644 --- a/scripts/migrate/migrateMetadataNew.js +++ b/scripts/migrate/migrateMetadataNew.js @@ -1,188 +1,158 @@ -const NETWORK = process.env.NETWORK; // sokol or core -const METADATA_OLD_ADDRESS = process.env.METADATA_OLD_ADDRESS; -const METADATA_NEW_ADDRESS = process.env.METADATA_NEW_ADDRESS; - const Web3 = require('web3'); -const readline = require('readline'); -var Writable = require('stream').Writable; -const EthereumTx = require('ethereumjs-tx'); const EthereumUtil = require('ethereumjs-util'); +const axios = require('axios'); +const utils = require('./utils/utils'); +const constants = require('./utils/constants'); + +const NETWORK = process.env.NETWORK; // sokol or core +const METADATA_NEW_ADDRESS = process.env.METADATA_NEW_ADDRESS; +const PROXY_STORAGE_NEW_ADDRESS = process.env.PROXY_STORAGE_NEW_ADDRESS; +const ONLY_CHECK = !!process.env.ONLY_CHECK === true web3 = new Web3(new Web3.providers.HttpProvider("https://" + NETWORK + ".poa.network")); -const GAS_PRICE = web3.utils.toWei('1', 'gwei'); -const GAS_LIMIT = 4700000; +require('chai') + .use(require('chai-as-promised')) + .use(require('chai-bignumber')(web3.BigNumber)) + .should(); -const metadataAbi = [{"constant":true,"inputs":[{"name":"_miningKey","type":"address"}],"name":"pendingChanges","outputs":[{"name":"firstName","type":"bytes32"},{"name":"lastName","type":"bytes32"},{"name":"licenseId","type":"bytes32"},{"name":"fullAddress","type":"string"},{"name":"state","type":"bytes32"},{"name":"zipcode","type":"bytes32"},{"name":"expirationDate","type":"uint256"},{"name":"createdDate","type":"uint256"},{"name":"updatedDate","type":"uint256"},{"name":"minThreshold","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_newProxyAddress","type":"address"}],"name":"pendingProxyConfirmations","outputs":[{"name":"count","type":"uint256"},{"name":"voters","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_firstName","type":"bytes32"},{"name":"_lastName","type":"bytes32"},{"name":"_licenseId","type":"bytes32"},{"name":"_fullAddress","type":"string"},{"name":"_state","type":"bytes32"},{"name":"_zipcode","type":"bytes32"},{"name":"_expirationDate","type":"uint256"}],"name":"createMetadata","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBallotsStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newProxyAddress","type":"address"}],"name":"setProxyAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_miningKey","type":"address"}],"name":"confirmations","outputs":[{"name":"count","type":"uint256"},{"name":"voters","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_miningKey","type":"address"}],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_votingKey","type":"address"}],"name":"getMiningByVotingKey","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_firstName","type":"bytes32"},{"name":"_lastName","type":"bytes32"},{"name":"_licenseId","type":"bytes32"},{"name":"_fullAddress","type":"string"},{"name":"_state","type":"bytes32"},{"name":"_zipcode","type":"bytes32"},{"name":"_expirationDate","type":"uint256"},{"name":"_createdDate","type":"uint256"},{"name":"_updatedDate","type":"uint256"},{"name":"_minThreshold","type":"uint256"},{"name":"_miningKey","type":"address"}],"name":"initMetadata","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newProxyAddress","type":"address"}],"name":"confirmNewProxyAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getKeysManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_miningKey","type":"address"}],"name":"confirmPendingChange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proxyStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_firstName","type":"bytes32"},{"name":"_lastName","type":"bytes32"},{"name":"_licenseId","type":"bytes32"},{"name":"_fullAddress","type":"string"},{"name":"_state","type":"bytes32"},{"name":"_zipcode","type":"bytes32"},{"name":"_expirationDate","type":"uint256"},{"name":"_miningKey","type":"address"}],"name":"changeRequestForValidator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_firstName","type":"bytes32"},{"name":"_lastName","type":"bytes32"},{"name":"_licenseId","type":"bytes32"},{"name":"_fullAddress","type":"string"},{"name":"_state","type":"bytes32"},{"name":"_zipcode","type":"bytes32"},{"name":"_expirationDate","type":"uint256"}],"name":"changeRequest","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_miningKey","type":"address"}],"name":"onlyIfChangeExist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingProxyStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMinThreshold","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_miningKey","type":"address"},{"name":"_voter","type":"address"}],"name":"isAddressAlreadyVoted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_newProxy","type":"address"},{"name":"_voter","type":"address"}],"name":"isAddressAlreadyVotedProxy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initMetadataDisable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"cancelPendingChange","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_miningKey","type":"address"}],"name":"validators","outputs":[{"name":"firstName","type":"bytes32"},{"name":"lastName","type":"bytes32"},{"name":"licenseId","type":"bytes32"},{"name":"fullAddress","type":"string"},{"name":"state","type":"bytes32"},{"name":"zipcode","type":"bytes32"},{"name":"expirationDate","type":"uint256"},{"name":"createdDate","type":"uint256"},{"name":"updatedDate","type":"uint256"},{"name":"minThreshold","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"miningKey","type":"address"}],"name":"MetadataCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"miningKey","type":"address"}],"name":"ChangeRequestInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"miningKey","type":"address"}],"name":"CancelledRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"miningKey","type":"address"},{"indexed":false,"name":"votingSender","type":"address"}],"name":"Confirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"miningKey","type":"address"}],"name":"FinalizedChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newProxyAddress","type":"address"}],"name":"RequestForNewProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newProxyAddress","type":"address"}],"name":"ChangeProxyStorage","type":"event"}]; -const proxyStorageAbi = [{"constant": true,"inputs": [],"name": "getPoaConsensus","outputs": [{"name": "","type": "address"}],"payable": false,"stateMutability": "view","type": "function"}]; -const poaConsensusAbi = [{"constant": true,"inputs": [],"name": "currentValidatorsLength","outputs": [{"name": "","type": "uint256"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": true,"inputs": [{"name": "","type": "uint256"}],"name": "currentValidators","outputs": [{"name": "","type": "address"}],"payable": false,"stateMutability": "view","type": "function"}]; +let METADATA_OLD_ADDRESS; +let POA_ADDRESS; +let MOC_ADDRESS; +let METADATA_OLD_ABI; +let POA_ABI; main(); -async function migrate(privateKey) { - console.log('Migration...'); - - const privateKeyBuf = Buffer.from(privateKey, 'hex'); - const senderAddress = '0x' + EthereumUtil.privateToAddress(privateKeyBuf).toString('hex'); - - const chainId = web3.utils.toHex(await web3.eth.net.getId()); - - const metadataOldInstance = new web3.eth.Contract(metadataAbi, METADATA_OLD_ADDRESS); - const metadataNewInstance = new web3.eth.Contract(metadataAbi, METADATA_NEW_ADDRESS); - const proxyStorageAddress = await metadataOldInstance.methods.proxyStorage().call(); - const proxyStorageInstance = new web3.eth.Contract(proxyStorageAbi, proxyStorageAddress); - const poaConsensusAddress = await proxyStorageInstance.methods.getPoaConsensus().call(); - const poaConsensusInstance = new web3.eth.Contract(poaConsensusAbi, poaConsensusAddress); - - const validatorsLength = await poaConsensusInstance.methods.currentValidatorsLength().call(); - +async function main() { let success = true; - - for (let i = 0; i < validatorsLength; i++) { - const miningKey = await poaConsensusInstance.methods.currentValidators(i).call(); - const validator = await metadataOldInstance.methods.validators(miningKey).call(); - - let validatorArray = []; - for (let j = 0; j < 10; j++) { - validatorArray[j] = validator[j]; - } - validatorArray.push(miningKey); + let commit; - const initMetadata = metadataNewInstance.methods.initMetadata(...validatorArray); - - let estimateGas; + if (NETWORK == 'core') { + commit = process.env.CORE_COMMIT ? process.env.CORE_COMMIT : constants.CORE_COMMIT; + } else if (NETWORK == 'sokol') { + commit = process.env.SOKOL_COMMIT ? process.env.SOKOL_COMMIT : constants.SOKOL_COMMIT; + } - try { - estimateGas = await initMetadata.estimateGas({ - from: senderAddress, - gas: web3.utils.toHex(GAS_LIMIT) - }); - } catch (err) { - const validatorNew = await metadataNewInstance.methods.validators(miningKey).call(); + try { + console.log('Retrieve addresses and ABIs...'); + let contracts = await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/contracts.json'); + METADATA_OLD_ADDRESS = contracts.data.METADATA_ADDRESS; + POA_ADDRESS = contracts.data.POA_ADDRESS; + MOC_ADDRESS = EthereumUtil.toChecksumAddress(contracts.data.MOC); + METADATA_OLD_ABI = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/ValidatorMetadata.abi.json')).data; + POA_ABI = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/PoaNetworkConsensus.abi.json')).data; + console.log(''); + } catch (err) { + console.log('Cannot read contracts.json'); + success = false; + } - let validatorNewArray = []; - for (let j = 0; j < 10; j++) validatorNewArray[j] = validatorNew[j]; - validatorNewArray.push(miningKey); - - if ( - validatorArray.length == validatorNewArray.length && - validatorArray.every((v,k)=> v === validatorNewArray[k]) - ) { - // the same validator with the same data already exists in the new contract - console.log(miningKey + '...success (already exists)'); - } else { - console.log(miningKey + '...failed'); - success = false; - } - continue; + if (success) { + if (ONLY_CHECK) { + success = migrateAndCheck(); + } else { + let privateKey = process.env.PRIVATE_KEY; + if (!privateKey) privateKey = await utils.readPrivateKey(); + success = migrateAndCheck(privateKey); } + } + + if (!success) { + process.exit(1); + } +} - const nonce = await web3.eth.getTransactionCount(senderAddress); - const nonceHex = web3.utils.toHex(nonce); - const data = await initMetadata.encodeABI(); +async function migrateAndCheck(privateKey) { + let key, sender, chainId; - var tx = new EthereumTx({ - nonce: nonceHex, - gasPrice: web3.utils.toHex(GAS_PRICE), - gasLimit: web3.utils.toHex(estimateGas), - to: METADATA_NEW_ADDRESS, - value: '0x00', - data: data, - chainId: chainId - }); + if (!ONLY_CHECK) { + key = Buffer.from(privateKey, 'hex'); + sender = '0x' + EthereumUtil.privateToAddress(key).toString('hex'); + chainId = web3.utils.toHex(await web3.eth.net.getId()); + } - tx.sign(privateKeyBuf); + let success = false; + let contractNewAddress = METADATA_NEW_ADDRESS; - const serializedTx = tx.serialize(); + try { + if (ONLY_CHECK) { + console.log('ValidatorMetadata checking...'); + } else { + console.log('ValidatorMetadata migration...'); + } - try { - await web3.eth.sendSignedTransaction("0x" + serializedTx.toString('hex')) + const implCompiled = await utils.compile('../../contracts/', 'ValidatorMetadata'); + if (!contractNewAddress && !ONLY_CHECK) { + const implAddress = await utils.deploy('ValidatorMetadata', implCompiled, sender, key, chainId); + console.log(' ValidatorMetadata implementation address is ' + implAddress); + const storageCompiled = await utils.compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); + contractNewAddress = await utils.deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [PROXY_STORAGE_NEW_ADDRESS, implAddress]); + } + console.log(' ValidatorMetadata storage address is ' + contractNewAddress); - const validatorNew = await metadataNewInstance.methods.validators(miningKey).call(); - - let validatorNewArray = []; - for (let j = 0; j < 10; j++) validatorNewArray[j] = validatorNew[j]; - validatorNewArray.push(miningKey); - - if ( - validatorArray.length == validatorNewArray.length && - validatorArray.every((v,k)=> v === validatorNewArray[k]) - ) { - // the data are the same in the new contract - console.log(miningKey + '...success'); - } else { - console.log(miningKey + '...failed'); - success = false; + const metadataOldInstance = new web3.eth.Contract(METADATA_OLD_ABI, METADATA_OLD_ADDRESS); + const metadataNewInstance = new web3.eth.Contract(implCompiled.abi, contractNewAddress); + const poaInstance = new web3.eth.Contract(POA_ABI, POA_ADDRESS); + const validatorsLength = await poaInstance.methods.currentValidatorsLength().call(); + + if (!ONLY_CHECK) { + console.log(` Handle each of ${validatorsLength} validator(s)...`); + for (let i = 0; i < validatorsLength; i++) { + const miningKey = await poaInstance.methods.currentValidators(i).call(); + console.log(` Migrate ${miningKey}...`); + const validator = await metadataOldInstance.methods.validators(miningKey).call(); + + if (validator.createdDate == 0 && miningKey == MOC_ADDRESS) { + continue; + } + + let validatorArray = []; + for (let j = 0; j < 10; j++) { + validatorArray[j] = validator[j]; + } + validatorArray.push(miningKey); + + const initMetadata = metadataNewInstance.methods.initMetadata(...validatorArray); + await utils.call(initMetadata, sender, contractNewAddress, key, chainId); } - } catch (err) { - console.log(miningKey + '...failed'); - success = false; + + console.log(' Disable migrations feature of the new contract...'); + await utils.call(metadataNewInstance.methods.initMetadataDisable(), sender, contractNewAddress, key, chainId); } - } - - if (success) { - // Disable migration if all metadata successfully migrated - const initMetadataDisable = metadataNewInstance.methods.initMetadataDisable(); - try { - const estimateGas = await initMetadataDisable.estimateGas({ - from: senderAddress, - gas: web3.utils.toHex(GAS_LIMIT) - }); - - const nonce = await web3.eth.getTransactionCount(senderAddress); - const nonceHex = web3.utils.toHex(nonce); - const data = await initMetadataDisable.encodeABI(); - - var tx = new EthereumTx({ - nonce: nonceHex, - gasPrice: web3.utils.toHex(GAS_PRICE), - gasLimit: web3.utils.toHex(estimateGas), - to: METADATA_NEW_ADDRESS, - value: '0x00', - data: data, - chainId: chainId - }); - - tx.sign(privateKeyBuf); - - const serializedTx = tx.serialize(); - - await web3.eth.sendSignedTransaction("0x" + serializedTx.toString('hex')) - - console.log('Migration successful'); - } catch (err) { - console.log(err.message); + if (ONLY_CHECK) { + console.log(' Checking the contract...'); + } else { + console.log(' Checking new contract...'); } - } -} - -async function main() { - var mutableStdout = new Writable({ - write: function(chunk, encoding, callback) { - if (!this.muted) { - process.stdout.write(chunk, encoding); - } - callback(); + for (let i = 0; i < validatorsLength; i++) { + const miningKey = await poaInstance.methods.currentValidators(i).call(); + console.log(` Check ${miningKey}...`); + const validatorOld = await metadataOldInstance.methods.validators(miningKey).call(); + const validatorNew = await metadataNewInstance.methods.validators(miningKey).call(); + validatorOld.should.be.deep.equal(validatorNew); } - }); - - mutableStdout.muted = false; - - const readlineInterface = readline.createInterface({ - input: process.stdin, - output: mutableStdout, - terminal: true - }); - - readlineInterface.question('Enter your private key: ', (privateKey) => { - readlineInterface.close(); + + console.log('Success'); console.log(''); - migrate(privateKey); - }); - - mutableStdout.muted = true; + success = true; + } catch (err) { + if (ONLY_CHECK) { + console.log('Something is wrong: ' + err.message); + } else { + console.log('Cannot migrate ValidatorMetadata: ' + err.message); + } + } + + return success; } -// NETWORK=sokol METADATA_OLD_ADDRESS=0xd4c9c95f1ac4eb5daceb4a67e3a7eefabf435232 METADATA_NEW_ADDRESS=0xf71dd3797e4f173c2c08f2cebe8a6801d8191b42 node migrateMetadataNew -// NETWORK=core METADATA_OLD_ADDRESS=0xb90ea07c213932d7ec6b540b35a0cae73af9c9b8 METADATA_NEW_ADDRESS=0x4c0eb450d8dfa6e89eb14ac154867bc86b3c559c node migrateMetadataNew \ No newline at end of file +// Deploy, migrate and check: +// NETWORK=sokol PROXY_STORAGE_NEW_ADDRESS=0x3f918617a055d48e90f9fe06c168a75134565190 node migrateMetadataNew + +// Migrate and check without deploy: +// NETWORK=sokol METADATA_NEW_ADDRESS=0xB4bBD4b13d1DeDa884C0b745774E975ea60b9aA2 node migrateMetadataNew + +// Only check: +// NETWORK=sokol METADATA_NEW_ADDRESS=0xB4bBD4b13d1DeDa884C0b745774E975ea60b9aA2 ONLY_CHECK=true node migrateMetadataNew diff --git a/scripts/migrate/migrateVotings.js b/scripts/migrate/migrateVotings.js index 0f8cfb1..952a21e 100644 --- a/scripts/migrate/migrateVotings.js +++ b/scripts/migrate/migrateVotings.js @@ -1,17 +1,14 @@ -const fs = require('fs'); const Web3 = require('web3'); -const readline = require('readline'); -var Writable = require('stream').Writable; -const EthereumTx = require('ethereumjs-tx'); const EthereumUtil = require('ethereumjs-util'); const axios = require('axios'); -const solc = require('solc'); +const utils = require('./utils/utils'); +const constants = require('./utils/constants'); const NETWORK = process.env.NETWORK; // sokol or core -const BALLOTS_STORAGE_NEW_ADDRESS = process.env.BALLOTS_STORAGE_NEW_ADDRESS; -const VOTING_TO_CHANGE_KEYS_NEW_ADDRESS = process.env.VOTING_TO_CHANGE_KEYS_NEW_ADDRESS; -const VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ADDRESS = process.env.VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ADDRESS; -const VOTING_TO_CHANGE_PROXY_NEW_ADDRESS = process.env.VOTING_TO_CHANGE_PROXY_NEW_ADDRESS; +let BALLOTS_STORAGE_NEW_ADDRESS = process.env.BALLOTS_STORAGE_NEW_ADDRESS; +let VOTING_TO_CHANGE_KEYS_NEW_ADDRESS = process.env.VOTING_TO_CHANGE_KEYS_NEW_ADDRESS; +let VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ADDRESS = process.env.VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ADDRESS; +let VOTING_TO_CHANGE_PROXY_NEW_ADDRESS = process.env.VOTING_TO_CHANGE_PROXY_NEW_ADDRESS; const PROXY_STORAGE_NEW_ADDRESS = process.env.PROXY_STORAGE_NEW_ADDRESS; const ONLY_CHECK = !!process.env.ONLY_CHECK === true @@ -22,9 +19,6 @@ require('chai') .use(require('chai-bignumber')(web3.BigNumber)) .should(); -const GAS_PRICE = web3.utils.toWei('1', 'gwei'); -const GAS_LIMIT = 4700000; - let KEYS_MANAGER_ADDRESS; let BALLOTS_STORAGE_OLD_ADDRESS; let VOTING_TO_CHANGE_KEYS_OLD_ADDRESS; @@ -34,9 +28,13 @@ let POA_ADDRESS; let KEYS_MANAGER_ABI; let BALLOTS_STORAGE_OLD_ABI; +let BALLOTS_STORAGE_NEW_ABI; let VOTING_TO_CHANGE_KEYS_OLD_ABI; +let VOTING_TO_CHANGE_KEYS_NEW_ABI; let VOTING_TO_CHANGE_MIN_THRESHOLD_OLD_ABI; +let VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ABI; let VOTING_TO_CHANGE_PROXY_OLD_ABI; +let VOTING_TO_CHANGE_PROXY_NEW_ABI; let POA_ABI; main(); @@ -46,9 +44,9 @@ async function main() { let commit; if (NETWORK == 'core') { - commit = 'fb311a6c475e37bd9ccc0781b369cf14d738f98e'; + commit = process.env.CORE_COMMIT ? process.env.CORE_COMMIT : constants.CORE_COMMIT; } else if (NETWORK == 'sokol') { - commit = '4e020b68a3d477e1c41859c3f0402c0626254529'; + commit = process.env.SOKOL_COMMIT ? process.env.SOKOL_COMMIT : constants.SOKOL_COMMIT; } try { @@ -68,6 +66,8 @@ async function main() { VOTING_TO_CHANGE_MIN_THRESHOLD_OLD_ABI = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/VotingToChangeMinThreshold.abi.json')).data; VOTING_TO_CHANGE_PROXY_OLD_ABI = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/VotingToChangeProxyAddress.abi.json')).data; POA_ABI = (await axios.get('https://raw.githubusercontent.com/poanetwork/poa-chain-spec/' + commit + '/abis/PoaNetworkConsensus.abi.json')).data; + + console.log(''); } catch (err) { console.log('Cannot read contracts.json'); success = false; @@ -77,8 +77,12 @@ async function main() { if (ONLY_CHECK) { migrateAndCheck(); } else { - readPrivateKey(); + let privateKey = process.env.PRIVATE_KEY; + if (!privateKey) privateKey = await utils.readPrivateKey(); + migrateAndCheck(privateKey); } + } else { + process.exit(1); } } @@ -91,10 +95,24 @@ async function migrateAndCheck(privateKey) { chainId = web3.utils.toHex(await web3.eth.net.getId()); } - if (!(await ballotsStorageMigrateAndCheck(sender, key, chainId))) return; - if (!(await votingToChangeMigrateAndCheck(sender, key, chainId, 'VotingToChangeKeys'))) return; - if (!(await votingToChangeMigrateAndCheck(sender, key, chainId, 'VotingToChangeMinThreshold'))) return; - if (!(await votingToChangeMigrateAndCheck(sender, key, chainId, 'VotingToChangeProxyAddress'))) return; + if (!(await ballotsStorageMigrateAndCheck(sender, key, chainId))) process.exit(1); + if (!(await votingToChangeMigrateAndCheck(sender, key, chainId, 'VotingToChangeKeys'))) process.exit(1); + if (!(await votingToChangeMigrateAndCheck(sender, key, chainId, 'VotingToChangeMinThreshold'))) process.exit(1); + if (!(await votingToChangeMigrateAndCheck(sender, key, chainId, 'VotingToChangeProxyAddress'))) process.exit(1); + + if (process.send) { + process.send({ + ballotsStorageNewAddress: BALLOTS_STORAGE_NEW_ADDRESS, + ballotsStorageNewAbi: BALLOTS_STORAGE_NEW_ABI, + votingToChangeKeysNewAddress: VOTING_TO_CHANGE_KEYS_NEW_ADDRESS, + votingToChangeKeysNewAbi: VOTING_TO_CHANGE_KEYS_NEW_ABI, + votingToChangeMinThresholdNewAddress: VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ADDRESS, + votingToChangeMinThresholdNewAbi: VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ABI, + votingToChangeProxyNewAddress: VOTING_TO_CHANGE_PROXY_NEW_ADDRESS, + votingToChangeProxyNewAbi: VOTING_TO_CHANGE_PROXY_NEW_ABI + }); + await setTimeout(() => {}, 1000); + } } async function ballotsStorageMigrateAndCheck(sender, key, chainId) { @@ -108,12 +126,14 @@ async function ballotsStorageMigrateAndCheck(sender, key, chainId) { console.log('BallotsStorage migration...'); } - const implCompiled = await compile('../../contracts/', 'BallotsStorage'); + const implCompiled = await utils.compile('../../contracts/', 'BallotsStorage'); if (!contractNewAddress && !ONLY_CHECK) { - const implAddress = await deploy('BallotsStorage', implCompiled, sender, key, chainId); + const implAddress = await utils.deploy('BallotsStorage', implCompiled, sender, key, chainId); console.log(' BallotsStorage implementation address is ' + implAddress); - const storageCompiled = await compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); - contractNewAddress = await deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [PROXY_STORAGE_NEW_ADDRESS, implAddress]); + const storageCompiled = await utils.compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); + contractNewAddress = await utils.deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [PROXY_STORAGE_NEW_ADDRESS, implAddress]); + BALLOTS_STORAGE_NEW_ADDRESS = contractNewAddress; + BALLOTS_STORAGE_NEW_ABI = implCompiled.abi; } console.log(' BallotsStorage storage address is ' + contractNewAddress); @@ -122,19 +142,19 @@ async function ballotsStorageMigrateAndCheck(sender, key, chainId) { if (!ONLY_CHECK) { const migrate = ballotsStorageNewInstance.methods.migrate(BALLOTS_STORAGE_OLD_ADDRESS); - await call(migrate, sender, contractNewAddress, key, chainId); + await utils.call(migrate, sender, contractNewAddress, key, chainId); } - - const oldKeysThreshold = await ballotsStorageOldInstance.methods.getBallotThreshold(1).call(); - const newKeysThreshold = await ballotsStorageNewInstance.methods.getBallotThreshold(1).call(); - const oldMetadataThreshold = await ballotsStorageOldInstance.methods.getBallotThreshold(2).call(); - const newMetadataThreshold = await ballotsStorageNewInstance.methods.getBallotThreshold(2).call(); if (ONLY_CHECK) { console.log(' Checking the contract...'); } else { console.log(' Checking new contract...'); } + const oldKeysThreshold = await ballotsStorageOldInstance.methods.getBallotThreshold(1).call(); + const newKeysThreshold = await ballotsStorageNewInstance.methods.getBallotThreshold(1).call(); + const oldMetadataThreshold = await ballotsStorageOldInstance.methods.getBallotThreshold(2).call(); + const newMetadataThreshold = await ballotsStorageNewInstance.methods.getBallotThreshold(2).call(); + oldKeysThreshold.should.be.equal(newKeysThreshold); oldMetadataThreshold.should.be.equal(newMetadataThreshold); @@ -179,12 +199,22 @@ async function votingToChangeMigrateAndCheck(sender, key, chainId, contractName) console.log(`${contractName} migration...`); } - const implCompiled = await compile('../../contracts/', contractName); + const implCompiled = await utils.compile('../../contracts/', contractName); if (!contractNewAddress && !ONLY_CHECK) { - const implAddress = await deploy(contractName, implCompiled, sender, key, chainId); + const implAddress = await utils.deploy(contractName, implCompiled, sender, key, chainId); console.log(` ${contractName} implementation address is ${implAddress}`); - const storageCompiled = await compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); - contractNewAddress = await deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [PROXY_STORAGE_NEW_ADDRESS, implAddress]); + const storageCompiled = await utils.compile('../../contracts/eternal-storage/', 'EternalStorageProxy'); + contractNewAddress = await utils.deploy('EternalStorageProxy', storageCompiled, sender, key, chainId, [PROXY_STORAGE_NEW_ADDRESS, implAddress]); + if (contractName == 'VotingToChangeKeys') { + VOTING_TO_CHANGE_KEYS_NEW_ADDRESS = contractNewAddress; + VOTING_TO_CHANGE_KEYS_NEW_ABI = implCompiled.abi; + } else if (contractName == 'VotingToChangeMinThreshold') { + VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ADDRESS = contractNewAddress; + VOTING_TO_CHANGE_MIN_THRESHOLD_NEW_ABI = implCompiled.abi; + } else if (contractName == 'VotingToChangeProxyAddress') { + VOTING_TO_CHANGE_PROXY_NEW_ADDRESS = contractNewAddress; + VOTING_TO_CHANGE_PROXY_NEW_ABI = implCompiled.abi; + } } console.log(` ${contractName} storage address is ${contractNewAddress}`); @@ -195,7 +225,7 @@ async function votingToChangeMigrateAndCheck(sender, key, chainId, contractName) const initDisabled = await votingNewInstance.methods.initDisabled().call(); if (!initDisabled) { const init = await votingNewInstance.methods.init(false); - await call(init, sender, contractNewAddress, key, chainId); + await utils.call(init, sender, contractNewAddress, key, chainId); } if (!ONLY_CHECK) { @@ -240,7 +270,7 @@ async function votingToChangeMigrateAndCheck(sender, key, chainId, contractName) console.log(' Call migrateBasicAll...'); const migrateBasicAll = votingNewInstance.methods.migrateBasicAll(contractOldAddress); - await call(migrateBasicAll, sender, contractNewAddress, key, chainId); + await utils.call(migrateBasicAll, sender, contractNewAddress, key, chainId); const nextBallotId = await votingOldInstance.methods.nextBallotId().call(); console.log(` Handle each of ${nextBallotId} ballot(s)...`); @@ -270,11 +300,11 @@ async function votingToChangeMigrateAndCheck(sender, key, chainId, contractName) voters ); - await call(migrateBasicOne, sender, contractNewAddress, key, chainId); + await utils.call(migrateBasicOne, sender, contractNewAddress, key, chainId); } - // console.log(' Disable migrations feature of the new contract...'); - // await call(votingNewInstance.methods.migrateDisable(), sender, contractNewAddress, key, chainId); + console.log(' Disable migrations feature of the new contract...'); + await utils.call(votingNewInstance.methods.migrateDisable(), sender, contractNewAddress, key, chainId); } if (ONLY_CHECK) { @@ -283,7 +313,7 @@ async function votingToChangeMigrateAndCheck(sender, key, chainId, contractName) console.log(' Checking new contract...'); } const poaInstance = new web3.eth.Contract(POA_ABI, POA_ADDRESS); - (await votingOldInstance.methods.proxyStorage().call()).should.be.equal(await votingNewInstance.methods.proxyStorage().call()); + PROXY_STORAGE_NEW_ADDRESS.should.be.equal(await votingNewInstance.methods.proxyStorage().call()); (await votingOldInstance.methods.maxOldMiningKeysDeepCheck().call()).should.be.equal(await votingNewInstance.methods.maxOldMiningKeysDeepCheck().call()); (await votingOldInstance.methods.nextBallotId().call()).should.be.equal(await votingNewInstance.methods.nextBallotId().call()); const activeBallotsLength = (await votingOldInstance.methods.activeBallotsLength().call()); @@ -340,82 +370,6 @@ async function votingToChangeMigrateAndCheck(sender, key, chainId, contractName) return success; } -async function compile(dir, contractName) { - console.log(` ${contractName} compile...`); - const compiled = solc.compile({ - sources: { - '': fs.readFileSync(dir + contractName + '.sol').toString() - } - }, 1, function (path) { - return {contents: fs.readFileSync(dir + path).toString()} - }); - const abi = JSON.parse(compiled.contracts[':' + contractName].interface); - const bytecode = compiled.contracts[':' + contractName].bytecode; - return {abi: abi, bytecode: bytecode}; -} - -async function deploy(contractName, contractSpec, sender, key, chainId, args) { - console.log(` ${contractName} deploy...`); - const contract = new web3.eth.Contract(contractSpec.abi); - const deploy = await contract.deploy({data: '0x' + contractSpec.bytecode, arguments: args}); - return (await call(deploy, sender, '', key, chainId)).contractAddress; -} - -async function call(method, from, to, key, chainId) { - const estimateGas = await method.estimateGas({ - from: from, - gas: web3.utils.toHex(GAS_LIMIT) - }); - - const nonce = await web3.eth.getTransactionCount(from); - const nonceHex = web3.utils.toHex(nonce); - const data = await method.encodeABI(); - - var tx = new EthereumTx({ - nonce: nonceHex, - gasPrice: web3.utils.toHex(GAS_PRICE), - gasLimit: web3.utils.toHex(estimateGas), - to: to, - value: '0x00', - data: data, - chainId: chainId - }); - - tx.sign(key); - - const serializedTx = tx.serialize(); - - return (await web3.eth.sendSignedTransaction("0x" + serializedTx.toString('hex'))); -} - -async function readPrivateKey() { - var mutableStdout = new Writable({ - write: function(chunk, encoding, callback) { - if (!this.muted) { - process.stdout.write(chunk, encoding); - } - callback(); - } - }); - - mutableStdout.muted = false; - - const readlineInterface = readline.createInterface({ - input: process.stdin, - output: mutableStdout, - terminal: true - }); - - readlineInterface.question('Enter your private key: ', (privateKey) => { - readlineInterface.close(); - console.log(''); - console.log(''); - migrateAndCheck(privateKey); - }); - - mutableStdout.muted = true; -} - // Deploy, init, migrate and check: // NETWORK=sokol PROXY_STORAGE_NEW_ADDRESS=0x3f918617a055d48e90f9fe06c168a75134565190 node migrateVotings diff --git a/scripts/migrate/utils/constants.js b/scripts/migrate/utils/constants.js new file mode 100644 index 0000000..6dae983 --- /dev/null +++ b/scripts/migrate/utils/constants.js @@ -0,0 +1,4 @@ +module.exports = { + CORE_COMMIT: 'fb311a6c475e37bd9ccc0781b369cf14d738f98e', + SOKOL_COMMIT: '4e020b68a3d477e1c41859c3f0402c0626254529' +} \ No newline at end of file diff --git a/scripts/migrate/utils/utils.js b/scripts/migrate/utils/utils.js new file mode 100644 index 0000000..12f2a23 --- /dev/null +++ b/scripts/migrate/utils/utils.js @@ -0,0 +1,95 @@ +const fs = require('fs'); +const Web3 = require('web3'); +var Writable = require('stream').Writable; +const readline = require('readline'); +const EthereumTx = require('ethereumjs-tx'); +const EthereumUtil = require('ethereumjs-util'); +const solc = require('solc'); + +const web3 = new Web3(new Web3.providers.HttpProvider("https://" + process.env.NETWORK + ".poa.network")); + +async function compile(dir, contractName) { + console.log(` ${contractName} compile...`); + const compiled = solc.compile({ + sources: { + '': fs.readFileSync(dir + contractName + '.sol').toString() + } + }, 1, function (path) { + return {contents: fs.readFileSync(dir + path).toString()} + }); + const abi = JSON.parse(compiled.contracts[':' + contractName].interface); + const bytecode = compiled.contracts[':' + contractName].bytecode; + return {abi: abi, bytecode: bytecode}; +} + +async function deploy(contractName, contractSpec, sender, key, chainId, args) { + console.log(` ${contractName} deploy...`); + const contract = new web3.eth.Contract(contractSpec.abi); + const deploy = await contract.deploy({data: '0x' + contractSpec.bytecode, arguments: args}); + return (await call(deploy, sender, '', key, chainId)).contractAddress; +} + +async function call(method, from, to, key, chainId) { + const gasPrice = web3.utils.toWei('1', 'gwei'); + const estimateGas = await method.estimateGas({ + from: from, + gas: web3.utils.toHex(4700000) + }); + + const nonce = await web3.eth.getTransactionCount(from); + const nonceHex = web3.utils.toHex(nonce); + const data = await method.encodeABI(); + + var tx = new EthereumTx({ + nonce: nonceHex, + gasPrice: web3.utils.toHex(gasPrice), + gasLimit: web3.utils.toHex(estimateGas), + to: to, + value: '0x00', + data: data, + chainId: chainId + }); + + tx.sign(key); + + const serializedTx = tx.serialize(); + + return web3.eth.sendSignedTransaction("0x" + serializedTx.toString('hex')); +} + +async function readPrivateKey() { + return new Promise((resolve, reject) => { + var mutableStdout = new Writable({ + write: function(chunk, encoding, callback) { + if (!this.muted) { + process.stdout.write(chunk, encoding); + } + callback(); + } + }); + + mutableStdout.muted = false; + + const readlineInterface = readline.createInterface({ + input: process.stdin, + output: mutableStdout, + terminal: true + }); + + readlineInterface.question('Enter your private key: ', (privateKey) => { + readlineInterface.close(); + console.log(''); + console.log(''); + resolve(privateKey); + }); + + mutableStdout.muted = true; + }); +} + +module.exports = { + compile: compile, + deploy: deploy, + call: call, + readPrivateKey: readPrivateKey +} \ No newline at end of file From ef0d6f56b77e05085dd378502623fe45e791ad55 Mon Sep 17 00:00:00 2001 From: Vadim Arasev Date: Mon, 14 May 2018 18:20:48 +0300 Subject: [PATCH 4/7] (Refactor) VotingToChange* contracts Relates to https://github.com/poanetwork/poa-network-consensus-contracts/issues/78#issuecomment-388439571 --- contracts/BallotsStorage.sol | 2 +- contracts/KeysManager.sol | 2 +- contracts/ProxyStorage.sol | 2 +- contracts/ValidatorMetadata.sol | 2 +- contracts/VotingToChangeKeys.sol | 526 +++--------------- contracts/VotingToChangeMinThreshold.sol | 431 +------------- contracts/VotingToChangeProxyAddress.sol | 422 ++------------ contracts/abstracts/VotingTo.sol | 191 +++++++ contracts/abstracts/VotingToChange.sol | 259 +++++++++ .../eternal-storage/EternalStorageProxy.sol | 2 +- .../IEternalStorageProxy.sol | 0 contracts/interfaces/IVotingToChange.sol | 15 + contracts/{ => libs}/SafeMath.sol | 0 scripts/migrate/utils/utils.js | 12 +- test/voting_to_change_keys_test.js | 30 +- test/voting_to_change_keys_upgrade_test.js | 28 +- test/voting_to_change_min_threshold_test.js | 28 +- ...ng_to_change_min_threshold_upgrade_test.js | 26 +- test/voting_to_change_proxy_test.js | 28 +- test/voting_to_change_proxy_upgrade_test.js | 26 +- 20 files changed, 702 insertions(+), 1330 deletions(-) create mode 100644 contracts/abstracts/VotingTo.sol create mode 100644 contracts/abstracts/VotingToChange.sol rename contracts/{eternal-storage => interfaces}/IEternalStorageProxy.sol (100%) create mode 100644 contracts/interfaces/IVotingToChange.sol rename contracts/{ => libs}/SafeMath.sol (100%) diff --git a/contracts/BallotsStorage.sol b/contracts/BallotsStorage.sol index f820eee..c7a1b3c 100644 --- a/contracts/BallotsStorage.sol +++ b/contracts/BallotsStorage.sol @@ -3,7 +3,7 @@ import "./interfaces/IBallotsStorage.sol"; import "./interfaces/IProxyStorage.sol"; import "./interfaces/IPoaNetworkConsensus.sol"; import "./eternal-storage/EternalStorage.sol"; -import "./SafeMath.sol"; +import "./libs/SafeMath.sol"; contract BallotsStorage is EternalStorage, IBallotsStorage { diff --git a/contracts/KeysManager.sol b/contracts/KeysManager.sol index 06900be..808de07 100644 --- a/contracts/KeysManager.sol +++ b/contracts/KeysManager.sol @@ -1,6 +1,6 @@ pragma solidity ^0.4.18; -import "./SafeMath.sol"; +import "./libs/SafeMath.sol"; import "./interfaces/IPoaNetworkConsensus.sol"; import "./interfaces/IKeysManager.sol"; import "./interfaces/IProxyStorage.sol"; diff --git a/contracts/ProxyStorage.sol b/contracts/ProxyStorage.sol index af869d5..e6f75d8 100644 --- a/contracts/ProxyStorage.sol +++ b/contracts/ProxyStorage.sol @@ -2,7 +2,7 @@ pragma solidity ^0.4.18; import "./interfaces/IProxyStorage.sol"; import "./interfaces/IPoaNetworkConsensus.sol"; -import "./eternal-storage/IEternalStorageProxy.sol"; +import "./interfaces/IEternalStorageProxy.sol"; import "./eternal-storage/EternalStorage.sol"; diff --git a/contracts/ValidatorMetadata.sol b/contracts/ValidatorMetadata.sol index 62ada9c..b38289b 100644 --- a/contracts/ValidatorMetadata.sol +++ b/contracts/ValidatorMetadata.sol @@ -1,6 +1,6 @@ pragma solidity ^0.4.18; -import "./SafeMath.sol"; +import "./libs/SafeMath.sol"; import "./interfaces/IBallotsStorage.sol"; import "./interfaces/IProxyStorage.sol"; import "./interfaces/IKeysManager.sol"; diff --git a/contracts/VotingToChangeKeys.sol b/contracts/VotingToChangeKeys.sol index 86787d9..bd916df 100644 --- a/contracts/VotingToChangeKeys.sol +++ b/contracts/VotingToChangeKeys.sol @@ -1,293 +1,20 @@ pragma solidity ^0.4.18; -import "./SafeMath.sol"; -import "./interfaces/IProxyStorage.sol"; -import "./interfaces/IBallotsStorage.sol"; import "./interfaces/IKeysManager.sol"; import "./interfaces/IVotingToChangeKeys.sol"; -import "./interfaces/IPoaNetworkConsensus.sol"; -import "./eternal-storage/EternalStorage.sol"; +import "./abstracts/VotingToChange.sol"; -contract VotingToChangeKeys is EternalStorage, IVotingToChangeKeys { - using SafeMath for uint256; - +contract VotingToChangeKeys is IVotingToChangeKeys, VotingToChange { enum BallotTypes {Invalid, Adding, Removal, Swap} enum KeyTypes {Invalid, MiningKey, VotingKey, PayoutKey} - enum QuorumStates {Invalid, InProgress, Accepted, Rejected} - enum ActionChoice {Invalid, Accept, Reject} - - event Vote(uint256 indexed id, uint256 decision, address indexed voter, uint256 time, address voterMiningKey); - event BallotFinalized(uint256 indexed id, address indexed voter); - event BallotCreated(uint256 indexed id, uint256 indexed ballotType, address indexed creator); - - modifier onlyOwner() { - require(msg.sender == addressStorage[keccak256("owner")]); - _; - } - - modifier onlyValidVotingKey(address _votingKey) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - require(keysManager.isVotingActive(_votingKey)); - _; - } - - function maxOldMiningKeysDeepCheck() public pure returns(uint8) { - return 25; - } - - function proxyStorage() public view returns(address) { - return addressStorage[keccak256("proxyStorage")]; - } - - function nextBallotId() public view returns(uint256) { - return uintStorage[keccak256("nextBallotId")]; - } - - function activeBallotsLength() public view returns(uint256) { - return uintArrayStorage[_activeBallotsHash()].length; - } - - function activeBallots(uint256 _index) public view returns(uint256) { - return uintArrayStorage[_activeBallotsHash()][_index]; - } - - function validatorActiveBallots(address _miningKey) public view returns(uint256) { - return uintStorage[keccak256("validatorActiveBallots", _miningKey)]; - } - - function demoMode() public view returns(bool) { - return boolStorage[keccak256("demoMode")]; - } - - function initDisabled() public view returns(bool) { - return boolStorage[keccak256("initDisabled")]; - } - - function init(bool _demoMode) public onlyOwner { - require(!initDisabled()); - boolStorage[keccak256("demoMode")] = _demoMode; - boolStorage[keccak256("initDisabled")] = true; - } - - function createVotingForKeys( - uint256 _startTime, - uint256 _endTime, - address _affectedKey, - uint256 _affectedKeyType, - address _miningKey, - uint256 _ballotType, - string memo - ) public onlyValidVotingKey(msg.sender) { - require(_startTime > 0 && _endTime > 0); - require(_endTime > _startTime && _startTime > getTime()); - uint256 diffTime = _endTime.sub(_startTime); - if (!demoMode()) { - require(diffTime > 2 days); - } - require(diffTime <= 14 days); - //only if ballotType is swap or remove - require(areBallotParamsValid(_ballotType, _affectedKey, _affectedKeyType, _miningKey)); - address creatorMiningKey = getMiningByVotingKey(msg.sender); - require(withinLimit(creatorMiningKey)); - uint256 _nextBallotId = nextBallotId(); - _setStartTime(_nextBallotId, _startTime); - _setEndTime(_nextBallotId, _endTime); - _setAffectedKey(_nextBallotId, _affectedKey); - _setAffectedKeyType(_nextBallotId, _affectedKeyType); - _setMiningKey(_nextBallotId, _miningKey); - _setTotalVoters(_nextBallotId, 0); - _setProgress(_nextBallotId, 0); - _setIsFinalized(_nextBallotId, false); - _setQuorumState(_nextBallotId, uint8(QuorumStates.InProgress)); - _setBallotType(_nextBallotId, _ballotType); - _setIndex(_nextBallotId, activeBallotsLength()); - _setMinThresholdOfVoters(_nextBallotId, getGlobalMinThresholdOfVoters()); - _setCreator(_nextBallotId, creatorMiningKey); - _setMemo(_nextBallotId, memo); - _activeBallotsAdd(_nextBallotId); - _increaseValidatorLimit(); - BallotCreated(_nextBallotId, _ballotType, msg.sender); - _setNextBallotId(_nextBallotId.add(1)); - } - - function vote(uint256 _id, uint8 _choice) public onlyValidVotingKey(msg.sender) { - require(!getIsFinalized(_id)); - // check for validation - address miningKey = getMiningByVotingKey(msg.sender); - require(isValidVote(_id, msg.sender)); - if (_choice == uint(ActionChoice.Accept)) { - _setProgress(_id, getProgress(_id) + 1); - } else if (_choice == uint(ActionChoice.Reject)) { - _setProgress(_id, getProgress(_id) - 1); - } else { - revert(); - } - _votersAdd(_id, miningKey); - _setTotalVoters(_id, getTotalVoters(_id).add(1)); - Vote(_id, _choice, msg.sender, getTime(), miningKey); - } - - function finalize(uint256 _id) public onlyValidVotingKey(msg.sender) { - require(_id < nextBallotId()); - require(getStartTime(_id) <= getTime()); - require(!isActive(_id)); - require(!getIsFinalized(_id)); - finalizeBallot(_id); - _decreaseValidatorLimit(_id); - _setIsFinalized(_id, true); - BallotFinalized(_id, msg.sender); - } - - function getBallotsStorage() public view returns(address) { - return IProxyStorage(proxyStorage()).getBallotsStorage(); - } - - function getKeysManager() public view returns(address) { - return IProxyStorage(proxyStorage()).getKeysManager(); - } - - function getBallotLimitPerValidator() public view returns(uint256) { - IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); - return ballotsStorage.getBallotLimitPerValidator(); - } - - function getGlobalMinThresholdOfVoters() public view returns(uint256) { - uint8 thresholdForKeysType = 1; - IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); - return ballotsStorage.getBallotThreshold(thresholdForKeysType); - } - - function getProgress(uint256 _id) public view returns(int) { - return intStorage[keccak256("votingState", _id, "progress")]; - } - - function getTotalVoters(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "totalVoters")]; - } - - function getMinThresholdOfVoters(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "minThresholdOfVoters")]; - } - - function getAffectedKeyType(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "affectedKeyType")]; - } - - function getAffectedKey(uint256 _id) public view returns(address) { - return addressStorage[keccak256("votingState", _id, "affectedKey")]; - } - - function getMiningKey(uint256 _id) public view returns(address) { - return addressStorage[keccak256("votingState", _id, "miningKey")]; - } - - function getMiningByVotingKey(address _votingKey) public view returns(address) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - return keysManager.getMiningKeyByVoting(_votingKey); - } - - function getBallotType(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "ballotType")]; - } - - function getStartTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "startTime")]; - } - - function getEndTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "endTime")]; - } - - function getIsFinalized(uint256 _id) public view returns(bool) { - return boolStorage[keccak256("votingState", _id, "isFinalized")]; - } - - function getQuorumState(uint256 _id) public view returns(uint8) { - return uint8(uintStorage[keccak256("votingState", _id, "quorumState")]); - } - - function getIndex(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "index")]; - } - - function getCreator(uint256 _id) public view returns(address) { - return addressStorage[keccak256("votingState", _id, "creator")]; - } - - function getTime() public view returns(uint256) { - return now; - } - - function isActive(uint256 _id) public view returns(bool) { - bool withinTime = getStartTime(_id) <= getTime() && getTime() <= getEndTime(_id); - return withinTime; - } - - function getMemo(uint256 _id) public view returns(string) { - return stringStorage[keccak256("votingState", _id, "memo")]; - } - - function hasMiningKeyAlreadyVoted(uint256 _id, address _miningKey) public view returns(bool) { - return boolStorage[keccak256("votingState", _id, "voters", _miningKey)]; - } - - function hasAlreadyVoted(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - return hasMiningKeyAlreadyVoted(_id, miningKey); - } - - function isValidVote(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - bool notVoted = !hasAlreadyVoted(_id, _votingKey); - bool oldKeysNotVoted = !areOldMiningKeysVoted(_id, miningKey); - return notVoted && isActive(_id) && oldKeysNotVoted; - } - - function areOldMiningKeysVoted(uint256 _id, address _miningKey) public view returns(bool) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - uint8 maxDeep = maxOldMiningKeysDeepCheck(); - for (uint8 i = 0; i < maxDeep; i++) { - address oldMiningKey = keysManager.getMiningKeyHistory(_miningKey); - if (oldMiningKey == address(0)) { - return false; - } - if (hasMiningKeyAlreadyVoted(_id, oldMiningKey)) { - return true; - } else { - _miningKey = oldMiningKey; - } - } - return false; - } - - function checkIfMiningExisted(address _currentKey, address _affectedKey) public view returns(bool) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - uint8 maxDeep = maxOldMiningKeysDeepCheck(); - for (uint8 i = 0; i < maxDeep; i++) { - address oldMiningKey = keysManager.getMiningKeyHistory(_currentKey); - if (oldMiningKey == address(0)) { - return false; - } - if (oldMiningKey == _affectedKey) { - return true; - } else { - _currentKey = oldMiningKey; - } - } - return false; - } - - function withinLimit(address _miningKey) public view returns(bool) { - return validatorActiveBallots(_miningKey) <= getBallotLimitPerValidator(); - } function areBallotParamsValid( uint256 _ballotType, address _affectedKey, uint256 _affectedKeyType, - address _miningKey) public view returns(bool) - { + address _miningKey + ) public view returns(bool) { if (_affectedKeyType == uint256(KeyTypes.MiningKey) && _ballotType != uint256(BallotTypes.Removal)) { require(!checkIfMiningExisted(_miningKey, _affectedKey)); } @@ -331,106 +58,87 @@ contract VotingToChangeKeys is EternalStorage, IVotingToChangeKeys { return true; } - function migrateDisabled() public view returns(bool) { - return boolStorage[keccak256("migrateDisabled")]; + function checkIfMiningExisted(address _currentKey, address _affectedKey) + public + view + returns(bool) + { + IKeysManager keysManager = IKeysManager(getKeysManager()); + uint8 maxDeep = maxOldMiningKeysDeepCheck(); + for (uint8 i = 0; i < maxDeep; i++) { + address oldMiningKey = keysManager.getMiningKeyHistory(_currentKey); + if (oldMiningKey == address(0)) { + return false; + } + if (oldMiningKey == _affectedKey) { + return true; + } else { + _currentKey = oldMiningKey; + } + } + return false; } - function migrateBasicAll(address _prevVotingToChangeKeys) public onlyOwner { - require(_prevVotingToChangeKeys != address(0)); - require(!migrateDisabled()); + function createBallot( + uint256 _startTime, + uint256 _endTime, + address _affectedKey, + uint256 _affectedKeyType, + address _miningKey, + uint256 _ballotType, + string memo + ) public { + //only if ballotType is swap or remove + require(areBallotParamsValid(_ballotType, _affectedKey, _affectedKeyType, _miningKey)); + uint256 ballotId = _createBallot(_ballotType, _startTime, _endTime, memo); + _setAffectedKey(ballotId, _affectedKey); + _setAffectedKeyType(ballotId, _affectedKeyType); + _setMiningKey(ballotId, _miningKey); + _setBallotType(ballotId, _ballotType); + } - IVotingToChangeKeys prev = - IVotingToChangeKeys(_prevVotingToChangeKeys); - IPoaNetworkConsensusForVotingToChange poa = - IPoaNetworkConsensusForVotingToChange(IProxyStorage(proxyStorage()).getPoaConsensus()); + function getAffectedKey(uint256 _id) public view returns(address) { + return addressStorage[keccak256(_storeName(), _id, "affectedKey")]; + } - _setNextBallotId(prev.nextBallotId()); + function getAffectedKeyType(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "affectedKeyType")]; + } - uint256 _activeBallotsLength = prev.activeBallotsLength(); - _activeBallotsClear(); - for (uint256 i = 0; i < _activeBallotsLength; i++) { - _activeBallotsAdd(prev.activeBallots(i)); - } + function getBallotType(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "ballotType")]; + } - uint256 currentValidatorsLength = poa.getCurrentValidatorsLength(); - for (i = 0; i < currentValidatorsLength; i++) { - address miningKey = poa.currentValidators(i); - uint256 count = prev.validatorActiveBallots(miningKey); - _setValidatorActiveBallots(miningKey, count); - } + function getMiningKey(uint256 _id) public view returns(address) { + return addressStorage[keccak256(_storeName(), _id, "miningKey")]; } function migrateBasicOne( uint256 _id, - address _prevVotingToChangeKeys, + address _prevVotingToChange, uint8 _quorumState, uint256 _index, address _creator, string _memo, address[] _voters - ) public onlyOwner { - require(_prevVotingToChangeKeys != address(0)); - require(!migrateDisabled()); - - IVotingToChangeKeys prev = - IVotingToChangeKeys(_prevVotingToChangeKeys); - - _setStartTime(_id, prev.getStartTime(_id)); - _setEndTime(_id, prev.getEndTime(_id)); + ) public { + _migrateBasicOne( + _id, + _prevVotingToChange, + _quorumState, + _index, + _creator, + _memo, + _voters + ); + IVotingToChangeKeys prev = IVotingToChangeKeys(_prevVotingToChange); + _setBallotType(_id, prev.getBallotType(_id)); _setAffectedKey(_id, prev.getAffectedKey(_id)); _setAffectedKeyType(_id, prev.getAffectedKeyType(_id)); _setMiningKey(_id, prev.getMiningKey(_id)); - _setTotalVoters(_id, prev.getTotalVoters(_id)); - _setProgress(_id, prev.getProgress(_id)); - _setIsFinalized(_id, prev.getIsFinalized(_id)); - _setQuorumState(_id, _quorumState); - _setBallotType(_id, prev.getBallotType(_id)); - _setIndex(_id, _index); - _setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id)); - for (uint256 i = 0; i < _voters.length; i++) { - address miningKey = _voters[i]; - _votersAdd(_id, miningKey); - } - _setCreator(_id, _creator); - _setMemo(_id, _memo); } - function migrateDisable() public onlyOwner { - require(!migrateDisabled()); - boolStorage[keccak256("migrateDisabled")] = true; - } - - function finalizeBallot(uint256 _id) private { - if (getProgress(_id) > 0 && getTotalVoters(_id) >= getMinThresholdOfVoters(_id)) { - _setQuorumState(_id, uint8(QuorumStates.Accepted)); - if (getBallotType(_id) == uint256(BallotTypes.Adding)) { - finalizeAdding(_id); - } else if (getBallotType(_id) == uint256(BallotTypes.Removal)) { - finalizeRemoval(_id); - } else if (getBallotType(_id) == uint256(BallotTypes.Swap)) { - finalizeSwap(_id); - } - } else { - _setQuorumState(_id, uint8(QuorumStates.Rejected)); - } - deactiveBallot(_id); - } - - function deactiveBallot(uint256 _id) private { - uint256 removedIndex = getIndex(_id); - uint256 lastIndex = activeBallotsLength() - 1; - uint256 lastBallotId = activeBallots(lastIndex); - // Override the removed ballot with the last one. - _activeBallotsSet(removedIndex, lastBallotId); - // Update the index of the last validator. - _setIndex(lastBallotId, removedIndex); - _activeBallotsSet(lastIndex, 0); - if (activeBallotsLength() > 0) { - _activeBallotsDecreaseLength(); - } - } - - function finalizeAdding(uint256 _id) private { + function _finalizeAdding(uint256 _id) private { require(getBallotType(_id) == uint256(BallotTypes.Adding)); IKeysManager keysManager = IKeysManager(getKeysManager()); if (getAffectedKeyType(_id) == uint256(KeyTypes.MiningKey)) { @@ -444,7 +152,17 @@ contract VotingToChangeKeys is EternalStorage, IVotingToChangeKeys { } } - function finalizeRemoval(uint256 _id) private { + function _finalizeBallotInner(uint256 _id) private { + if (getBallotType(_id) == uint256(BallotTypes.Adding)) { + _finalizeAdding(_id); + } else if (getBallotType(_id) == uint256(BallotTypes.Removal)) { + _finalizeRemoval(_id); + } else if (getBallotType(_id) == uint256(BallotTypes.Swap)) { + _finalizeSwap(_id); + } + } + + function _finalizeRemoval(uint256 _id) private { require(getBallotType(_id) == uint256(BallotTypes.Removal)); IKeysManager keysManager = IKeysManager(getKeysManager()); if (getAffectedKeyType(_id) == uint256(KeyTypes.MiningKey)) { @@ -458,7 +176,7 @@ contract VotingToChangeKeys is EternalStorage, IVotingToChangeKeys { } } - function finalizeSwap(uint256 _id) private { + function _finalizeSwap(uint256 _id) private { require(getBallotType(_id) == uint256(BallotTypes.Swap)); IKeysManager keysManager = IKeysManager(getKeysManager()); if (getAffectedKeyType(_id) == uint256(KeyTypes.MiningKey)) { @@ -472,56 +190,6 @@ contract VotingToChangeKeys is EternalStorage, IVotingToChangeKeys { } } - function _increaseValidatorLimit() private { - address miningKey = getMiningByVotingKey(msg.sender); - _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).add(1)); - } - - function _decreaseValidatorLimit(uint256 _id) private { - address miningKey = getCreator(_id); - _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).sub(1)); - } - - function _setNextBallotId(uint256 _id) private { - uintStorage[keccak256("nextBallotId")] = _id; - } - - function _activeBallotsHash() private pure returns(bytes32) { - return keccak256("activeBallots"); - } - - function _activeBallotsAdd(uint256 _id) private { - uintArrayStorage[_activeBallotsHash()].push(_id); - } - - function _activeBallotsSet(uint256 _index, uint256 _id) private { - uintArrayStorage[_activeBallotsHash()][_index] = _id; - } - - function _activeBallotsDecreaseLength() private { - uintArrayStorage[_activeBallotsHash()].length--; - } - - function _activeBallotsClear() private { - delete uintArrayStorage[_activeBallotsHash()]; - } - - function _setValidatorActiveBallots(address _miningKey, uint256 _count) private { - uintStorage[keccak256("validatorActiveBallots", _miningKey)] = _count; - } - - function _storeName() private pure returns(string) { - return "votingState"; - } - - function _setStartTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "startTime")] = _value; - } - - function _setEndTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "endTime")] = _value; - } - function _setAffectedKey(uint256 _ballotId, address _value) private { addressStorage[keccak256(_storeName(), _ballotId, "affectedKey")] = _value; } @@ -530,48 +198,12 @@ contract VotingToChangeKeys is EternalStorage, IVotingToChangeKeys { uintStorage[keccak256(_storeName(), _ballotId, "affectedKeyType")] = _value; } - function _setMiningKey(uint256 _ballotId, address _value) private { - addressStorage[keccak256(_storeName(), _ballotId, "miningKey")] = _value; - } - - function _setTotalVoters(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "totalVoters")] = _value; - } - - function _setProgress(uint256 _ballotId, int256 _value) private { - intStorage[keccak256(_storeName(), _ballotId, "progress")] = _value; - } - - function _setIsFinalized(uint256 _ballotId, bool _value) private { - boolStorage[keccak256(_storeName(), _ballotId, "isFinalized")] = _value; - } - - function _setQuorumState(uint256 _ballotId, uint8 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "quorumState")] = _value; - } - function _setBallotType(uint256 _ballotId, uint256 _value) private { uintStorage[keccak256(_storeName(), _ballotId, "ballotType")] = _value; } - function _setIndex(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "index")] = _value; - } - - function _setMinThresholdOfVoters(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "minThresholdOfVoters")] = _value; - } - - function _setCreator(uint256 _ballotId, address _value) private { - addressStorage[keccak256(_storeName(), _ballotId, "creator")] = _value; - } - - function _setMemo(uint256 _ballotId, string _value) private { - stringStorage[keccak256(_storeName(), _ballotId, "memo")] = _value; - } - - function _votersAdd(uint256 _ballotId, address _miningKey) private { - boolStorage[keccak256(_storeName(), _ballotId, "voters", _miningKey)] = true; + function _setMiningKey(uint256 _ballotId, address _value) private { + addressStorage[keccak256(_storeName(), _ballotId, "miningKey")] = _value; } } diff --git a/contracts/VotingToChangeMinThreshold.sol b/contracts/VotingToChangeMinThreshold.sol index 4b984ec..232d290 100644 --- a/contracts/VotingToChangeMinThreshold.sol +++ b/contracts/VotingToChangeMinThreshold.sol @@ -1,36 +1,16 @@ pragma solidity ^0.4.18; -import "./SafeMath.sol"; -import "./interfaces/IProxyStorage.sol"; -import "./interfaces/IBallotsStorage.sol"; -import "./interfaces/IKeysManager.sol"; import "./interfaces/IVotingToChangeMinThreshold.sol"; -import "./interfaces/IPoaNetworkConsensus.sol"; -import "./eternal-storage/EternalStorage.sol"; +import "./abstracts/VotingToChange.sol"; -contract VotingToChangeMinThreshold is EternalStorage, IVotingToChangeMinThreshold { - using SafeMath for uint256; - - enum QuorumStates {Invalid, InProgress, Accepted, Rejected} - enum ActionChoice {Invalid, Accept, Reject} - - event Vote(uint256 indexed id, uint256 decision, address indexed voter, uint256 time, address voterMiningKey); - event BallotFinalized(uint256 indexed id, address indexed voter); - event BallotCreated(uint256 indexed id, uint256 indexed ballotType, address indexed creator); - - modifier onlyOwner() { - require(msg.sender == addressStorage[keccak256("owner")]); - _; - } - - modifier onlyValidVotingKey(address _votingKey) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - require(keysManager.isVotingActive(_votingKey)); - _; - } - - modifier isValidProposedValue(uint256 _proposedValue) { +contract VotingToChangeMinThreshold is IVotingToChangeMinThreshold, VotingToChange { + function createBallot( + uint256 _startTime, + uint256 _endTime, + uint256 _proposedValue, + string memo + ) public { IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); if (demoMode()) { require(_proposedValue >= 1); @@ -39,401 +19,46 @@ contract VotingToChangeMinThreshold is EternalStorage, IVotingToChangeMinThresho } require(_proposedValue != getGlobalMinThresholdOfVoters()); require(_proposedValue <= ballotsStorage.getProxyThreshold()); - _; - } - - function maxOldMiningKeysDeepCheck() public pure returns(uint8) { - return 25; - } - - function proxyStorage() public view returns(address) { - return addressStorage[keccak256("proxyStorage")]; - } - - function nextBallotId() public view returns(uint256) { - return uintStorage[keccak256("nextBallotId")]; - } - - function activeBallotsLength() public view returns(uint256) { - return uintArrayStorage[_activeBallotsHash()].length; - } - - function activeBallots(uint256 _index) public view returns(uint256) { - return uintArrayStorage[_activeBallotsHash()][_index]; - } - - function validatorActiveBallots(address _miningKey) public view returns(uint256) { - return uintStorage[keccak256("validatorActiveBallots", _miningKey)]; - } - - function demoMode() public view returns(bool) { - return boolStorage[keccak256("demoMode")]; - } - - function initDisabled() public view returns(bool) { - return boolStorage[keccak256("initDisabled")]; - } - - function init(bool _demoMode) public onlyOwner { - require(!initDisabled()); - boolStorage[keccak256("demoMode")] = _demoMode; - boolStorage[keccak256("initDisabled")] = true; - } - - function createBallotToChangeThreshold( - uint256 _startTime, - uint256 _endTime, - uint256 _proposedValue, - string memo - ) public onlyValidVotingKey(msg.sender) isValidProposedValue(_proposedValue) { - require(_startTime > 0 && _endTime > 0); - require(_endTime > _startTime && _startTime > getTime()); - uint256 diffTime = _endTime.sub(_startTime); - if (!demoMode()) { - require(diffTime > 2 days); - } - require(diffTime <= 14 days); - address creatorMiningKey = getMiningByVotingKey(msg.sender); - require(withinLimit(creatorMiningKey)); - uint256 _nextBallotId = nextBallotId(); - _setStartTime(_nextBallotId, _startTime); - _setEndTime(_nextBallotId, _endTime); - _setTotalVoters(_nextBallotId, 0); - _setProgress(_nextBallotId, 0); - _setIsFinalized(_nextBallotId, false); - _setQuorumState(_nextBallotId, uint8(QuorumStates.InProgress)); - _setIndex(_nextBallotId, activeBallotsLength()); - _setProposedValue(_nextBallotId, _proposedValue); - _setMinThresholdOfVoters(_nextBallotId, getGlobalMinThresholdOfVoters()); - _setCreator(_nextBallotId, creatorMiningKey); - _setMemo(_nextBallotId, memo); - _activeBallotsAdd(_nextBallotId); - _increaseValidatorLimit(); - BallotCreated(_nextBallotId, 4, msg.sender); - _setNextBallotId(_nextBallotId.add(1)); - } - - function vote(uint256 _id, uint8 _choice) public onlyValidVotingKey(msg.sender) { - require(!getIsFinalized(_id)); - address miningKey = getMiningByVotingKey(msg.sender); - require(isValidVote(_id, msg.sender)); - if (_choice == uint(ActionChoice.Accept)) { - _setProgress(_id, getProgress(_id) + 1); - } else if (_choice == uint(ActionChoice.Reject)) { - _setProgress(_id, getProgress(_id) - 1); - } else { - revert(); - } - _votersAdd(_id, miningKey); - _setTotalVoters(_id, getTotalVoters(_id).add(1)); - Vote(_id, _choice, msg.sender, getTime(), miningKey); - } - - function finalize(uint256 _id) public onlyValidVotingKey(msg.sender) { - require(_id < nextBallotId()); - require(getStartTime(_id) <= getTime()); - require(!isActive(_id)); - require(!getIsFinalized(_id)); - finalizeBallot(_id); - _decreaseValidatorLimit(_id); - _setIsFinalized(_id, true); - BallotFinalized(_id, msg.sender); - } - - function getBallotsStorage() public view returns(address) { - return IProxyStorage(proxyStorage()).getBallotsStorage(); - } - - function getKeysManager() public view returns(address) { - return IProxyStorage(proxyStorage()).getKeysManager(); - } - - function getBallotLimitPerValidator() public view returns(uint256) { - IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); - return ballotsStorage.getBallotLimitPerValidator(); + uint256 ballotType = 4; + uint256 ballotId = _createBallot(ballotType, _startTime, _endTime, memo); + _setProposedValue(ballotId, _proposedValue); } function getProposedValue(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "proposedValue")]; - } - - function getGlobalMinThresholdOfVoters() public view returns(uint256) { - uint8 thresholdForKeysType = 1; - IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); - return ballotsStorage.getBallotThreshold(thresholdForKeysType); - } - - function getProgress(uint256 _id) public view returns(int) { - return intStorage[keccak256("votingState", _id, "progress")]; - } - - function getTotalVoters(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "totalVoters")]; - } - - function getMinThresholdOfVoters(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "minThresholdOfVoters")]; - } - - function getMiningByVotingKey(address _votingKey) public view returns(address) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - return keysManager.getMiningKeyByVoting(_votingKey); - } - - function getStartTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "startTime")]; - } - - function getEndTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "endTime")]; - } - - function getIsFinalized(uint256 _id) public view returns(bool) { - return boolStorage[keccak256("votingState", _id, "isFinalized")]; - } - - function getQuorumState(uint256 _id) public view returns(uint8) { - return uint8(uintStorage[keccak256("votingState", _id, "quorumState")]); - } - - function getIndex(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "index")]; - } - - function getCreator(uint256 _id) public view returns(address) { - return addressStorage[keccak256("votingState", _id, "creator")]; - } - - function getTime() public view returns(uint256) { - return now; - } - - function isActive(uint256 _id) public view returns(bool) { - bool withinTime = getStartTime(_id) <= getTime() && getTime() <= getEndTime(_id); - return withinTime; - } - - function getMemo(uint256 _id) public view returns(string) { - return stringStorage[keccak256("votingState", _id, "memo")]; - } - - function hasMiningKeyAlreadyVoted(uint256 _id, address _miningKey) public view returns(bool) { - return boolStorage[keccak256("votingState", _id, "voters", _miningKey)]; - } - - function hasAlreadyVoted(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - return hasMiningKeyAlreadyVoted(_id, miningKey); - } - - function isValidVote(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - bool notVoted = !hasAlreadyVoted(_id, _votingKey); - bool oldKeysNotVoted = !areOldMiningKeysVoted(_id, miningKey); - return notVoted && isActive(_id) && oldKeysNotVoted; - } - - function areOldMiningKeysVoted(uint256 _id, address _miningKey) public view returns(bool) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - uint8 maxDeep = maxOldMiningKeysDeepCheck(); - for (uint8 i = 0; i < maxDeep; i++) { - address oldMiningKey = keysManager.getMiningKeyHistory(_miningKey); - if (oldMiningKey == address(0)) { - return false; - } - if (hasMiningKeyAlreadyVoted(_id, oldMiningKey)) { - return true; - } else { - _miningKey = oldMiningKey; - } - } - return false; - } - - function withinLimit(address _miningKey) public view returns(bool) { - return validatorActiveBallots(_miningKey) <= getBallotLimitPerValidator(); - } - - function migrateDisabled() public view returns(bool) { - return boolStorage[keccak256("migrateDisabled")]; - } - - function migrateBasicAll(address _prevVotingToChangeMinThreshold) public onlyOwner { - require(_prevVotingToChangeMinThreshold != address(0)); - require(!migrateDisabled()); - - IVotingToChangeMinThreshold prev = - IVotingToChangeMinThreshold(_prevVotingToChangeMinThreshold); - IPoaNetworkConsensusForVotingToChange poa = - IPoaNetworkConsensusForVotingToChange(IProxyStorage(proxyStorage()).getPoaConsensus()); - - _setNextBallotId(prev.nextBallotId()); - - uint256 _activeBallotsLength = prev.activeBallotsLength(); - _activeBallotsClear(); - for (uint256 i = 0; i < _activeBallotsLength; i++) { - _activeBallotsAdd(prev.activeBallots(i)); - } - - uint256 currentValidatorsLength = poa.getCurrentValidatorsLength(); - for (i = 0; i < currentValidatorsLength; i++) { - address miningKey = poa.currentValidators(i); - uint256 count = prev.validatorActiveBallots(miningKey); - _setValidatorActiveBallots(miningKey, count); - } + return uintStorage[keccak256(_storeName(), _id, "proposedValue")]; } function migrateBasicOne( uint256 _id, - address _prevVotingToChangeMinThreshold, + address _prevVotingToChange, uint8 _quorumState, uint256 _index, address _creator, string _memo, address[] _voters - ) public onlyOwner { - require(_prevVotingToChangeMinThreshold != address(0)); - require(!migrateDisabled()); - + ) public { + _migrateBasicOne( + _id, + _prevVotingToChange, + _quorumState, + _index, + _creator, + _memo, + _voters + ); IVotingToChangeMinThreshold prev = - IVotingToChangeMinThreshold(_prevVotingToChangeMinThreshold); - - _setStartTime(_id, prev.getStartTime(_id)); - _setEndTime(_id, prev.getEndTime(_id)); - _setTotalVoters(_id, prev.getTotalVoters(_id)); - _setProgress(_id, prev.getProgress(_id)); - _setIsFinalized(_id, prev.getIsFinalized(_id)); - _setQuorumState(_id, _quorumState); - _setIndex(_id, _index); - _setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id)); + IVotingToChangeMinThreshold(_prevVotingToChange); _setProposedValue(_id, prev.getProposedValue(_id)); - for (uint256 i = 0; i < _voters.length; i++) { - address miningKey = _voters[i]; - _votersAdd(_id, miningKey); - } - _setCreator(_id, _creator); - _setMemo(_id, _memo); - } - - function migrateDisable() public onlyOwner { - require(!migrateDisabled()); - boolStorage[keccak256("migrateDisabled")] = true; - } - - function finalizeBallot(uint256 _id) private { - if (getProgress(_id) > 0 && getTotalVoters(_id) >= getMinThresholdOfVoters(_id)) { - uint8 thresholdForKeysType = 1; - IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); - _setQuorumState(_id, uint8(QuorumStates.Accepted)); - ballotsStorage.setThreshold(getProposedValue(_id), thresholdForKeysType); - } else { - _setQuorumState(_id, uint8(QuorumStates.Rejected)); - } - deactiveBallot(_id); - } - - function deactiveBallot(uint256 _id) private { - uint256 removedIndex = getIndex(_id); - uint256 lastIndex = activeBallotsLength() - 1; - uint256 lastBallotId = activeBallots(lastIndex); - // Override the removed ballot with the last one. - _activeBallotsSet(removedIndex, lastBallotId); - // Update the index of the last validator. - _setIndex(lastBallotId, removedIndex); - _activeBallotsSet(lastIndex, 0); - if (activeBallotsLength() > 0) { - _activeBallotsDecreaseLength(); - } - } - - function _increaseValidatorLimit() private { - address miningKey = getMiningByVotingKey(msg.sender); - _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).add(1)); - } - - function _decreaseValidatorLimit(uint256 _id) private { - address miningKey = getCreator(_id); - _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).sub(1)); } - function _setNextBallotId(uint256 _id) private { - uintStorage[keccak256("nextBallotId")] = _id; - } - - function _activeBallotsHash() private pure returns(bytes32) { - return keccak256("activeBallots"); - } - - function _activeBallotsAdd(uint256 _id) private { - uintArrayStorage[_activeBallotsHash()].push(_id); - } - - function _activeBallotsSet(uint256 _index, uint256 _id) private { - uintArrayStorage[_activeBallotsHash()][_index] = _id; - } - - function _activeBallotsDecreaseLength() private { - uintArrayStorage[_activeBallotsHash()].length--; - } - - function _activeBallotsClear() private { - delete uintArrayStorage[_activeBallotsHash()]; - } - - function _setValidatorActiveBallots(address _miningKey, uint256 _count) private { - uintStorage[keccak256("validatorActiveBallots", _miningKey)] = _count; - } - - function _storeName() private pure returns(string) { - return "votingState"; - } - - function _setStartTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "startTime")] = _value; - } - - function _setEndTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "endTime")] = _value; - } - - function _setTotalVoters(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "totalVoters")] = _value; - } - - function _setProgress(uint256 _ballotId, int256 _value) private { - intStorage[keccak256(_storeName(), _ballotId, "progress")] = _value; - } - - function _setIsFinalized(uint256 _ballotId, bool _value) private { - boolStorage[keccak256(_storeName(), _ballotId, "isFinalized")] = _value; - } - - function _setQuorumState(uint256 _ballotId, uint8 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "quorumState")] = _value; - } - - function _setIndex(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "index")] = _value; + function _finalizeBallotInner(uint256 _id) private { + uint8 thresholdForKeysType = 1; + IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); + ballotsStorage.setThreshold(getProposedValue(_id), thresholdForKeysType); } function _setProposedValue(uint256 _ballotId, uint256 _value) private { uintStorage[keccak256(_storeName(), _ballotId, "proposedValue")] = _value; } - function _setMinThresholdOfVoters(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "minThresholdOfVoters")] = _value; - } - - function _setCreator(uint256 _ballotId, address _value) private { - addressStorage[keccak256(_storeName(), _ballotId, "creator")] = _value; - } - - function _setMemo(uint256 _ballotId, string _value) private { - stringStorage[keccak256(_storeName(), _ballotId, "memo")] = _value; - } - - function _votersAdd(uint256 _ballotId, address _miningKey) private { - boolStorage[keccak256(_storeName(), _ballotId, "voters", _miningKey)] = true; - } - } diff --git a/contracts/VotingToChangeProxyAddress.sol b/contracts/VotingToChangeProxyAddress.sol index 43a6c01..d49efc4 100644 --- a/contracts/VotingToChangeProxyAddress.sol +++ b/contracts/VotingToChangeProxyAddress.sol @@ -1,436 +1,76 @@ pragma solidity ^0.4.18; -import "./SafeMath.sol"; import "./interfaces/IProxyStorage.sol"; import "./interfaces/IBallotsStorage.sol"; -import "./interfaces/IKeysManager.sol"; import "./interfaces/IVotingToChangeProxyAddress.sol"; -import "./interfaces/IPoaNetworkConsensus.sol"; -import "./eternal-storage/EternalStorage.sol"; +import "./abstracts/VotingToChange.sol"; -contract VotingToChangeProxyAddress is EternalStorage, IVotingToChangeProxyAddress { - using SafeMath for uint256; - - enum QuorumStates {Invalid, InProgress, Accepted, Rejected} - enum ActionChoice {Invalid, Accept, Reject} - - event Vote(uint256 indexed id, uint256 decision, address indexed voter, uint256 time, address voterMiningKey); - event BallotFinalized(uint256 indexed id, address indexed voter); - event BallotCreated(uint256 indexed id, uint256 indexed ballotType, address indexed creator); - - modifier onlyOwner() { - require(msg.sender == addressStorage[keccak256("owner")]); - _; - } - - modifier onlyValidVotingKey(address _votingKey) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - require(keysManager.isVotingActive(_votingKey)); - _; - } - - function maxOldMiningKeysDeepCheck() public pure returns(uint8) { - return 25; - } - - function proxyStorage() public view returns(address) { - return addressStorage[keccak256("proxyStorage")]; - } - - function nextBallotId() public view returns(uint256) { - return uintStorage[keccak256("nextBallotId")]; - } - - function activeBallotsLength() public view returns(uint256) { - return uintArrayStorage[_activeBallotsHash()].length; - } - - function activeBallots(uint256 _index) public view returns(uint256) { - return uintArrayStorage[_activeBallotsHash()][_index]; - } - - function validatorActiveBallots(address _miningKey) public view returns(uint256) { - return uintStorage[keccak256("validatorActiveBallots", _miningKey)]; - } - - function demoMode() public view returns(bool) { - return boolStorage[keccak256("demoMode")]; - } - - function initDisabled() public view returns(bool) { - return boolStorage[keccak256("initDisabled")]; - } - - function init(bool _demoMode) public onlyOwner { - require(!initDisabled()); - boolStorage[keccak256("demoMode")] = _demoMode; - boolStorage[keccak256("initDisabled")] = true; - } - - function createBallotToChangeProxyAddress( +contract VotingToChangeProxyAddress is IVotingToChangeProxyAddress, VotingToChange { + function createBallot( uint256 _startTime, uint256 _endTime, address _proposedValue, uint8 _contractType, string memo - ) public onlyValidVotingKey(msg.sender) { - require(_startTime > 0 && _endTime > 0); - require(_endTime > _startTime && _startTime > getTime()); - uint256 diffTime = _endTime.sub(_startTime); - if (!demoMode()) { - require(diffTime > 2 days); - } - require(diffTime <= 14 days); + ) public { require(_proposedValue != address(0)); - address creatorMiningKey = getMiningByVotingKey(msg.sender); - require(withinLimit(creatorMiningKey)); - uint256 _nextBallotId = nextBallotId(); - _setStartTime(_nextBallotId, _startTime); - _setEndTime(_nextBallotId, _endTime); - _setTotalVoters(_nextBallotId, 0); - _setProgress(_nextBallotId, 0); - _setIsFinalized(_nextBallotId, false); - _setQuorumState(_nextBallotId, uint8(QuorumStates.InProgress)); - _setIndex(_nextBallotId, activeBallotsLength()); - _setProposedValue(_nextBallotId, _proposedValue); - _setContractType(_nextBallotId, _contractType); - _setMinThresholdOfVoters(_nextBallotId, getGlobalMinThresholdOfVoters()); - _setCreator(_nextBallotId, creatorMiningKey); - _setMemo(_nextBallotId, memo); - _activeBallotsAdd(_nextBallotId); - _increaseValidatorLimit(); - BallotCreated(_nextBallotId, 5, msg.sender); - _setNextBallotId(_nextBallotId.add(1)); + uint256 ballotType = 5; + uint256 ballotId = _createBallot(ballotType, _startTime, _endTime, memo); + _setProposedValue(ballotId, _proposedValue); + _setContractType(ballotId, _contractType); } - function vote(uint256 _id, uint8 _choice) public onlyValidVotingKey(msg.sender) { - require(!getIsFinalized(_id)); - address miningKey = getMiningByVotingKey(msg.sender); - require(isValidVote(_id, msg.sender)); - if (_choice == uint(ActionChoice.Accept)) { - _setProgress(_id, getProgress(_id) + 1); - } else if (_choice == uint(ActionChoice.Reject)) { - _setProgress(_id, getProgress(_id) - 1); - } else { - revert(); - } - _votersAdd(_id, miningKey); - _setTotalVoters(_id, getTotalVoters(_id).add(1)); - Vote(_id, _choice, msg.sender, getTime(), miningKey); - } - - function finalize(uint256 _id) public onlyValidVotingKey(msg.sender) { - require(_id < nextBallotId()); - require(getStartTime(_id) <= getTime()); - require(!isActive(_id)); - require(!getIsFinalized(_id)); - finalizeBallot(_id); - _decreaseValidatorLimit(_id); - _setIsFinalized(_id, true); - BallotFinalized(_id, msg.sender); - } - - function getBallotsStorage() public view returns(address) { - return IProxyStorage(proxyStorage()).getBallotsStorage(); - } - - function getKeysManager() public view returns(address) { - return IProxyStorage(proxyStorage()).getKeysManager(); - } - - function getProposedValue(uint256 _id) public view returns(address) { - return addressStorage[keccak256("votingState", _id, "proposedValue")]; - } - function getContractType(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "contractType")]; + return uintStorage[keccak256(_storeName(), _id, "contractType")]; } - + function getGlobalMinThresholdOfVoters() public view returns(uint256) { IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); return ballotsStorage.getProxyThreshold(); } - function getProgress(uint256 _id) public view returns(int) { - return intStorage[keccak256("votingState", _id, "progress")]; - } - - function getTotalVoters(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "totalVoters")]; - } - - function getMinThresholdOfVoters(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "minThresholdOfVoters")]; - } - - function getMiningByVotingKey(address _votingKey) public view returns(address) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - return keysManager.getMiningKeyByVoting(_votingKey); - } - - function getStartTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "startTime")]; - } - - function getEndTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "endTime")]; - } - - function getIsFinalized(uint256 _id) public view returns(bool) { - return boolStorage[keccak256("votingState", _id, "isFinalized")]; - } - - function getQuorumState(uint256 _id) public view returns(uint8) { - return uint8(uintStorage[keccak256("votingState", _id, "quorumState")]); - } - - function getIndex(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256("votingState", _id, "index")]; - } - - function getCreator(uint256 _id) public view returns(address) { - return addressStorage[keccak256("votingState", _id, "creator")]; - } - - function getTime() public view returns(uint256) { - return now; - } - - function isActive(uint256 _id) public view returns(bool) { - bool withinTime = getStartTime(_id) <= getTime() && getTime() <= getEndTime(_id); - return withinTime; - } - - function getMemo(uint256 _id) public view returns(string) { - return stringStorage[keccak256("votingState", _id, "memo")]; - } - - function hasMiningKeyAlreadyVoted(uint256 _id, address _miningKey) public view returns(bool) { - return boolStorage[keccak256("votingState", _id, "voters", _miningKey)]; - } - - function hasAlreadyVoted(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - return hasMiningKeyAlreadyVoted(_id, miningKey); - } - - function isValidVote(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - bool notVoted = !hasAlreadyVoted(_id, _votingKey); - bool oldKeysNotVoted = !areOldMiningKeysVoted(_id, miningKey); - return notVoted && isActive(_id) && oldKeysNotVoted; - } - - function areOldMiningKeysVoted(uint256 _id, address _miningKey) public view returns(bool) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - uint8 maxDeep = maxOldMiningKeysDeepCheck(); - for (uint8 i = 0; i < maxDeep; i++) { - address oldMiningKey = keysManager.getMiningKeyHistory(_miningKey); - if (oldMiningKey == address(0)) { - return false; - } - if (hasMiningKeyAlreadyVoted(_id, oldMiningKey)) { - return true; - } else { - _miningKey = oldMiningKey; - } - } - return false; - } - - function getBallotLimitPerValidator() public view returns(uint256) { - IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); - return ballotsStorage.getBallotLimitPerValidator(); - } - - function withinLimit(address _miningKey) public view returns(bool) { - return validatorActiveBallots(_miningKey) <= getBallotLimitPerValidator(); - } - - function migrateDisabled() public view returns(bool) { - return boolStorage[keccak256("migrateDisabled")]; - } - - function migrateBasicAll(address _prevVotingToChangeProxy) public onlyOwner { - require(_prevVotingToChangeProxy != address(0)); - require(!migrateDisabled()); - - IVotingToChangeProxyAddress prev = - IVotingToChangeProxyAddress(_prevVotingToChangeProxy); - IPoaNetworkConsensusForVotingToChange poa = - IPoaNetworkConsensusForVotingToChange(IProxyStorage(proxyStorage()).getPoaConsensus()); - - _setNextBallotId(prev.nextBallotId()); - - uint256 _activeBallotsLength = prev.activeBallotsLength(); - _activeBallotsClear(); - for (uint256 i = 0; i < _activeBallotsLength; i++) { - _activeBallotsAdd(prev.activeBallots(i)); - } - - uint256 currentValidatorsLength = poa.getCurrentValidatorsLength(); - for (i = 0; i < currentValidatorsLength; i++) { - address miningKey = poa.currentValidators(i); - uint256 count = prev.validatorActiveBallots(miningKey); - _setValidatorActiveBallots(miningKey, count); - } + function getProposedValue(uint256 _id) public view returns(address) { + return addressStorage[keccak256(_storeName(), _id, "proposedValue")]; } function migrateBasicOne( uint256 _id, - address _prevVotingToChangeProxy, + address _prevVotingToChange, uint8 _quorumState, uint256 _index, address _creator, string _memo, address[] _voters - ) public onlyOwner { - require(_prevVotingToChangeProxy != address(0)); - require(!migrateDisabled()); - + ) public { + _migrateBasicOne( + _id, + _prevVotingToChange, + _quorumState, + _index, + _creator, + _memo, + _voters + ); IVotingToChangeProxyAddress prev = - IVotingToChangeProxyAddress(_prevVotingToChangeProxy); - - _setStartTime(_id, prev.getStartTime(_id)); - _setEndTime(_id, prev.getEndTime(_id)); - _setTotalVoters(_id, prev.getTotalVoters(_id)); - _setProgress(_id, prev.getProgress(_id)); - _setIsFinalized(_id, prev.getIsFinalized(_id)); - _setQuorumState(_id, _quorumState); - _setIndex(_id, _index); - _setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id)); + IVotingToChangeProxyAddress(_prevVotingToChange); _setProposedValue(_id, prev.getProposedValue(_id)); _setContractType(_id, prev.getContractType(_id)); - for (uint256 i = 0; i < _voters.length; i++) { - address miningKey = _voters[i]; - _votersAdd(_id, miningKey); - } - _setCreator(_id, _creator); - _setMemo(_id, _memo); - } - - function migrateDisable() public onlyOwner { - require(!migrateDisabled()); - boolStorage[keccak256("migrateDisabled")] = true; - } - - function finalizeBallot(uint256 _id) private { - if (getProgress(_id) > 0 && getTotalVoters(_id) >= getMinThresholdOfVoters(_id)) { - _setQuorumState(_id, uint8(QuorumStates.Accepted)); - IProxyStorage(proxyStorage()).setContractAddress(getContractType(_id), getProposedValue(_id)); - } else { - _setQuorumState(_id, uint8(QuorumStates.Rejected)); - } - deactiveBallot(_id); - } - - function deactiveBallot(uint256 _id) private { - uint256 removedIndex = getIndex(_id); - uint256 lastIndex = activeBallotsLength() - 1; - uint256 lastBallotId = activeBallots(lastIndex); - // Override the removed ballot with the last one. - _activeBallotsSet(removedIndex, lastBallotId); - // Update the index of the last validator. - _setIndex(lastBallotId, removedIndex); - _activeBallotsSet(lastIndex, 0); - if (activeBallotsLength() > 0) { - _activeBallotsDecreaseLength(); - } - } - - function _increaseValidatorLimit() private { - address miningKey = getMiningByVotingKey(msg.sender); - _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).add(1)); - } - - function _decreaseValidatorLimit(uint256 _id) private { - address miningKey = getCreator(_id); - _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).sub(1)); - } - - function _setNextBallotId(uint256 _id) private { - uintStorage[keccak256("nextBallotId")] = _id; - } - - function _activeBallotsHash() private pure returns(bytes32) { - return keccak256("activeBallots"); - } - - function _activeBallotsAdd(uint256 _id) private { - uintArrayStorage[_activeBallotsHash()].push(_id); } - function _activeBallotsSet(uint256 _index, uint256 _id) private { - uintArrayStorage[_activeBallotsHash()][_index] = _id; - } - - function _activeBallotsDecreaseLength() private { - uintArrayStorage[_activeBallotsHash()].length--; - } - - function _activeBallotsClear() private { - delete uintArrayStorage[_activeBallotsHash()]; - } - - function _setValidatorActiveBallots(address _miningKey, uint256 _count) private { - uintStorage[keccak256("validatorActiveBallots", _miningKey)] = _count; - } - - function _storeName() private pure returns(string) { - return "votingState"; - } - - function _setStartTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "startTime")] = _value; - } - - function _setEndTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "endTime")] = _value; - } - - function _setTotalVoters(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "totalVoters")] = _value; - } - - function _setProgress(uint256 _ballotId, int256 _value) private { - intStorage[keccak256(_storeName(), _ballotId, "progress")] = _value; - } - - function _setIsFinalized(uint256 _ballotId, bool _value) private { - boolStorage[keccak256(_storeName(), _ballotId, "isFinalized")] = _value; - } - - function _setQuorumState(uint256 _ballotId, uint8 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "quorumState")] = _value; - } - - function _setIndex(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "index")] = _value; - } - - function _setProposedValue(uint256 _ballotId, address _value) private { - addressStorage[keccak256(_storeName(), _ballotId, "proposedValue")] = _value; + function _finalizeBallotInner(uint256 _id) private { + IProxyStorage(proxyStorage()).setContractAddress( + getContractType(_id), + getProposedValue(_id) + ); } function _setContractType(uint256 _ballotId, uint256 _value) private { uintStorage[keccak256(_storeName(), _ballotId, "contractType")] = _value; } - function _setMinThresholdOfVoters(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "minThresholdOfVoters")] = _value; - } - - function _setCreator(uint256 _ballotId, address _value) private { - addressStorage[keccak256(_storeName(), _ballotId, "creator")] = _value; - } - - function _setMemo(uint256 _ballotId, string _value) private { - stringStorage[keccak256(_storeName(), _ballotId, "memo")] = _value; - } - - function _votersAdd(uint256 _ballotId, address _miningKey) private { - boolStorage[keccak256(_storeName(), _ballotId, "voters", _miningKey)] = true; + function _setProposedValue(uint256 _ballotId, address _value) private { + addressStorage[keccak256(_storeName(), _ballotId, "proposedValue")] = _value; } } diff --git a/contracts/abstracts/VotingTo.sol b/contracts/abstracts/VotingTo.sol new file mode 100644 index 0000000..c923e79 --- /dev/null +++ b/contracts/abstracts/VotingTo.sol @@ -0,0 +1,191 @@ +pragma solidity ^0.4.18; + +import "../libs/SafeMath.sol"; +import "../interfaces/IBallotsStorage.sol"; +import "../interfaces/IKeysManager.sol"; +import "../interfaces/IProxyStorage.sol"; +import "../eternal-storage/EternalStorage.sol"; + + +contract VotingTo is EternalStorage { + using SafeMath for uint256; + + event BallotCreated( + uint256 indexed id, + uint256 indexed ballotType, + address indexed creator + ); + event BallotFinalized( + uint256 indexed id, + address indexed voter + ); + event Vote( + uint256 indexed id, + uint256 decision, + address indexed voter, + uint256 time, + address voterMiningKey + ); + + modifier onlyOwner() { + require(msg.sender == addressStorage[keccak256("owner")]); + _; + } + + modifier onlyValidVotingKey(address _votingKey) { + IKeysManager keysManager = IKeysManager(getKeysManager()); + require(keysManager.isVotingActive(_votingKey)); + _; + } + + function areOldMiningKeysVoted(uint256 _id, address _miningKey) + public view returns(bool) + { + IKeysManager keysManager = IKeysManager(getKeysManager()); + uint8 maxDeep = maxOldMiningKeysDeepCheck(); + for (uint8 i = 0; i < maxDeep; i++) { + address oldMiningKey = keysManager.getMiningKeyHistory(_miningKey); + if (oldMiningKey == address(0)) { + return false; + } + if (hasMiningKeyAlreadyVoted(_id, oldMiningKey)) { + return true; + } else { + _miningKey = oldMiningKey; + } + } + return false; + } + + function getBallotsStorage() public view returns(address) { + return IProxyStorage(proxyStorage()).getBallotsStorage(); + } + + function getCreator(uint256 _id) public view returns(address) { + return addressStorage[keccak256(_storeName(), _id, "creator")]; + } + + function getEndTime(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "endTime")]; + } + + function getGlobalMinThresholdOfVoters() public view returns(uint256) { + IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); + return ballotsStorage.getBallotThreshold(1); + } + + function getIsFinalized(uint256 _id) public view returns(bool) { + return boolStorage[keccak256(_storeName(), _id, "isFinalized")]; + } + + function getKeysManager() public view returns(address) { + return IProxyStorage(proxyStorage()).getKeysManager(); + } + + function getMemo(uint256 _id) public view returns(string) { + return stringStorage[keccak256(_storeName(), _id, "memo")]; + } + + function getMiningByVotingKey(address _votingKey) public view returns(address) { + IKeysManager keysManager = IKeysManager(getKeysManager()); + return keysManager.getMiningKeyByVoting(_votingKey); + } + + function getMinThresholdOfVoters(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "minThresholdOfVoters")]; + } + + function getQuorumState(uint256 _id) public view returns(uint8) { + return uint8(uintStorage[keccak256(_storeName(), _id, "quorumState")]); + } + + function getStartTime(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "startTime")]; + } + + function getTime() public view returns(uint256) { + return now; + } + + function hasMiningKeyAlreadyVoted(uint256 _id, address _miningKey) + public view returns(bool) + { + return boolStorage[keccak256(_storeName(), _id, "voters", _miningKey)]; + } + + function hasAlreadyVoted(uint256 _id, address _votingKey) + public view returns(bool) + { + address miningKey = getMiningByVotingKey(_votingKey); + return hasMiningKeyAlreadyVoted(_id, miningKey); + } + + function initDisabled() public view returns(bool) { + return boolStorage[keccak256("initDisabled")]; + } + + function isActive(uint256 _id) public view returns(bool) { + return getStartTime(_id) <= getTime() && getTime() <= getEndTime(_id); + } + + function isValidVote(uint256 _id, address _votingKey) + public view returns(bool) + { + address miningKey = getMiningByVotingKey(_votingKey); + bool notVoted = !hasAlreadyVoted(_id, _votingKey); + bool oldKeysNotVoted = !areOldMiningKeysVoted(_id, miningKey); + return notVoted && isActive(_id) && oldKeysNotVoted; + } + + function maxOldMiningKeysDeepCheck() public pure returns(uint8) { + return 25; + } + + function nextBallotId() public view returns(uint256) { + return uintStorage[keccak256("nextBallotId")]; + } + + function proxyStorage() public view returns(address) { + return addressStorage[keccak256("proxyStorage")]; + } + + function _setCreator(uint256 _ballotId, address _value) internal { + addressStorage[keccak256(_storeName(), _ballotId, "creator")] = _value; + } + + function _setEndTime(uint256 _ballotId, uint256 _value) internal { + uintStorage[keccak256(_storeName(), _ballotId, "endTime")] = _value; + } + + function _setIsFinalized(uint256 _ballotId, bool _value) internal { + boolStorage[keccak256(_storeName(), _ballotId, "isFinalized")] = _value; + } + + function _setMemo(uint256 _ballotId, string _value) internal { + stringStorage[keccak256(_storeName(), _ballotId, "memo")] = _value; + } + + function _setMinThresholdOfVoters(uint256 _ballotId, uint256 _value) internal { + uintStorage[keccak256(_storeName(), _ballotId, "minThresholdOfVoters")] = _value; + } + + function _setNextBallotId(uint256 _id) internal { + uintStorage[keccak256("nextBallotId")] = _id; + } + + function _setQuorumState(uint256 _ballotId, uint8 _value) internal { + uintStorage[keccak256(_storeName(), _ballotId, "quorumState")] = _value; + } + + function _setStartTime(uint256 _ballotId, uint256 _value) internal { + uintStorage[keccak256(_storeName(), _ballotId, "startTime")] = _value; + } + + function _storeName() internal pure returns(string) { + return "votingState"; + } + + function _votersAdd(uint256 _ballotId, address _miningKey) internal { + boolStorage[keccak256(_storeName(), _ballotId, "voters", _miningKey)] = true; + } +} diff --git a/contracts/abstracts/VotingToChange.sol b/contracts/abstracts/VotingToChange.sol new file mode 100644 index 0000000..9c2d5c2 --- /dev/null +++ b/contracts/abstracts/VotingToChange.sol @@ -0,0 +1,259 @@ +pragma solidity ^0.4.18; + +import "../interfaces/IBallotsStorage.sol"; +import "../interfaces/IPoaNetworkConsensus.sol"; +import "../interfaces/IVotingToChange.sol"; +import "./VotingTo.sol"; + + +contract VotingToChange is IVotingToChange, VotingTo { + enum QuorumStates {Invalid, InProgress, Accepted, Rejected} + enum ActionChoice {Invalid, Accept, Reject} + + modifier onlyValidTime(uint256 _startTime, uint256 _endTime) { + require(_startTime > 0 && _endTime > 0); + require(_endTime > _startTime && _startTime > getTime()); + uint256 diffTime = _endTime.sub(_startTime); + if (!demoMode()) { + require(diffTime > 2 days); + } + require(diffTime <= 14 days); + _; + } + + function activeBallots(uint256 _index) public view returns(uint256) { + return uintArrayStorage[_activeBallotsHash()][_index]; + } + + function activeBallotsLength() public view returns(uint256) { + return uintArrayStorage[_activeBallotsHash()].length; + } + + function demoMode() public view returns(bool) { + return boolStorage[keccak256("demoMode")]; + } + + function finalize(uint256 _id) public onlyValidVotingKey(msg.sender) { + require(_id < nextBallotId()); + require(getStartTime(_id) <= getTime()); + require(!isActive(_id)); + require(!getIsFinalized(_id)); + _finalizeBallot(_id); + _decreaseValidatorLimit(_id); + _setIsFinalized(_id, true); + BallotFinalized(_id, msg.sender); + } + + function getBallotLimitPerValidator() public view returns(uint256) { + IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); + return ballotsStorage.getBallotLimitPerValidator(); + } + + function getIndex(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "index")]; + } + + function getProgress(uint256 _id) public view returns(int) { + return intStorage[keccak256(_storeName(), _id, "progress")]; + } + + function getTotalVoters(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "totalVoters")]; + } + + function init(bool _demoMode) public onlyOwner { + require(!initDisabled()); + boolStorage[keccak256("demoMode")] = _demoMode; + boolStorage[keccak256("initDisabled")] = true; + } + + function migrateBasicAll(address _prevVotingToChange) public onlyOwner { + require(_prevVotingToChange != address(0)); + require(!migrateDisabled()); + + IVotingToChange prev = + IVotingToChange(_prevVotingToChange); + IPoaNetworkConsensusForVotingToChange poa = + IPoaNetworkConsensusForVotingToChange( + IProxyStorage(proxyStorage()).getPoaConsensus() + ); + + _setNextBallotId(prev.nextBallotId()); + + uint256 _activeBallotsLength = prev.activeBallotsLength(); + _activeBallotsClear(); + for (uint256 i = 0; i < _activeBallotsLength; i++) { + _activeBallotsAdd(prev.activeBallots(i)); + } + + uint256 currentValidatorsLength = poa.getCurrentValidatorsLength(); + for (i = 0; i < currentValidatorsLength; i++) { + address miningKey = poa.currentValidators(i); + uint256 count = prev.validatorActiveBallots(miningKey); + _setValidatorActiveBallots(miningKey, count); + } + } + + function migrateDisable() public onlyOwner { + require(!migrateDisabled()); + boolStorage[keccak256("migrateDisabled")] = true; + } + + function migrateDisabled() public view returns(bool) { + return boolStorage[keccak256("migrateDisabled")]; + } + + function validatorActiveBallots(address _miningKey) public view returns(uint256) { + return uintStorage[keccak256("validatorActiveBallots", _miningKey)]; + } + + function vote(uint256 _id, uint8 _choice) public onlyValidVotingKey(msg.sender) { + require(!getIsFinalized(_id)); + address miningKey = getMiningByVotingKey(msg.sender); + require(isValidVote(_id, msg.sender)); + if (_choice == uint(ActionChoice.Accept)) { + _setProgress(_id, getProgress(_id) + 1); + } else if (_choice == uint(ActionChoice.Reject)) { + _setProgress(_id, getProgress(_id) - 1); + } else { + revert(); + } + _votersAdd(_id, miningKey); + _setTotalVoters(_id, getTotalVoters(_id).add(1)); + Vote(_id, _choice, msg.sender, getTime(), miningKey); + } + + function withinLimit(address _miningKey) public view returns(bool) { + return validatorActiveBallots(_miningKey) <= getBallotLimitPerValidator(); + } + + function _activeBallotsAdd(uint256 _id) internal { + uintArrayStorage[_activeBallotsHash()].push(_id); + } + + function _activeBallotsClear() private { + delete uintArrayStorage[_activeBallotsHash()]; + } + + function _activeBallotsDecreaseLength() private { + if (activeBallotsLength() > 0) { + uintArrayStorage[_activeBallotsHash()].length--; + } + } + + function _activeBallotsHash() internal pure returns(bytes32) { + return keccak256("activeBallots"); + } + + function _activeBallotsSet(uint256 _index, uint256 _id) private { + uintArrayStorage[_activeBallotsHash()][_index] = _id; + } + + function _createBallot( + uint256 _ballotType, + uint256 _startTime, + uint256 _endTime, + string memo + ) + internal + onlyValidVotingKey(msg.sender) + onlyValidTime(_startTime, _endTime) + returns(uint256) + { + address creatorMiningKey = getMiningByVotingKey(msg.sender); + require(withinLimit(creatorMiningKey)); + uint256 ballotId = nextBallotId(); + _setStartTime(ballotId, _startTime); + _setEndTime(ballotId, _endTime); + _setTotalVoters(ballotId, 0); + _setProgress(ballotId, 0); + _setIsFinalized(ballotId, false); + _setQuorumState(ballotId, uint8(QuorumStates.InProgress)); + _setIndex(ballotId, activeBallotsLength()); + _setMinThresholdOfVoters(ballotId, getGlobalMinThresholdOfVoters()); + _setCreator(ballotId, creatorMiningKey); + _setMemo(ballotId, memo); + _activeBallotsAdd(ballotId); + _increaseValidatorLimit(creatorMiningKey); + _setNextBallotId(ballotId.add(1)); + BallotCreated(ballotId, _ballotType, msg.sender); + return ballotId; + } + + function _deactiveBallot(uint256 _id) internal { + uint256 removedIndex = getIndex(_id); + uint256 lastIndex = activeBallotsLength() - 1; + uint256 lastBallotId = activeBallots(lastIndex); + // Override the removed ballot with the last one. + _activeBallotsSet(removedIndex, lastBallotId); + // Update the index of the last validator. + _setIndex(lastBallotId, removedIndex); + _activeBallotsSet(lastIndex, 0); + _activeBallotsDecreaseLength(); + } + + function _decreaseValidatorLimit(uint256 _id) internal { + address miningKey = getCreator(_id); + _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).sub(1)); + } + + function _finalizeBallot(uint256 _id) private { + if (getProgress(_id) > 0 && getTotalVoters(_id) >= getMinThresholdOfVoters(_id)) { + _setQuorumState(_id, uint8(QuorumStates.Accepted)); + _finalizeBallotInner(_id); + } else { + _setQuorumState(_id, uint8(QuorumStates.Rejected)); + } + _deactiveBallot(_id); + } + + function _finalizeBallotInner(uint256 _id) private; + + function _increaseValidatorLimit(address _miningKey) internal { + _setValidatorActiveBallots(_miningKey, validatorActiveBallots(_miningKey).add(1)); + } + + function _migrateBasicOne( + uint256 _id, + address _prevVotingToChange, + uint8 _quorumState, + uint256 _index, + address _creator, + string _memo, + address[] _voters + ) internal onlyOwner { + require(_prevVotingToChange != address(0)); + require(!migrateDisabled()); + IVotingToChange prev = IVotingToChange(_prevVotingToChange); + _setStartTime(_id, prev.getStartTime(_id)); + _setEndTime(_id, prev.getEndTime(_id)); + _setTotalVoters(_id, prev.getTotalVoters(_id)); + _setProgress(_id, prev.getProgress(_id)); + _setIsFinalized(_id, prev.getIsFinalized(_id)); + _setQuorumState(_id, _quorumState); + _setIndex(_id, _index); + _setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id)); + for (uint256 i = 0; i < _voters.length; i++) { + address miningKey = _voters[i]; + _votersAdd(_id, miningKey); + } + _setCreator(_id, _creator); + _setMemo(_id, _memo); + } + + function _setIndex(uint256 _ballotId, uint256 _value) internal { + uintStorage[keccak256(_storeName(), _ballotId, "index")] = _value; + } + + function _setProgress(uint256 _ballotId, int256 _value) internal { + intStorage[keccak256(_storeName(), _ballotId, "progress")] = _value; + } + + function _setTotalVoters(uint256 _ballotId, uint256 _value) internal { + uintStorage[keccak256(_storeName(), _ballotId, "totalVoters")] = _value; + } + + function _setValidatorActiveBallots(address _miningKey, uint256 _count) internal { + uintStorage[keccak256("validatorActiveBallots", _miningKey)] = _count; + } +} diff --git a/contracts/eternal-storage/EternalStorageProxy.sol b/contracts/eternal-storage/EternalStorageProxy.sol index 6ff6ed8..3df14b7 100644 --- a/contracts/eternal-storage/EternalStorageProxy.sol +++ b/contracts/eternal-storage/EternalStorageProxy.sol @@ -1,7 +1,7 @@ pragma solidity ^0.4.18; import "./EternalStorage.sol"; -import "./IEternalStorageProxy.sol"; +import "../interfaces/IEternalStorageProxy.sol"; /** diff --git a/contracts/eternal-storage/IEternalStorageProxy.sol b/contracts/interfaces/IEternalStorageProxy.sol similarity index 100% rename from contracts/eternal-storage/IEternalStorageProxy.sol rename to contracts/interfaces/IEternalStorageProxy.sol diff --git a/contracts/interfaces/IVotingToChange.sol b/contracts/interfaces/IVotingToChange.sol new file mode 100644 index 0000000..c43a94c --- /dev/null +++ b/contracts/interfaces/IVotingToChange.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.4.18; + + +interface IVotingToChange { + function nextBallotId() public view returns(uint256); + function activeBallots(uint256) public view returns(uint256); + function activeBallotsLength() public view returns(uint256); + function validatorActiveBallots(address) public view returns(uint256); + function getStartTime(uint256) public view returns(uint256); + function getEndTime(uint256) public view returns(uint256); + function getTotalVoters(uint256) public view returns(uint256); + function getProgress(uint256) public view returns(int256); + function getIsFinalized(uint256) public view returns(bool); + function getMinThresholdOfVoters(uint256) public view returns(uint256); +} \ No newline at end of file diff --git a/contracts/SafeMath.sol b/contracts/libs/SafeMath.sol similarity index 100% rename from contracts/SafeMath.sol rename to contracts/libs/SafeMath.sol diff --git a/scripts/migrate/utils/utils.js b/scripts/migrate/utils/utils.js index 12f2a23..90f498b 100644 --- a/scripts/migrate/utils/utils.js +++ b/scripts/migrate/utils/utils.js @@ -15,7 +15,17 @@ async function compile(dir, contractName) { '': fs.readFileSync(dir + contractName + '.sol').toString() } }, 1, function (path) { - return {contents: fs.readFileSync(dir + path).toString()} + let content; + try { + content = fs.readFileSync(dir + path); + } catch (e) { + if (e.code == 'ENOENT') { + content = fs.readFileSync(dir + '../' + path); + } + } + return { + contents: content.toString() + } }); const abi = JSON.parse(compiled.contracts[':' + contractName].interface); const bytecode = compiled.contracts[':' + contractName].bytecode; diff --git a/test/voting_to_change_keys_test.js b/test/voting_to_change_keys_test.js index f942adc..de1ecb6 100644 --- a/test/voting_to_change_keys_test.js +++ b/test/voting_to_change_keys_test.js @@ -72,8 +72,8 @@ contract('Voting to change keys [all features]', function (accounts) { const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); const id = await voting.nextBallotId(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: miningKeyForVotingKey}).should.be.rejectedWith(ERROR_MSG); - const {logs} = await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: miningKeyForVotingKey}).should.be.rejectedWith(ERROR_MSG); + const {logs} = await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); const startTime = await voting.getStartTime(id.toNumber()); const endTime = await voting.getEndTime(id.toNumber()); const keysManagerFromContract = await voting.getKeysManager(); @@ -88,13 +88,13 @@ contract('Voting to change keys [all features]', function (accounts) { it('should not let create voting with invalid duration', async () => { let VOTING_START_DATE = moment.utc().add(10, 'days').unix(); let VOTING_END_DATE = moment.utc().add(2, 'seconds').unix(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); VOTING_START_DATE = 0 VOTING_END_DATE = moment.utc().add(2, 'seconds').unix(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); VOTING_START_DATE = moment.utc().add(2, 'seconds').unix(); VOTING_END_DATE = 0 - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); }) it('should not let create more ballots than the limit', async () => { await proxyStorageMock.setVotingContractMock(masterOfCeremony); @@ -102,12 +102,12 @@ contract('Voting to change keys [all features]', function (accounts) { await keysManager.addVotingKey(votingKey, accounts[1]).should.be.fulfilled; const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); new web3.BigNumber(200).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); await addValidators({proxyStorageMock, keysManager, poaNetworkConsensusMock}); //add 100 validators, so total will be 101 validator new web3.BigNumber(1).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}).should.be.rejectedWith(ERROR_MSG) + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}).should.be.rejectedWith(ERROR_MSG) }) }) @@ -121,7 +121,7 @@ contract('Voting to change keys [all features]', function (accounts) { await keysManager.addMiningKey(accounts[1]).should.be.fulfilled; await keysManager.addVotingKey(votingKey, accounts[1]).should.be.fulfilled; id = await voting.nextBallotId(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[1], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[1], 1, "memo", {from: votingKey}); }) it('should let a validator to vote', async () => { @@ -226,7 +226,7 @@ contract('Voting to change keys [all features]', function (accounts) { }) it('happy path - no action since it did not meet minimum number of totalVoters', async () => { // Ballot to Add Payout Key for miner account[1] - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, payoutKeyToAdd, 3, accounts[1], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, payoutKeyToAdd, 3, accounts[1], 1, "memo", {from: votingKey}); let activeBallotsLength = await voting.activeBallotsLength(); votingId = await voting.activeBallots(activeBallotsLength.toNumber() - 1); // console.log(votingId); @@ -348,7 +348,7 @@ contract('Voting to change keys [all features]', function (accounts) { }) await voting.setTime(VOTING_START_DATE - 1); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, miningKey, 1, accounts[5], 3, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, miningKey, 1, accounts[5], 3, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); }) it('finalize addition of MiningKey', async () => { @@ -575,8 +575,8 @@ contract('Voting to change keys [all features]', function (accounts) { await keysManager.addMiningKey(miningKey).should.be.fulfilled; await proxyStorageMock.setVotingContractMock(voting.address); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, affectedKey, 1, miningKey, 3, "memo",{from: votingKey}); - await voting.createVotingForKeys(VOTING_START_DATE+2, VOTING_END_DATE+2, affectedKey, 1, miningKey, 2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, affectedKey, 1, miningKey, 3, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE+2, VOTING_END_DATE+2, affectedKey, 1, miningKey, 2, "memo",{from: votingKey}); const activeBallotsLength = await voting.activeBallotsLength(); votingId = await voting.activeBallots(activeBallotsLength.toNumber() - 2); let votingIdForSecond = votingId.add(1); @@ -661,7 +661,7 @@ contract('Voting to change keys [all features]', function (accounts) { const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); await votingEternalStorage.setProxyStorage(proxyStorageMock.address); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, payoutKeyToAdd, 3, accounts[1], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, payoutKeyToAdd, 3, accounts[1], 1, "memo", {from: votingKey}); const activeBallotsLength = await voting.activeBallotsLength(); const votingId = await voting.activeBallots(activeBallotsLength.toNumber() - 1); @@ -705,7 +705,7 @@ async function deployAndTestBallot({_affectedKey, _affectedKeyType, _miningKey, // address _miningKey, // uint256 _ballotType [ enum BallotTypes {Invalid, Adding, Removal, Swap} ] votingId = await voting.nextBallotId(); - await voting.createVotingForKeys( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, _affectedKey, diff --git a/test/voting_to_change_keys_upgrade_test.js b/test/voting_to_change_keys_upgrade_test.js index dd09e2f..2dfdde9 100644 --- a/test/voting_to_change_keys_upgrade_test.js +++ b/test/voting_to_change_keys_upgrade_test.js @@ -77,8 +77,8 @@ contract('Voting to change keys upgraded [all features]', function (accounts) { const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); const id = await voting.nextBallotId(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: miningKeyForVotingKey}).should.be.rejectedWith(ERROR_MSG); - const {logs} = await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: miningKeyForVotingKey}).should.be.rejectedWith(ERROR_MSG); + const {logs} = await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); const startTime = await voting.getStartTime(id.toNumber()); const endTime = await voting.getEndTime(id.toNumber()); const keysManagerFromContract = await voting.getKeysManager(); @@ -93,13 +93,13 @@ contract('Voting to change keys upgraded [all features]', function (accounts) { it('should not let create voting with invalid duration', async () => { let VOTING_START_DATE = moment.utc().add(10, 'days').unix(); let VOTING_END_DATE = moment.utc().add(2, 'seconds').unix(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); VOTING_START_DATE = 0 VOTING_END_DATE = moment.utc().add(2, 'seconds').unix(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); VOTING_START_DATE = moment.utc().add(2, 'seconds').unix(); VOTING_END_DATE = 0 - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); }) it('should not let create more ballots than the limit', async () => { await proxyStorageMock.setVotingContractMock(masterOfCeremony); @@ -107,12 +107,12 @@ contract('Voting to change keys upgraded [all features]', function (accounts) { await keysManager.addVotingKey(votingKey, accounts[1]).should.be.fulfilled; const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}); new web3.BigNumber(200).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); await addValidators({proxyStorageMock, keysManager, poaNetworkConsensusMock}); //add 100 validators, so total will be 101 validator new web3.BigNumber(1).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}).should.be.rejectedWith(ERROR_MSG) + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[2], 1, "memo", {from: votingKey}).should.be.rejectedWith(ERROR_MSG) }) }) @@ -126,7 +126,7 @@ contract('Voting to change keys upgraded [all features]', function (accounts) { await keysManager.addMiningKey(accounts[1]).should.be.fulfilled; await keysManager.addVotingKey(votingKey, accounts[1]).should.be.fulfilled; id = await voting.nextBallotId(); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[1], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[1], 1, accounts[1], 1, "memo", {from: votingKey}); }) it('should let a validator to vote', async () => { @@ -231,7 +231,7 @@ contract('Voting to change keys upgraded [all features]', function (accounts) { }) it('happy path - no action since it did not meet minimum number of totalVoters', async () => { // Ballot to Add Payout Key for miner account[1] - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, payoutKeyToAdd, 3, accounts[1], 1, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, payoutKeyToAdd, 3, accounts[1], 1, "memo", {from: votingKey}); let activeBallotsLength = await voting.activeBallotsLength(); votingId = await voting.activeBallots(activeBallotsLength.toNumber() - 1); // console.log(votingId); @@ -353,7 +353,7 @@ contract('Voting to change keys upgraded [all features]', function (accounts) { }) await voting.setTime(VOTING_START_DATE - 1); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, miningKey, 1, accounts[5], 3, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, miningKey, 1, accounts[5], 3, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG); }) it('finalize addition of MiningKey', async () => { @@ -580,8 +580,8 @@ contract('Voting to change keys upgraded [all features]', function (accounts) { await keysManager.addMiningKey(miningKey).should.be.fulfilled; await proxyStorageMock.setVotingContractMock(voting.address); - await voting.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, affectedKey, 1, miningKey, 3, "memo",{from: votingKey}); - await voting.createVotingForKeys(VOTING_START_DATE+2, VOTING_END_DATE+2, affectedKey, 1, miningKey, 2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, affectedKey, 1, miningKey, 3, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE+2, VOTING_END_DATE+2, affectedKey, 1, miningKey, 2, "memo",{from: votingKey}); const activeBallotsLength = await voting.activeBallotsLength(); votingId = await voting.activeBallots(activeBallotsLength.toNumber() - 2); let votingIdForSecond = votingId.add(1); @@ -618,7 +618,7 @@ async function deployAndTestBallot({_affectedKey, _affectedKeyType, _miningKey, // address _miningKey, // uint256 _ballotType [ enum BallotTypes {Invalid, Adding, Removal, Swap} ] votingId = await voting.nextBallotId(); - await voting.createVotingForKeys( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, _affectedKey, diff --git a/test/voting_to_change_min_threshold_test.js b/test/voting_to_change_min_threshold_test.js index 10077bd..d6871dc 100644 --- a/test/voting_to_change_min_threshold_test.js +++ b/test/voting_to_change_min_threshold_test.js @@ -85,7 +85,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { await poaNetworkConsensusMock.finalizeChange().should.be.fulfilled; }) - describe('#createBallotToChangeThreshold', async () => { + describe('#createBallot', async () => { let VOTING_START_DATE, VOTING_END_DATE, id; beforeEach(async () => { VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); @@ -93,7 +93,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { id = await voting.nextBallotId(); }) it('happy path', async () => { - const {logs} = await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4, "memo", {from: votingKey}); + const {logs} = await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4, "memo", {from: votingKey}); const startTime = await voting.getStartTime(id.toNumber()); const endTime = await voting.getEndTime(id.toNumber()); const keysManagerFromContract = await voting.getKeysManager(); @@ -114,21 +114,21 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { logs[0].args.creator.should.be.equal(votingKey); }) it('proposed value should be more than or equal to 3', async () => { - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 2,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 2,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); }) it('proposed value should not be equal to the same value', async () => { - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 3,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 3,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); }) it('should not let create more ballots than the limit', async () => { const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); // we have 6 validators, so 200 limit / 6 = 33.3 ~ 33 new web3.BigNumber(33).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); await addValidators({proxyStorageMock, keysManager, poaNetworkConsensusMock}); // add 100 validators, so total will be 106 validators new web3.BigNumber(1).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) }) }) @@ -141,7 +141,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { id = await voting.nextBallotId(); let validators = await poaNetworkConsensusMock.getValidators(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}); }) it('should let a validator to vote', async () => { @@ -232,7 +232,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { it('does not change if it did not pass minimum threshold', async () => { let proposedValue = 4; votingId = await voting.nextBallotId(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); await voting.setTime(VOTING_START_DATE); await voting.vote(votingId, choice.accept, {from: votingKey}).should.be.fulfilled; // await voting.vote(votingId, choice.accept, {from: votingKey2}).should.be.fulfilled; @@ -267,7 +267,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { it('should change to proposedValue when quorum is reached', async () => { let proposedValue = 4; votingId = await voting.nextBallotId(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); await voting.setTime(VOTING_START_DATE); await voting.vote(votingId, choice.accept, {from: votingKey}).should.be.fulfilled; @@ -315,7 +315,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { await votingForKeys.init(false); const nextId = await votingForKeys.nextBallotId(); - await votingForKeys.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 3, accounts[1], 1, "memo", {from: votingKey}); + await votingForKeys.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 3, accounts[1], 1, "memo", {from: votingKey}); const minThresholdVotingForKeys = await votingForKeys.getMinThresholdOfVoters(nextId); minThresholdVotingForKeys.should.be.bignumber.equal(proposedValue); }) @@ -323,7 +323,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { it('prevents double finalize', async () => { let proposedValue1 = 4; let proposedValue2 = 5; - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, proposedValue1, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, proposedValue1, "memo",{from: votingKey}); await proxyStorageMock.setVotingContractMock(accounts[0]); await keysManager.addMiningKey("0xa6Bf70bd230867c870eF13631D7EFf1AE8Ab85c9").should.be.fulfilled; @@ -331,7 +331,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { await poaNetworkConsensusMock.setSystemAddress(accounts[0]); await poaNetworkConsensusMock.finalizeChange().should.be.fulfilled; - await voting.createBallotToChangeThreshold(VOTING_START_DATE+2, VOTING_END_DATE+2, proposedValue2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE+2, VOTING_END_DATE+2, proposedValue2, "memo",{from: votingKey}); await voting.finalize(votingId, { from: votingKey }).should.be.rejectedWith(ERROR_MSG); const activeBallotsLength = await voting.activeBallotsLength(); votingId = await voting.activeBallots(activeBallotsLength.toNumber() - 2); @@ -412,7 +412,7 @@ contract('VotingToChangeMinThreshold [all features]', function (accounts) { const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); const id = await voting.nextBallotId(); await votingEternalStorage.setProxyStorage(proxyStorageMock.address); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4, "memo", {from: votingKey}).should.be.fulfilled; + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4, "memo", {from: votingKey}).should.be.fulfilled; await votingEternalStorage.setProxyStorage(proxyStorageStubAddress); let votingNew = await VotingNew.new(); await votingEternalStorage.upgradeTo(votingNew.address, {from: proxyStorageStubAddress}).should.be.fulfilled; diff --git a/test/voting_to_change_min_threshold_upgrade_test.js b/test/voting_to_change_min_threshold_upgrade_test.js index 8500ff5..7672e7c 100644 --- a/test/voting_to_change_min_threshold_upgrade_test.js +++ b/test/voting_to_change_min_threshold_upgrade_test.js @@ -91,7 +91,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account await poaNetworkConsensusMock.finalizeChange().should.be.fulfilled; }) - describe('#createBallotToChangeThreshold', async () => { + describe('#createBallot', async () => { let VOTING_START_DATE, VOTING_END_DATE, id; beforeEach(async () => { VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); @@ -99,7 +99,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account id = await voting.nextBallotId(); }) it('happy path', async () => { - const {logs} = await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4, "memo", {from: votingKey}); + const {logs} = await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4, "memo", {from: votingKey}); const startTime = await voting.getStartTime(id.toNumber()); const endTime = await voting.getEndTime(id.toNumber()); const keysManagerFromContract = await voting.getKeysManager(); @@ -120,21 +120,21 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account logs[0].args.creator.should.be.equal(votingKey); }) it('proposed value should be more than or equal to 3', async () => { - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 2,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 2,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); }) it('proposed value should not be equal to the same value', async () => { - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 3,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 3,"memo", {from: votingKey}).should.be.fulfilled.rejectedWith(ERROR_MSG); }) it('should not let create more ballots than the limit', async () => { const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4,"memo", {from: votingKey}); // we have 6 validators, so 200 limit / 6 = 33.3 ~ 33 new web3.BigNumber(33).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); await addValidators({proxyStorageMock, keysManager, poaNetworkConsensusMock}); // add 100 validators, so total will be 106 validators new web3.BigNumber(1).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) }) }) @@ -147,7 +147,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account id = await voting.nextBallotId(); let validators = await poaNetworkConsensusMock.getValidators(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, 4, "memo",{from: votingKey}); }) it('should let a validator to vote', async () => { @@ -238,7 +238,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account it('does not change if it did not pass minimum threshold', async () => { let proposedValue = 4; votingId = await voting.nextBallotId(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); await voting.setTime(VOTING_START_DATE); await voting.vote(votingId, choice.accept, {from: votingKey}).should.be.fulfilled; // await voting.vote(votingId, choice.accept, {from: votingKey2}).should.be.fulfilled; @@ -273,7 +273,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account it('should change to proposedValue when quorum is reached', async () => { let proposedValue = 4; votingId = await voting.nextBallotId(); - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, proposedValue, "memo", {from: votingKey}); await voting.setTime(VOTING_START_DATE); await voting.vote(votingId, choice.accept, {from: votingKey}).should.be.fulfilled; @@ -321,7 +321,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account await votingForKeys.init(false); const nextId = await votingForKeys.nextBallotId(); - await votingForKeys.createVotingForKeys(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 3, accounts[1], 1, "memo", {from: votingKey}); + await votingForKeys.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 3, accounts[1], 1, "memo", {from: votingKey}); const minThresholdVotingForKeys = await votingForKeys.getMinThresholdOfVoters(nextId); minThresholdVotingForKeys.should.be.bignumber.equal(proposedValue); }) @@ -329,7 +329,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account it('prevents double finalize', async () => { let proposedValue1 = 4; let proposedValue2 = 5; - await voting.createBallotToChangeThreshold(VOTING_START_DATE, VOTING_END_DATE, proposedValue1, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, proposedValue1, "memo",{from: votingKey}); await proxyStorageMock.setVotingContractMock(accounts[0]); await keysManager.addMiningKey("0xa6Bf70bd230867c870eF13631D7EFf1AE8Ab85c9").should.be.fulfilled; @@ -337,7 +337,7 @@ contract('VotingToChangeMinThreshold upgraded [all features]', function (account await poaNetworkConsensusMock.setSystemAddress(accounts[0]); await poaNetworkConsensusMock.finalizeChange().should.be.fulfilled; - await voting.createBallotToChangeThreshold(VOTING_START_DATE+2, VOTING_END_DATE+2, proposedValue2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE+2, VOTING_END_DATE+2, proposedValue2, "memo",{from: votingKey}); await voting.finalize(votingId, { from: votingKey }).should.be.rejectedWith(ERROR_MSG); const activeBallotsLength = await voting.activeBallotsLength(); votingId = await voting.activeBallots(activeBallotsLength.toNumber() - 2); diff --git a/test/voting_to_change_proxy_test.js b/test/voting_to_change_proxy_test.js index 8e7d86e..a5bc6b1 100644 --- a/test/voting_to_change_proxy_test.js +++ b/test/voting_to_change_proxy_test.js @@ -82,7 +82,7 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { ); }) - describe('#createBallotToChangeProxyAddress', async () => { + describe('#createBallot', async () => { let VOTING_START_DATE, VOTING_END_DATE, id; beforeEach(async () => { proxyStorageMock.setVotingContractMock(accounts[0]); @@ -98,7 +98,7 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { // uint256 _endTime, // address _proposedValue, // uint8 _contractType - const {logs} = await voting.createBallotToChangeProxyAddress( + const {logs} = await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], 1, "memo", { from: votingKey } ); const keysManagerFromContract = await voting.getKeysManager(); @@ -127,10 +127,10 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { logs[0].args.creator.should.be.equal(votingKey); }) it('proposed address should not be 0x0', async () => { - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, '0x0000000000000000000000000000000000000000', 2, "memo",{ from: votingKey }).should.be.fulfilled.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, '0x0000000000000000000000000000000000000000', 2, "memo",{ from: votingKey }).should.be.fulfilled.rejectedWith(ERROR_MSG); }) it('can create multiple ballots', async () => { - const { logs } = await voting.createBallotToChangeProxyAddress( + const { logs } = await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], 1, "memo",{ from: votingKey }); const keysManagerFromContract = await voting.getKeysManager(); @@ -140,7 +140,7 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { let nextBallotId = await voting.nextBallotId(); nextBallotId.should.be.bignumber.equal(1); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE + 1, VOTING_END_DATE + 1, accounts[5], 2, "memo",{ from: votingKey } ); (await voting.getStartTime(nextBallotId)).should.be.bignumber.equal(VOTING_START_DATE+1); @@ -159,13 +159,13 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { it('should not let create more ballots than the limit', async () => { const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); // we have 1 validator, so 200 limit / 1 = 200 new web3.BigNumber(200).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); await addValidators({proxyStorageMock, keysManager, poaNetworkConsensusMock}); // add 100 validators, so total will be 101 validator new web3.BigNumber(1).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) }) }) @@ -179,7 +179,7 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { await keysManager.addMiningKey(accounts[1]).should.be.fulfilled; await keysManager.addVotingKey(votingKey, accounts[1]).should.be.fulfilled; id = await voting.nextBallotId(); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], 1, "memo", { from: votingKey } ); }) @@ -291,7 +291,7 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { let proposedValue = 5; let contractType = 1; //keysManager votingId = await voting.nextBallotId(); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], contractType, "memo", { from: votingKey } ); await voting.finalize(votingId, { from: votingKey }).should.be.rejectedWith(ERROR_MSG); @@ -392,10 +392,10 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { let newAddress2 = accounts[5]; let contractType1 = 100; let contractType2 = 101; - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, newAddress1, contractType1, "memo", { from: votingKey } ); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE+2, VOTING_END_DATE+2, newAddress2, contractType2, "memo", { from: votingKey } ); @@ -511,7 +511,7 @@ contract('VotingToChangeProxyAddress [all features]', function (accounts) { await keysManager.addVotingKey(votingKey, miningKeyForVotingKey).should.be.fulfilled; proxyStorageMock.setVotingContractMock(votingForKeysEternalStorage.address); await votingEternalStorage.setProxyStorage(proxyStorageMock.address); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], 1, "memo", { from: votingKey } ).should.be.fulfilled; await votingEternalStorage.setProxyStorage(proxyStorageStubAddress); @@ -539,7 +539,7 @@ async function deployAndTest({ newAddress }) { votingId = await voting.nextBallotId(); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, newAddress, contractType, "memo", { from: votingKey } ); await voting.setTime(VOTING_START_DATE); diff --git a/test/voting_to_change_proxy_upgrade_test.js b/test/voting_to_change_proxy_upgrade_test.js index 3700bd4..3cc999a 100644 --- a/test/voting_to_change_proxy_upgrade_test.js +++ b/test/voting_to_change_proxy_upgrade_test.js @@ -88,7 +88,7 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account ); }) - describe('#createBallotToChangeProxyAddress', async () => { + describe('#createBallot', async () => { let VOTING_START_DATE, VOTING_END_DATE, id; beforeEach(async () => { proxyStorageMock.setVotingContractMock(accounts[0]); @@ -104,7 +104,7 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account // uint256 _endTime, // address _proposedValue, // uint8 _contractType - const {logs} = await voting.createBallotToChangeProxyAddress( + const {logs} = await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], 1, "memo", { from: votingKey } ); const keysManagerFromContract = await voting.getKeysManager(); @@ -133,10 +133,10 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account logs[0].args.creator.should.be.equal(votingKey); }) it('proposed address should not be 0x0', async () => { - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, '0x0000000000000000000000000000000000000000', 2, "memo",{ from: votingKey }).should.be.fulfilled.rejectedWith(ERROR_MSG); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, '0x0000000000000000000000000000000000000000', 2, "memo",{ from: votingKey }).should.be.fulfilled.rejectedWith(ERROR_MSG); }) it('can create multiple ballots', async () => { - const { logs } = await voting.createBallotToChangeProxyAddress( + const { logs } = await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], 1, "memo",{ from: votingKey }); const keysManagerFromContract = await voting.getKeysManager(); @@ -146,7 +146,7 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account let nextBallotId = await voting.nextBallotId(); nextBallotId.should.be.bignumber.equal(1); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE + 1, VOTING_END_DATE + 1, accounts[5], 2, "memo",{ from: votingKey } ); (await voting.getStartTime(nextBallotId)).should.be.bignumber.equal(VOTING_START_DATE+1); @@ -165,13 +165,13 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account it('should not let create more ballots than the limit', async () => { const VOTING_START_DATE = moment.utc().add(20, 'seconds').unix(); const VOTING_END_DATE = moment.utc().add(10, 'days').unix(); - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}); // we have 1 validator, so 200 limit / 1 = 200 new web3.BigNumber(200).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); await addValidators({proxyStorageMock, keysManager, poaNetworkConsensusMock}); // add 100 validators, so total will be 101 validator new web3.BigNumber(1).should.be.bignumber.equal(await voting.getBallotLimitPerValidator()); - await voting.createBallotToChangeProxyAddress(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) + await voting.createBallot(VOTING_START_DATE, VOTING_END_DATE, accounts[5], 2, "memo",{from: votingKey}).should.be.rejectedWith(ERROR_MSG) }) }) @@ -185,7 +185,7 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account await keysManager.addMiningKey(accounts[1]).should.be.fulfilled; await keysManager.addVotingKey(votingKey, accounts[1]).should.be.fulfilled; id = await voting.nextBallotId(); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], 1, "memo", { from: votingKey } ); }) @@ -297,7 +297,7 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account let proposedValue = 5; let contractType = 1; //keysManager votingId = await voting.nextBallotId(); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, accounts[5], contractType, "memo", { from: votingKey } ); await voting.finalize(votingId, { from: votingKey }).should.be.rejectedWith(ERROR_MSG); @@ -398,10 +398,10 @@ contract('VotingToChangeProxyAddress upgraded [all features]', function (account let newAddress2 = accounts[5]; let contractType1 = 100; let contractType2 = 101; - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, newAddress1, contractType1, "memo", { from: votingKey } ); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE+2, VOTING_END_DATE+2, newAddress2, contractType2, "memo", { from: votingKey } ); @@ -466,7 +466,7 @@ async function deployAndTest({ newAddress }) { votingId = await voting.nextBallotId(); - await voting.createBallotToChangeProxyAddress( + await voting.createBallot( VOTING_START_DATE, VOTING_END_DATE, newAddress, contractType, "memo", { from: votingKey } ); await voting.setTime(VOTING_START_DATE); From 114d210aab5607a98c129b1b2b5c4f4df1913e2c Mon Sep 17 00:00:00 2001 From: Vadim Arasev Date: Tue, 15 May 2018 13:31:39 +0300 Subject: [PATCH 5/7] (Refactor) Update to Solidity v0.4.23 Relates to https://github.com/poanetwork/poa-network-consensus-contracts/issues/78#issuecomment-388858710 --- README.md | 2 +- contracts/BallotsStorage.sol | 4 +- contracts/KeysManager.sol | 71 +- contracts/Migrations.sol | 4 +- contracts/PoaNetworkConsensus.sol | 20 +- contracts/ProxyStorage.sol | 6 +- contracts/ValidatorMetadata.sol | 171 +- contracts/VotingToChangeKeys.sol | 21 +- contracts/VotingToChangeMinThreshold.sol | 4 +- contracts/VotingToChangeProxyAddress.sol | 4 +- contracts/abstracts/VotingTo.sol | 4 +- contracts/abstracts/VotingToChange.sol | 18 +- contracts/eternal-storage/EternalStorage.sol | 2 +- .../eternal-storage/EternalStorageProxy.sol | 54 +- contracts/interfaces/IBallotsStorage.sol | 16 +- contracts/interfaces/IEternalStorageProxy.sol | 4 +- contracts/interfaces/IKeysManager.sol | 48 +- contracts/interfaces/IPoaNetworkConsensus.sol | 22 +- contracts/interfaces/IProxyStorage.sol | 18 +- contracts/interfaces/IVotingToChange.sol | 22 +- contracts/interfaces/IVotingToChangeKeys.sol | 30 +- .../IVotingToChangeMinThreshold.sol | 24 +- .../IVotingToChangeProxyAddress.sol | 26 +- contracts/libs/SafeMath.sol | 2 +- make_flat.sh | 18 +- package-lock.json | 6700 ++++++++++++++--- package.json | 6 +- scripts/migrate/package-lock.json | 973 +-- scripts/migrate/package.json | 2 +- .../mockContracts/EternalStorageProxyMock.sol | 4 +- test/mockContracts/KeysManagerMock.sol | 2 +- .../mockContracts/PoaNetworkConsensusMock.sol | 4 +- test/mockContracts/ProxyStorageMock.sol | 2 +- test/mockContracts/ValidatorMetadataMock.sol | 2 +- test/mockContracts/VotingToChangeKeysMock.sol | 2 +- .../VotingToChangeMinThresholdMock.sol | 2 +- .../VotingToChangeProxyAddressMock.sol | 2 +- test/upgradeContracts/BallotsStorageNew.sol | 2 +- test/upgradeContracts/KeysManagerNew.sol | 2 +- test/upgradeContracts/ProxyStorageNew.sol | 2 +- .../upgradeContracts/ValidatorMetadataNew.sol | 2 +- .../VotingToChangeKeysNew.sol | 2 +- .../VotingToChangeMinThresholdNew.sol | 2 +- .../VotingToChangeProxyAddressNew.sol | 2 +- 44 files changed, 6441 insertions(+), 1889 deletions(-) diff --git a/README.md b/README.md index 89f6070..42bbc55 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ It will show the bytecode of `PoaNetworkConsensus` contract. Copy the bytecode a ### Add Contracts to Parity UI. Start Parity UI. In the contracts section press `Develop` button. -Select `0.4.18` Solidity compiler version. Set `Optimize` to `true`. +Select `0.4.23` Solidity compiler version. Set `Optimize` to `true`. - In Parity UI `Contracts` tab choose watch custom contract. Paste bytecode and ABI of `PoaNetworkConsensus` contract from Remix. diff --git a/contracts/BallotsStorage.sol b/contracts/BallotsStorage.sol index c7a1b3c..21ab5db 100644 --- a/contracts/BallotsStorage.sol +++ b/contracts/BallotsStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./interfaces/IBallotsStorage.sol"; import "./interfaces/IProxyStorage.sol"; import "./interfaces/IPoaNetworkConsensus.sol"; @@ -63,7 +63,7 @@ contract BallotsStorage is EternalStorage, IBallotsStorage { require(_newValue > 0); require(_newValue != getBallotThreshold(_thresholdType)); _setThreshold(_newValue, _thresholdType); - ThresholdChanged(_thresholdType, _newValue); + emit ThresholdChanged(_thresholdType, _newValue); } function getBallotThreshold(uint8 _ballotType) public view returns(uint256) { diff --git a/contracts/KeysManager.sol b/contracts/KeysManager.sol index 808de07..7c71c60 100644 --- a/contracts/KeysManager.sol +++ b/contracts/KeysManager.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./libs/SafeMath.sol"; import "./interfaces/IPoaNetworkConsensus.sol"; @@ -12,11 +12,22 @@ contract KeysManager is EternalStorage, IKeysManager { enum InitialKeyState {Invalid, Activated, Deactivated} - event PayoutKeyChanged(address key, address indexed miningKey, string action); - event VotingKeyChanged(address key, address indexed miningKey, string action); event MiningKeyChanged(address key, string action); - event ValidatorInitialized(address indexed miningKey, address indexed votingKey, address indexed payoutKey); - event InitialKeyCreated(address indexed initialKey, uint256 time, uint256 initialKeysCount); + event VotingKeyChanged(address key, address indexed miningKey, string action); + event PayoutKeyChanged(address key, address indexed miningKey, string action); + + event ValidatorInitialized( + address indexed miningKey, + address indexed votingKey, + address indexed payoutKey + ); + + event InitialKeyCreated( + address indexed initialKey, + uint256 time, + uint256 initialKeysCount + ); + event Migrated(string name, address key); modifier onlyOwner() { @@ -120,7 +131,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setIsVotingActive(false, _masterOfCeremony); _setIsPayoutActive(false, _masterOfCeremony); _setSuccessfulValidatorClone(true, _masterOfCeremony); - Migrated("miningKey", _masterOfCeremony); + emit Migrated("miningKey", _masterOfCeremony); if (_previousKeysManager != address(0)) { _setPreviousKeysManager(_previousKeysManager); IKeysManager previous = IKeysManager(_previousKeysManager); @@ -153,7 +164,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setMiningKeyHistory(currentMiningKey, oldMiningKey); currentMiningKey = oldMiningKey; } - Migrated("miningKey", _miningKey); + emit Migrated("miningKey", _miningKey); } function migrateInitialKey(address _initialKey) public { @@ -167,7 +178,7 @@ contract KeysManager is EternalStorage, IKeysManager { status == uint8(InitialKeyState.Deactivated) ); _setInitialKeyStatus(_initialKey, status); - Migrated("initialKey", _initialKey); + emit Migrated("initialKey", _initialKey); } function initiateKeys(address _initialKey) public { @@ -180,13 +191,26 @@ contract KeysManager is EternalStorage, IKeysManager { _setInitialKeyStatus(_initialKey, uint8(InitialKeyState.Activated)); _initialKeysCount = _initialKeysCount.add(1); _setInitialKeysCount(_initialKeysCount); - InitialKeyCreated(_initialKey, getTime(), _initialKeysCount); + emit InitialKeyCreated(_initialKey, getTime(), _initialKeysCount); } - function createKeys(address _miningKey, address _votingKey, address _payoutKey) public onlyValidInitialKey { - require(_miningKey != address(0) && _votingKey != address(0) && _payoutKey != address(0)); - require(_miningKey != _votingKey && _miningKey != _payoutKey && _votingKey != _payoutKey); - require(_miningKey != msg.sender && _votingKey != msg.sender && _payoutKey != msg.sender); + function createKeys( + address _miningKey, + address _votingKey, + address _payoutKey + ) + public + onlyValidInitialKey + { + require(_miningKey != address(0)); + require(_votingKey != address(0)); + require(_payoutKey != address(0)); + require(_miningKey != _votingKey); + require(_miningKey != _payoutKey); + require(_votingKey != _payoutKey); + require(_miningKey != msg.sender); + require(_votingKey != msg.sender); + require(_payoutKey != msg.sender); _setVotingKey(_votingKey, _miningKey); _setPayoutKey(_payoutKey, _miningKey); _setIsMiningActive(true, _miningKey); @@ -195,7 +219,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setMiningKeyByVoting(_votingKey, _miningKey); _setInitialKeyStatus(msg.sender, uint8(InitialKeyState.Deactivated)); IPoaNetworkConsensus(poaNetworkConsensus()).addValidator(_miningKey, true); - ValidatorInitialized(_miningKey, _votingKey, _payoutKey); + emit ValidatorInitialized(_miningKey, _votingKey, _payoutKey); } function getTime() public view returns(uint256) { @@ -267,7 +291,10 @@ contract KeysManager is EternalStorage, IKeysManager { _removePayoutKey(_miningKey); } - function swapMiningKey(address _key, address _oldMiningKey) public onlyVotingToChangeKeys { + function swapMiningKey(address _key, address _oldMiningKey) + public + onlyVotingToChangeKeys + { _setMiningKeyHistory(_key, _oldMiningKey); address votingKey = getVotingByMining(_oldMiningKey); require(isMiningActive(_oldMiningKey)); @@ -283,7 +310,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setIsVotingActive(false, _oldMiningKey); _setIsPayoutActive(false, _oldMiningKey); _setMiningKeyByVoting(votingKey, _key); - MiningKeyChanged(_key, "swapped"); + emit MiningKeyChanged(_key, "swapped"); } function swapVotingKey(address _key, address _miningKey) public onlyVotingToChangeKeys { @@ -311,7 +338,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setIsVotingActive(false, _key); _setIsPayoutActive(false, _key); IPoaNetworkConsensus(poaNetworkConsensus()).addValidator(_key, true); - MiningKeyChanged(_key, "added"); + emit MiningKeyChanged(_key, "added"); } function _addVotingKey(address _key, address _miningKey) private { @@ -324,7 +351,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setVotingKey(_key, _miningKey); _setIsVotingActive(true, _miningKey); _setMiningKeyByVoting(_key, _miningKey); - VotingKeyChanged(_key, _miningKey, "added"); + emit VotingKeyChanged(_key, _miningKey, "added"); } } @@ -337,7 +364,7 @@ contract KeysManager is EternalStorage, IKeysManager { } else { _setPayoutKey(_key, _miningKey); _setIsPayoutActive(true, _miningKey); - PayoutKeyChanged(_key, _miningKey, "added"); + emit PayoutKeyChanged(_key, _miningKey, "added"); } } @@ -350,7 +377,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setIsVotingActive(false, _key); _setIsPayoutActive(false, _key); IPoaNetworkConsensus(poaNetworkConsensus()).removeValidator(_key, true); - MiningKeyChanged(_key, "removed"); + emit MiningKeyChanged(_key, "removed"); } function _removeVotingKey(address _miningKey) private { @@ -359,7 +386,7 @@ contract KeysManager is EternalStorage, IKeysManager { _setVotingKey(address(0), _miningKey); _setIsVotingActive(false, _miningKey); _setMiningKeyByVoting(oldVoting, address(0)); - VotingKeyChanged(oldVoting, _miningKey, "removed"); + emit VotingKeyChanged(oldVoting, _miningKey, "removed"); } function _removePayoutKey(address _miningKey) private { @@ -367,7 +394,7 @@ contract KeysManager is EternalStorage, IKeysManager { address oldPayout = getPayoutByMining(_miningKey); _setPayoutKey(address(0), _miningKey); _setIsPayoutActive(false, _miningKey); - PayoutKeyChanged(oldPayout, _miningKey, "removed"); + emit PayoutKeyChanged(oldPayout, _miningKey, "removed"); } function _setMasterOfCeremony(address _moc) private { diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol index 72b47fa..b01c380 100644 --- a/contracts/Migrations.sol +++ b/contracts/Migrations.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; contract Migrations { @@ -9,7 +9,7 @@ contract Migrations { if (msg.sender == owner) _; } - function Migrations() public { + constructor() public { owner = msg.sender; } diff --git a/contracts/PoaNetworkConsensus.sol b/contracts/PoaNetworkConsensus.sol index f00b5aa..2a4c783 100644 --- a/contracts/PoaNetworkConsensus.sol +++ b/contracts/PoaNetworkConsensus.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./interfaces/IPoaNetworkConsensus.sol"; import "./interfaces/IProxyStorage.sol"; @@ -57,7 +57,7 @@ contract PoaNetworkConsensus is IPoaNetworkConsensus { _; } - function PoaNetworkConsensus(address _masterOfCeremony, address[] validators) public { + constructor(address _masterOfCeremony, address[] validators) public { // TODO: When you deploy this contract, make sure you hardcode items below // Make sure you have those addresses defined in spec.json require(_masterOfCeremony != address(0)); @@ -95,10 +95,14 @@ contract PoaNetworkConsensus is IPoaNetworkConsensus { finalized = true; currentValidators = pendingList; currentValidatorsLength = currentValidators.length; - ChangeFinalized(getValidators()); + emit ChangeFinalized(getValidators()); } - function addValidator(address _validator, bool _shouldFireEvent) public onlyKeysManager isNewValidator(_validator) { + function addValidator(address _validator, bool _shouldFireEvent) + public + onlyKeysManager + isNewValidator(_validator) + { require(_validator != address(0)); validatorsState[_validator] = ValidatorState({ isValidator: true, @@ -107,7 +111,7 @@ contract PoaNetworkConsensus is IPoaNetworkConsensus { pendingList.push(_validator); finalized = false; if (_shouldFireEvent) { - InitiateChange(block.blockhash(block.number - 1), pendingList); + emit InitiateChange(blockhash(block.number - 1), pendingList); } } @@ -130,7 +134,7 @@ contract PoaNetworkConsensus is IPoaNetworkConsensus { validatorsState[_validator].isValidator = false; finalized = false; if (_shouldFireEvent) { - InitiateChange(block.blockhash(block.number - 1), pendingList); + emit InitiateChange(blockhash(block.number - 1), pendingList); } } @@ -138,7 +142,7 @@ contract PoaNetworkConsensus is IPoaNetworkConsensus { require(isValidator(_oldKey)); removeValidator(_oldKey, false); addValidator(_newKey, false); - InitiateChange(block.blockhash(block.number - 1), pendingList); + emit InitiateChange(blockhash(block.number - 1), pendingList); } function setProxyStorage(address _newAddress) public { @@ -148,7 +152,7 @@ contract PoaNetworkConsensus is IPoaNetworkConsensus { require(_newAddress != address(0)); proxyStorage = IProxyStorage(_newAddress); isMasterOfCeremonyInitialized = true; - MoCInitializedProxyStorage(proxyStorage); + emit MoCInitializedProxyStorage(proxyStorage); } function isValidator(address _someone) public view returns(bool) { diff --git a/contracts/ProxyStorage.sol b/contracts/ProxyStorage.sol index e6f75d8..db9555a 100644 --- a/contracts/ProxyStorage.sol +++ b/contracts/ProxyStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./interfaces/IProxyStorage.sol"; import "./interfaces/IPoaNetworkConsensus.sol"; @@ -107,7 +107,7 @@ contract ProxyStorage is EternalStorage, IProxyStorage { addressStorage[keccak256("validatorMetadataEternalStorage")] = _validatorMetadataEternalStorage; boolStorage[keccak256("mocInitialized")] = true; - ProxyInitialized( + emit ProxyInitialized( _keysManagerEternalStorage, _votingToChangeKeysEternalStorage, _votingToChangeMinThresholdEternalStorage, @@ -151,7 +151,7 @@ contract ProxyStorage is EternalStorage, IProxyStorage { } else if (_contractType == uint8(ContractTypes.ProxyStorage)) { IEternalStorageProxy(this).upgradeTo(_contractAddress); } - AddressSet(_contractType, _contractAddress); + emit AddressSet(_contractType, _contractAddress); } function isValidator(address _validator) public view returns(bool) { diff --git a/contracts/ValidatorMetadata.sol b/contracts/ValidatorMetadata.sol index b38289b..eac07c7 100644 --- a/contracts/ValidatorMetadata.sol +++ b/contracts/ValidatorMetadata.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./libs/SafeMath.sol"; import "./interfaces/IBallotsStorage.sol"; @@ -107,11 +107,14 @@ contract ValidatorMetadata is EternalStorage { count = voters.length; } - function setProxyAddress(address _newProxyAddress) public onlyValidVotingKey(msg.sender) { + function setProxyAddress(address _newProxyAddress) + public + onlyValidVotingKey(msg.sender) + { require(pendingProxyStorage() == address(0)); _setPendingProxyStorage(_newProxyAddress); _pendingProxyConfirmationsVoterAdd(_newProxyAddress, msg.sender); - RequestForNewProxy(_newProxyAddress); + emit RequestForNewProxy(_newProxyAddress); } function confirmNewProxyAddress(address _newProxyAddress) @@ -128,10 +131,10 @@ contract ValidatorMetadata is EternalStorage { delete addressArrayStorage[ keccak256("pendingProxyConfirmations", _newProxyAddress, "voters") ]; - ChangeProxyStorage(_newProxyAddress); + emit ChangeProxyStorage(_newProxyAddress); } - Confirmed(_newProxyAddress, msg.sender); + emit Confirmed(_newProxyAddress, msg.sender); } function initMetadataDisabled() public view returns(bool) { @@ -199,7 +202,7 @@ contract ValidatorMetadata is EternalStorage { _setCreatedDate(false, miningKey, getTime()); _setUpdatedDate(false, miningKey, 0); _setMinThreshold(false, miningKey, getMinThreshold()); - MetadataCreated(miningKey); + emit MetadataCreated(miningKey); } function changeRequest( @@ -253,19 +256,25 @@ contract ValidatorMetadata is EternalStorage { _setUpdatedDate(true, _miningKey, getTime()); _setMinThreshold(true, _miningKey, _getMinThreshold(false, _miningKey)); delete addressArrayStorage[keccak256("confirmations", _miningKey, "voters")]; - ChangeRequestInitiated(_miningKey); + emit ChangeRequestInitiated(_miningKey); return true; } function cancelPendingChange() public onlyValidVotingKey(msg.sender) returns(bool) { address miningKey = getMiningByVotingKey(msg.sender); _deletePendingChange(miningKey); - CancelledRequest(miningKey); + emit CancelledRequest(miningKey); return true; } - function isAddressAlreadyVoted(address _miningKey, address _voter) public view returns(bool) { - var (count, voters) = confirmations(_miningKey); + function isAddressAlreadyVoted(address _miningKey, address _voter) + public + view + returns(bool) + { + uint256 count; + address[] memory voters; + (count, voters) = confirmations(_miningKey); for (uint256 i = 0; i < count; i++) { if (voters[i] == _voter) { return true; @@ -274,8 +283,14 @@ contract ValidatorMetadata is EternalStorage { return false; } - function isAddressAlreadyVotedProxy(address _newProxy, address _voter) public view returns(bool) { - var (count, voters) = pendingProxyConfirmations(_newProxy); + function isAddressAlreadyVotedProxy(address _newProxy, address _voter) + public + view + returns(bool) + { + uint256 count; + address[] memory voters; + (count, voters) = pendingProxyConfirmations(_newProxy); for (uint256 i = 0; i < count; i++) { if (voters[i] == _voter) { return true; @@ -284,14 +299,17 @@ contract ValidatorMetadata is EternalStorage { return false; } - function confirmPendingChange(address _miningKey) public onlyValidVotingKey(msg.sender) { + function confirmPendingChange(address _miningKey) + public + onlyValidVotingKey(msg.sender) + { require(!isAddressAlreadyVoted(_miningKey, msg.sender)); uint256 count = _getConfirmationsVoters(_miningKey).length; require(count <= 50); // no need for more confirmations address miningKey = getMiningByVotingKey(msg.sender); require(miningKey != _miningKey); _confirmationsVoterAdd(_miningKey, msg.sender); - Confirmed(_miningKey, msg.sender); + emit Confirmed(_miningKey, msg.sender); } function finalize(address _miningKey) public onlyValidVotingKey(msg.sender) { @@ -310,7 +328,7 @@ contract ValidatorMetadata is EternalStorage { _setUpdatedDate(false, _miningKey, _getUpdatedDate(true, _miningKey)); _setMinThreshold(false, _miningKey, _getMinThreshold(true, _miningKey)); _deletePendingChange(_miningKey); - FinalizedChange(_miningKey); + emit FinalizedChange(_miningKey); } function getMiningByVotingKey(address _votingKey) public view returns(address) { @@ -344,52 +362,102 @@ contract ValidatorMetadata is EternalStorage { return _pending ? "pendingChanges" : "validators"; } - function _getFirstName(bool _pending, address _miningKey) private view returns(bytes32) { + function _getFirstName(bool _pending, address _miningKey) + private + view + returns(bytes32) + { return bytes32Storage[keccak256(_storeName(_pending), _miningKey, "firstName")]; } - function _getLastName(bool _pending, address _miningKey) private view returns(bytes32) { + function _getLastName(bool _pending, address _miningKey) + private + view + returns(bytes32) + { return bytes32Storage[keccak256(_storeName(_pending), _miningKey, "lastName")]; } - function _getLicenseId(bool _pending, address _miningKey) private view returns(bytes32) { + function _getLicenseId(bool _pending, address _miningKey) + private + view + returns(bytes32) + { return bytes32Storage[keccak256(_storeName(_pending), _miningKey, "licenseId")]; } - function _getFullAddress(bool _pending, address _miningKey) private view returns(string) { + function _getFullAddress(bool _pending, address _miningKey) + private + view + returns(string) + { return stringStorage[keccak256(_storeName(_pending), _miningKey, "fullAddress")]; } - function _getState(bool _pending, address _miningKey) private view returns(bytes32) { + function _getState(bool _pending, address _miningKey) + private + view + returns(bytes32) + { return bytes32Storage[keccak256(_storeName(_pending), _miningKey, "state")]; } - function _getZipcode(bool _pending, address _miningKey) private view returns(bytes32) { + function _getZipcode(bool _pending, address _miningKey) + private + view + returns(bytes32) + { return bytes32Storage[keccak256(_storeName(_pending), _miningKey, "zipcode")]; } - function _getExpirationDate(bool _pending, address _miningKey) private view returns(uint256) { + function _getExpirationDate(bool _pending, address _miningKey) + private + view + returns(uint256) + { return uintStorage[keccak256(_storeName(_pending), _miningKey, "expirationDate")]; } - function _getCreatedDate(bool _pending, address _miningKey) private view returns(uint256) { + function _getCreatedDate(bool _pending, address _miningKey) + private + view + returns(uint256) + { return uintStorage[keccak256(_storeName(_pending), _miningKey, "createdDate")]; } - function _getUpdatedDate(bool _pending, address _miningKey) private view returns(uint256) { + function _getUpdatedDate(bool _pending, address _miningKey) + private + view + returns(uint256) + { return uintStorage[keccak256(_storeName(_pending), _miningKey, "updatedDate")]; } - function _getMinThreshold(bool _pending, address _miningKey) private view returns(uint256) { + function _getMinThreshold(bool _pending, address _miningKey) + private + view + returns(uint256) + { return uintStorage[keccak256(_storeName(_pending), _miningKey, "minThreshold")]; } - function _getConfirmationsVoters(address _miningKey) private view returns(address[] voters) { + function _getConfirmationsVoters(address _miningKey) + private + view + returns(address[] voters) + { voters = addressArrayStorage[keccak256("confirmations", _miningKey, "voters")]; } - function _getPendingProxyConfirmationsVoters(address _newProxyAddress) private view returns(address[] voters) { - voters = addressArrayStorage[keccak256("pendingProxyConfirmations", _newProxyAddress, "voters")]; + function _getPendingProxyConfirmationsVoters(address _newProxyAddress) + private + view + returns(address[] voters) + { + voters = addressArrayStorage[ + keccak256("pendingProxyConfirmations", _newProxyAddress, "voters") + ]; } function _deletePendingChange(address _miningKey) private { @@ -438,7 +506,11 @@ contract ValidatorMetadata is EternalStorage { )] = _state; } - function _setFullAddress(bool _pending, address _miningKey, string _fullAddress) private { + function _setFullAddress( + bool _pending, + address _miningKey, + string _fullAddress + ) private { stringStorage[keccak256( _storeName(_pending), _miningKey, @@ -454,7 +526,11 @@ contract ValidatorMetadata is EternalStorage { )] = _zipcode; } - function _setExpirationDate(bool _pending, address _miningKey, uint256 _expirationDate) private { + function _setExpirationDate( + bool _pending, + address _miningKey, + uint256 _expirationDate + ) private { uintStorage[keccak256( _storeName(_pending), _miningKey, @@ -462,7 +538,11 @@ contract ValidatorMetadata is EternalStorage { )] = _expirationDate; } - function _setCreatedDate(bool _pending, address _miningKey, uint256 _createdDate) private { + function _setCreatedDate( + bool _pending, + address _miningKey, + uint256 _createdDate + ) private { uintStorage[keccak256( _storeName(_pending), _miningKey, @@ -470,7 +550,11 @@ contract ValidatorMetadata is EternalStorage { )] = _createdDate; } - function _setUpdatedDate(bool _pending, address _miningKey, uint256 _updatedDate) private { + function _setUpdatedDate( + bool _pending, + address _miningKey, + uint256 _updatedDate + ) private { uintStorage[keccak256( _storeName(_pending), _miningKey, @@ -478,7 +562,11 @@ contract ValidatorMetadata is EternalStorage { )] = _updatedDate; } - function _setMinThreshold(bool _pending, address _miningKey, uint256 _minThreshold) private { + function _setMinThreshold( + bool _pending, + address _miningKey, + uint256 _minThreshold + ) private { uintStorage[keccak256( _storeName(_pending), _miningKey, @@ -495,11 +583,18 @@ contract ValidatorMetadata is EternalStorage { } function _confirmationsVoterAdd(address _miningKey, address _voter) private { - addressArrayStorage[keccak256("confirmations", _miningKey, "voters")].push(_voter); - } - - function _pendingProxyConfirmationsVoterAdd(address _newProxyAddress, address _voter) private { - addressArrayStorage[keccak256("pendingProxyConfirmations", _newProxyAddress, "voters")].push(_voter); + addressArrayStorage[ + keccak256("confirmations", _miningKey, "voters") + ].push(_voter); + } + + function _pendingProxyConfirmationsVoterAdd( + address _newProxyAddress, + address _voter + ) private { + addressArrayStorage[ + keccak256("pendingProxyConfirmations", _newProxyAddress, "voters") + ].push(_voter); } } \ No newline at end of file diff --git a/contracts/VotingToChangeKeys.sol b/contracts/VotingToChangeKeys.sol index bd916df..8a1d6fe 100644 --- a/contracts/VotingToChangeKeys.sol +++ b/contracts/VotingToChangeKeys.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./interfaces/IKeysManager.sol"; import "./interfaces/IVotingToChangeKeys.sol"; @@ -15,7 +15,10 @@ contract VotingToChangeKeys is IVotingToChangeKeys, VotingToChange { uint256 _affectedKeyType, address _miningKey ) public view returns(bool) { - if (_affectedKeyType == uint256(KeyTypes.MiningKey) && _ballotType != uint256(BallotTypes.Removal)) { + if ( + _affectedKeyType == uint256(KeyTypes.MiningKey) && + _ballotType != uint256(BallotTypes.Removal) + ) { require(!checkIfMiningExisted(_miningKey, _affectedKey)); } require(_affectedKeyType > 0); @@ -32,7 +35,10 @@ contract VotingToChangeKeys is IVotingToChangeKeys, VotingToChange { } require(_affectedKey != _miningKey); bool keyCheck; - if (_ballotType == uint256(BallotTypes.Removal) || _ballotType == uint256(BallotTypes.Swap)) { + if ( + _ballotType == uint256(BallotTypes.Removal) || + _ballotType == uint256(BallotTypes.Swap) + ) { if (_affectedKeyType == uint256(KeyTypes.MiningKey)) { return isMiningActive; } @@ -89,7 +95,12 @@ contract VotingToChangeKeys is IVotingToChangeKeys, VotingToChange { string memo ) public { //only if ballotType is swap or remove - require(areBallotParamsValid(_ballotType, _affectedKey, _affectedKeyType, _miningKey)); + require(areBallotParamsValid( + _ballotType, + _affectedKey, + _affectedKeyType, + _miningKey + )); uint256 ballotId = _createBallot(_ballotType, _startTime, _endTime, memo); _setAffectedKey(ballotId, _affectedKey); _setAffectedKeyType(ballotId, _affectedKeyType); @@ -152,7 +163,7 @@ contract VotingToChangeKeys is IVotingToChangeKeys, VotingToChange { } } - function _finalizeBallotInner(uint256 _id) private { + function _finalizeBallotInner(uint256 _id) internal { if (getBallotType(_id) == uint256(BallotTypes.Adding)) { _finalizeAdding(_id); } else if (getBallotType(_id) == uint256(BallotTypes.Removal)) { diff --git a/contracts/VotingToChangeMinThreshold.sol b/contracts/VotingToChangeMinThreshold.sol index 232d290..a72d584 100644 --- a/contracts/VotingToChangeMinThreshold.sol +++ b/contracts/VotingToChangeMinThreshold.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./interfaces/IVotingToChangeMinThreshold.sol"; import "./abstracts/VotingToChange.sol"; @@ -51,7 +51,7 @@ contract VotingToChangeMinThreshold is IVotingToChangeMinThreshold, VotingToChan _setProposedValue(_id, prev.getProposedValue(_id)); } - function _finalizeBallotInner(uint256 _id) private { + function _finalizeBallotInner(uint256 _id) internal { uint8 thresholdForKeysType = 1; IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); ballotsStorage.setThreshold(getProposedValue(_id), thresholdForKeysType); diff --git a/contracts/VotingToChangeProxyAddress.sol b/contracts/VotingToChangeProxyAddress.sol index d49efc4..c22db68 100644 --- a/contracts/VotingToChangeProxyAddress.sol +++ b/contracts/VotingToChangeProxyAddress.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./interfaces/IProxyStorage.sol"; import "./interfaces/IBallotsStorage.sol"; @@ -58,7 +58,7 @@ contract VotingToChangeProxyAddress is IVotingToChangeProxyAddress, VotingToChan _setContractType(_id, prev.getContractType(_id)); } - function _finalizeBallotInner(uint256 _id) private { + function _finalizeBallotInner(uint256 _id) internal { IProxyStorage(proxyStorage()).setContractAddress( getContractType(_id), getProposedValue(_id) diff --git a/contracts/abstracts/VotingTo.sol b/contracts/abstracts/VotingTo.sol index c923e79..a1dc40c 100644 --- a/contracts/abstracts/VotingTo.sol +++ b/contracts/abstracts/VotingTo.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "../libs/SafeMath.sol"; import "../interfaces/IBallotsStorage.sol"; @@ -15,10 +15,12 @@ contract VotingTo is EternalStorage { uint256 indexed ballotType, address indexed creator ); + event BallotFinalized( uint256 indexed id, address indexed voter ); + event Vote( uint256 indexed id, uint256 decision, diff --git a/contracts/abstracts/VotingToChange.sol b/contracts/abstracts/VotingToChange.sol index 9c2d5c2..5a36d34 100644 --- a/contracts/abstracts/VotingToChange.sol +++ b/contracts/abstracts/VotingToChange.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "../interfaces/IBallotsStorage.sol"; import "../interfaces/IPoaNetworkConsensus.sol"; @@ -41,7 +41,7 @@ contract VotingToChange is IVotingToChange, VotingTo { _finalizeBallot(_id); _decreaseValidatorLimit(_id); _setIsFinalized(_id, true); - BallotFinalized(_id, msg.sender); + emit BallotFinalized(_id, msg.sender); } function getBallotLimitPerValidator() public view returns(uint256) { @@ -120,7 +120,7 @@ contract VotingToChange is IVotingToChange, VotingTo { } _votersAdd(_id, miningKey); _setTotalVoters(_id, getTotalVoters(_id).add(1)); - Vote(_id, _choice, msg.sender, getTime(), miningKey); + emit Vote(_id, _choice, msg.sender, getTime(), miningKey); } function withinLimit(address _miningKey) public view returns(bool) { @@ -131,11 +131,11 @@ contract VotingToChange is IVotingToChange, VotingTo { uintArrayStorage[_activeBallotsHash()].push(_id); } - function _activeBallotsClear() private { + function _activeBallotsClear() internal { delete uintArrayStorage[_activeBallotsHash()]; } - function _activeBallotsDecreaseLength() private { + function _activeBallotsDecreaseLength() internal { if (activeBallotsLength() > 0) { uintArrayStorage[_activeBallotsHash()].length--; } @@ -145,7 +145,7 @@ contract VotingToChange is IVotingToChange, VotingTo { return keccak256("activeBallots"); } - function _activeBallotsSet(uint256 _index, uint256 _id) private { + function _activeBallotsSet(uint256 _index, uint256 _id) internal { uintArrayStorage[_activeBallotsHash()][_index] = _id; } @@ -176,7 +176,7 @@ contract VotingToChange is IVotingToChange, VotingTo { _activeBallotsAdd(ballotId); _increaseValidatorLimit(creatorMiningKey); _setNextBallotId(ballotId.add(1)); - BallotCreated(ballotId, _ballotType, msg.sender); + emit BallotCreated(ballotId, _ballotType, msg.sender); return ballotId; } @@ -197,7 +197,7 @@ contract VotingToChange is IVotingToChange, VotingTo { _setValidatorActiveBallots(miningKey, validatorActiveBallots(miningKey).sub(1)); } - function _finalizeBallot(uint256 _id) private { + function _finalizeBallot(uint256 _id) internal { if (getProgress(_id) > 0 && getTotalVoters(_id) >= getMinThresholdOfVoters(_id)) { _setQuorumState(_id, uint8(QuorumStates.Accepted)); _finalizeBallotInner(_id); @@ -207,7 +207,7 @@ contract VotingToChange is IVotingToChange, VotingTo { _deactiveBallot(_id); } - function _finalizeBallotInner(uint256 _id) private; + function _finalizeBallotInner(uint256 _id) internal; function _increaseValidatorLimit(address _miningKey) internal { _setValidatorActiveBallots(_miningKey, validatorActiveBallots(_miningKey).add(1)); diff --git a/contracts/eternal-storage/EternalStorage.sol b/contracts/eternal-storage/EternalStorage.sol index 93c2f40..71a1402 100644 --- a/contracts/eternal-storage/EternalStorage.sol +++ b/contracts/eternal-storage/EternalStorage.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; /** diff --git a/contracts/eternal-storage/EternalStorageProxy.sol b/contracts/eternal-storage/EternalStorageProxy.sol index 3df14b7..0e3008e 100644 --- a/contracts/eternal-storage/EternalStorageProxy.sol +++ b/contracts/eternal-storage/EternalStorageProxy.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./EternalStorage.sol"; import "../interfaces/IEternalStorageProxy.sol"; @@ -32,15 +32,7 @@ contract EternalStorageProxy is EternalStorage, IEternalStorageProxy { _; } - function getProxyStorage() public view returns(address) { - return addressStorage[keccak256("proxyStorage")]; - } - - function getOwner() public view returns(address) { - return addressStorage[keccak256("owner")]; - } - - function EternalStorageProxy(address _proxyStorage, address _implementationAddress) public { + constructor(address _proxyStorage, address _implementationAddress) public { require(_implementationAddress != address(0)); if (_proxyStorage != address(0)) { @@ -74,20 +66,20 @@ contract EternalStorageProxy is EternalStorage, IEternalStorageProxy { } } - /** - * @dev Allows ProxyStorage contract to upgrade the current implementation. - * @param implementation representing the address of the new implementation to be set. - */ - function upgradeTo(address implementation) public onlyProxyStorage { - require(_implementation != implementation); - require(implementation != address(0)); + function getOwner() public view returns(address) { + return addressStorage[keccak256("owner")]; + } - uint256 _newVersion = _version + 1; - assert(_newVersion > _version); - _version = _newVersion; + function getProxyStorage() public view returns(address) { + return addressStorage[keccak256("proxyStorage")]; + } - _implementation = implementation; - Upgraded(_version, _implementation); + /** + * @dev Allows the current owner to relinquish ownership. + */ + function renounceOwnership() public onlyOwner { + emit OwnershipRenounced(getOwner()); + _setOwner(address(0)); } /** @@ -96,16 +88,24 @@ contract EternalStorageProxy is EternalStorage, IEternalStorageProxy { */ function transferOwnership(address _newOwner) public onlyOwner { require(_newOwner != address(0)); - OwnershipTransferred(getOwner(), _newOwner); + emit OwnershipTransferred(getOwner(), _newOwner); _setOwner(_newOwner); } /** - * @dev Allows the current owner to relinquish ownership. + * @dev Allows ProxyStorage contract to upgrade the current implementation. + * @param implementation representing the address of the new implementation to be set. */ - function renounceOwnership() public onlyOwner { - OwnershipRenounced(getOwner()); - _setOwner(address(0)); + function upgradeTo(address implementation) public onlyProxyStorage { + require(_implementation != implementation); + require(implementation != address(0)); + + uint256 _newVersion = _version + 1; + assert(_newVersion > _version); + _version = _newVersion; + + _implementation = implementation; + emit Upgraded(_version, _implementation); } function _setProxyStorage(address _proxyStorage) private { diff --git a/contracts/interfaces/IBallotsStorage.sol b/contracts/interfaces/IBallotsStorage.sol index a680dba..0cf24c1 100644 --- a/contracts/interfaces/IBallotsStorage.sol +++ b/contracts/interfaces/IBallotsStorage.sol @@ -1,12 +1,12 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IBallotsStorage { - function setThreshold(uint256, uint8) public; - function getBallotThreshold(uint8) public view returns(uint256); - function getVotingToChangeThreshold() public view returns(address); - function getTotalNumberOfValidators() public view returns(uint256); - function getProxyThreshold() public view returns(uint256); - function getBallotLimitPerValidator() public view returns(uint256); - function getMaxLimitBallot() public view returns(uint256); + function setThreshold(uint256, uint8) external; + function getBallotThreshold(uint8) external view returns(uint256); + function getVotingToChangeThreshold() external view returns(address); + function getTotalNumberOfValidators() external view returns(uint256); + function getProxyThreshold() external view returns(uint256); + function getBallotLimitPerValidator() external view returns(uint256); + function getMaxLimitBallot() external view returns(uint256); } \ No newline at end of file diff --git a/contracts/interfaces/IEternalStorageProxy.sol b/contracts/interfaces/IEternalStorageProxy.sol index 8543bbe..ece1f2d 100644 --- a/contracts/interfaces/IEternalStorageProxy.sol +++ b/contracts/interfaces/IEternalStorageProxy.sol @@ -1,6 +1,6 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IEternalStorageProxy { - function upgradeTo(address) public; + function upgradeTo(address) external; } \ No newline at end of file diff --git a/contracts/interfaces/IKeysManager.sol b/contracts/interfaces/IKeysManager.sol index 3cbc7f6..820f949 100644 --- a/contracts/interfaces/IKeysManager.sol +++ b/contracts/interfaces/IKeysManager.sol @@ -1,28 +1,28 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IKeysManager { - function initialKeysCount() public view returns(uint256); - function initiateKeys(address) public; - function createKeys(address, address, address) public; - function isMiningActive(address) public view returns(bool); - function isVotingActive(address) public view returns(bool); - function isPayoutActive(address) public view returns(bool); - function getVotingByMining(address) public view returns(address); - function getPayoutByMining(address) public view returns(address); - function addMiningKey(address) public; - function addVotingKey(address, address) public; - function addPayoutKey(address, address) public; - function removeMiningKey(address) public; - function removeVotingKey(address) public; - function removePayoutKey(address) public; - function swapMiningKey(address, address) public; - function swapVotingKey(address, address) public; - function swapPayoutKey(address, address) public; - function getTime() public view returns(uint256); - function getMiningKeyHistory(address) public view returns(address); - function getMiningKeyByVoting(address) public view returns(address); - function getInitialKey(address) public view returns(uint8); - function migrateInitialKey(address) public; - function migrateMiningKey(address) public; + function initialKeysCount() external view returns(uint256); + function initiateKeys(address) external; + function createKeys(address, address, address) external; + function isMiningActive(address) external view returns(bool); + function isVotingActive(address) external view returns(bool); + function isPayoutActive(address) external view returns(bool); + function getVotingByMining(address) external view returns(address); + function getPayoutByMining(address) external view returns(address); + function addMiningKey(address) external; + function addVotingKey(address, address) external; + function addPayoutKey(address, address) external; + function removeMiningKey(address) external; + function removeVotingKey(address) external; + function removePayoutKey(address) external; + function swapMiningKey(address, address) external; + function swapVotingKey(address, address) external; + function swapPayoutKey(address, address) external; + function getTime() external view returns(uint256); + function getMiningKeyHistory(address) external view returns(address); + function getMiningKeyByVoting(address) external view returns(address); + function getInitialKey(address) external view returns(uint8); + function migrateInitialKey(address) external; + function migrateMiningKey(address) external; } \ No newline at end of file diff --git a/contracts/interfaces/IPoaNetworkConsensus.sol b/contracts/interfaces/IPoaNetworkConsensus.sol index 4772e03..c4231b9 100644 --- a/contracts/interfaces/IPoaNetworkConsensus.sol +++ b/contracts/interfaces/IPoaNetworkConsensus.sol @@ -1,19 +1,19 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IPoaNetworkConsensus { - function getValidators() public view returns(address[]); - function getPendingList() public view returns(address[]); - function finalizeChange() public; - function addValidator(address, bool) public; - function removeValidator(address, bool) public; - function isValidator(address) public view returns(bool); - function getCurrentValidatorsLength() public view returns(uint256); - function swapValidatorKey(address, address) public; + function getValidators() external view returns(address[]); + function getPendingList() external view returns(address[]); + function finalizeChange() external; + function addValidator(address, bool) external; + function removeValidator(address, bool) external; + function isValidator(address) external view returns(bool); + function getCurrentValidatorsLength() external view returns(uint256); + function swapValidatorKey(address, address) external; } interface IPoaNetworkConsensusForVotingToChange { - function currentValidators(uint256) public view returns(address); - function getCurrentValidatorsLength() public view returns(uint256); + function currentValidators(uint256) external view returns(address); + function getCurrentValidatorsLength() external view returns(uint256); } \ No newline at end of file diff --git a/contracts/interfaces/IProxyStorage.sol b/contracts/interfaces/IProxyStorage.sol index c206872..ea12b24 100644 --- a/contracts/interfaces/IProxyStorage.sol +++ b/contracts/interfaces/IProxyStorage.sol @@ -1,13 +1,13 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IProxyStorage { - function getKeysManager() public view returns(address); - function getBallotsStorage() public view returns(address); - function getVotingToChangeKeys() public view returns(address); - function getVotingToChangeMinThreshold() public view returns(address); - function getPoaConsensus() public view returns(address); - function initializeAddresses(address, address, address, address, address, address) public; - function setContractAddress(uint256, address) public; - function isValidator(address) public view returns(bool); + function getKeysManager() external view returns(address); + function getBallotsStorage() external view returns(address); + function getVotingToChangeKeys() external view returns(address); + function getVotingToChangeMinThreshold() external view returns(address); + function getPoaConsensus() external view returns(address); + function initializeAddresses(address, address, address, address, address, address) external; + function setContractAddress(uint256, address) external; + function isValidator(address) external view returns(bool); } \ No newline at end of file diff --git a/contracts/interfaces/IVotingToChange.sol b/contracts/interfaces/IVotingToChange.sol index c43a94c..cfc377a 100644 --- a/contracts/interfaces/IVotingToChange.sol +++ b/contracts/interfaces/IVotingToChange.sol @@ -1,15 +1,15 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IVotingToChange { - function nextBallotId() public view returns(uint256); - function activeBallots(uint256) public view returns(uint256); - function activeBallotsLength() public view returns(uint256); - function validatorActiveBallots(address) public view returns(uint256); - function getStartTime(uint256) public view returns(uint256); - function getEndTime(uint256) public view returns(uint256); - function getTotalVoters(uint256) public view returns(uint256); - function getProgress(uint256) public view returns(int256); - function getIsFinalized(uint256) public view returns(bool); - function getMinThresholdOfVoters(uint256) public view returns(uint256); + function nextBallotId() external view returns(uint256); + function activeBallots(uint256) external view returns(uint256); + function activeBallotsLength() external view returns(uint256); + function validatorActiveBallots(address) external view returns(uint256); + function getStartTime(uint256) external view returns(uint256); + function getEndTime(uint256) external view returns(uint256); + function getTotalVoters(uint256) external view returns(uint256); + function getProgress(uint256) external view returns(int256); + function getIsFinalized(uint256) external view returns(bool); + function getMinThresholdOfVoters(uint256) external view returns(uint256); } \ No newline at end of file diff --git a/contracts/interfaces/IVotingToChangeKeys.sol b/contracts/interfaces/IVotingToChangeKeys.sol index 6a79cea..f2bd25e 100644 --- a/contracts/interfaces/IVotingToChangeKeys.sol +++ b/contracts/interfaces/IVotingToChangeKeys.sol @@ -1,19 +1,19 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IVotingToChangeKeys { - function nextBallotId() public view returns(uint256); - function activeBallots(uint256) public view returns(uint256); - function activeBallotsLength() public view returns(uint256); - function validatorActiveBallots(address) public view returns(uint256); - function getStartTime(uint256) public view returns(uint256); - function getEndTime(uint256) public view returns(uint256); - function getAffectedKey(uint256) public view returns(address); - function getAffectedKeyType(uint256) public view returns(uint256); - function getMiningKey(uint256) public view returns(address); - function getTotalVoters(uint256) public view returns(uint256); - function getProgress(uint256) public view returns(int256); - function getIsFinalized(uint256) public view returns(bool); - function getBallotType(uint256) public view returns(uint256); - function getMinThresholdOfVoters(uint256) public view returns(uint256); + function nextBallotId() external view returns(uint256); + function activeBallots(uint256) external view returns(uint256); + function activeBallotsLength() external view returns(uint256); + function validatorActiveBallots(address) external view returns(uint256); + function getStartTime(uint256) external view returns(uint256); + function getEndTime(uint256) external view returns(uint256); + function getAffectedKey(uint256) external view returns(address); + function getAffectedKeyType(uint256) external view returns(uint256); + function getMiningKey(uint256) external view returns(address); + function getTotalVoters(uint256) external view returns(uint256); + function getProgress(uint256) external view returns(int256); + function getIsFinalized(uint256) external view returns(bool); + function getBallotType(uint256) external view returns(uint256); + function getMinThresholdOfVoters(uint256) external view returns(uint256); } \ No newline at end of file diff --git a/contracts/interfaces/IVotingToChangeMinThreshold.sol b/contracts/interfaces/IVotingToChangeMinThreshold.sol index 6dcfac1..9c62bc9 100644 --- a/contracts/interfaces/IVotingToChangeMinThreshold.sol +++ b/contracts/interfaces/IVotingToChangeMinThreshold.sol @@ -1,16 +1,16 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IVotingToChangeMinThreshold { - function nextBallotId() public view returns(uint256); - function activeBallots(uint256) public view returns(uint256); - function activeBallotsLength() public view returns(uint256); - function validatorActiveBallots(address) public view returns(uint256); - function getStartTime(uint256) public view returns(uint256); - function getEndTime(uint256) public view returns(uint256); - function getTotalVoters(uint256) public view returns(uint256); - function getProgress(uint256) public view returns(int256); - function getIsFinalized(uint256) public view returns(bool); - function getMinThresholdOfVoters(uint256) public view returns(uint256); - function getProposedValue(uint256) public view returns(uint256); + function nextBallotId() external view returns(uint256); + function activeBallots(uint256) external view returns(uint256); + function activeBallotsLength() external view returns(uint256); + function validatorActiveBallots(address) external view returns(uint256); + function getStartTime(uint256) external view returns(uint256); + function getEndTime(uint256) external view returns(uint256); + function getTotalVoters(uint256) external view returns(uint256); + function getProgress(uint256) external view returns(int256); + function getIsFinalized(uint256) external view returns(bool); + function getMinThresholdOfVoters(uint256) external view returns(uint256); + function getProposedValue(uint256) external view returns(uint256); } \ No newline at end of file diff --git a/contracts/interfaces/IVotingToChangeProxyAddress.sol b/contracts/interfaces/IVotingToChangeProxyAddress.sol index 2c576dc..5e41f7e 100644 --- a/contracts/interfaces/IVotingToChangeProxyAddress.sol +++ b/contracts/interfaces/IVotingToChangeProxyAddress.sol @@ -1,17 +1,17 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IVotingToChangeProxyAddress { - function nextBallotId() public view returns(uint256); - function activeBallots(uint256) public view returns(uint256); - function activeBallotsLength() public view returns(uint256); - function validatorActiveBallots(address) public view returns(uint256); - function getStartTime(uint256) public view returns(uint256); - function getEndTime(uint256) public view returns(uint256); - function getTotalVoters(uint256) public view returns(uint256); - function getProgress(uint256) public view returns(int256); - function getIsFinalized(uint256) public view returns(bool); - function getMinThresholdOfVoters(uint256) public view returns(uint256); - function getProposedValue(uint256) public view returns(address); - function getContractType(uint256) public view returns(uint256); + function nextBallotId() external view returns(uint256); + function activeBallots(uint256) external view returns(uint256); + function activeBallotsLength() external view returns(uint256); + function validatorActiveBallots(address) external view returns(uint256); + function getStartTime(uint256) external view returns(uint256); + function getEndTime(uint256) external view returns(uint256); + function getTotalVoters(uint256) external view returns(uint256); + function getProgress(uint256) external view returns(int256); + function getIsFinalized(uint256) external view returns(bool); + function getMinThresholdOfVoters(uint256) external view returns(uint256); + function getProposedValue(uint256) external view returns(address); + function getContractType(uint256) external view returns(uint256); } \ No newline at end of file diff --git a/contracts/libs/SafeMath.sol b/contracts/libs/SafeMath.sol index 9cbb20d..0823555 100644 --- a/contracts/libs/SafeMath.sol +++ b/contracts/libs/SafeMath.sol @@ -1,4 +1,4 @@ -pragma solidity ^ 0.4.18; +pragma solidity ^0.4.23; /** diff --git a/make_flat.sh b/make_flat.sh index abfefe7..e5866d3 100755 --- a/make_flat.sh +++ b/make_flat.sh @@ -3,12 +3,12 @@ #pip3 install solidity-flattener --no-cache-dir -U rm -rf flat/* -solidity_flattener contracts/KeysManager.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/KeysManager_flat.sol -solidity_flattener contracts/PoaNetworkConsensus.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/PoaNetworkConsensus_flat.sol -solidity_flattener contracts/VotingToChangeKeys.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/VotingToChangeKeys_flat.sol -solidity_flattener contracts/VotingToChangeMinThreshold.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/VotingToChangeMinThreshold_flat.sol -solidity_flattener contracts/ValidatorMetadata.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/ValidatorMetadata_flat.sol -solidity_flattener contracts/ProxyStorage.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/ProxyStorage_flat.sol -solidity_flattener contracts/BallotsStorage.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/BallotsStorage_flat.sol -solidity_flattener contracts/VotingToChangeProxyAddress.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/VotingToChangeProxyAddress_flat.sol -solidity_flattener contracts/eternal-storage/EternalStorageProxy.sol | sed "1s/.*/pragma solidity ^0.4.18;/" > flat/EternalStorageProxy_flat.sol \ No newline at end of file +solidity_flattener contracts/KeysManager.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/KeysManager_flat.sol +solidity_flattener contracts/PoaNetworkConsensus.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/PoaNetworkConsensus_flat.sol +solidity_flattener contracts/VotingToChangeKeys.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/VotingToChangeKeys_flat.sol +solidity_flattener contracts/VotingToChangeMinThreshold.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/VotingToChangeMinThreshold_flat.sol +solidity_flattener contracts/ValidatorMetadata.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/ValidatorMetadata_flat.sol +solidity_flattener contracts/ProxyStorage.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/ProxyStorage_flat.sol +solidity_flattener contracts/BallotsStorage.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/BallotsStorage_flat.sol +solidity_flattener contracts/VotingToChangeProxyAddress.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/VotingToChangeProxyAddress_flat.sol +solidity_flattener contracts/eternal-storage/EternalStorageProxy.sol | sed "1s/.*/pragma solidity ^0.4.23;/" > flat/EternalStorageProxy_flat.sol \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a18c69b..44064c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,22 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -22,7 +38,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -39,7 +55,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -56,10 +72,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -74,9 +90,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -86,9 +102,9 @@ "dev": true }, "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -103,7 +119,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "antlr4": { @@ -112,14 +128,20 @@ "integrity": "sha1-KX+VbdwG+DOX/AmQ7PLgzyC/u+4=", "dev": true }, + "any-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", + "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", + "dev": true + }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "argparse": { @@ -128,7 +150,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -137,7 +159,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -146,13 +168,25 @@ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -185,9 +219,9 @@ "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -205,13 +239,25 @@ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "dev": true + }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "^4.14.0" } }, "async-each": { @@ -220,15 +266,21 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "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" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-styles": { @@ -243,11 +295,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "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" } }, "supports-color": { @@ -258,334 +310,1432 @@ } } }, - "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=", + "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": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "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": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "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": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, - "bignumber.js": { - "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "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" + } }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true + "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" + } }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true + "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" + } }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "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": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "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" + } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true + "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" + } }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "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": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "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": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "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": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "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": { - "bn.js": "4.11.8", - "randombytes": "2.0.5" + "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" } }, - "browserify-sha3": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", - "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", + "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": { - "js-sha3": "0.3.1" + "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" } }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "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": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "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": { - "pako": "1.0.6" + "babel-runtime": "^6.22.0" } }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "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": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "babel-runtime": "^6.22.0" } }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", "dev": true }, - "caller-path": { - "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" - } + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", "dev": true }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" } }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "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": { - "assertion-error": "1.0.2", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.5" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", "dev": true, "requires": { - "check-error": "1.0.2" + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "chai-bignumber": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/chai-bignumber/-/chai-bignumber-2.0.2.tgz", - "integrity": "sha512-BIdRNjRaoRj4bMsZLKbIZPMNKqmwnzNiyxqBYDSs6dFOCs9w8OHPuUE8e1bH60i1IhOzT0NjLtCD+lKEWB1KTQ==", - "dev": true - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true + "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" + } }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "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": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "babel-runtime": "^6.22.0" } }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "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": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, - "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 + "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" + } }, - "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=", + "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": { - "restore-cursor": "2.0.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "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 + "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" + } }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "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": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "co": { + "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-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.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-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.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" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "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": { + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "7.0.0-beta.47", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", + "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": 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 + } + } + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "bignumber.js": { + "version": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "from": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", + "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==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.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.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "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, + "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" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-path": { + "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" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chai-bignumber": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chai-bignumber/-/chai-bignumber-2.0.2.tgz", + "integrity": "sha512-BIdRNjRaoRj4bMsZLKbIZPMNKqmwnzNiyxqBYDSs6dFOCs9w8OHPuUE8e1bH60i1IhOzT0NjLtCD+lKEWB1KTQ==", + "dev": true + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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 + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "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" + } + } + } + }, + "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 + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "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 + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "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" + } + }, + "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" + } + } + } + }, + "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", @@ -597,13 +1747,23 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -612,12 +1772,30 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -625,14 +1803,15 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "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": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "console-browserify": { @@ -641,7 +1820,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -650,6 +1829,18 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", @@ -668,8 +1859,8 @@ "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -678,10 +1869,10 @@ "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -690,12 +1881,12 @@ "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "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-spawn": { @@ -704,9 +1895,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { @@ -715,17 +1906,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" + "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" } }, "crypto-js": { @@ -740,9 +1931,21 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.37" + "es5-ext": "^0.10.9" } }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=", + "dev": true + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -776,34 +1979,108 @@ "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-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" + } + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.5" + "type-detect": "^4.0.0" } }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": 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 + } + } + }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "des.js": { @@ -812,8 +2089,23 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-conflict": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", + "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=", + "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" } }, "diff": { @@ -828,18 +2120,45 @@ "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "doctrine": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", - "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", + "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" + "esutils": "^2.0.2" } }, "domain-browser": { @@ -848,19 +2167,43 @@ "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", "dev": true }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "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" } }, "emojis-list": { @@ -875,7 +2218,7 @@ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" } }, "enhanced-resolve": { @@ -884,19 +2227,35 @@ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, + "envinfo": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-4.4.2.tgz", + "integrity": "sha512-5rfRs+m+6pwoKRCFqpsA5+qsLngFms1aWPrxfKbrObCzQaPc3M3yPloZx+BL9UE3dK58cxw36XVQbFRSCCfGSQ==", + "dev": true + }, "errno": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" + } + }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true, + "requires": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" } }, "error-ex": { @@ -905,7 +2264,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es5-ext": { @@ -914,8 +2273,8 @@ "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -924,9 +2283,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -935,12 +2294,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -949,11 +2308,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -962,8 +2321,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -972,10 +2331,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-string-regexp": { @@ -990,11 +2349,11 @@ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" }, "dependencies": { "esprima": { @@ -1016,7 +2375,7 @@ "dev": true, "optional": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -1027,10 +2386,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -1039,43 +2398,43 @@ "integrity": "sha1-3cf8f9cL+TIFsLNEm7FqHp59SVA=", "dev": true, "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "2.6.9", - "doctrine": "2.0.2", - "eslint-scope": "3.7.1", - "espree": "3.5.2", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.1", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "4.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" + "ajv": "^5.2.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^2.6.8", + "doctrine": "^2.0.0", + "eslint-scope": "^3.7.1", + "espree": "^3.5.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^9.17.0", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^4.0.0", + "progress": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "^4.0.1", + "text-table": "~0.2.0" }, "dependencies": { "ansi-regex": { @@ -1090,7 +2449,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -1101,18 +2460,26 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + } } }, "esprima": { @@ -1122,12 +2489,12 @@ "dev": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "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.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -1136,8 +2503,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -1158,16 +2525,17 @@ "integrity": "sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA==", "dev": true, "requires": { - "webpack": "3.10.0" + "webpack": "^3.0.0" } }, "ethereumjs-testrpc-sc": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-6.0.7.tgz", - "integrity": "sha512-6X/FknTe702L0UGtJ3V3qlh6HNavJkuuRxB18fbITOuOyvCike7O5TVYOthqyCdxgW+ZW/FQGtFpoKeuRZnbNg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-6.1.2.tgz", + "integrity": "sha512-dBTav4AZQ7zuajmICv1k7bEesqS+8f0u0wciXNUJZb842RTBi0lgKEDF8WgZshzv4ThI+XVQSRNV/A+seiK4aA==", "dev": true, "requires": { - "webpack": "3.10.0" + "source-map-support": "^0.5.3", + "webpack-cli": "^2.0.9" } }, "event-emitter": { @@ -1176,8 +2544,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" + "d": "1", + "es5-ext": "~0.10.14" } }, "events": { @@ -1192,8 +2560,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -1202,22 +2570,28 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -1226,18 +2600,48 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -1246,7 +2650,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "fast-deep-equal": { @@ -1255,6 +2659,331 @@ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", "dev": true }, + "fast-glob": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz", + "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": 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 + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, "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", @@ -1273,13 +3002,13 @@ "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "dev": true, "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" }, "dependencies": { "core-js": { @@ -1296,7 +3025,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -1305,8 +3034,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "filename-regex": { @@ -1321,11 +3050,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-up": { @@ -1334,7 +3063,16 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" } }, "flat-cache": { @@ -1343,12 +3081,18 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, + "flow-parser": { + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.72.0.tgz", + "integrity": "sha512-kFaDtviKlD/rHi6NRp42KTbnPgz/nKcWUJQhqDnLDeKA8uGcRVSy0YlQjaf9M3pFo5PgC3SNFnCPpQGLtHjH2w==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1361,7 +3105,26 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-extra": { @@ -1370,9 +3133,9 @@ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs.realpath": { @@ -1388,8 +3151,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" }, "dependencies": { "abbrev": { @@ -1404,8 +3167,8 @@ "dev": true, "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -1425,8 +3188,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -1470,7 +3233,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { @@ -1478,7 +3241,7 @@ "bundled": true, "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { @@ -1486,7 +3249,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -1494,7 +3257,7 @@ "bundled": true, "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, @@ -1525,7 +3288,7 @@ "bundled": true, "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -1548,7 +3311,7 @@ "bundled": true, "dev": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -1557,7 +3320,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -1606,7 +3369,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -1647,10 +3410,10 @@ "bundled": true, "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -1659,9 +3422,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -1670,14 +3433,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { @@ -1686,7 +3449,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -1702,12 +3465,12 @@ "bundled": true, "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } }, "graceful-fs": { @@ -1742,10 +3505,10 @@ "bundled": true, "dev": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -1759,9 +3522,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { @@ -1769,8 +3532,8 @@ "bundled": true, "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1815,7 +3578,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -1836,7 +3599,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -1917,17 +3680,17 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -1936,8 +3699,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -1946,10 +3709,10 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -1974,7 +3737,7 @@ "bundled": true, "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2033,10 +3796,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2052,13 +3815,13 @@ "bundled": true, "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -2067,28 +3830,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { @@ -2096,7 +3859,7 @@ "bundled": true, "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -2127,7 +3890,7 @@ "bundled": true, "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -2136,15 +3899,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "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", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -2160,9 +3923,9 @@ "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -2170,7 +3933,7 @@ "bundled": true, "dev": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -2184,7 +3947,7 @@ "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -2198,9 +3961,9 @@ "bundled": true, "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -2209,14 +3972,14 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { @@ -2225,7 +3988,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -2234,7 +3997,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -2275,7 +4038,7 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -2315,18 +4078,124 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "dev": true, + "requires": { + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" + }, + "dependencies": { + "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" + } + }, + "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-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" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "github-username": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", + "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", + "dev": true, + "requires": { + "gh-got": "^6.0.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" + } + }, + "glob-all": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", + "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", + "dev": true, + "requires": { + "glob": "^7.0.5", + "yargs": "~1.2.6" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", + "dev": true + }, + "yargs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", + "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", + "dev": true, + "requires": { + "minimist": "^0.1.0" + } + } } }, "glob-base": { @@ -2335,17 +4204,47 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "is-glob": "2.0.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -2360,12 +4259,45 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "got": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.1.tgz", + "integrity": "sha512-tiLX+bnYm5A56T5N/n9Xo89vMaO1mrS9qoDqj3u/anVooqGozvY/HbXzEpDfbNeKsHCBpK40gSbz8wGYSp3i1w==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "graceful-fs": { @@ -2380,6 +4312,15 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, + "grouped-queue": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", + "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", + "dev": true, + "requires": { + "lodash": "^4.17.2" + } + }, "growl": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", @@ -2392,10 +4333,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { @@ -2410,7 +4351,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -2421,22 +4362,103 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", + "dev": true + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "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-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" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "hash-base": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "hash.js": { @@ -2445,8 +4467,8 @@ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "he": { @@ -2461,9 +4483,28 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "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" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -2472,6 +4513,12 @@ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -2491,17 +4538,36 @@ "dev": true }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -2514,8 +4580,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2524,26 +4590,32 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "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.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", + "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.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "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" }, "dependencies": { "ansi-regex": { @@ -2558,7 +4630,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -2569,12 +4641,40 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "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 }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2587,7 +4687,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -2602,7 +4702,35 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } }, "is-dotfile": { @@ -2617,7 +4745,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -2632,13 +4760,22 @@ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -2647,7 +4784,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { @@ -2656,7 +4793,47 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" + } + }, + "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-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "dev": true, + "requires": { + "symbol-observable": "^0.2.2" + }, + "dependencies": { + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", + "dev": true + } + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } } }, "is-path-cwd": { @@ -2666,12 +4843,12 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -2680,7 +4857,30 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" + } + }, + "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-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "is-posix-bracket": { @@ -2702,11 +4902,26 @@ "dev": true }, "is-resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", - "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", "dev": true }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "dev": true, + "requires": { + "scoped-regex": "^1.0.0" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -2719,12 +4934,24 @@ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2746,8 +4973,8 @@ "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "dev": true, "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "istanbul": { @@ -2756,20 +4983,20 @@ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.11", - "js-yaml": "3.10.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.3.0", - "wordwrap": "1.0.0" + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" }, "dependencies": { "async": { @@ -2790,11 +5017,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-flag": { @@ -2803,13 +5030,19 @@ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "wordwrap": { @@ -2820,6 +5053,27 @@ } } }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "dev": true, + "requires": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + } + }, + "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" + } + }, "jade": { "version": "0.26.3", "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", @@ -2862,16 +5116,57 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jscodeshift": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.5.0.tgz", + "integrity": "sha512-JAcQINNMFpdzzpKJN8k5xXjF3XDuckB1/48uScSzcnNyK199iWEc9AxKL9OoX5144M2w5zEx9Qs4/E/eBZZUlw==", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^7.0.0-beta.30", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "neo-async": "^2.5.0", + "node-dir": "0.1.8", + "nomnom": "^1.8.1", + "recast": "^0.14.1", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" } }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, "json-loader": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", @@ -2884,7 +5179,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -2911,7 +5206,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -2926,8 +5221,17 @@ "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", "dev": true, "requires": { - "browserify-sha3": "0.0.1", - "sha3": "1.2.0" + "browserify-sha3": "^0.0.1", + "sha3": "^1.1.0" + } + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" } }, "kind-of": { @@ -2936,7 +5240,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "klaw": { @@ -2945,7 +5249,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "lazy-cache": { @@ -2960,17 +5264,236 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "listr": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", + "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^0.2.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.4.2", + "stream-to-observable": "^0.2.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "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 + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", + "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "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 + } } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "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 + } } }, "load-json-file": { @@ -2979,10 +5502,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "loader-runner": { @@ -2997,9 +5520,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -3008,8 +5531,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -3024,8 +5547,8 @@ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" } }, "lodash._basecopy": { @@ -3064,9 +5587,9 @@ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "dev": true, "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" } }, "lodash.isarguments": { @@ -3093,9 +5616,61 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } } }, "longest": { @@ -3110,17 +5685,55 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.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": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" } }, "md5.js": { @@ -3129,8 +5742,8 @@ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" }, "dependencies": { "hash-base": { @@ -3139,8 +5752,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } } } @@ -3151,7 +5764,92 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" + } + }, + "mem-fs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", + "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", + "dev": true, + "requires": { + "through2": "^2.0.0", + "vinyl": "^1.1.0", + "vinyl-file": "^2.0.0" + } + }, + "mem-fs-editor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz", + "integrity": "sha512-QHvdXLLNmwJXxKdf7x27aNUren6IoPxwcM8Sfd+S6/ddQQMcYdEtVKsh6ilpqMrU18VQuKZEaH0aCGt3JDbA0g==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.5.1", + "ejs": "^2.5.9", + "glob": "^7.0.3", + "globby": "^8.0.0", + "isbinaryfile": "^3.0.2", + "mkdirp": "^0.5.0", + "multimatch": "^2.0.0", + "rimraf": "^2.2.8", + "through2": "^2.0.0", + "vinyl": "^2.0.1" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } } }, "memory-fs": { @@ -3160,8 +5858,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.6", - "readable-stream": "2.3.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "memorystream": { @@ -3170,25 +5868,31 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "miller-rabin": { @@ -3197,8 +5901,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mimic-fn": { @@ -3207,6 +5911,12 @@ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", "dev": true }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=", + "dev": true + }, "minimalistic-assert": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", @@ -3225,7 +5935,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3234,6 +5944,27 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -3294,8 +6025,8 @@ "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimatch": "0.3.0" + "inherits": "2", + "minimatch": "0.3" } }, "lru-cache": { @@ -3310,8 +6041,8 @@ "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", "dev": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "lru-cache": "2", + "sigmund": "~1.0.0" } }, "ms": { @@ -3334,14 +6065,14 @@ "integrity": "sha512-zJOOQTva23H6DB0Y3paoQZZTwmYTEOqh5AeJOtn/wgLdrl9jZr+jXpYb7bQik1DjTdU6NGAoasGKTCHcK7CMrQ==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "chalk": "2.3.0", - "diff": "3.4.0", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", - "mochawesome-report-generator": "3.0.1", - "strip-ansi": "4.0.0", - "uuid": "3.1.0" + "babel-runtime": "^6.20.0", + "chalk": "^2.3.0", + "diff": "^3.4.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.3", + "mochawesome-report-generator": "^3.0.0", + "strip-ansi": "^4.0.0", + "uuid": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -3356,7 +6087,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -3367,19 +6098,19 @@ "integrity": "sha512-ZEpk3XJ59I5o+XcbjnaWyQm2l9ZDTH4kwDS2uCicsWhW4iRVuSm/UYlS+Ysl2q9VxPrDWuiRG7vsVCjErzSr1Q==", "dev": true, "requires": { - "chalk": "2.3.0", - "dateformat": "3.0.2", - "fs-extra": "4.0.3", - "fsu": "1.0.4", - "lodash.isfunction": "3.0.8", - "opener": "1.4.3", - "prop-types": "15.6.0", - "react": "16.2.0", - "react-dom": "16.2.0", - "tcomb": "3.2.24", - "tcomb-validation": "3.4.1", - "validator": "9.2.0", - "yargs": "10.0.3" + "chalk": "^2.3.0", + "dateformat": "^3.0.2", + "fs-extra": "^4.0.2", + "fsu": "^1.0.2", + "lodash.isfunction": "^3.0.8", + "opener": "^1.4.2", + "prop-types": "^15.5.8", + "react": "^16.0.0", + "react-dom": "^16.0.0", + "tcomb": "^3.2.17", + "tcomb-validation": "^3.3.0", + "validator": "^9.1.2", + "yargs": "^10.0.3" }, "dependencies": { "camelcase": { @@ -3394,9 +6125,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -3405,9 +6136,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -3418,18 +6149,18 @@ "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", "dev": true, "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "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", + "y18n": "^3.2.1", + "yargs-parser": "^8.0.0" } }, "yargs-parser": { @@ -3438,7 +6169,7 @@ "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -3455,6 +6186,18 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -3465,7 +6208,48 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "dev": true + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "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 + } + } }, "natural-compare": { "version": "1.4.0", @@ -3473,14 +6257,32 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-dir": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", + "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=", + "dev": true + }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "dev": true, "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "node-libs-browser": { @@ -3489,38 +6291,73 @@ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" } }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "dev": true, + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "1" } }, "normalize-package-data": { @@ -3529,10 +6366,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -3541,7 +6378,18 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" } }, "npm-run-path": { @@ -3550,7 +6398,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -3565,14 +6413,70 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "once": { @@ -3581,7 +6485,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -3590,7 +6494,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "opener": { @@ -3605,8 +6509,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.2" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "optionator": { @@ -3615,12 +6519,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" }, "dependencies": { "wordwrap": { @@ -3631,6 +6535,70 @@ } } }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "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 + } + } + }, "original-require": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/original-require/-/original-require-1.0.1.tgz", @@ -3643,15 +6611,21 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -3660,12 +6634,39 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, "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-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-lazy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", + "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=", + "dev": true + }, "p-limit": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", @@ -3678,7 +6679,28 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" } }, "pako": { @@ -3693,11 +6715,11 @@ "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", "dev": true, "requires": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "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-glob": { @@ -3706,10 +6728,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -3718,15 +6740,33 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -3751,13 +6791,19 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pathval": { @@ -3772,11 +6818,11 @@ "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pegjs": { @@ -3803,7 +6849,16 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" } }, "pluralize": { @@ -3812,18 +6867,48 @@ "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", "dev": true }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, "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 }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", + "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=", + "dev": true + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3848,7 +6933,7 @@ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "prop-types": { @@ -3857,9 +6942,9 @@ "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "dev": true, "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "prr": { @@ -3880,11 +6965,11 @@ "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { @@ -3893,6 +6978,17 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -3911,8 +7007,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -3921,7 +7017,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3930,7 +7026,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3941,7 +7037,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3952,7 +7048,7 @@ "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -3961,8 +7057,8 @@ "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", "dev": true, "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "react": { @@ -3971,10 +7067,10 @@ "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", "dev": true, "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" } }, "react-dom": { @@ -3983,10 +7079,28 @@ "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", "dev": true, "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "read-chunk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", + "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", + "dev": true, + "requires": { + "pify": "^3.0.0", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "read-pkg": { @@ -3995,9 +7109,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -4006,8 +7120,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "readable-stream": { @@ -4016,13 +7130,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -4031,10 +7145,30 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + } + }, + "recast": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", + "integrity": "sha512-/nwm9pkrcWagN40JeJhkPaRxiHXBRkXyRh/hgU088Z/v+qCy+zIHHY6bC6o7NaKAxPqtE6nD8zBH1LfU0/Wx6A==", + "dev": true, + "requires": { + "ast-types": "0.11.3", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "rechoir": { @@ -4043,22 +7177,75 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.1.7" + "resolve": "^1.1.6" } }, + "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" + } + }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "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": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" } }, "remove-trailing-separator": { @@ -4079,13 +7266,28 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, "req-cwd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-1.0.1.tgz", "integrity": "sha1-DXOurpJm5penj3l2AZZ352rPD/8=", "dev": true, "requires": { - "req-from": "1.0.1" + "req-from": "^1.0.1" } }, "req-from": { @@ -4094,7 +7296,7 @@ "integrity": "sha1-v4HaUUeUfTLRO5R9wSpYrUWHNQ4=", "dev": true, "requires": { - "resolve-from": "2.0.0" + "resolve-from": "^2.0.0" }, "dependencies": { "resolve-from": { @@ -4129,15 +7331,45 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "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" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } }, "resolve-from": { "version": "1.0.1", @@ -4145,23 +7377,44 @@ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -4170,7 +7423,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "ripemd160": { @@ -4179,8 +7432,8 @@ "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "dev": true, "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^2.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -4189,7 +7442,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -4204,7 +7457,16 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" + } + }, + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" } }, "safe-buffer": { @@ -4213,6 +7475,21 @@ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "scoped-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=", + "dev": true + }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", @@ -4231,6 +7508,29 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -4243,17 +7543,25 @@ "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "sha3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", - "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.2.tgz", + "integrity": "sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k=", "dev": true, "requires": { - "nan": "2.8.0" + "nan": "2.10.0" + }, + "dependencies": { + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true + } } }, "shebang-command": { @@ -4262,7 +7570,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -4277,9 +7585,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "sigmund": { @@ -4294,23 +7602,143 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "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==", + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "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" + }, + "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 + } + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "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=", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": 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 } } }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, "sol-explore": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.2.tgz", @@ -4318,16 +7746,16 @@ "dev": true }, "solc": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.18.tgz", - "integrity": "sha512-Kq+O3PNF9Pfq7fB+lDYAuoqRdghLmZyfngsg0h1Hj38NKAeVHeGPOGeZasn5KqdPeCzbMFvaGyTySxzGv6aXCg==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", + "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", "dev": true, "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.4.1", - "yargs": "4.8.1" + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" }, "dependencies": { "camelcase": { @@ -4342,9 +7770,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "find-up": { @@ -4353,8 +7781,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "fs-extra": { @@ -4363,11 +7791,11 @@ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, "jsonfile": { @@ -4376,7 +7804,7 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "load-json-file": { @@ -4385,11 +7813,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "os-locale": { @@ -4398,7 +7826,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "path-exists": { @@ -4407,7 +7835,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-type": { @@ -4416,9 +7844,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -4427,9 +7855,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -4438,8 +7866,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "string-width": { @@ -4448,9 +7876,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-bom": { @@ -4459,7 +7887,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "which-module": { @@ -4480,20 +7908,20 @@ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" + "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": { @@ -4502,51 +7930,52 @@ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } } } }, "solhint": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-1.1.9.tgz", - "integrity": "sha1-1M8Epy2zbqFTah9oyIN5JfFfgn0=", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-1.1.10.tgz", + "integrity": "sha1-KP80jLIuDVH6J8Ny+0Y1dRrX7Vo=", "dev": true, "requires": { "antlr4": "4.7.0", "commander": "2.11.0", "eslint": "4.6.1", "glob": "7.1.2", + "ignore": "^3.3.7", "lodash": "4.17.4" } }, "solidity-coverage": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.4.6.tgz", - "integrity": "sha512-eTWGvHCK+Igh4EAV11ZEAbuhOReyTO4mG0RPfTgY9BmiKc5HR/ggdCECKaK48g5FVmi3+rmuxiNJqeRpOPnqTA==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.4.15.tgz", + "integrity": "sha512-iA3MT20rh1LllcNwfxAKU3ZBDu8R/4K8jANJAk7BcJU1foOjEh3tYhGqL8w2kRJPIo5XtoW0wxyVt95X2eJk/A==", "dev": true, "requires": { - "death": "1.1.0", - "ethereumjs-testrpc-sc": "6.0.7", - "istanbul": "0.4.5", - "keccakjs": "0.2.1", - "req-cwd": "1.0.1", - "shelljs": "0.7.8", - "sol-explore": "1.6.2", - "solidity-parser-sc": "0.4.3", - "web3": "0.18.4" + "death": "^1.1.0", + "ethereumjs-testrpc-sc": "6.1.2", + "istanbul": "^0.4.5", + "keccakjs": "^0.2.1", + "req-cwd": "^1.0.1", + "shelljs": "^0.7.4", + "sol-explore": "^1.6.2", + "solidity-parser-sc": "0.4.7", + "web3": "^0.18.4" } }, "solidity-parser-sc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/solidity-parser-sc/-/solidity-parser-sc-0.4.3.tgz", - "integrity": "sha512-vpph+yv294sM+uOig2ZQHHXSoY24sA4i3V34vpcdnusH8wAgrDwtKWE9MkejmmOJBf7DSyw9+6OchVCXkSpxoA==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/solidity-parser-sc/-/solidity-parser-sc-0.4.7.tgz", + "integrity": "sha512-wbX2806sm6thZME1aniqLcLH9HYwNwuKke6aw/FEgupCvoT9Iq5PdwuN9OyHWKGBOVeczpM5tCrnRXWNQ04YVw==", "dev": true, "requires": { - "mocha": "2.5.3", - "pegjs": "0.10.0", - "yargs": "4.8.1" + "mocha": "^2.4.5", + "pegjs": "^0.10.0", + "yargs": "^4.6.0" }, "dependencies": { "camelcase": { @@ -4561,9 +7990,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "find-up": { @@ -4572,8 +8001,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "load-json-file": { @@ -4582,11 +8011,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "os-locale": { @@ -4595,7 +8024,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "path-exists": { @@ -4604,7 +8033,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-type": { @@ -4613,9 +8042,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -4624,9 +8053,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -4635,8 +8064,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "string-width": { @@ -4645,9 +8074,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-bom": { @@ -4656,7 +8085,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "which-module": { @@ -4677,20 +8106,20 @@ "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true, "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" + "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": { @@ -4699,12 +8128,21 @@ "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dev": true, "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } } } }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", @@ -4717,13 +8155,50 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -4738,20 +8213,50 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -4760,21 +8265,42 @@ "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.2.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-to-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", + "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", + "dev": true, + "requires": { + "any-observable": "^0.2.0" } }, + "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-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", + "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -4795,7 +8321,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -4806,7 +8332,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -4815,7 +8341,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -4824,6 +8350,27 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "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-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -4842,21 +8389,53 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", + "integrity": "sha512-VDUX1oSajablmiyFyED9L1DFndg0P9h7p1F+NO8FkIzei6EPrR6Zu1n18rd5P8PqaSRd/FrWv3G1TVBqpM83gA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^4.2.1" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "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 + } } }, "tapable": { @@ -4877,7 +8456,25 @@ "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==", "dev": true, "requires": { - "tcomb": "3.2.24" + "tcomb": "^3.0.0" + } + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } } }, "text-table": { @@ -4886,19 +8483,41 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "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 + }, "timers-browserify": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -4907,7 +8526,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -4916,21 +8535,75 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, "to-iso-string": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, "truffle": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.0.4.tgz", - "integrity": "sha512-keAkRNNfU3W7yUMRDF3YHoqmqdv6TChXY0g+RuPpxnRHfspXVtIKwuN2pV07jzY/RbDsIKShcSyF7VBV7eZUvg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/truffle/-/truffle-4.1.8.tgz", + "integrity": "sha512-btDML3J9Ao+UDqR725ajTybcEqyXzxFzJDC/NAXOyOXoXf2HJwKq6VEvnjP9qc6owA+fJ50d87MmsPRXk+riCg==", "dev": true, "requires": { - "mocha": "3.5.3", - "original-require": "1.0.1", - "solc": "0.4.18" + "mocha": "^3.4.2", + "original-require": "^1.0.1", + "solc": "0.4.23" }, "dependencies": { "commander": { @@ -4939,7 +8612,7 @@ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } }, "debug": { @@ -4963,12 +8636,12 @@ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-flag": { @@ -5003,7 +8676,7 @@ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -5020,7 +8693,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -5047,9 +8720,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -5058,9 +8731,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -5079,9 +8752,50 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } } }, "universalify": { @@ -5090,20 +8804,127 @@ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", "dev": true }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "untildify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", + "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=", + "dev": true + }, + "uri-js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", + "integrity": "sha512-jpKCA3HjsBfSDOEgxRDAxQCNyHfCPSbq57PqCkd3gAyBuPb3IWxw54EHncqESznIdqSetHfw3D7ylThu2Kcc9A==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "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 + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" }, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "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 } } @@ -5143,14 +8964,20 @@ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true }, + "v8-compile-cache": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", + "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "validator": { @@ -5159,6 +8986,42 @@ "integrity": "sha512-6Ij4Eo0KM4LkR0d0IegOwluG5453uqT5QyF5SV5Ezvm8/zmkKI/L4eoraafZGlZPC9guLkwKzgypcw8VGWWnGA==", "dev": true }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" + }, + "dependencies": { + "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" + } + } + } + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -5174,9 +9037,9 @@ "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", "dev": true, "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" + "async": "^2.1.2", + "chokidar": "^1.7.0", + "graceful-fs": "^4.1.2" } }, "web3": { @@ -5186,10 +9049,10 @@ "dev": true, "requires": { "bignumber.js": "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2", - "crypto-js": "3.1.8", - "utf8": "2.1.2", - "xhr2": "0.1.4", - "xmlhttprequest": "1.8.0" + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2": "*", + "xmlhttprequest": "*" } }, "webpack": { @@ -5198,28 +9061,300 @@ "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^5.1.5", + "ajv-keywords": "^2.0.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + } + }, + "webpack-addons": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", + "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", + "dev": true, + "requires": { + "jscodeshift": "^0.4.0" + }, + "dependencies": { + "ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "jscodeshift": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", + "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", + "dev": true, + "requires": { + "async": "^1.5.0", + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^6.17.3", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "node-dir": "0.1.8", + "nomnom": "^1.8.1", + "recast": "^0.12.5", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" + } + }, + "recast": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", + "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", + "dev": true, + "requires": { + "ast-types": "0.10.1", + "core-js": "^2.4.1", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.1.3.tgz", + "integrity": "sha512-5AsKoL/Ccn8iTrwk3uErdyhetGH+c7VRQ7Itim2GL0IhBRq5rtojVDk00buMRmFmBpw1RvHXq97Gup965LbozA==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "cross-spawn": "^6.0.5", + "diff": "^3.5.0", + "enhanced-resolve": "^4.0.0", + "envinfo": "^4.4.2", + "glob-all": "^3.1.0", + "global-modules": "^1.0.0", + "got": "^8.2.0", + "import-local": "^1.0.0", + "inquirer": "^5.1.0", + "interpret": "^1.0.4", + "jscodeshift": "^0.5.0", + "listr": "^0.13.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.5", + "log-symbols": "^2.2.0", + "mkdirp": "^0.5.1", + "p-each-series": "^1.0.0", + "p-lazy": "^1.0.0", + "prettier": "^1.5.3", + "supports-color": "^5.3.0", + "v8-compile-cache": "^1.1.2", + "webpack-addons": "^1.1.5", + "yargs": "^11.1.0", + "yeoman-environment": "^2.0.0", + "yeoman-generator": "^2.0.4" + }, + "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 + }, + "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" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "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.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "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 + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "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", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } } }, "webpack-sources": { @@ -5228,8 +9363,8 @@ "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -5252,7 +9387,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -5279,8 +9414,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "string-width": { @@ -5289,9 +9424,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -5308,7 +9443,18 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "xhr2": { @@ -5347,19 +9493,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { "camelcase": { @@ -5374,9 +9520,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -5385,9 +9531,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -5400,7 +9546,7 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -5410,6 +9556,272 @@ "dev": true } } + }, + "yeoman-environment": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.1.1.tgz", + "integrity": "sha512-IBLwCUrJrDxBYuwdYm1wuF3O/CR2LpXR0rFS684QOrU6x69DPPrsdd20dZOFaedZ/M9sON7po73WhO3I1CbgNQ==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "diff": "^3.3.1", + "escape-string-regexp": "^1.0.2", + "globby": "^8.0.1", + "grouped-queue": "^0.3.3", + "inquirer": "^5.2.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.10", + "log-symbols": "^2.1.0", + "mem-fs": "^1.1.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0", + "untildify": "^3.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 + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "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" + } + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "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.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "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 + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "yeoman-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.5.tgz", + "integrity": "sha512-rV6tJ8oYzm4mmdF2T3wjY+Q42jKF2YiiD0VKfJ8/0ZYwmhCKC9Xs2346HVLPj/xE13i68psnFJv7iS6gWRkeAg==", + "dev": true, + "requires": { + "async": "^2.6.0", + "chalk": "^2.3.0", + "cli-table": "^0.3.1", + "cross-spawn": "^6.0.5", + "dargs": "^5.1.0", + "dateformat": "^3.0.3", + "debug": "^3.1.0", + "detect-conflict": "^1.0.0", + "error": "^7.0.2", + "find-up": "^2.1.0", + "github-username": "^4.0.0", + "istextorbinary": "^2.2.1", + "lodash": "^4.17.10", + "make-dir": "^1.1.0", + "mem-fs-editor": "^4.0.0", + "minimist": "^1.2.0", + "pretty-bytes": "^4.0.2", + "read-chunk": "^2.1.0", + "read-pkg-up": "^3.0.0", + "rimraf": "^2.6.2", + "run-async": "^2.0.0", + "shelljs": "^0.8.0", + "text-table": "^0.2.0", + "through2": "^2.0.0", + "yeoman-environment": "^2.0.5" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "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 + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "shelljs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", + "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + } + } } } } diff --git a/package.json b/package.json index 02fc21e..acd2aff 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,9 @@ "ethereumjs-testrpc": "^6.0.3", "mochawesome": "^3.0.0", "moment": "^2.19.3", - "solhint": "^1.1.9", - "solidity-coverage": "^0.4.2", - "truffle": "^4.0.1" + "solhint": "^1.1.10", + "solidity-coverage": "^0.4.15", + "truffle": "^4.1.8" }, "dependencies": {} } diff --git a/scripts/migrate/package-lock.json b/scripts/migrate/package-lock.json index 2fc278b..490abc6 100644 --- a/scripts/migrate/package-lock.json +++ b/scripts/migrate/package-lock.json @@ -9,7 +9,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -18,10 +18,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ansi-regex": { @@ -49,9 +49,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert-plus": { @@ -84,8 +84,8 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { - "follow-redirects": "1.4.1", - "is-buffer": "1.1.6" + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" } }, "balanced-match": { @@ -104,7 +104,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "bindings": { @@ -117,7 +117,7 @@ "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "bl": { @@ -125,8 +125,8 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { - "readable-stream": "2.3.6", - "safe-buffer": "5.1.2" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, "block-stream": { @@ -134,7 +134,7 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "bluebird": { @@ -153,15 +153,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" }, "dependencies": { "debug": { @@ -179,7 +179,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "brace-expansion": { @@ -187,7 +187,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -201,12 +201,12 @@ "resolved": "https://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.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "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": { @@ -214,9 +214,9 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -224,9 +224,9 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -234,8 +234,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sha3": { @@ -243,7 +243,7 @@ "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.1.tgz", "integrity": "sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE=", "requires": { - "js-sha3": "0.3.1" + "js-sha3": "^0.3.1" } }, "browserify-sign": { @@ -251,13 +251,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "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" } }, "buffer": { @@ -265,8 +265,8 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, "buffer-alloc": { @@ -274,8 +274,8 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz", "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=", "requires": { - "buffer-alloc-unsafe": "0.1.1", - "buffer-fill": "0.1.1" + "buffer-alloc-unsafe": "^0.1.0", + "buffer-fill": "^0.1.0" } }, "buffer-alloc-unsafe": { @@ -328,8 +328,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "cliui": { @@ -337,9 +337,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "co": { @@ -357,7 +357,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -365,7 +365,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } }, "concat-map": { @@ -403,8 +403,8 @@ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", "requires": { - "object-assign": "4.1.1", - "vary": "1.1.2" + "object-assign": "^4", + "vary": "^1" } }, "create-ecdh": { @@ -412,8 +412,8 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -421,11 +421,11 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "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": { @@ -433,12 +433,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "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" } }, "cryptiles": { @@ -446,7 +446,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -454,7 +454,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -464,17 +464,17 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "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": { @@ -482,7 +482,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -508,14 +508,14 @@ "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", "requires": { - "decompress-tar": "4.1.1", - "decompress-tarbz2": "4.1.1", - "decompress-targz": "4.1.1", - "decompress-unzip": "4.0.1", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "pify": "2.3.0", - "strip-dirs": "2.1.0" + "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" } }, "decompress-response": { @@ -523,7 +523,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "mimic-response": "1.0.0" + "mimic-response": "^1.0.0" } }, "decompress-tar": { @@ -531,9 +531,9 @@ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "requires": { - "file-type": "5.2.0", - "is-stream": "1.1.0", - "tar-stream": "1.5.6" + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" } }, "decompress-tarbz2": { @@ -541,11 +541,11 @@ "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "requires": { - "decompress-tar": "4.1.1", - "file-type": "6.2.0", - "is-stream": "1.1.0", - "seek-bzip": "1.0.5", - "unbzip2-stream": "1.2.5" + "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": { @@ -560,9 +560,9 @@ "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "requires": { - "decompress-tar": "4.1.1", - "file-type": "5.2.0", - "is-stream": "1.1.0" + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" } }, "decompress-unzip": { @@ -570,10 +570,10 @@ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", "requires": { - "file-type": "3.9.0", - "get-stream": "2.3.1", - "pify": "2.3.0", - "yauzl": "2.9.1" + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" }, "dependencies": { "file-type": { @@ -586,8 +586,8 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" } } } @@ -607,8 +607,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { @@ -621,9 +621,9 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dom-walk": { @@ -636,9 +636,9 @@ "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", "requires": { - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "create-hmac": "1.1.7" + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" } }, "duplexer3": { @@ -652,7 +652,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -665,13 +665,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "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": { @@ -684,7 +684,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "error-ex": { @@ -692,7 +692,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-html": { @@ -710,13 +710,13 @@ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0", - "keccakjs": "0.2.1", - "nano-json-stream-parser": "0.1.2", - "servify": "0.1.12", - "ws": "3.3.3", - "xhr-request-promise": "0.1.2" + "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" } }, "ethereum-common": { @@ -729,8 +729,8 @@ "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.4.tgz", "integrity": "sha512-kOgUd5jC+0tgV7t52UDECMMz9Uf+Lro+6fSpCvzWemtXfMEcwI3EOxf5mVPMRbTFkMMhuERokNNVF3jItAjidg==", "requires": { - "ethereum-common": "0.0.18", - "ethereumjs-util": "5.1.5" + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, "ethereumjs-util": { @@ -738,13 +738,13 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.1.5.tgz", "integrity": "sha512-xPaSEATYJpMTCGowIt0oMZwFP4R1bxd6QsWgkcDvFL0JtXsr39p32WEcD14RscCjfP41YXZPCVWA4yAg0nrJmw==", "requires": { - "bn.js": "4.11.8", - "create-hash": "1.2.0", - "ethjs-util": "0.1.4", - "keccak": "1.4.0", - "rlp": "2.0.0", - "safe-buffer": "5.1.2", - "secp256k1": "3.5.0" + "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" } }, "ethjs-unit": { @@ -782,8 +782,8 @@ "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.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "express": { @@ -791,36 +791,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "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", + "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", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "debug": { @@ -868,7 +868,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "requires": { - "pend": "1.2.0" + "pend": "~1.2.0" } }, "file-type": { @@ -882,12 +882,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "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" + "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": { @@ -910,8 +910,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "follow-redirects": { @@ -919,7 +919,7 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { - "debug": "3.1.0" + "debug": "^3.1.0" } }, "for-each": { @@ -927,7 +927,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", "requires": { - "is-function": "1.0.1" + "is-function": "~1.0.0" } }, "forever-agent": { @@ -940,9 +940,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "forwarded": { @@ -960,8 +960,8 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" } }, "fs-promise": { @@ -969,10 +969,10 @@ "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", "requires": { - "any-promise": "1.3.0", - "fs-extra": "2.1.2", - "mz": "2.7.0", - "thenify-all": "1.6.0" + "any-promise": "^1.3.0", + "fs-extra": "^2.0.0", + "mz": "^2.6.0", + "thenify-all": "^1.6.0" } }, "fs.realpath": { @@ -985,10 +985,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "get-caller-file": { @@ -1006,7 +1006,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -1014,12 +1014,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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": { @@ -1027,8 +1027,8 @@ "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", "requires": { - "min-document": "2.19.0", - "process": "0.5.2" + "min-document": "^2.19.0", + "process": "~0.5.1" } }, "got": { @@ -1036,20 +1036,20 @@ "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "requires": { - "decompress-response": "3.3.0", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-plain-obj": "1.1.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "isurl": "1.0.0", - "lowercase-keys": "1.0.1", - "p-cancelable": "0.3.0", - "p-timeout": "1.2.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "url-parse-lax": "1.0.0", - "url-to-options": "1.0.1" + "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": { @@ -1072,8 +1072,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-symbol-support-x": { @@ -1086,7 +1086,7 @@ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "requires": { - "has-symbol-support-x": "1.4.2" + "has-symbol-support-x": "^1.4.1" } }, "hash-base": { @@ -1094,8 +1094,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -1103,8 +1103,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hawk": { @@ -1112,10 +1112,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "hmac-drbg": { @@ -1123,9 +1123,9 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -1143,10 +1143,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" } }, "http-https": { @@ -1159,9 +1159,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -1179,8 +1179,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1213,7 +1213,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -1221,7 +1221,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-function": { @@ -1284,8 +1284,8 @@ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "requires": { - "has-to-string-tag-x": "1.4.1", - "is-object": "1.0.1" + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" } }, "js-sha3": { @@ -1319,7 +1319,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsprim": { @@ -1338,10 +1338,10 @@ "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", "requires": { - "bindings": "1.3.0", - "inherits": "2.0.3", - "nan": "2.10.0", - "safe-buffer": "5.1.2" + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" } }, "keccakjs": { @@ -1349,8 +1349,8 @@ "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", "integrity": "sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0=", "requires": { - "browserify-sha3": "0.0.1", - "sha3": "1.2.0" + "browserify-sha3": "^0.0.1", + "sha3": "^1.1.0" } }, "klaw": { @@ -1358,7 +1358,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "lcid": { @@ -1366,7 +1366,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "load-json-file": { @@ -1374,11 +1374,11 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "lodash.assign": { @@ -1396,7 +1396,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -1411,8 +1411,8 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "media-typer": { @@ -1440,8 +1440,8 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { @@ -1459,7 +1459,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-response": { @@ -1472,7 +1472,7 @@ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "requires": { - "dom-walk": "0.1.1" + "dom-walk": "^0.1.0" } }, "minimalistic-assert": { @@ -1490,7 +1490,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -1511,7 +1511,7 @@ "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", "requires": { - "mkdirp": "0.5.1" + "mkdirp": "*" } }, "mock-fs": { @@ -1534,9 +1534,9 @@ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "requires": { - "any-promise": "1.3.0", - "object-assign": "4.1.1", - "thenify-all": "1.6.0" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, "nan": { @@ -1559,10 +1559,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "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": { @@ -1601,7 +1601,7 @@ "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.3.tgz", "integrity": "sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8=", "requires": { - "http-https": "1.0.0" + "http-https": "^1.0.0" } }, "on-finished": { @@ -1617,7 +1617,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-locale": { @@ -1625,7 +1625,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "p-cancelable": { @@ -1643,7 +1643,7 @@ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "requires": { - "p-finally": "1.0.0" + "p-finally": "^1.0.0" } }, "parse-asn1": { @@ -1651,11 +1651,11 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "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": { @@ -1663,7 +1663,7 @@ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", "requires": { - "for-each": "0.3.2", + "for-each": "^0.3.2", "trim": "0.0.1" } }, @@ -1672,7 +1672,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parseurl": { @@ -1685,7 +1685,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -1703,9 +1703,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pbkdf2": { @@ -1713,11 +1713,11 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "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": { @@ -1745,7 +1745,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "prepend-http": { @@ -1768,7 +1768,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -1777,11 +1777,11 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { @@ -1799,9 +1799,9 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "randombytes": { @@ -1809,7 +1809,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -1817,8 +1817,8 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "randomhex": { @@ -1855,7 +1855,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.5.0" + "statuses": ">= 1.3.1 < 2" } }, "setprototypeof": { @@ -1870,9 +1870,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -1880,8 +1880,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -1889,13 +1889,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "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" } }, "request": { @@ -1903,28 +1903,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "require-directory": { @@ -1947,7 +1947,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "ripemd160": { @@ -1955,8 +1955,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "rlp": { @@ -1974,7 +1974,7 @@ "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", "requires": { - "nan": "2.10.0" + "nan": "^2.0.8" } }, "scrypt.js": { @@ -1982,8 +1982,8 @@ "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.2.0.tgz", "integrity": "sha1-r40UZbcemZARC+38WTuUeeA6ito=", "requires": { - "scrypt": "6.0.3", - "scryptsy": "1.2.1" + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" } }, "scryptsy": { @@ -1991,7 +1991,7 @@ "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", "requires": { - "pbkdf2": "3.0.16" + "pbkdf2": "^3.0.3" } }, "secp256k1": { @@ -1999,14 +1999,14 @@ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.5.0.tgz", "integrity": "sha512-e5QIJl8W7Y4tT6LHffVcZAxJjvpgE5Owawv6/XCYPQljE9aP2NFFddQ8OYMKhdLshNu88FfL3qCN3/xYkXGRsA==", "requires": { - "bindings": "1.3.0", - "bip66": "1.1.5", - "bn.js": "4.11.8", - "create-hash": "1.2.0", - "drbg.js": "1.0.1", - "elliptic": "6.4.0", - "nan": "2.10.0", - "safe-buffer": "5.1.2" + "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" } }, "seek-bzip": { @@ -2014,7 +2014,7 @@ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "requires": { - "commander": "2.8.1" + "commander": "~2.8.1" } }, "semver": { @@ -2028,18 +2028,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "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", + "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.3", + "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" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { "debug": { @@ -2062,9 +2062,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -2073,11 +2073,11 @@ "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "requires": { - "body-parser": "1.18.2", - "cors": "2.8.4", - "express": "4.16.3", - "request": "2.85.0", - "xhr": "2.4.1" + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" } }, "set-blocking": { @@ -2100,8 +2100,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "sha3": { @@ -2109,7 +2109,7 @@ "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.0.tgz", "integrity": "sha1-aYnxtwpJhwWHajc+LGKs6WqpOZo=", "requires": { - "nan": "2.10.0" + "nan": "^2.0.5" } }, "simple-concat": { @@ -2122,9 +2122,9 @@ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", "requires": { - "decompress-response": "3.3.0", - "once": "1.4.0", - "simple-concat": "1.0.0" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, "sntp": { @@ -2132,19 +2132,19 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "solc": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.21.tgz", - "integrity": "sha512-8lJmimVjOG9AJOQRWS2ph4rSctPMsPGZ4H360HLs5iI+euUlt7iAvUxSLeFZZzwk0kas4Qta7HmlMXNU3yYwhw==", - "requires": { - "fs-extra": "0.30.0", - "memorystream": "0.3.1", - "require-from-string": "1.2.1", - "semver": "5.5.0", - "yargs": "4.8.1" + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.23.tgz", + "integrity": "sha512-AT7anLHY6uIRg2It6N0UlCHeZ7YeecIkUhnlirrCgCPCUevtnoN48BxvgigN/4jJTRljv5oFhAJtI6gvHzT5DQ==", + "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": { @@ -2152,11 +2152,11 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } } } @@ -2166,8 +2166,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -2180,8 +2180,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -2194,14 +2194,14 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "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", + "tweetnacl": "~0.14.0" } }, "statuses": { @@ -2219,9 +2219,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -2229,7 +2229,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -2242,7 +2242,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -2250,7 +2250,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-dirs": { @@ -2258,7 +2258,7 @@ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "requires": { - "is-natural-number": "4.0.1" + "is-natural-number": "^4.0.1" } }, "strip-hex-prefix": { @@ -2274,19 +2274,19 @@ "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.37.tgz", "integrity": "sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ==", "requires": { - "bluebird": "3.5.1", - "buffer": "5.1.0", - "decompress": "4.2.0", - "eth-lib": "0.1.27", - "fs-extra": "2.1.2", - "fs-promise": "2.0.3", - "got": "7.1.0", - "mime-types": "2.1.18", - "mkdirp-promise": "5.0.1", - "mock-fs": "4.4.2", - "setimmediate": "1.0.5", - "tar.gz": "1.0.7", - "xhr-request-promise": "0.1.2" + "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" } }, "tar": { @@ -2294,9 +2294,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-stream": { @@ -2304,12 +2304,12 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.6.tgz", "integrity": "sha512-tFG9xPbc4Y7CubEwriTss87tdcBQDsw81ejJyCbT4ALNYkNsdPqCfCD6Gkg3OpRkUkq6VO7qpNfwoQAuk/aeNQ==", "requires": { - "bl": "1.2.2", - "buffer-alloc": "1.1.0", - "end-of-stream": "1.4.1", - "readable-stream": "2.3.6", - "to-buffer": "1.1.0", - "xtend": "4.0.1" + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "readable-stream": "^2.0.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" } }, "tar.gz": { @@ -2317,11 +2317,11 @@ "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-1.0.7.tgz", "integrity": "sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg==", "requires": { - "bluebird": "2.11.0", - "commander": "2.8.1", - "fstream": "1.0.11", - "mout": "0.11.1", - "tar": "2.2.1" + "bluebird": "^2.9.34", + "commander": "^2.8.1", + "fstream": "^1.0.8", + "mout": "^0.11.0", + "tar": "^2.1.1" }, "dependencies": { "bluebird": { @@ -2336,7 +2336,7 @@ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", "requires": { - "any-promise": "1.3.0" + "any-promise": "^1.0.0" } }, "thenify-all": { @@ -2344,7 +2344,7 @@ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", "requires": { - "thenify": "3.3.0" + "thenify": ">= 3.1.0 < 4" } }, "through": { @@ -2367,7 +2367,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "trim": { @@ -2380,7 +2380,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -2395,7 +2395,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } }, "typedarray-to-buffer": { @@ -2403,7 +2403,7 @@ "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" + "is-typedarray": "^1.0.0" } }, "ultron": { @@ -2416,8 +2416,8 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", "integrity": "sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og==", "requires": { - "buffer": "3.6.0", - "through": "2.3.8" + "buffer": "^3.0.1", + "through": "^2.3.6" }, "dependencies": { "base64-js": { @@ -2431,8 +2431,8 @@ "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", "requires": { "base64-js": "0.0.8", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } } } @@ -2452,7 +2452,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "url-set-query": { @@ -2490,8 +2490,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vary": { @@ -2504,9 +2504,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "web3": { @@ -2656,9 +2656,9 @@ "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0", - "xhr-request-promise": "0.1.2" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, "uuid": { @@ -2784,11 +2784,12 @@ }, "websocket": { "version": "git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c", + "from": "websocket@git://github.com/frozeman/WebSocket-Node.git#7004c39c42ac98875ab61126e5b4a925430f592c", "requires": { - "debug": "2.6.9", - "nan": "2.10.0", - "typedarray-to-buffer": "3.1.5", - "yaeti": "0.0.6" + "debug": "^2.2.0", + "nan": "^2.3.3", + "typedarray-to-buffer": "^3.1.2", + "yaeti": "^0.0.6" }, "dependencies": { "debug": { @@ -2816,8 +2817,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" } }, "wrappy": { @@ -2830,9 +2831,9 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.2", - "ultron": "1.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, "xhr": { @@ -2840,10 +2841,10 @@ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.1.tgz", "integrity": "sha512-pAIU5vBr9Hiy5cpFIbPnwf0C18ZF86DBsZKrlsf87N5De/JbA6RJ83UP/cv+aljl4S40iRVMqP4pr4sF9Dnj0A==", "requires": { - "global": "4.3.2", - "is-function": "1.0.1", - "parse-headers": "2.0.1", - "xtend": "4.0.1" + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" } }, "xhr-request": { @@ -2851,13 +2852,13 @@ "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", "requires": { - "buffer-to-arraybuffer": "0.0.5", - "object-assign": "4.1.1", - "query-string": "5.1.1", - "simple-get": "2.8.1", - "timed-out": "4.0.1", - "url-set-query": "1.0.0", - "xhr": "2.4.1" + "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": { @@ -2865,7 +2866,7 @@ "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", "requires": { - "xhr-request": "1.1.0" + "xhr-request": "^1.0.1" } }, "xhr2": { @@ -2893,20 +2894,20 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "lodash.assign": "4.2.0", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "window-size": "0.2.0", - "y18n": "3.2.1", - "yargs-parser": "2.4.1" + "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": { @@ -2914,8 +2915,8 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "requires": { - "camelcase": "3.0.0", - "lodash.assign": "4.2.0" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } }, "yauzl": { @@ -2923,8 +2924,8 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", "requires": { - "buffer-crc32": "0.2.13", - "fd-slicer": "1.0.1" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.0.1" } } } diff --git a/scripts/migrate/package.json b/scripts/migrate/package.json index f1518d9..ce0d080 100644 --- a/scripts/migrate/package.json +++ b/scripts/migrate/package.json @@ -10,7 +10,7 @@ "dependencies": { "axios": "^0.18.0", "ethereumjs-tx": "^1.3.4", - "solc": "^0.4.21", + "solc": "^0.4.23", "web3": "^1.0.0-beta.34" } } diff --git a/test/mockContracts/EternalStorageProxyMock.sol b/test/mockContracts/EternalStorageProxyMock.sol index 6529ce9..bb3a34a 100644 --- a/test/mockContracts/EternalStorageProxyMock.sol +++ b/test/mockContracts/EternalStorageProxyMock.sol @@ -1,10 +1,10 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/eternal-storage/EternalStorageProxy.sol'; contract EternalStorageProxyMock is EternalStorageProxy { - function EternalStorageProxyMock( + constructor( address _proxyStorage, address _implementationAddress ) EternalStorageProxy( diff --git a/test/mockContracts/KeysManagerMock.sol b/test/mockContracts/KeysManagerMock.sol index 9d60dcc..5c233cf 100644 --- a/test/mockContracts/KeysManagerMock.sol +++ b/test/mockContracts/KeysManagerMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/KeysManager.sol'; diff --git a/test/mockContracts/PoaNetworkConsensusMock.sol b/test/mockContracts/PoaNetworkConsensusMock.sol index d797dfd..8ba8d5a 100644 --- a/test/mockContracts/PoaNetworkConsensusMock.sol +++ b/test/mockContracts/PoaNetworkConsensusMock.sol @@ -1,11 +1,11 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/PoaNetworkConsensus.sol'; import '../../contracts/interfaces/IProxyStorage.sol'; contract PoaNetworkConsensusMock is PoaNetworkConsensus { - function PoaNetworkConsensusMock( + constructor( address _moc, address[] validators ) PoaNetworkConsensus( diff --git a/test/mockContracts/ProxyStorageMock.sol b/test/mockContracts/ProxyStorageMock.sol index 4cb6142..519e288 100644 --- a/test/mockContracts/ProxyStorageMock.sol +++ b/test/mockContracts/ProxyStorageMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/ProxyStorage.sol'; diff --git a/test/mockContracts/ValidatorMetadataMock.sol b/test/mockContracts/ValidatorMetadataMock.sol index 6456cbb..94cc95c 100644 --- a/test/mockContracts/ValidatorMetadataMock.sol +++ b/test/mockContracts/ValidatorMetadataMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/ValidatorMetadata.sol'; diff --git a/test/mockContracts/VotingToChangeKeysMock.sol b/test/mockContracts/VotingToChangeKeysMock.sol index 1674dab..eba7ec7 100644 --- a/test/mockContracts/VotingToChangeKeysMock.sol +++ b/test/mockContracts/VotingToChangeKeysMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/VotingToChangeKeys.sol'; diff --git a/test/mockContracts/VotingToChangeMinThresholdMock.sol b/test/mockContracts/VotingToChangeMinThresholdMock.sol index eef4359..f399da5 100644 --- a/test/mockContracts/VotingToChangeMinThresholdMock.sol +++ b/test/mockContracts/VotingToChangeMinThresholdMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/VotingToChangeMinThreshold.sol'; diff --git a/test/mockContracts/VotingToChangeProxyAddressMock.sol b/test/mockContracts/VotingToChangeProxyAddressMock.sol index 6cdf884..4e0af88 100644 --- a/test/mockContracts/VotingToChangeProxyAddressMock.sol +++ b/test/mockContracts/VotingToChangeProxyAddressMock.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../../contracts/VotingToChangeProxyAddress.sol'; diff --git a/test/upgradeContracts/BallotsStorageNew.sol b/test/upgradeContracts/BallotsStorageNew.sol index 0bc3727..adcaeeb 100644 --- a/test/upgradeContracts/BallotsStorageNew.sol +++ b/test/upgradeContracts/BallotsStorageNew.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "../../contracts/BallotsStorage.sol"; diff --git a/test/upgradeContracts/KeysManagerNew.sol b/test/upgradeContracts/KeysManagerNew.sol index 887c275..0c24a7c 100644 --- a/test/upgradeContracts/KeysManagerNew.sol +++ b/test/upgradeContracts/KeysManagerNew.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../mockContracts/KeysManagerMock.sol'; diff --git a/test/upgradeContracts/ProxyStorageNew.sol b/test/upgradeContracts/ProxyStorageNew.sol index e5f4382..4e0c284 100644 --- a/test/upgradeContracts/ProxyStorageNew.sol +++ b/test/upgradeContracts/ProxyStorageNew.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../mockContracts/ProxyStorageMock.sol'; diff --git a/test/upgradeContracts/ValidatorMetadataNew.sol b/test/upgradeContracts/ValidatorMetadataNew.sol index cfed46e..65231de 100644 --- a/test/upgradeContracts/ValidatorMetadataNew.sol +++ b/test/upgradeContracts/ValidatorMetadataNew.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../mockContracts/ValidatorMetadataMock.sol'; diff --git a/test/upgradeContracts/VotingToChangeKeysNew.sol b/test/upgradeContracts/VotingToChangeKeysNew.sol index b73699a..53ef995 100644 --- a/test/upgradeContracts/VotingToChangeKeysNew.sol +++ b/test/upgradeContracts/VotingToChangeKeysNew.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../mockContracts/VotingToChangeKeysMock.sol'; diff --git a/test/upgradeContracts/VotingToChangeMinThresholdNew.sol b/test/upgradeContracts/VotingToChangeMinThresholdNew.sol index dfcf8b0..5a8666c 100644 --- a/test/upgradeContracts/VotingToChangeMinThresholdNew.sol +++ b/test/upgradeContracts/VotingToChangeMinThresholdNew.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../mockContracts/VotingToChangeMinThresholdMock.sol'; diff --git a/test/upgradeContracts/VotingToChangeProxyAddressNew.sol b/test/upgradeContracts/VotingToChangeProxyAddressNew.sol index 1f5b041..da95d15 100644 --- a/test/upgradeContracts/VotingToChangeProxyAddressNew.sol +++ b/test/upgradeContracts/VotingToChangeProxyAddressNew.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import '../mockContracts/VotingToChangeProxyAddressMock.sol'; From 25f11b1f5b5a6d695afe79417c2bd28b1087b6ca Mon Sep 17 00:00:00 2001 From: Vadim Arasev Date: Tue, 15 May 2018 14:39:26 +0300 Subject: [PATCH 6/7] (Update) Increased Emission Supply - refactor and update to v0.4.23 Relates to https://github.com/poanetwork/poa-network-consensus-contracts/issues/78#issuecomment-388439571 --- contracts/EmissionFunds.sol | 24 +- contracts/VotingToManageEmissionFunds.sol | 402 +++++++--------------- contracts/interfaces/IEmissionFunds.sol | 2 +- 3 files changed, 139 insertions(+), 289 deletions(-) diff --git a/contracts/EmissionFunds.sol b/contracts/EmissionFunds.sol index 948fb2e..e8daad7 100644 --- a/contracts/EmissionFunds.sol +++ b/contracts/EmissionFunds.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; import "./interfaces/IEmissionFunds.sol"; @@ -6,20 +6,30 @@ import "./interfaces/IEmissionFunds.sol"; contract EmissionFunds is IEmissionFunds { address public votingToManageEmissionFunds; - event SendFundsTo(address indexed receiver, address indexed caller, uint256 value, bool success); - event BurnFunds(address indexed burner, uint256 value, bool success); + event SendFundsTo( + address indexed receiver, + address indexed caller, + uint256 value, + bool success + ); + + event BurnFunds( + address indexed burner, + uint256 value, + bool success + ); modifier onlyVotingToManageEmissionFunds() { require(msg.sender == votingToManageEmissionFunds); _; } - function EmissionFunds(address _votingToManageEmissionFunds) public { + constructor(address _votingToManageEmissionFunds) public { require(_votingToManageEmissionFunds != address(0)); votingToManageEmissionFunds = _votingToManageEmissionFunds; } - function () external payable {} + function() external payable {} function sendFundsTo(address _receiver) external @@ -29,7 +39,7 @@ contract EmissionFunds is IEmissionFunds { uint256 value = _balance(); // using `send` instead of `transfer` to avoid revert on failure bool success = _receiver.send(value); - SendFundsTo(_receiver, msg.sender, value, success); + emit SendFundsTo(_receiver, msg.sender, value, success); return success; } @@ -41,7 +51,7 @@ contract EmissionFunds is IEmissionFunds { uint256 value = _balance(); // using `send` instead of `transfer` to avoid revert on failure bool success = address(0).send(value); - BurnFunds(msg.sender, value, success); + emit BurnFunds(msg.sender, value, success); return success; } diff --git a/contracts/VotingToManageEmissionFunds.sol b/contracts/VotingToManageEmissionFunds.sol index 55e0258..2977697 100644 --- a/contracts/VotingToManageEmissionFunds.sol +++ b/contracts/VotingToManageEmissionFunds.sol @@ -1,104 +1,17 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; -import "./SafeMath.sol"; -import "./interfaces/IProxyStorage.sol"; -import "./interfaces/IBallotsStorage.sol"; -import "./interfaces/IKeysManager.sol"; import "./interfaces/IEmissionFunds.sol"; -import "./eternal-storage/EternalStorage.sol"; +import "./abstracts/VotingTo.sol"; -contract VotingToManageEmissionFunds is EternalStorage { - using SafeMath for uint256; - +contract VotingToManageEmissionFunds is VotingTo { enum QuorumStates {Invalid, InProgress, Sent, Burnt, Frozen} enum ActionChoice {Invalid, Send, Burn, Freeze} - event Vote(uint256 indexed id, uint256 decision, address indexed voter, uint256 time, address voterMiningKey); - event BallotFinalized(uint256 indexed id, address indexed voter); - event BallotCreated(uint256 indexed id, uint256 indexed ballotType, address indexed creator); - - modifier onlyOwner() { - require(msg.sender == addressStorage[keccak256("owner")]); - _; - } - - modifier onlyValidVotingKey(address _votingKey) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - require(keysManager.isVotingActive(_votingKey)); - _; - } - - function maxOldMiningKeysDeepCheck() public pure returns(uint8) { - return 25; - } - - function proxyStorage() public view returns(address) { - return addressStorage[keccak256("proxyStorage")]; - } - - function nextBallotId() public view returns(uint256) { - return uintStorage[keccak256("nextBallotId")]; - } - - function initDisabled() public view returns(bool) { - return boolStorage[keccak256("initDisabled")]; - } - - function emissionReleaseTime() public view returns(uint256) { - return uintStorage[keccak256("emissionReleaseTime")]; - } - - function refreshEmissionReleaseTime() public returns(uint256) { - uint256 releaseTime = emissionReleaseTime(); - uint256 currentTime = getTime(); - if (currentTime > releaseTime) { - uint256 releaseThreshold = emissionReleaseThreshold(); - uint256 diff = currentTime.sub(releaseTime).div(releaseThreshold); - if (diff > 0) { - releaseTime = releaseTime.add(releaseThreshold.mul(diff)); - _setEmissionReleaseTime(releaseTime); - } - } - return releaseTime; - } - - function emissionReleaseThreshold() public view returns(uint256) { - return uintStorage[keccak256("emissionReleaseThreshold")]; - } - - function distributionThreshold() public view returns(uint256) { - return uintStorage[keccak256("distributionThreshold")]; - } - - function emissionFunds() public view returns(address) { - return addressStorage[keccak256("emissionFunds")]; - } - - function init( - address _emissionFunds, - uint256 _emissionReleaseTime, - uint256 _emissionReleaseThreshold, - uint256 _distributionThreshold - ) public onlyOwner { - require(!initDisabled()); - require(_emissionFunds != address(0)); - require(_emissionReleaseTime > getTime()); - require(_emissionReleaseThreshold > 0); - require(_distributionThreshold > 0); - require(_emissionReleaseThreshold > _distributionThreshold); - _setLastBallotFinalized(true); - _setEmissionReleaseTime(_emissionReleaseTime); - addressStorage[keccak256("emissionFunds")] = _emissionFunds; - uintStorage[keccak256("emissionReleaseThreshold")] = _emissionReleaseThreshold; - uintStorage[keccak256("distributionThreshold")] = _distributionThreshold; - boolStorage[keccak256("initDisabled")] = true; - } - - function createBallotToManageEmissionFunds( + function createBallot( uint256 _startTime, uint256 _endTime, - address _sendTo, + address _receiver, string memo ) public onlyValidVotingKey(msg.sender) { require(_startTime > 0 && _endTime > 0); @@ -108,8 +21,8 @@ contract VotingToManageEmissionFunds is EternalStorage { require(_startTime > releaseTime); require(currentTime > releaseTime); require(_endTime.sub(releaseTime) <= distributionThreshold()); - require(_sendTo != address(0)); - require(lastBallotFinalized()); + require(_receiver != address(0)); + require(previousBallotFinalized()); uint256 ballotId = nextBallotId(); _setStartTime(ballotId, _startTime); _setEndTime(ballotId, _endTime); @@ -118,30 +31,29 @@ contract VotingToManageEmissionFunds is EternalStorage { _setFreezeVotes(ballotId, 0); _setIsFinalized(ballotId, false); _setQuorumState(ballotId, uint8(QuorumStates.InProgress)); - _setSendTo(ballotId, _sendTo); + _setReceiver(ballotId, _receiver); _setMinThresholdOfVoters(ballotId, getGlobalMinThresholdOfVoters()); _setCreator(ballotId, getMiningByVotingKey(msg.sender)); _setMemo(ballotId, memo); - _setLastBallotFinalized(false); - BallotCreated(ballotId, 6, msg.sender); + _setPreviousBallotFinalized(false); _setNextBallotId(ballotId.add(1)); + emit BallotCreated(ballotId, 6, msg.sender); } - function vote(uint256 _id, uint8 _choice) public onlyValidVotingKey(msg.sender) { - require(!getIsFinalized(_id)); - require(isValidVote(_id, msg.sender)); - if (_choice == uint(ActionChoice.Send)) { - _setSendVotes(_id, getSendVotes(_id).add(1)); - } else if (_choice == uint(ActionChoice.Burn)) { - _setBurnVotes(_id, getBurnVotes(_id).add(1)); - } else if (_choice == uint(ActionChoice.Freeze)) { - _setFreezeVotes(_id, getFreezeVotes(_id).add(1)); - } else { - revert(); - } - address miningKey = getMiningByVotingKey(msg.sender); - _votersAdd(_id, miningKey); - Vote(_id, _choice, msg.sender, getTime(), miningKey); + function distributionThreshold() public view returns(uint256) { + return uintStorage[keccak256("distributionThreshold")]; + } + + function emissionFunds() public view returns(address) { + return addressStorage[keccak256("emissionFunds")]; + } + + function emissionReleaseThreshold() public view returns(uint256) { + return uintStorage[keccak256("emissionReleaseThreshold")]; + } + + function emissionReleaseTime() public view returns(uint256) { + return uintStorage[keccak256("emissionReleaseTime")]; } function finalize(uint256 _id) public onlyValidVotingKey(msg.sender) { @@ -149,35 +61,14 @@ contract VotingToManageEmissionFunds is EternalStorage { require(getStartTime(_id) <= getTime()); require(!isActive(_id)); require(!getIsFinalized(_id)); - require(!lastBallotFinalized()); + require(!previousBallotFinalized()); _finalizeBallot(_id); _setIsFinalized(_id, true); - _setLastBallotFinalized(true); + _setPreviousBallotFinalized(true); _setEmissionReleaseTime( emissionReleaseTime().add(emissionReleaseThreshold()) ); - BallotFinalized(_id, msg.sender); - } - - function getBallotsStorage() public view returns(address) { - return IProxyStorage(proxyStorage()).getBallotsStorage(); - } - - function getKeysManager() public view returns(address) { - return IProxyStorage(proxyStorage()).getKeysManager(); - } - - function getGlobalMinThresholdOfVoters() public view returns(uint256) { - IBallotsStorage ballotsStorage = IBallotsStorage(getBallotsStorage()); - return ballotsStorage.getBallotThreshold(1); - } - - function getTotalVoters(uint256 _id) public view returns(uint256) { - return getSendVotes(_id) + getBurnVotes(_id) + getFreezeVotes(_id); - } - - function getSendVotes(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256(_storeName(), _id, "sendVotes")]; + emit BallotFinalized(_id, msg.sender); } function getBurnVotes(uint256 _id) public view returns(uint256) { @@ -188,194 +79,143 @@ contract VotingToManageEmissionFunds is EternalStorage { return uintStorage[keccak256(_storeName(), _id, "freezeVotes")]; } - function getMinThresholdOfVoters(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256(_storeName(), _id, "minThresholdOfVoters")]; + function getReceiver(uint256 _id) public view returns(address) { + return addressStorage[keccak256(_storeName(), _id, "receiver")]; } - function getMiningByVotingKey(address _votingKey) public view returns(address) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - return keysManager.getMiningKeyByVoting(_votingKey); - } - - function getStartTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256(_storeName(), _id, "startTime")]; - } - - function getEndTime(uint256 _id) public view returns(uint256) { - return uintStorage[keccak256(_storeName(), _id, "endTime")]; - } - - function getIsFinalized(uint256 _id) public view returns(bool) { - return boolStorage[keccak256(_storeName(), _id, "isFinalized")]; - } - - function lastBallotFinalized() public view returns(bool) { - return boolStorage[keccak256("lastBallotFinalized")]; - } - - function getQuorumState(uint256 _id) public view returns(uint8) { - return uint8(uintStorage[keccak256(_storeName(), _id, "quorumState")]); - } - - function getSendTo(uint256 _id) public view returns(address) { - return addressStorage[keccak256(_storeName(), _id, "sendTo")]; - } - - function getCreator(uint256 _id) public view returns(address) { - return addressStorage[keccak256(_storeName(), _id, "creator")]; - } - - function getTime() public view returns(uint256) { - return now; - } - - function isActive(uint256 _id) public view returns(bool) { - bool withinTime = getStartTime(_id) <= getTime() && getTime() <= getEndTime(_id); - return withinTime; + function getSendVotes(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "sendVotes")]; } - function getMemo(uint256 _id) public view returns(string) { - return stringStorage[keccak256(_storeName(), _id, "memo")]; + function getTotalVoters(uint256 _id) public view returns(uint256) { + return getSendVotes(_id).add(getBurnVotes(_id)).add(getFreezeVotes(_id)); } - function hasMiningKeyAlreadyVoted(uint256 _id, address _miningKey) public view returns(bool) { - return boolStorage[keccak256(_storeName(), _id, "voters", _miningKey)]; + function init( + address _emissionFunds, + uint256 _emissionReleaseTime, + uint256 _emissionReleaseThreshold, + uint256 _distributionThreshold + ) public onlyOwner { + require(!initDisabled()); + require(_emissionFunds != address(0)); + require(_emissionReleaseTime > getTime()); + require(_emissionReleaseThreshold > 0); + require(_distributionThreshold > 0); + require(_emissionReleaseThreshold > _distributionThreshold); + _setPreviousBallotFinalized(true); + _setEmissionReleaseTime(_emissionReleaseTime); + addressStorage[keccak256("emissionFunds")] = _emissionFunds; + uintStorage[keccak256("emissionReleaseThreshold")] = _emissionReleaseThreshold; + uintStorage[keccak256("distributionThreshold")] = _distributionThreshold; + boolStorage[keccak256("initDisabled")] = true; } - function hasAlreadyVoted(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - return hasMiningKeyAlreadyVoted(_id, miningKey); + function previousBallotFinalized() public view returns(bool) { + return boolStorage[keccak256("previousBallotFinalized")]; } - function isValidVote(uint256 _id, address _votingKey) public view returns(bool) { - address miningKey = getMiningByVotingKey(_votingKey); - bool notVoted = !hasAlreadyVoted(_id, _votingKey); - bool oldKeysNotVoted = !areOldMiningKeysVoted(_id, miningKey); - return notVoted && isActive(_id) && oldKeysNotVoted; + function refreshEmissionReleaseTime() public returns(uint256) { + uint256 releaseTime = emissionReleaseTime(); + uint256 currentTime = getTime(); + if (currentTime > releaseTime) { + uint256 releaseThreshold = emissionReleaseThreshold(); + uint256 diff = currentTime.sub(releaseTime).div(releaseThreshold); + if (diff > 0) { + releaseTime = releaseTime.add(releaseThreshold.mul(diff)); + _setEmissionReleaseTime(releaseTime); + } + } + return releaseTime; } - function areOldMiningKeysVoted(uint256 _id, address _miningKey) public view returns(bool) { - IKeysManager keysManager = IKeysManager(getKeysManager()); - uint8 maxDeep = maxOldMiningKeysDeepCheck(); - for (uint8 i = 0; i < maxDeep; i++) { - address oldMiningKey = keysManager.getMiningKeyHistory(_miningKey); - if (oldMiningKey == address(0)) { - return false; - } - if (hasMiningKeyAlreadyVoted(_id, oldMiningKey)) { - return true; - } else { - _miningKey = oldMiningKey; - } + function vote(uint256 _id, uint8 _choice) public onlyValidVotingKey(msg.sender) { + require(!getIsFinalized(_id)); + require(isValidVote(_id, msg.sender)); + if (_choice == uint(ActionChoice.Send)) { + _setSendVotes(_id, getSendVotes(_id).add(1)); + } else if (_choice == uint(ActionChoice.Burn)) { + _setBurnVotes(_id, getBurnVotes(_id).add(1)); + } else if (_choice == uint(ActionChoice.Freeze)) { + _setFreezeVotes(_id, getFreezeVotes(_id).add(1)); + } else { + revert(); } - return false; + address miningKey = getMiningByVotingKey(msg.sender); + _votersAdd(_id, miningKey); + emit Vote(_id, _choice, msg.sender, getTime(), miningKey); } function _finalizeBallot(uint256 _id) private { - QuorumStates quorumState = QuorumStates.Frozen; - - if (getTotalVoters(_id) >= getMinThresholdOfVoters(_id)) { - uint256 sendVotesCount = getSendVotes(_id); - uint256 burnVotesCount = getBurnVotes(_id); - uint256 freezeVotesCount = getFreezeVotes(_id); + if (getTotalVoters(_id) < getMinThresholdOfVoters(_id)) { + _setQuorumState(_id, uint8(QuorumStates.Frozen)); + return; + } + QuorumStates quorumState = QuorumStates.Frozen; + uint256 sendVotesCount = getSendVotes(_id); + uint256 burnVotesCount = getBurnVotes(_id); + uint256 freezeVotesCount = getFreezeVotes(_id); + + if ( + sendVotesCount != burnVotesCount && + burnVotesCount != freezeVotesCount && + sendVotesCount != freezeVotesCount + ) { + uint256 max = _max(sendVotesCount, burnVotesCount, freezeVotesCount); + if (max == sendVotesCount) quorumState = QuorumStates.Sent; + else if (max == burnVotesCount) quorumState = QuorumStates.Burnt; + } else { if ( - sendVotesCount != burnVotesCount && - burnVotesCount != freezeVotesCount && - sendVotesCount != freezeVotesCount + burnVotesCount == freezeVotesCount && + sendVotesCount > burnVotesCount + ) { + quorumState = QuorumStates.Sent; + } else if ( + sendVotesCount == freezeVotesCount && + burnVotesCount > sendVotesCount ) { - uint256 max = 0; - if (sendVotesCount > max) max = sendVotesCount; - if (burnVotesCount > max) max = burnVotesCount; - if (freezeVotesCount > max) max = freezeVotesCount; - if (max == sendVotesCount) quorumState = QuorumStates.Sent; - else if (max == burnVotesCount) quorumState = QuorumStates.Burnt; - } else { - if ( - burnVotesCount == freezeVotesCount && - sendVotesCount > burnVotesCount - ) { - quorumState = QuorumStates.Sent; - } else if ( - sendVotesCount == freezeVotesCount && - burnVotesCount > sendVotesCount - ) { - quorumState = QuorumStates.Burnt; - } + quorumState = QuorumStates.Burnt; } } _setQuorumState(_id, uint8(quorumState)); if (quorumState == QuorumStates.Sent) { - IEmissionFunds(emissionFunds()).sendFundsTo(getSendTo(_id)); + IEmissionFunds(emissionFunds()).sendFundsTo(getReceiver(_id)); } else if (quorumState == QuorumStates.Burnt) { IEmissionFunds(emissionFunds()).burnFunds(); } } - function _setNextBallotId(uint256 _id) private { - uintStorage[keccak256("nextBallotId")] = _id; - } - - function _storeName() private pure returns(string) { - return "votingState"; - } - - function _setStartTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "startTime")] = _value; - } - - function _setEndTime(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "endTime")] = _value; - } - - function _setSendVotes(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "sendVotes")] = _value; + function _max(uint256 a, uint256 b, uint256 c) private pure returns(uint256) { + uint256 max = a; + (max < b) && ((max = b) != 0); + (max < c) && ((max = c) != 0); + return max; } function _setBurnVotes(uint256 _ballotId, uint256 _value) private { uintStorage[keccak256(_storeName(), _ballotId, "burnVotes")] = _value; } - function _setFreezeVotes(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "freezeVotes")] = _value; - } - - function _setIsFinalized(uint256 _ballotId, bool _value) private { - boolStorage[keccak256(_storeName(), _ballotId, "isFinalized")] = _value; - } - - function _setLastBallotFinalized(bool _finalized) private { - boolStorage[keccak256("lastBallotFinalized")] = _finalized; - } - - function _setQuorumState(uint256 _ballotId, uint8 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "quorumState")] = _value; - } - - function _setSendTo(uint256 _ballotId, address _value) private { - addressStorage[keccak256(_storeName(), _ballotId, "sendTo")] = _value; - } - - function _setMinThresholdOfVoters(uint256 _ballotId, uint256 _value) private { - uintStorage[keccak256(_storeName(), _ballotId, "minThresholdOfVoters")] = _value; + function _setEmissionReleaseTime(uint256 _time) private { + uintStorage[keccak256("emissionReleaseTime")] = _time; } - function _setCreator(uint256 _ballotId, address _value) private { - addressStorage[keccak256(_storeName(), _ballotId, "creator")] = _value; + function _setFreezeVotes(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "freezeVotes")] = _value; } - function _setMemo(uint256 _ballotId, string _value) private { - stringStorage[keccak256(_storeName(), _ballotId, "memo")] = _value; + function _setPreviousBallotFinalized(bool _finalized) private { + boolStorage[keccak256("previousBallotFinalized")] = _finalized; } - function _votersAdd(uint256 _ballotId, address _miningKey) private { - boolStorage[keccak256(_storeName(), _ballotId, "voters", _miningKey)] = true; + function _setReceiver(uint256 _ballotId, address _value) private { + addressStorage[keccak256(_storeName(), _ballotId, "receiver")] = _value; } - function _setEmissionReleaseTime(uint256 _time) private { - uintStorage[keccak256("emissionReleaseTime")] = _time; + function _setSendVotes(uint256 _ballotId, uint256 _value) private { + uintStorage[keccak256(_storeName(), _ballotId, "sendVotes")] = _value; } - } diff --git a/contracts/interfaces/IEmissionFunds.sol b/contracts/interfaces/IEmissionFunds.sol index f1626c5..c673764 100644 --- a/contracts/interfaces/IEmissionFunds.sol +++ b/contracts/interfaces/IEmissionFunds.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.4.18; +pragma solidity ^0.4.23; interface IEmissionFunds { From b0ca5e5cc1940f4e84b77d4704315f94a871125c Mon Sep 17 00:00:00 2001 From: Vadim Arasev Date: Wed, 16 May 2018 17:10:47 +0300 Subject: [PATCH 7/7] (Fix) Increased Emission Supply - finalization function --- contracts/EmissionFunds.sol | 28 +++++++-------- contracts/VotingToManageEmissionFunds.sol | 42 +++++++++++++++++------ contracts/interfaces/IEmissionFunds.sol | 4 +-- 3 files changed, 48 insertions(+), 26 deletions(-) diff --git a/contracts/EmissionFunds.sol b/contracts/EmissionFunds.sol index e8daad7..a8c20d8 100644 --- a/contracts/EmissionFunds.sol +++ b/contracts/EmissionFunds.sol @@ -9,16 +9,21 @@ contract EmissionFunds is IEmissionFunds { event SendFundsTo( address indexed receiver, address indexed caller, - uint256 value, + uint256 amount, bool success ); event BurnFunds( address indexed burner, - uint256 value, + uint256 amount, bool success ); + modifier onlyPayloadSize(uint256 numwords) { + assert(msg.data.length >= numwords * 32 + 4); + _; + } + modifier onlyVotingToManageEmissionFunds() { require(msg.sender == votingToManageEmissionFunds); _; @@ -31,31 +36,26 @@ contract EmissionFunds is IEmissionFunds { function() external payable {} - function sendFundsTo(address _receiver) + function sendFundsTo(address _receiver, uint256 _amount) external onlyVotingToManageEmissionFunds + onlyPayloadSize(2) returns(bool) { - uint256 value = _balance(); // using `send` instead of `transfer` to avoid revert on failure - bool success = _receiver.send(value); - emit SendFundsTo(_receiver, msg.sender, value, success); + bool success = _receiver.send(_amount); + emit SendFundsTo(_receiver, msg.sender, _amount, success); return success; } - function burnFunds() + function burnFunds(uint256 _amount) external onlyVotingToManageEmissionFunds returns(bool) { - uint256 value = _balance(); // using `send` instead of `transfer` to avoid revert on failure - bool success = address(0).send(value); - emit BurnFunds(msg.sender, value, success); + bool success = address(0).send(_amount); + emit BurnFunds(msg.sender, _amount, success); return success; } - - function _balance() private view returns(uint256) { - return address(this).balance; - } } \ No newline at end of file diff --git a/contracts/VotingToManageEmissionFunds.sol b/contracts/VotingToManageEmissionFunds.sol index 2977697..79e166e 100644 --- a/contracts/VotingToManageEmissionFunds.sol +++ b/contracts/VotingToManageEmissionFunds.sol @@ -1,6 +1,7 @@ pragma solidity ^0.4.23; import "./interfaces/IEmissionFunds.sol"; +import "./interfaces/IPoaNetworkConsensus.sol"; import "./abstracts/VotingTo.sol"; @@ -35,6 +36,7 @@ contract VotingToManageEmissionFunds is VotingTo { _setMinThresholdOfVoters(ballotId, getGlobalMinThresholdOfVoters()); _setCreator(ballotId, getMiningByVotingKey(msg.sender)); _setMemo(ballotId, memo); + _setAmount(ballotId, emissionFunds().balance); _setPreviousBallotFinalized(false); _setNextBallotId(ballotId.add(1)); emit BallotCreated(ballotId, 6, msg.sender); @@ -62,13 +64,11 @@ contract VotingToManageEmissionFunds is VotingTo { require(!isActive(_id)); require(!getIsFinalized(_id)); require(!previousBallotFinalized()); - _finalizeBallot(_id); - _setIsFinalized(_id, true); - _setPreviousBallotFinalized(true); - _setEmissionReleaseTime( - emissionReleaseTime().add(emissionReleaseThreshold()) - ); - emit BallotFinalized(_id, msg.sender); + _finalize(_id); + } + + function getAmount(uint256 _id) public view returns(uint256) { + return uintStorage[keccak256(_storeName(), _id, "amount")]; } function getBurnVotes(uint256 _id) public view returns(uint256) { @@ -144,9 +144,27 @@ contract VotingToManageEmissionFunds is VotingTo { address miningKey = getMiningByVotingKey(msg.sender); _votersAdd(_id, miningKey); emit Vote(_id, _choice, msg.sender, getTime(), miningKey); + + uint256 validatorsLength = + IPoaNetworkConsensus(IProxyStorage(proxyStorage()).getPoaConsensus()) + .getCurrentValidatorsLength(); + if (validatorsLength > 0) { + validatorsLength--; // exclude MasterOfCeremony + } + if (getTotalVoters(_id) >= validatorsLength) { + _finalize(_id); + } } - function _finalizeBallot(uint256 _id) private { + function _finalize(uint256 _id) private { + _setIsFinalized(_id, true); + _setPreviousBallotFinalized(true); + _setEmissionReleaseTime( + emissionReleaseTime().add(emissionReleaseThreshold()) + ); + + emit BallotFinalized(_id, msg.sender); + if (getTotalVoters(_id) < getMinThresholdOfVoters(_id)) { _setQuorumState(_id, uint8(QuorumStates.Frozen)); return; @@ -182,9 +200,9 @@ contract VotingToManageEmissionFunds is VotingTo { _setQuorumState(_id, uint8(quorumState)); if (quorumState == QuorumStates.Sent) { - IEmissionFunds(emissionFunds()).sendFundsTo(getReceiver(_id)); + IEmissionFunds(emissionFunds()).sendFundsTo(getReceiver(_id), getAmount(_id)); } else if (quorumState == QuorumStates.Burnt) { - IEmissionFunds(emissionFunds()).burnFunds(); + IEmissionFunds(emissionFunds()).burnFunds(getAmount(_id)); } } @@ -195,6 +213,10 @@ contract VotingToManageEmissionFunds is VotingTo { return max; } + function _setAmount(uint256 _ballotId, uint256 _amount) private { + uintStorage[keccak256(_storeName(), _ballotId, "amount")] = _amount; + } + function _setBurnVotes(uint256 _ballotId, uint256 _value) private { uintStorage[keccak256(_storeName(), _ballotId, "burnVotes")] = _value; } diff --git a/contracts/interfaces/IEmissionFunds.sol b/contracts/interfaces/IEmissionFunds.sol index c673764..b66af21 100644 --- a/contracts/interfaces/IEmissionFunds.sol +++ b/contracts/interfaces/IEmissionFunds.sol @@ -2,6 +2,6 @@ pragma solidity ^0.4.23; interface IEmissionFunds { - function sendFundsTo(address) external returns(bool); - function burnFunds() external returns(bool); + function sendFundsTo(address, uint256) external returns(bool); + function burnFunds(uint256) external returns(bool); } \ No newline at end of file