From c687070e9b9757382557a21072b35de64c324728 Mon Sep 17 00:00:00 2001 From: satyam Date: Tue, 15 Jan 2019 15:53:19 +0530 Subject: [PATCH 01/16] EIP-1594/1644/1643 implementation --- contracts/interfaces/ISecurityToken.sol | 172 ++- contracts/interfaces/ITransferManager.sol | 4 + contracts/interfaces/token/IERC1594.sol | 28 + contracts/interfaces/token/IERC1643.sol | 18 + contracts/interfaces/token/IERC1644.sol | 28 + contracts/libraries/KindMath.sol | 54 +- contracts/libraries/TokenLib.sol | 56 + .../Mixed/ScheduledCheckpoint.sol | 21 +- .../LockupVolumeRestrictionTM.sol | 26 +- .../SingleTradeVolumeRestrictionTM.sol | 32 +- .../TransferManager/CountTransferManager.sol | 31 +- .../GeneralTransferManager.sol | 50 +- .../ManualApprovalTransferManager.sol | 35 +- .../PercentageTransferManager.sol | 37 +- contracts/tokens/ERC20.sol | 219 ++++ contracts/tokens/SecurityToken.sol | 550 +++++--- docs/ethereum_status_codes.md | 46 + yarn.lock | 1111 +---------------- 18 files changed, 1103 insertions(+), 1415 deletions(-) create mode 100644 contracts/interfaces/token/IERC1594.sol create mode 100644 contracts/interfaces/token/IERC1643.sol create mode 100644 contracts/interfaces/token/IERC1644.sol create mode 100644 contracts/tokens/ERC20.sol create mode 100644 docs/ethereum_status_codes.md diff --git a/contracts/interfaces/ISecurityToken.sol b/contracts/interfaces/ISecurityToken.sol index 3228d8740..677f4932b 100644 --- a/contracts/interfaces/ISecurityToken.sol +++ b/contracts/interfaces/ISecurityToken.sol @@ -18,23 +18,82 @@ interface ISecurityToken { event Approval(address indexed owner, address indexed spender, uint256 value); /** - * @notice Validates a transfer with a TransferManager module if it exists - * @dev TransferManager module has a key of 2 - * @param _from Sender of transfer - * @param _to Receiver of transfer - * @param _value Value of transfer - * @return bool + * @notice Transfers of securities may fail for a number of reasons. So this function will used to understand the + * cause of failure by getting the byte value. Which will be the ESC that follows the EIP 1066. ESC can be mapped + * with a reson string to understand the failure cause, table of Ethereum status code will always reside off-chain + * @param _to address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. + * @return bool It signifies whether the transaction will be executed or not. + * @return byte Ethereum status code (ESC) + * @return bytes32 Application specific reason code */ - function verifyTransfer(address _from, address _to, uint256 _value, bytes calldata _data) external returns(bool success); + function canTransfer(address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32); + + /** + * @notice Transfers of securities may fail for a number of reasons. So this function will used to understand the + * cause of failure by getting the byte value. Which will be the ESC that follows the EIP 1066. ESC can be mapped + * with a reson string to understand the failure cause, table of Ethereum status code will always reside off-chain + * @param _from address The address which you want to send tokens from + * @param _to address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. + * @return bool It signifies whether the transaction will be executed or not. + * @return byte Ethereum status code (ESC) + * @return bytes32 Application specific reason code + */ + function canTransferFrom(address _from, address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32); /** - * @notice Mints new tokens and assigns them to the target _investor. - * Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet) - * @param _investor Address the tokens will be minted to - * @param _value is the amount of tokens that will be minted to the investor - * @return success + * @notice Used to attach a new document to the contract, or update the URI or hash of an existing attached document + * @dev Can only be executed by the owner of the contract. + * @param _name Name of the document. It should be unique always + * @param _uri Off-chain uri of the document from where it is accessible to investors/advisors to read. + * @param _documentHash hash (of the contents) of the document. + */ + function setDocument(bytes32 _name, string calldata _uri, bytes32 _documentHash) external; + + /** + * @notice Used to remove an existing document from the contract by giving the name of the document. + * @dev Can only be executed by the owner of the contract. + * @param _name Name of the document. It should be unique always + */ + function removeDocument(bytes32 _name) external; + + /** + * @notice Used to return the details of a document with a known name (`bytes32`). + * @param _name Name of the document + * @return string The URI associated with the document. + * @return bytes32 The hash (of the contents) of the document. + * @return uint256 the timestamp at which the document was last modified. + */ + function getDocument(bytes32 _name) external view returns (string memory, bytes32, uint256); + + /** + * @notice Used to retrieve a full list of documents attached to the smart contract. + * @return bytes32 List of all documents names present in the contract. + */ + function getAllDocuments() external view returns (bytes32[] memory); + + /** + * @notice In order to provide transparency over whether `controllerTransfer` / `controllerRedeem` are useable + * or not `isControllable` function will be used. + * @dev If `isControllable` returns `false` then it always return `false` and + * `controllerTransfer` / `controllerRedeem` will always revert. + * @return bool `true` when controller address is non-zero otherwise return `false`. + */ + function isControllable() external view returns (bool); + + /** + * @notice This function must be called to increase the total supply (Corresponds to mint function of ERC20). + * @dev It only be called by the token issuer or the operator defined by the issuer. ERC1594 doesn't have + * have the any logic related to operator but its superset ERC1400 have the operator logic and this function + * is allowed to call by the operator. + * @param _tokenHolder The account that will receive the created tokens (account should be whitelisted or KYCed). + * @param _value The amount of tokens need to be issued + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. */ - function mint(address _investor, uint256 _value) external returns(bool success); + function issue(address _tokenHolder, uint256 _value, bytes memory _data) external; /** * @notice Mints new tokens and assigns them to the target _investor. @@ -46,19 +105,24 @@ interface ISecurityToken { function mintWithData(address _investor, uint256 _value, bytes calldata _data) external returns(bool success); /** - * @notice Used to burn the securityToken on behalf of someone else - * @param _from Address for whom to burn tokens - * @param _value No. of tokens to be burned - * @param _data Data to indicate validation + * @notice This function redeem an amount of the token of a msg.sender. For doing so msg.sender may incentivize + * using different ways that could be implemented with in the `redeem` function definition. But those implementations + * are out of the scope of the ERC1594. + * @param _value The amount of tokens need to be redeemed + * @param _data The `bytes _data` it can be used in the token contract to authenticate the redemption. */ - function burnFromWithData(address _from, uint256 _value, bytes calldata _data) external; + function redeem(uint256 _value, bytes calldata _data) external; /** - * @notice Used to burn the securityToken - * @param _value No. of tokens to be burned - * @param _data Data to indicate validation + * @notice This function redeem an amount of the token of a msg.sender. For doing so msg.sender may incentivize + * using different ways that could be implemented with in the `redeem` function definition. But those implementations + * are out of the scope of the ERC1594. + * @dev It is analogy to `transferFrom` + * @param _tokenHolder The account whose tokens gets redeemed. + * @param _value The amount of tokens need to be redeemed + * @param _data The `bytes _data` it can be used in the token contract to authenticate the redemption. */ - function burnWithData(uint256 _value, bytes calldata _data) external; + function redeemFrom(address _tokenHolder, uint256 _value, bytes calldata _data) external; event Minted(address indexed _to, uint256 _value); event Burnt(address indexed _burner, uint256 _value); @@ -195,16 +259,7 @@ interface ISecurityToken { /** * @notice Ends token minting period permanently */ - function freezeMinting() external; - - /** - * @notice Mints new tokens and assigns them to the target investors. - * Can only be called by the STO attached to the token or by the Issuer (Security Token contract owner) - * @param _investors A list of addresses to whom the minted tokens will be delivered - * @param _values A list of the amount of tokens to mint to corresponding addresses from _investor[] list - * @return Success - */ - function mintMulti(address[] calldata _investors, uint256[] calldata _values) external returns(bool success); + function freezeIssuance() external; /** * @notice Attachs a module to the SecurityToken @@ -263,23 +318,33 @@ interface ISecurityToken { function setController(address _controller) external; /** - * @notice Used by a controller to execute a forced transfer - * @param _from address from which to take tokens - * @param _to address where to send tokens - * @param _value amount of tokens to transfer - * @param _data data to indicate validation - * @param _log data attached to the transfer by controller to emit in event + * @notice This function allows an authorised address to transfer tokens between any two token holders. + * The transfer must still respect the balances of the token holders (so the transfer must be for at most + * `balanceOf(_from)` tokens) and potentially also need to respect other transfer restrictions. + * @dev This function can only be executed by the `controller` address. + * @param _from Address The address which you want to send tokens from + * @param _to Address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data data to validate the transfer. (It is not used in this reference implementation + * because use of `_data` parameter is implementation specific). + * @param _operatorData data attached to the transfer by controller to emit in event. (It is more like a reason string + * for calling this function (aka force transfer) which provides the transparency on-chain). */ - function forceTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _log) external; - - /** - * @notice Used by a controller to execute a foced burn - * @param _from address from which to take tokens - * @param _value amount of tokens to transfer - * @param _data data to indicate validation - * @param _log data attached to the transfer by controller to emit in event + function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external + + /** + * @notice This function allows an authorised address to redeem tokens for any token holder. + * The redemption must still respect the balances of the token holder (so the redemption must be for at most + * `balanceOf(_tokenHolder)` tokens) and potentially also need to respect other transfer restrictions. + * @dev This function can only be executed by the `controller` address. + * @param _tokenHolder The account whose tokens will be redeemed. + * @param _value uint256 the amount of tokens need to be redeemed. + * @param _data data to validate the transfer. (It is not used in this reference implementation + * because use of `_data` parameter is implementation specific). + * @param _operatorData data attached to the transfer by controller to emit in event. (It is more like a reason string + * for calling this function (aka force transfer) which provides the transparency on-chain). */ - function forceBurn(address _from, uint256 _value, bytes calldata _data, bytes calldata _log) external; + function controllerRedeem(address _tokenHolder, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external; /** * @notice Used by the issuer to permanently disable controller functionality @@ -304,7 +369,7 @@ interface ISecurityToken { * @param _data data to indicate validation * @return bool success */ - function transferWithData(address _to, uint256 _value, bytes calldata _data) external returns(bool success); + function transferWithData(address _to, uint256 _value, bytes calldata _data) external; /** * @notice Overloaded version of the transferFrom function @@ -314,11 +379,20 @@ interface ISecurityToken { * @param _data data to indicate validation * @return bool success */ - function transferFromWithData(address _from, address _to, uint256 _value, bytes calldata _data) external returns(bool); + function transferFromWithData(address _from, address _to, uint256 _value, bytes calldata _data) external; /** * @notice Provides the granularity of the token * @return uint256 */ function granularity() external view returns(uint256); + + /** + * @notice A security token issuer can specify that issuance has finished for the token + * (i.e. no new tokens can be minted or issued). + * @dev If a token returns FALSE for `isIssuable()` then it MUST always return FALSE in the future. + * If a token returns FALSE for `isIssuable()` then it MUST never allow additional tokens to be issued. + * @return bool `true` signifies the minting is allowed. While `false` denotes the end of minting + */ + function isIssuable() external view returns (bool) } diff --git a/contracts/interfaces/ITransferManager.sol b/contracts/interfaces/ITransferManager.sol index b248a98b3..b7c73e8ba 100644 --- a/contracts/interfaces/ITransferManager.sol +++ b/contracts/interfaces/ITransferManager.sol @@ -13,4 +13,8 @@ interface ITransferManager { TransferManagerEnums.Result ); + function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external view returns( + TransferManagerEnums.Result, byte + ); + } diff --git a/contracts/interfaces/token/IERC1594.sol b/contracts/interfaces/token/IERC1594.sol new file mode 100644 index 000000000..00e1e4d36 --- /dev/null +++ b/contracts/interfaces/token/IERC1594.sol @@ -0,0 +1,28 @@ +pragma solidity ^0.5.0; + +/** + * @title Standard Interface of ERC1594 + */ +interface IERC1594 { + + // Transfers + function transferWithData(address _to, uint256 _value, bytes calldata _data) external; + function transferFromWithData(address _from, address _to, uint256 _value, bytes calldata _data) external; + + // Token Issuance + function isIssuable() external view returns (bool); + function issue(address _tokenHolder, uint256 _value, bytes calldata _data) external; + + // Token Redemption + function redeem(uint256 _value, bytes calldata _data) external; + function redeemFrom(address _tokenHolder, uint256 _value, bytes calldata _data) external; + + // Transfer Validity + function canTransfer(address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32); + function canTransferFrom(address _from, address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32); + + // Issuance / Redemption Events + event Issued(address indexed _operator, address indexed _to, uint256 _value, bytes _data); + event Redeemed(address indexed _operator, address indexed _from, uint256 _value, bytes _data); + +} \ No newline at end of file diff --git a/contracts/interfaces/token/IERC1643.sol b/contracts/interfaces/token/IERC1643.sol new file mode 100644 index 000000000..00e6f6084 --- /dev/null +++ b/contracts/interfaces/token/IERC1643.sol @@ -0,0 +1,18 @@ +pragma solidity ^0.5.0; + +// @title IERC1643 Document Management (part of the ERC1400 Security Token Standards) +/// @dev See https://github.com/SecurityTokenStandard/EIP-Spec + +interface IERC1643 { + + // Document Management + function getDocument(bytes32 _name) external view returns (string memory, bytes32, uint256); + function setDocument(bytes32 _name, string calldata _uri, bytes32 _documentHash) external; + function removeDocument(bytes32 _name) external; + function getAllDocuments() external view returns (bytes32[] memory); + + // Document Events + event DocumentRemoved(bytes32 indexed _name, string _uri, bytes32 _documentHash); + event DocumentUpdated(bytes32 indexed _name, string _uri, bytes32 _documentHash); + +} \ No newline at end of file diff --git a/contracts/interfaces/token/IERC1644.sol b/contracts/interfaces/token/IERC1644.sol new file mode 100644 index 000000000..d03e1cf30 --- /dev/null +++ b/contracts/interfaces/token/IERC1644.sol @@ -0,0 +1,28 @@ +pragma solidity ^0.5.0; + +interface IERC1644 { + + // Controller Operation + function isControllable() external view returns (bool); + function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external; + function controllerRedeem(address _tokenHolder, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external; + + // Controller Events + event ControllerTransfer( + address _controller, + address indexed _from, + address indexed _to, + uint256 _value, + bytes _data, + bytes _operatorData + ); + + event ControllerRedemption( + address _controller, + address indexed _tokenHolder, + uint256 _value, + bytes _data, + bytes _operatorData + ); + +} \ No newline at end of file diff --git a/contracts/libraries/KindMath.sol b/contracts/libraries/KindMath.sol index 00810abb1..e9de30c65 100644 --- a/contracts/libraries/KindMath.sol +++ b/contracts/libraries/KindMath.sol @@ -1,52 +1,48 @@ pragma solidity ^0.5.0; -// Copied from OpenZeppelin and modified to be friendlier - /** * @title KindMath - * @dev Math operations with safety checks that throw on error + * @notice ref. https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/math/SafeMath.sol + * @dev Math operations with safety checks that returns boolean */ library KindMath { + /** - * @dev Multiplies two numbers, throws on overflow. - */ - function mul(uint256 a, uint256 b) internal pure returns(uint256 c) { + * @dev Multiplies two numbers, return false on overflow. + */ + function checkMul(uint256 a, uint256 b) internal pure returns (bool) { // Gas optimization: this is cheaper than requireing 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { - return 0; + return true; } - c = a * b; - require(c / a == b, "mul overflow"); - return c; - } - - /** - * @dev Integer division of two numbers, truncating the quotient. - */ - function div(uint256 a, uint256 b) internal pure returns(uint256) { - // require(b > 0); // Solidity automatically throws when dividing by 0 - // uint256 c = a / b; - // require(a == b * c + a % b); // There is no case in which this doesn't hold - return a / b; + uint256 c = a * b; + if (c / a == b) + return true; + else + return false; } /** - * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). + * @dev Subtracts two numbers, return false on overflow (i.e. if subtrahend is greater than minuend). */ - function sub(uint256 a, uint256 b) internal pure returns(uint256) { - require(b <= a, "sub overflow"); - return a - b; + function checkSub(uint256 a, uint256 b) internal pure returns (bool) { + if (b <= a) + return true; + else + return false; } /** - * @dev Adds two numbers, throws on overflow. + * @dev Adds two numbers, return false on overflow. */ - function add(uint256 a, uint256 b) internal pure returns(uint256 c) { - c = a + b; - require(c >= a, "add overflow"); - return c; + function checkAdd(uint256 a, uint256 b) internal pure returns (bool) { + uint256 c = a + b; + if (c < a) + return false; + else + return true; } } diff --git a/contracts/libraries/TokenLib.sol b/contracts/libraries/TokenLib.sol index 8585a3dba..93a6261b1 100644 --- a/contracts/libraries/TokenLib.sol +++ b/contracts/libraries/TokenLib.sol @@ -3,6 +3,8 @@ pragma solidity ^0.5.0; import "../modules/PermissionManager/IPermissionManager.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "../interfaces/IPoly.sol"; +import "../interfaces/TransferManagerEnums.sol"; +import "../interfaces/ITransferManager.sol"; library TokenLib { using SafeMath for uint256; @@ -278,4 +280,58 @@ library TokenLib { } + /** + * @notice Validate transfer with TransferManager module if it exists + * @dev TransferManager module has a key of 2 + * @param from sender of transfer + * @param to receiver of transfer + * @param value value of transfer + * @param data data to indicate validation + * @param modules Array of addresses for transfer managers + * @param modulesToData Mapping of the modules details + * @param transfersFrozen whether the transfer are frozen or not. + * @return bool + */ + function verifyTransfer( + address[] storage modules, + mapping(address => ModuleData) storage modulesToData, + address from, + address to, + uint256 value, + bytes memory data, + bool transfersFrozen + ) + public + view + returns(bool, byte) + { + if (!transfersFrozen) { + bool isInvalid = false; + bool isValid = false; + bool isForceValid = false; + // Use the local variables to avoid the stack too deep error + transfersFrozen = false; // bool unarchived = false; + byte reasonCode; + for (uint256 i = 0; i < modules.length; i++) { + if (!modulesToData[modules[i]].isArchived) { + transfersFrozen = true; + (TransferManagerEnums.Result valid, byte reason) = ITransferManager(modules[i]).verifyTransfer(from, to, value, data); + if (valid == TransferManagerEnums.Result.INVALID) { + isInvalid = true; + reasonCode = reason; + } else if (valid == TransferManagerEnums.Result.VALID) { + isValid = true; + } else if (valid == TransferManagerEnums.Result.FORCE_VALID) { + isForceValid = true; + } + } + } + // If no unarchived modules, return true by default + // Use the local variables to avoid the stack too deep error + isValid = transfersFrozen ? (isForceValid ? true : (isInvalid ? false : isValid)) : true; + return (isValid, isValid ? byte(0x51): reasonCode); + } + return (false, 0x54); + } + } diff --git a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol index e2aed863f..cd0f70f0d 100644 --- a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol +++ b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol @@ -95,10 +95,27 @@ contract ScheduledCheckpoint is ICheckpoint, TransferManager { { require(_isTransfer == false || msg.sender == securityToken, "Sender is not owner"); if (paused || !_isTransfer) { - return Result.NA; + return (Result.NA); } _updateAll(); - return Result.NA; + return (Result.NA); + } + + /** + * @notice Used to create checkpoints that correctly reflect balances + * @return always returns Result.NA + */ + function verifyTransfer( + address, /* _from */ + address, /* _to */ + uint256, /* _amount */ + bytes memory /* _data */ + ) + public + view + returns(Result, byte) + { + return (Result.NA, 0xA0); } /** diff --git a/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol b/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol index 5d0ac2307..27b879073 100644 --- a/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol +++ b/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol @@ -76,7 +76,23 @@ contract LockupVolumeRestrictionTM is TransferManager { // check if this transfer is valid return _checkIfValidTransfer(_from, _amount, _isTransfer); } - return Result.NA; + return (Result.NA); + } + ///////////////////////// Not a valid function. It will change once dev-2.1.0 will be merged to dev-3.0.0//////////////////////// + /** + * @notice Used to verify the transfer transaction and prevent locked up tokens from being transferred + */ + function verifyTransfer( + address /*_from*/, + address /* _to*/, + uint256 /*_amount*/, + bytes memory /* _data */ + ) + public + view + returns(Result, byte) + { + return (Result.NA, 0xA0); } /** @@ -298,7 +314,7 @@ contract LockupVolumeRestrictionTM is TransferManager { // transfer is valid and will succeed. if (!isTransfer) { // if this isn't a real transfer, don't subtract the withdrawn amounts from the lockups. it's a "read only" txn - return Result.VALID; + return (Result.VALID); } // we are going to write the withdrawn balances back to the lockups, so make sure that the person calling this function is the securityToken itself, since its public @@ -321,7 +337,7 @@ contract LockupVolumeRestrictionTM is TransferManager { } } - return Result.VALID; + return (Result.VALID); } return _checkIfUnlockedTokenTransferIsPossible(userAddress, amount, tokenSums[1], tokenSums[2]); @@ -342,9 +358,9 @@ contract LockupVolumeRestrictionTM is TransferManager { uint stillLockedAmount = totalSum.sub(alreadyWithdrawnSum); if (currentUserBalance >= stillLockedAmount && amount <= currentUserBalance.sub(stillLockedAmount)) { // the user has more tokens in their balance than are actually locked up. they should be allowed to withdraw the difference - return Result.VALID; + return (Result.VALID); } - return Result.INVALID; + return (Result.INVALID); } /** diff --git a/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol b/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol index 431408336..0d7ce27c7 100644 --- a/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol +++ b/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol @@ -56,20 +56,40 @@ contract SingleTradeVolumeRestrictionTM is TransferManager { */ function verifyTransfer( address _from, - address /* _to */, + address _to, uint256 _amount, - bytes calldata /* _data */, + bytes calldata _data, bool /* _isTransfer */ ) external returns(Result) + { + (Result success,) = verifyTransfer(_from, _to, _amount, _data); + return success; + } + + ///////////////////////// Not a valid function. It will change once dev-2.1.0 will be merged to dev-3.0.0//////////////////////// + + /** @notice Used to verify the transfer transaction and prevent an account from sending more tokens than allowed in a single transfer + * @param _from Address of the sender + * @param _amount The amount of tokens to transfer + */ + function verifyTransfer( + address _from, + address /* _to */, + uint256 _amount, + bytes memory /* _data */ + ) + public + view + returns(Result, byte) { bool validTransfer; - if (exemptWallets[_from] || paused) return Result.NA; + if (exemptWallets[_from] || paused) return (Result.NA, 0xA0); if (_from == address(0) && allowPrimaryIssuance) { - return Result.NA; + return (Result.NA, 0xA0); } if (isTransferLimitInPercentage) { @@ -87,8 +107,8 @@ contract SingleTradeVolumeRestrictionTM is TransferManager { validTransfer = _amount <= globalTransferLimitInTokens; } } - if (validTransfer) return Result.NA; - return Result.INVALID; + if (validTransfer) return (Result.NA, 0xA0); + return (Result.INVALID, 0xA5); } /** diff --git a/contracts/modules/TransferManager/CountTransferManager.sol b/contracts/modules/TransferManager/CountTransferManager.sol index 756a9ce7c..7603763ba 100644 --- a/contracts/modules/TransferManager/CountTransferManager.sol +++ b/contracts/modules/TransferManager/CountTransferManager.sol @@ -27,25 +27,46 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { address _from, address _to, uint256 _amount, - bytes calldata /* _data */, + bytes calldata _data, bool /* _isTransfer */ ) external returns(Result) + { + (Result success,) = verifyTransfer(_from, _to, _amount, _data); + return success; + } + + /** + * @notice Used to verify the transfer transaction and prevent a transfer if it passes the allowed amount of token holders + * @param _from Address of the sender + * @param _to Address of the receiver + * @param _amount Amount to send + */ + function verifyTransfer( + address _from, + address _to, + uint256 _amount, + bytes memory /* _data */ + ) + public + view + returns(Result, byte) { if (!paused) { if (maxHolderCount < ISecurityToken(securityToken).getInvestorCount()) { // Allow transfers to existing maxHolders if (ISecurityToken(securityToken).balanceOf(_to) != 0 || ISecurityToken(securityToken).balanceOf(_from) == _amount) { - return Result.NA; + return (Result.NA, 0xA0); } - return Result.INVALID; + return (Result.INVALID, 0xA2); } - return Result.NA; + return (Result.NA, 0xA0); } - return Result.NA; + return (Result.NA, 0xA0); } + /** * @notice Used to initialize the variables of the contract * @param _maxHolderCount Maximum no. of holders this module allows the SecurityToken to have diff --git a/contracts/modules/TransferManager/GeneralTransferManager.sol b/contracts/modules/TransferManager/GeneralTransferManager.sol index ec88dadc9..18d05d99f 100644 --- a/contracts/modules/TransferManager/GeneralTransferManager.sol +++ b/contracts/modules/TransferManager/GeneralTransferManager.sol @@ -141,45 +141,75 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage function verifyTransfer( address _from, address _to, - uint256, /*_amount*/ - bytes calldata, /* _data */ + uint256 _amount, + bytes calldata _data, bool /* _isTransfer */ ) external returns(Result) { + (Result success,) = verifyTransfer(_from, _to, _amount, _data); + return success; + } + + /** + * @notice Default implementation of verifyTransfer used by SecurityToken + * If the transfer request comes from the STO, it only checks that the investor is in the whitelist + * If the transfer request comes from a token holder, it checks that: + * a) Both are on the whitelist + * b) Seller's sale lockup period is over + * c) Buyer's purchase lockup is over + * @param _from Address of the sender + * @param _to Address of the receiver + */ + function verifyTransfer( + address _from, + address _to, + uint256, /*_amount*/ + bytes memory /* _data */ + ) + public + view + returns(Result, byte) + { + Result success; if (!paused) { if (allowAllTransfers) { //All transfers allowed, regardless of whitelist - return Result.VALID; + return (Result.VALID, 0xA1); } if (allowAllBurnTransfers && (_to == address(0))) { - return Result.VALID; + return (Result.VALID, 0xA1); } if (allowAllWhitelistTransfers) { //Anyone on the whitelist can transfer, regardless of time - return (_onWhitelist(_to) && _onWhitelist(_from)) ? Result.VALID : Result.NA; + success = (_onWhitelist(_to) && _onWhitelist(_from)) ? Result.VALID : Result.NA; + return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); } (uint64 adjustedFromTime, uint64 adjustedToTime) = _adjustTimes(whitelist[_from].fromTime, whitelist[_to].toTime); if (_from == issuanceAddress) { // Possible STO transaction, but investor not allowed to purchased from STO if ((whitelist[_to].canBuyFromSTO == 0) && _isSTOAttached()) { - return Result.NA; + return (Result.NA, 0xA0); } // if allowAllWhitelistIssuances is true, so time stamp ignored if (allowAllWhitelistIssuances) { - return _onWhitelist(_to) ? Result.VALID : Result.NA; + success = _onWhitelist(_to) ? Result.VALID : Result.NA; + return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); } else { - return (_onWhitelist(_to) && (adjustedToTime <= uint64(now))) ? Result.VALID : Result.NA; + success = (_onWhitelist(_to) && (adjustedToTime <= uint64(now))) ? Result.VALID : Result.NA; + return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); } } //Anyone on the whitelist can transfer provided the blocknumber is large enough /*solium-disable-next-line security/no-block-members*/ - return ((_onWhitelist(_from) && (adjustedFromTime <= uint64(now))) && (_onWhitelist(_to) && + success = ((_onWhitelist(_from) && (adjustedFromTime <= uint64(now))) && (_onWhitelist(_to) && (adjustedToTime <= uint64(now)))) ? Result.VALID : Result.NA; /*solium-disable-line security/no-block-members*/ + return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); } - return Result.NA; + return (Result.NA, 0xA0); } + /** * @notice Adds or removes addresses from the whitelist. * @param _investor is the address to whitelist diff --git a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol index 3bc258c60..59403683c 100644 --- a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol +++ b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol @@ -62,7 +62,7 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, address _from, address _to, uint256 _amount, - bytes calldata, /* _data */ + bytes calldata _data, bool _isTransfer ) external @@ -70,23 +70,44 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, { // function must only be called by the associated security token if _isTransfer == true require(_isTransfer == false || msg.sender == securityToken, "Sender is not the owner"); + (Result success, byte esc) = verifyTransfer(_from, _to, _amount, _data); + if (_isTransfer && esc == 0xA1) { + manualApprovals[_from][_to].allowance = manualApprovals[_from][_to].allowance.sub(_amount); + } + return (success); + } + + /** + * @notice Used to verify the transfer transaction and allow a manually approved transqaction to bypass other restrictions + * @param _from Address of the sender + * @param _to Address of the receiver + * @param _amount The amount of tokens to transfer + */ + function verifyTransfer( + address _from, + address _to, + uint256 _amount, + bytes memory /* _data */ + ) + public + view + returns(Result, byte) + { // manual blocking takes precidence over manual approval if (!paused) { /*solium-disable-next-line security/no-block-members*/ if (manualBlockings[_from][_to].expiryTime >= now) { - return Result.INVALID; + return (Result.INVALID, 0xA3); } /*solium-disable-next-line security/no-block-members*/ if ((manualApprovals[_from][_to].expiryTime >= now) && (manualApprovals[_from][_to].allowance >= _amount)) { - if (_isTransfer) { - manualApprovals[_from][_to].allowance = manualApprovals[_from][_to].allowance.sub(_amount); - } - return Result.VALID; + return (Result.VALID, 0xA1); } } - return Result.NA; + return (Result.NA, 0xA0); } + /** * @notice Adds a pair of addresses to manual approvals * @param _from is the address from which transfers are approved diff --git a/contracts/modules/TransferManager/PercentageTransferManager.sol b/contracts/modules/TransferManager/PercentageTransferManager.sol index 43c4a6f61..0e67af544 100644 --- a/contracts/modules/TransferManager/PercentageTransferManager.sol +++ b/contracts/modules/TransferManager/PercentageTransferManager.sol @@ -25,7 +25,10 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer * @notice Constructor * @param _securityToken Address of the security token */ - constructor(address _securityToken, address _polyToken) public Module(_securityToken, _polyToken) { + constructor(address _securityToken, address _polyToken) + public + Module(_securityToken, _polyToken) + { } @@ -38,27 +41,47 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer address _from, address _to, uint256 _amount, - bytes calldata, /* _data */ + bytes calldata _data, bool /* _isTransfer */ ) external returns(Result) + { + (Result success,) = verifyTransfer(_from, _to, _amount, _data); + return success; + } + + /** + * @notice Used to verify the transfer transaction and prevent a given account to end up with more tokens than allowed + * @param _from Address of the sender + * @param _to Address of the receiver + * @param _amount The amount of tokens to transfer + */ + function verifyTransfer( + address _from, + address _to, + uint256 _amount, + bytes memory /*_data*/ + ) + public + view + returns(Result, byte) { if (!paused) { if (_from == address(0) && allowPrimaryIssuance) { - return Result.NA; + return (Result.NA, 0xA0); } // If an address is on the whitelist, it is allowed to hold more than maxHolderPercentage of the tokens. if (whitelist[_to]) { - return Result.NA; + return (Result.NA, 0xA0); } uint256 newBalance = ISecurityToken(securityToken).balanceOf(_to).add(_amount); if (newBalance.mul(uint256(10) ** 18).div(ISecurityToken(securityToken).totalSupply()) > maxHolderPercentage) { - return Result.INVALID; + return (Result.INVALID, 0xA4); } - return Result.NA; + return (Result.NA, 0xA0); } - return Result.NA; + return (Result.NA, 0xA0); } /** diff --git a/contracts/tokens/ERC20.sol b/contracts/tokens/ERC20.sol new file mode 100644 index 000000000..c60379fc6 --- /dev/null +++ b/contracts/tokens/ERC20.sol @@ -0,0 +1,219 @@ +pragma solidity ^0.5.0; + +import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; +import "openzeppelin-solidity/contracts/math/SafeMath.sol"; + +contract ERC20 is IERC20 { + + using SafeMath for uint256; + + mapping (address => uint256) internal _balances; + + mapping (address => mapping (address => uint256)) internal _allowed; + + uint256 private _totalSupply; + + /** + * @dev Total number of tokens in existence + */ + function totalSupply() public view returns (uint256) { + return _totalSupply; + } + + /** + * @dev Gets the balance of the specified address. + * @param owner The address to query the balance of. + * @return An uint256 representing the amount owned by the passed address. + */ + function balanceOf(address owner) public view returns (uint256) { + return _balances[owner]; + } + + /** + * @dev Function to check the amount of tokens that an owner allowed to a spender. + * @param owner address The address which owns the funds. + * @param spender address The address which will spend the funds. + * @return A uint256 specifying the amount of tokens still available for the spender. + */ + function allowance( + address owner, + address spender + ) + public + view + returns (uint256) + { + return _allowed[owner][spender]; + } + + /** + * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. + * Beware that changing an allowance with this method brings the risk that someone may use both the old + * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this + * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * @param spender The address which will spend the funds. + * @param value The amount of tokens to be spent. + */ + function approve(address spender, uint256 value) public returns (bool) { + require(spender != address(0)); + + _allowed[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + return true; + } + + /** + * @dev Transfer token for a specified address + * @param to The address to transfer to. + * @param value The amount to be transferred. + */ + function transfer(address to, uint256 value) public returns (bool) { + _transfer(msg.sender, to, value); + return true; + } + + /** + * @dev Transfer tokens from one address to another + * @param from address The address which you want to send tokens from + * @param to address The address which you want to transfer to + * @param value uint256 the amount of tokens to be transferred + */ + function transferFrom( + address from, + address to, + uint256 value + ) + public + returns (bool) + { + _transferFrom(msg.sender, from, to, value); + return true; + } + + function _transferFrom( + address spender, + address from, + address to, + uint256 value + ) + internal + { + require(value <= _allowed[from][spender]); + + _allowed[from][spender] = _allowed[from][spender].sub(value); + _transfer(from, to, value); + } + + /** + * @dev Increase the amount of tokens that an owner allowed to a spender. + * approve should be called when allowed_[_spender] == 0. To increment + * allowed value is better to use this function to avoid 2 calls (and wait until + * the first transaction is mined) + * From MonolithDAO Token.sol + * @param spender The address which will spend the funds. + * @param addedValue The amount of tokens to increase the allowance by. + */ + function increaseAllowance( + address spender, + uint256 addedValue + ) + public + returns (bool) + { + require(spender != address(0)); + + _allowed[msg.sender][spender] = ( + _allowed[msg.sender][spender].add(addedValue)); + emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); + return true; + } + + /** + * @dev Decrease the amount of tokens that an owner allowed to a spender. + * approve should be called when allowed_[_spender] == 0. To decrement + * allowed value is better to use this function to avoid 2 calls (and wait until + * the first transaction is mined) + * From MonolithDAO Token.sol + * @param spender The address which will spend the funds. + * @param subtractedValue The amount of tokens to decrease the allowance by. + */ + function decreaseAllowance( + address spender, + uint256 subtractedValue + ) + public + returns (bool) + { + require(spender != address(0)); + + _allowed[msg.sender][spender] = ( + _allowed[msg.sender][spender].sub(subtractedValue)); + emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); + return true; + } + + /** + * @dev Transfer token for a specified addresses + * @param from The address to transfer from. + * @param to The address to transfer to. + * @param value The amount to be transferred. + */ + function _transfer(address from, address to, uint256 value) internal { + require(value <= _balances[from]); + require(to != address(0)); + _balances[from] = _balances[from].sub(value); + _balances[to] = _balances[to].add(value); + emit Transfer(from, to, value); + } + + /** + * @dev Internal function that mints an amount of the token and assigns it to + * an account. This encapsulates the modification of balances such that the + * proper events are emitted. + * @param account The account that will receive the created tokens. + * @param value The amount that will be created. + */ + function _mint(address account, uint256 value) internal { + require(account != address(0)); + _totalSupply = _totalSupply.add(value); + _balances[account] = _balances[account].add(value); + emit Transfer(address(0), account, value); + } + + /** + * @dev Internal function that burns an amount of the token of a given + * account. + * @param account The account whose tokens will be burnt. + * @param value The amount that will be burnt. + */ + function _burn(address account, uint256 value) internal { + require(account != address(0)); + require(value <= _balances[account]); + + _totalSupply = _totalSupply.sub(value); + _balances[account] = _balances[account].sub(value); + emit Transfer(account, address(0), value); + } + + /** + * @dev Internal function that burns an amount of the token of a given + * account, deducting from the sender's allowance for said account. Uses the + * internal burn function. + * @param account The account whose tokens will be burnt. + * @param value The amount that will be burnt. + */ + function _burnFrom(address account, uint256 value) internal { + require(value <= _allowed[account][msg.sender]); + + // Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted, + // this function needs to emit an event with the updated approval. + _allowed[account][msg.sender] = _allowed[account][msg.sender].sub( + value); + _burn(account, value); + } +} + + + + diff --git a/contracts/tokens/SecurityToken.sol b/contracts/tokens/SecurityToken.sol index 2979a6a5d..168b67b29 100644 --- a/contracts/tokens/SecurityToken.sol +++ b/contracts/tokens/SecurityToken.sol @@ -1,46 +1,36 @@ pragma solidity ^0.5.0; -import "openzeppelin-solidity/contracts/math/Math.sol"; -import "../interfaces/IPoly.sol"; +import "./ERC20.sol"; +import "../RegistryUpdater.sol"; +import "../libraries/KindMath.sol"; +import "../libraries/TokenLib.sol"; import "../interfaces/IModule.sol"; import "../interfaces/IModuleFactory.sol"; +import "../interfaces/token/IERC1594.sol"; +import "../interfaces/token/IERC1643.sol"; +import "../interfaces/token/IERC1644.sol"; import "../interfaces/IModuleRegistry.sol"; import "../interfaces/IFeatureRegistry.sol"; import "../interfaces/ITransferManager.sol"; -import "../RegistryUpdater.sol"; -import "../libraries/Util.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; -import "../libraries/TokenLib.sol"; /** -* @title Security Token contract -* @notice SecurityToken is an ERC20 token with added capabilities: -* @notice - Implements the ST-20 Interface -* @notice - Transfers are restricted -* @notice - Modules can be attached to it to control its behaviour -* @notice - ST should not be deployed directly, but rather the SecurityTokenRegistry should be used -* @notice - ST does not inherit from ISecurityToken due to: -* @notice - https://github.com/ethereum/solidity/issues/4847 -*/ -contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater { + * @title Security Token contract + * @notice SecurityToken is an ERC1400 token with added capabilities: + * @notice - Implements the ERC1400 Interface + * @notice - Transfers are restricted + * @notice - Modules can be attached to it to control its behaviour + * @notice - ST should not be deployed directly, but rather the SecurityTokenRegistry should be used + * @notice - ST does not inherit from ISecurityToken due to: + * @notice - https://github.com/ethereum/solidity/issues/4847 + */ +contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater, IERC1594, IERC1643, IERC1644 { + using SafeMath for uint256; TokenLib.InvestorDataStorage investorData; - // Used to hold the semantic version data - struct SemanticVersion { - uint8 major; - uint8 minor; - uint8 patch; - } - - SemanticVersion securityTokenVersion; - - // off-chain data - string public tokenDetails; - uint8 constant PERMISSION_KEY = 1; uint8 constant TRANSFER_KEY = 2; uint8 constant MINT_KEY = 3; @@ -49,20 +39,14 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater uint256 public granularity; - // Value of current checkpoint - uint256 public currentCheckpointId; + // Used to permanently halt controller actions + bool public controllerDisabled; // Used to temporarily halt all transactions bool public transfersFrozen; - // Used to permanently halt all minting - bool public mintingFrozen; - - // Used to permanently halt controller actions - bool public controllerDisabled; - - // Address whitelisted by issuer as controller - address public controller; + // Value of current checkpoint + uint256 public currentCheckpointId; // Records added modules - module list should be order agnostic! mapping(uint8 => address[]) modules; @@ -82,6 +66,54 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater // Times at which each checkpoint was created uint256[] checkpointTimes; + ////////////////////////// + /// Document datastructure + ////////////////////////// + + struct Document { + bytes32 docHash; // Hash of the document + uint256 lastModified; // Timestamp at which document details was last modified + string uri; // URI of the document that exist off-chain + } + + // Used to hold the semantic version data + struct SemanticVersion { + uint8 major; + uint8 minor; + uint8 patch; + } + + SemanticVersion securityTokenVersion; + + // off-chain data + string public tokenDetails; + + // mapping to store the documents details in the document + mapping(bytes32 => Document) internal _documents; + // mapping to store the document name indexes + mapping(bytes32 => uint256) internal _docIndexes; + // Array use to store all the document name present in the contracts + bytes32[] _docNames; + + + // Variable which tells whether issuance is ON or OFF forever + // Implementers need to implement one more function to reset the value of `issuance` variable + // to false. That function is not a part of the standard (EIP-1594) as it is depend on the various factors + // issuer, followed compliance rules etc. So issuers have the choice how they want to close the issuance. + bool internal issuance = true; + + // Address of the controller which is a delegated entity + // set by the issuer/owner of the token + address public controller; + + // Emit when transfers are frozen or unfrozen + event FreezeTransfers(bool _status, uint256 _timestamp); + // Emit when is permanently frozen by the issuer + event FreezeIssuance(uint256 _timestamp); + // Emit when the token details get updated + event UpdateTokenDetails(string _oldDetails, string _newDetails); + // Emit when the granularity get changed + event GranularityChanged(uint256 _oldGranularity, uint256 _newGranularity); // Emit at the time when module get added event ModuleAdded( uint8[] _types, @@ -93,11 +125,6 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater bytes32 _label, uint256 _timestamp ); - - // Emit when the token details get updated - event UpdateTokenDetails(string _oldDetails, string _newDetails); - // Emit when the granularity get changed - event GranularityChanged(uint256 _oldGranularity, uint256 _newGranularity); // Emit when Module get archived from the securityToken event ModuleArchived(uint8[] _types, address _module, uint256 _timestamp); // Emit when Module get unarchived from the securityToken @@ -106,29 +133,12 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater event ModuleRemoved(uint8[] _types, address _module, uint256 _timestamp); // Emit when the budget allocated to a module is changed event ModuleBudgetChanged(uint8[] _moduleTypes, address _module, uint256 _oldBudget, uint256 _budget); - // Emit when transfers are frozen or unfrozen - event FreezeTransfers(bool _status, uint256 _timestamp); // Emit when new checkpoint created event CheckpointCreated(uint256 indexed _checkpointId, uint256 _timestamp); - // Emit when is permanently frozen by the issuer - event FreezeMinting(uint256 _timestamp); - // Events to log minting and burning - event Minted(address indexed _to, uint256 _value); - event Burnt(address indexed _from, uint256 _value); - // Events to log controller actions event SetController(address indexed _oldController, address indexed _newController); - event ForceTransfer( - address indexed _controller, - address indexed _from, - address indexed _to, - uint256 _value, - bool _verifyTransfer, - bytes _data - ); - event ForceBurn(address indexed _controller, address indexed _from, uint256 _value, bool _verifyTransfer, bytes _data); event DisableController(uint256 _timestamp); - + function _isModule(address _module, uint8 _type) internal view returns(bool) { require(modulesToData[_module].module == _module, "Wrong address"); require(!modulesToData[_module].isArchived, "Module archived"); @@ -156,13 +166,19 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater } } + modifier isIssuanceAllowed() { + require(!issuance, "Issuance frozen"); + _; + } + modifier checkGranularity(uint256 _value) { require(_value % granularity == 0, "Invalid granularity"); _; } - - modifier isMintingAllowed() { - require(!mintingFrozen, "Minting frozen"); + + // Modifier to check whether the msg.sender is authorised or not + modifier onlyController() { + require(msg.sender == controller, "Not Authorised"); _; } @@ -170,18 +186,9 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater require(IFeatureRegistry(featureRegistry).getFeatureStatus(_nameKey)); _; } - - /** - * @notice Revert if called by an account which is not a controller - */ - modifier onlyController() { - require(msg.sender == controller, "Not controller"); - require(!controllerDisabled, "Controller disabled"); - _; - } - + /** - * @notice Constructor + * @notice constructor * @param _name Name of the SecurityToken * @param _symbol Symbol of the Token * @param _decimals Decimals for the securityToken @@ -197,8 +204,9 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater string memory _tokenDetails, address _polymathRegistry ) - public - ERC20Detailed(_name, _symbol, _decimals) RegistryUpdater(_polymathRegistry) + public + ERC20Detailed(_name, _symbol, _decimals) + RegistryUpdater(_polymathRegistry) { //When it is created, the owner is the STR updateFromRegistry(); @@ -207,7 +215,7 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater securityTokenVersion = SemanticVersion(2, 0, 0); } - /** + /** * @notice Attachs a module to the SecurityToken * @dev E.G.: On deployment (through the STR) ST gets a TransferManager module attached to it * @dev to control restrictions on transfers. @@ -225,7 +233,8 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater bytes32 _label ) public - onlyOwner nonReentrant + onlyOwner + nonReentrant { //Check that the module factory exists in the ModuleRegistry - will throw otherwise IModuleRegistry(moduleRegistry).useModule(_moduleFactory); @@ -480,20 +489,24 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater * @return bool success */ function transfer(address _to, uint256 _value) public returns(bool success) { - return transferWithData(_to, _value, ""); + transferWithData(_to, _value, ""); + return true; } - + /** - * @notice Overloaded version of the transfer function - * @param _to receiver of transfer - * @param _value value of transfer - * @param _data data to indicate validation - * @return bool success + * @notice Transfer restrictions can take many forms and typically involve on-chain rules or whitelists. + * However for many types of approved transfers, maintaining an on-chain list of approved transfers can be + * cumbersome and expensive. An alternative is the co-signing approach, where in addition to the token holder + * approving a token transfer, and authorised entity provides signed data which further validates the transfer. + * @param _to address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. + * for the token contract to interpret or record. This could be signed data authorising the transfer + * (e.g. a dynamic whitelist) but is flexible enough to accomadate other use-cases. */ - function transferWithData(address _to, uint256 _value, bytes memory _data) public returns(bool success) { + function transferWithData(address _to, uint256 _value, bytes memory _data) public { require(_updateTransfer(msg.sender, _to, _value, _data), "Transfer invalid"); require(super.transfer(_to, _value)); - return true; } /** @@ -504,21 +517,26 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater * @return bool success */ function transferFrom(address _from, address _to, uint256 _value) public returns(bool) { - return transferFromWithData(_from, _to, _value, ""); + transferFromWithData(_from, _to, _value, ""); + return true; } /** - * @notice Overloaded version of the transferFrom function - * @param _from sender of transfer - * @param _to receiver of transfer - * @param _value value of transfer - * @param _data data to indicate validation - * @return bool success + * @notice Transfer restrictions can take many forms and typically involve on-chain rules or whitelists. + * However for many types of approved transfers, maintaining an on-chain list of approved transfers can be + * cumbersome and expensive. An alternative is the co-signing approach, where in addition to the token holder + * approving a token transfer, and authorised entity provides signed data which further validates the transfer. + * @dev `msg.sender` MUST have a sufficient `allowance` set and this `allowance` must be debited by the `_value`. + * @param _from address The address which you want to send tokens from + * @param _to address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. + * for the token contract to interpret or record. This could be signed data authorising the transfer + * (e.g. a dynamic whitelist) but is flexible enough to accomadate other use-cases. */ - function transferFromWithData(address _from, address _to, uint256 _value, bytes memory _data) public returns(bool) { + function transferFromWithData(address _from, address _to, uint256 _value, bytes memory _data) public { require(_updateTransfer(_from, _to, _value, _data), "Transfer invalid"); require(super.transferFrom(_from, _to, _value)); - return true; } /** @@ -568,7 +586,7 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater internal checkGranularity(_value) returns(bool) - { + { if (!transfersFrozen) { bool isInvalid = false; bool isValid = false; @@ -596,77 +614,100 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater } /** - * @notice Validates a transfer with a TransferManager module if it exists - * @dev TransferManager module has a key of 2 - * @param _from sender of transfer - * @param _to receiver of transfer - * @param _value value of transfer - * @param _data data to indicate validation - * @return bool + * @notice A security token issuer can specify that issuance has finished for the token + * (i.e. no new tokens can be minted or issued). + * @dev If a token returns FALSE for `isIssuable()` then it MUST always return FALSE in the future. + * If a token returns FALSE for `isIssuable()` then it MUST never allow additional tokens to be issued. + * @return bool `true` signifies the minting is allowed. While `false` denotes the end of minting */ - function verifyTransfer(address _from, address _to, uint256 _value, bytes memory _data) public returns(bool) { - return _verifyTransfer(_from, _to, _value, _data, false); + function isIssuable() external view returns (bool) { + return issuance; } /** - * @notice Permanently freeze minting of this security token. + * @notice Permanently freeze issuance of this security token. * @dev It MUST NOT be possible to increase `totalSuppy` after this function is called. */ - function freezeMinting() external isMintingAllowed isEnabled("freezeMintingAllowed") onlyOwner { - mintingFrozen = true; + function freezeIssuance() external isIssuanceAllowed isEnabled("freezeMintingAllowed") onlyOwner { + issuance = true; /*solium-disable-next-line security/no-block-members*/ - emit FreezeMinting(now); - } - - /** - * @notice Mints new tokens and assigns them to the target _investor. - * @dev Can only be called by the issuer or STO attached to the token - * @param _investor Address where the minted tokens will be delivered - * @param _value Number of tokens be minted - * @return success - */ - function mint(address _investor, uint256 _value) public returns(bool success) { - return mintWithData(_investor, _value, ""); + emit FreezeIssuance(now); } /** - * @notice mints new tokens and assigns them to the target _investor. - * @dev Can only be called by the issuer or STO attached to the token - * @param _investor Address where the minted tokens will be delivered - * @param _value Number of tokens be minted - * @param _data data to indicate validation - * @return success + * @notice This function must be called to increase the total supply (Corresponds to mint function of ERC20). + * @dev It only be called by the token issuer or the operator defined by the issuer. ERC1594 doesn't have + * have the any logic related to operator but its superset ERC1400 have the operator logic and this function + * is allowed to call by the operator. + * @param _tokenHolder The account that will receive the created tokens (account should be whitelisted or KYCed). + * @param _value The amount of tokens need to be issued + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. */ - function mintWithData( - address _investor, + function issue( + address _tokenHolder, uint256 _value, bytes memory _data ) public + isIssuanceAllowed onlyModuleOrOwner(MINT_KEY) - isMintingAllowed - returns(bool success) { - require(_updateTransfer(address(0), _investor, _value, _data), "Transfer invalid"); + // Add a function to validate the `_data` parameter + _mint(_tokenHolder, _value); + require(_updateTransfer(address(0), _tokenHolder, _value, _data), "Transfer invalid"); _adjustTotalSupplyCheckpoints(); - _mint(_investor, _value); - emit Minted(_investor, _value); - return true; + emit Issued(msg.sender, _tokenHolder, _value, _data); } /** - * @notice Mints new tokens and assigns them to the target _investor. + * @notice issue new tokens and assigns them to the target _tokenHolder. * @dev Can only be called by the issuer or STO attached to the token. - * @param _investors A list of addresses to whom the minted tokens will be dilivered - * @param _values A list of number of tokens get minted and transfer to corresponding address of the investor from _investor[] list + * @param _tokenHolders A list of addresses to whom the minted tokens will be dilivered + * @param _values A list of number of tokens get minted and transfer to corresponding address of the investor from _tokenHolders[] list * @return success */ - function mintMulti(address[] calldata _investors, uint256[] calldata _values) external returns(bool success) { - require(_investors.length == _values.length, "Incorrect inputs"); - for (uint256 i = 0; i < _investors.length; i++) { - mint(_investors[i], _values[i]); + function issueMulti(address[] calldata _tokenHolders, uint256[] calldata _values) external { + require(_tokenHolders.length == _values.length, "Incorrect inputs"); + for (uint256 i = 0; i < _tokenHolders.length; i++) { + issue(_tokenHolders[i], _values[i], ""); } - return true; + } + + /** + * @notice This function redeem an amount of the token of a msg.sender. For doing so msg.sender may incentivize + * using different ways that could be implemented with in the `redeem` function definition. But those implementations + * are out of the scope of the ERC1594. + * @param _value The amount of tokens need to be redeemed + * @param _data The `bytes _data` it can be used in the token contract to authenticate the redemption. + */ + function redeem(uint256 _value, bytes calldata _data) external { + // Add a function to validate the `_data` parameter + require(_checkAndBurn(msg.sender, _value, _data), "Invalid redeem"); + } + + function _checkAndBurn(address _from, uint256 _value, bytes memory _data) internal returns(bool) { + bool verified = _updateTransfer(_from, address(0), _value, _data); + _adjustTotalSupplyCheckpoints(); + _burn(_from, _value); + emit Redeemed(address(0), msg.sender, _value, _data); + return verified; + } + + /** + * @notice This function redeem an amount of the token of a msg.sender. For doing so msg.sender may incentivize + * using different ways that could be implemented with in the `redeem` function definition. But those implementations + * are out of the scope of the ERC1594. + * @dev It is analogy to `transferFrom` + * @param _tokenHolder The account whose tokens gets redeemed. + * @param _value The amount of tokens need to be redeemed + * @param _data The `bytes _data` it can be used in the token contract to authenticate the redemption. + */ + function redeemFrom(address _tokenHolder, uint256 _value, bytes calldata _data) external { + // Add a function to validate the `_data` parameter + require(_updateTransfer(_tokenHolder, address(0), _value, _data), "Invalid redeem"); + _adjustTotalSupplyCheckpoints(); + _burnFrom(_tokenHolder, _value); + emit Redeemed(msg.sender, _tokenHolder, _value, _data); } /** @@ -690,41 +731,6 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater return false; } - function _checkAndBurn(address _from, uint256 _value, bytes memory _data) internal returns(bool) { - bool verified = _updateTransfer(_from, address(0), _value, _data); - _adjustTotalSupplyCheckpoints(); - _burn(_from, _value); - emit Burnt(_from, _value); - return verified; - } - - /** - * @notice Burn function used to burn the securityToken - * @param _value No. of tokens that get burned - * @param _data data to indicate validation - */ - function burnWithData(uint256 _value, bytes memory _data) public onlyModule(BURN_KEY) { - require(_checkAndBurn(msg.sender, _value, _data), "Burn invalid"); - } - - function _checkAndBurnFrom(address _from, uint256 _value, bytes memory _data) internal returns(bool) { - bool verified = _updateTransfer(_from, address(0), _value, _data); - _adjustTotalSupplyCheckpoints(); - _burnFrom(_from, _value); - emit Burnt(_from, _value); - return verified; - } - - /** - * @notice Burn function used to burn the securityToken on behalf of someone else - * @param _from Address for whom to burn tokens - * @param _value No. of tokens that get burned - * @param _data data to indicate validation - */ - function burnFromWithData(address _from, uint256 _value, bytes memory _data) public onlyModule(BURN_KEY) { - require(_checkAndBurnFrom(_from, _value, _data), "Burn invalid"); - } - /** * @notice Creates a checkpoint that can be used to query historical balances / totalSuppy * @return uint256 @@ -773,6 +779,10 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater */ function setController(address _controller) public onlyOwner { require(!controllerDisabled); + // Below condition is to restrict the owner/issuer to become the controller(In an ideal world). + // But for non ideal case issuer could set another address which is not the owner of the token + // but issuer holds its private key. + require(_controller != msg.sender); emit SetController(controller, _controller); controller = _controller; } @@ -785,34 +795,178 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater require(!controllerDisabled); controllerDisabled = true; delete controller; - /*solium-disable-next-line security/no-block-members*/ emit DisableController(now); } /** - * @notice Used by a controller to execute a forced transfer - * @param _from address from which to take tokens - * @param _to address where to send tokens - * @param _value amount of tokens to transfer - * @param _data data to indicate validation - * @param _log data attached to the transfer by controller to emit in event + * @notice Transfers of securities may fail for a number of reasons. So this function will used to understand the + * cause of failure by getting the byte value. Which will be the ESC that follows the EIP 1066. ESC can be mapped + * with a reson string to understand the failure cause, table of Ethereum status code will always reside off-chain + * @param _to address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. + * @return bool It signifies whether the transaction will be executed or not. + * @return byte Ethereum status code (ESC) + * @return bytes32 Application specific reason code + */ + function canTransfer(address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32) { + return _canTransfer(msg.sender, _to, _value, _data); + } + + /** + * @notice Transfers of securities may fail for a number of reasons. So this function will used to understand the + * cause of failure by getting the byte value. Which will be the ESC that follows the EIP 1066. ESC can be mapped + * with a reson string to understand the failure cause, table of Ethereum status code will always reside off-chain + * @param _from address The address which you want to send tokens from + * @param _to address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. + * @return bool It signifies whether the transaction will be executed or not. + * @return byte Ethereum status code (ESC) + * @return bytes32 Application specific reason code + */ + function canTransferFrom(address _from, address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32) { + (bool success, byte reasonCode, bytes32 appCode) = _canTransfer(_from, _to, _value, _data); + if (success && _value > _allowed[_from][msg.sender]) { + return (false, 0x53, bytes32(0)); + } else + return (success, reasonCode, appCode); + } + + function _canTransfer(address _from, address _to, uint256 _value, bytes memory _data) internal view returns (bool, byte, bytes32) { + byte reasonCode; + bool success; + if (_value % granularity != 0) { + reasonCode = 0xA8; + return (false, 0x50, bytes32(reasonCode)); + } + (success, reasonCode) = TokenLib.verifyTransfer(modules[TRANSFER_KEY], modulesToData, _from, _to, _value, _data, transfersFrozen); + if (!success) + return (false, 0x50, bytes32(reasonCode)); + + else if (_balances[_from] < _value) + return (false, 0x52, bytes32(0)); + + else if (_to == address(0)) + return (false, 0x57, bytes32(0)); + + else if (!KindMath.checkAdd(_balances[_to], _value)) + return (false, 0x50, bytes32(0)); + return (true, 0x51, bytes32(0)); + } + + /** + * @notice Used to attach a new document to the contract, or update the URI or hash of an existing attached document + * @dev Can only be executed by the owner of the contract. + * @param _name Name of the document. It should be unique always + * @param _uri Off-chain uri of the document from where it is accessible to investors/advisors to read. + * @param _documentHash hash (of the contents) of the document. + */ + function setDocument(bytes32 _name, string calldata _uri, bytes32 _documentHash) external onlyOwner { + require(_name != bytes32(0), "Zero value is not allowed"); + require(bytes(_uri).length > 0, "Should not be a empty uri"); + if (_documents[_name].lastModified == uint256(0)) { + _docNames.push(_name); + _docIndexes[_name] = _docNames.length; + } + _documents[_name] = Document(_documentHash, now, _uri); + emit DocumentUpdated(_name, _uri, _documentHash); + } + + /** + * @notice Used to remove an existing document from the contract by giving the name of the document. + * @dev Can only be executed by the owner of the contract. + * @param _name Name of the document. It should be unique always */ - function forceTransfer(address _from, address _to, uint256 _value, bytes memory _data, bytes memory _log) public onlyController { - bool verified = _updateTransfer(_from, _to, _value, _data); + function removeDocument(bytes32 _name) external onlyOwner { + require(_documents[_name].lastModified != uint256(0), "Document should be existed"); + uint256 index = _docIndexes[_name] - 1; + if (index != _docNames.length - 1) { + _docNames[index] = _docNames[_docNames.length - 1]; + _docIndexes[_docNames[index]] = index + 1; + } + _docNames.length--; + emit DocumentRemoved(_name, _documents[_name].uri, _documents[_name].docHash); + delete _documents[_name]; + } + + /** + * @notice Used to return the details of a document with a known name (`bytes32`). + * @param _name Name of the document + * @return string The URI associated with the document. + * @return bytes32 The hash (of the contents) of the document. + * @return uint256 the timestamp at which the document was last modified. + */ + function getDocument(bytes32 _name) external view returns (string memory, bytes32, uint256) { + return ( + _documents[_name].uri, + _documents[_name].docHash, + _documents[_name].lastModified + ); + } + + /** + * @notice Used to retrieve a full list of documents attached to the smart contract. + * @return bytes32 List of all documents names present in the contract. + */ + function getAllDocuments() external view returns (bytes32[] memory) { + return _docNames; + } + + /** + * @notice Internal function to know whether the controller functionality + * allowed or not. + * @return bool `true` when controller address is non-zero otherwise return `false`. + */ + function _isControllable() internal view returns (bool) { + return !controllerDisabled; + } + + /** + * @notice In order to provide transparency over whether `controllerTransfer` / `controllerRedeem` are useable + * or not `isControllable` function will be used. + * @dev If `isControllable` returns `false` then it always return `false` and + * `controllerTransfer` / `controllerRedeem` will always revert. + * @return bool `true` when controller address is non-zero otherwise return `false`. + */ + function isControllable() external view returns (bool) { + return _isControllable(); + } + + /** + * @notice This function allows an authorised address to transfer tokens between any two token holders. + * The transfer must still respect the balances of the token holders (so the transfer must be for at most + * `balanceOf(_from)` tokens) and potentially also need to respect other transfer restrictions. + * @dev This function can only be executed by the `controller` address. + * @param _from Address The address which you want to send tokens from + * @param _to Address The address which you want to transfer to + * @param _value uint256 the amount of tokens to be transferred + * @param _data data to validate the transfer. (It is not used in this reference implementation + * because use of `_data` parameter is implementation specific). + * @param _operatorData data attached to the transfer by controller to emit in event. (It is more like a reason string + * for calling this function (aka force transfer) which provides the transparency on-chain). + */ + function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external onlyController { + _updateTransfer(_from, _to, _value, _data); _transfer(_from, _to, _value); - emit ForceTransfer(msg.sender, _from, _to, _value, verified, _log); + emit ControllerTransfer(msg.sender, _from, _to, _value, _data, _operatorData); } /** - * @notice Used by a controller to execute a forced burn - * @param _from address from which to take tokens - * @param _value amount of tokens to transfer - * @param _data data to indicate validation - * @param _log data attached to the transfer by controller to emit in event + * @notice This function allows an authorised address to redeem tokens for any token holder. + * The redemption must still respect the balances of the token holder (so the redemption must be for at most + * `balanceOf(_tokenHolder)` tokens) and potentially also need to respect other transfer restrictions. + * @dev This function can only be executed by the `controller` address. + * @param _tokenHolder The account whose tokens will be redeemed. + * @param _value uint256 the amount of tokens need to be redeemed. + * @param _data data to validate the transfer. (It is not used in this reference implementation + * because use of `_data` parameter is implementation specific). + * @param _operatorData data attached to the transfer by controller to emit in event. (It is more like a reason string + * for calling this function (aka force transfer) which provides the transparency on-chain). */ - function forceBurn(address _from, uint256 _value, bytes memory _data, bytes memory _log) public onlyController { - bool verified = _checkAndBurn(_from, _value, _data); - emit ForceBurn(msg.sender, _from, _value, verified, _log); + function controllerRedeem(address _tokenHolder, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external onlyController { + _checkAndBurn(_tokenHolder, _value, _data); + emit ControllerRedemption(msg.sender, _tokenHolder, _value, _data, _operatorData); } /** @@ -826,4 +980,4 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater return _version; } -} +} \ No newline at end of file diff --git a/docs/ethereum_status_codes.md b/docs/ethereum_status_codes.md new file mode 100644 index 000000000..60a2ff0d9 --- /dev/null +++ b/docs/ethereum_status_codes.md @@ -0,0 +1,46 @@ + +# For ERC1400 + +| Code | Reason | +| ------ | ------------------------------------------------------------- | +| `0x50` | transfer failure | +| `0x51` | transfer success | +| `0x52` | insufficient balance | +| `0x53` | insufficient allowance | +| `0x54` | transfers halted (contract paused) | +| `0x55` | funds locked (lockup period) | +| `0x56` | invalid sender | +| `0x57` | invalid receiver | +| `0x58` | invalid operator (transfer agent) | +| `0x59` | | +| `0x5a` | | +| `0x5b` | | +| `0x5a` | | +| `0x5b` | | +| `0x5c` | | +| `0x5d` | | +| `0x5e` | | +| `0x5f` | token meta or info + +# For Application specific (Polymath) + +| Code | Reason | +| ------ | ------------------------------------------------------------- | +| `0xA0` | Not affected | +| `0xA1` | Success | +| `0xA2` | Max holders reach | +| `0xA3` | Manual Approval Expired | +| `0xA4` | funds limit reached | +| `0xA5` | Tx Volume limit reached | +| `0xA6` | Blacklisted tx | +| `0xA7` | funds locked (lockup period) | +| `0xA8` | Invalid granularity | +| `0xA9` | | +| `0xAa` | | +| `0xAb` | | +| `0xAa` | | +| `0xAb` | | +| `0xAc` | | +| `0xAd` | | +| `0xAe` | | +| `0xAf` | token meta or info | diff --git a/yarn.lock b/yarn.lock index fbe3ccc99..ba5641ffe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19,12 +19,10 @@ "@soldoc/markdown@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@soldoc/markdown/-/markdown-0.1.0.tgz#9f85be75049af9721b5129f133d52dafbf5f671e" - integrity sha512-V0UnvVVJ1qDzpuKLMuh7oHG94puwi8BI3t99Vrr7dQgIHuJdfZJ4SbGuWuFV/fSthyH++WY4ePO3d6gxfZ2//w== "@soldoc/soldoc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@soldoc/soldoc/-/soldoc-0.4.3.tgz#24ffee9264228e1c3edd61fd3162d63587954933" - integrity sha1-JP/ukmQijhw+3WH9MWLWNYeVSTM= dependencies: "@soldoc/markdown" "^0.1.0" chalk "^2.3.1" @@ -42,31 +40,26 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" - integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== dependencies: xtend "~4.0.0" abstract-leveldown@~2.7.1: version "2.7.2" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" - integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== dependencies: xtend "~4.0.0" accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: mime-types "~2.1.18" negotiator "0.6.1" @@ -74,7 +67,6 @@ accepts@~1.3.5: acorn-dynamic-import@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ= dependencies: acorn "^4.0.3" @@ -85,12 +77,10 @@ acorn-jsx@^5.0.0: acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= acorn@^5.0.0: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== acorn@^6.0.2: version "6.0.4" @@ -99,22 +89,18 @@ acorn@^6.0.2: aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= aes-js@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= ajv@^5.1.1, ajv@^5.2.2: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -139,10 +125,9 @@ ajv@^6.5.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.5.5, ajv@^6.6.1: +ajv@^6.5.5: version "6.6.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" - integrity sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -152,7 +137,6 @@ ajv@^6.5.5, ajv@^6.6.1: align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -161,7 +145,6 @@ align-text@^0.1.1, align-text@^0.1.3: ambi@^2.2.0: version "2.5.0" resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" - integrity sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA= dependencies: editions "^1.1.1" typechecker "^4.3.0" @@ -169,49 +152,40 @@ ambi@^2.2.0: amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== ansi-regex@^2.0.0, ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" - integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" any-promise@1.3.0, any-promise@^1.0.0, any-promise@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" @@ -219,7 +193,6 @@ anymatch@^1.3.0: anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" @@ -227,17 +200,14 @@ anymatch@^2.0.0: app-module-path@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" - integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -245,26 +215,22 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" @@ -273,22 +239,18 @@ arr-union@^3.1.0: array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" @@ -297,41 +259,30 @@ asn1.js@^4.0.0: asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= dependencies: util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-eventemitter@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" @@ -344,54 +295,44 @@ async-eventemitter@ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async@1.x, async@^1.4.2, async@~1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.4.1, async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: lodash "^4.17.10" async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= async@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" @@ -400,7 +341,6 @@ babel-code-frame@^6.26.0: babel-core@^6.0.14, babel-core@^6.26.0: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -425,7 +365,6 @@ babel-core@^6.0.14, babel-core@^6.26.0: babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -439,7 +378,6 @@ babel-generator@^6.26.0: babel-helper-bindify-decorators@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - integrity sha1-FMGeXxQte0fxmlJDHlKxzLxAozA= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -448,7 +386,6 @@ babel-helper-bindify-decorators@^6.24.1: babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= dependencies: babel-helper-explode-assignable-expression "^6.24.1" babel-runtime "^6.22.0" @@ -457,7 +394,6 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -467,7 +403,6 @@ babel-helper-call-delegate@^6.24.1: babel-helper-define-map@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.26.0" @@ -477,7 +412,6 @@ babel-helper-define-map@^6.24.1: babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= dependencies: babel-runtime "^6.22.0" babel-traverse "^6.24.1" @@ -486,7 +420,6 @@ babel-helper-explode-assignable-expression@^6.24.1: babel-helper-explode-class@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" - integrity sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes= dependencies: babel-helper-bindify-decorators "^6.24.1" babel-runtime "^6.22.0" @@ -496,7 +429,6 @@ babel-helper-explode-class@^6.24.1: babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= dependencies: babel-helper-get-function-arity "^6.24.1" babel-runtime "^6.22.0" @@ -507,7 +439,6 @@ babel-helper-function-name@^6.24.1: babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -515,7 +446,6 @@ babel-helper-get-function-arity@^6.24.1: babel-helper-hoist-variables@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -523,7 +453,6 @@ babel-helper-hoist-variables@^6.24.1: babel-helper-optimise-call-expression@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -531,7 +460,6 @@ babel-helper-optimise-call-expression@^6.24.1: babel-helper-regex@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= dependencies: babel-runtime "^6.26.0" babel-types "^6.26.0" @@ -540,7 +468,6 @@ babel-helper-regex@^6.24.1: babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -551,7 +478,6 @@ babel-helper-remap-async-to-generator@^6.24.1: babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= dependencies: babel-helper-optimise-call-expression "^6.24.1" babel-messages "^6.23.0" @@ -563,7 +489,6 @@ babel-helper-replace-supers@^6.24.1: babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -571,61 +496,50 @@ babel-helpers@^6.24.1: babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= dependencies: babel-runtime "^6.22.0" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= babel-plugin-syntax-async-generators@^6.5.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - integrity sha1-a8lj67FuzLrmuStZbrfzXDQqi5o= babel-plugin-syntax-class-properties@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94= babel-plugin-syntax-decorators@^6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - integrity sha1-MSVjtNvePMgGzuPkFszurd0RrAs= babel-plugin-syntax-dynamic-import@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo= babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= babel-plugin-transform-async-generator-functions@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" - integrity sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-generators "^6.5.0" @@ -634,7 +548,6 @@ babel-plugin-transform-async-generator-functions@^6.24.1: babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= dependencies: babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" @@ -643,7 +556,6 @@ babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async- babel-plugin-transform-class-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw= dependencies: babel-helper-function-name "^6.24.1" babel-plugin-syntax-class-properties "^6.8.0" @@ -653,7 +565,6 @@ babel-plugin-transform-class-properties@^6.24.1: babel-plugin-transform-decorators@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - integrity sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0= dependencies: babel-helper-explode-class "^6.24.1" babel-plugin-syntax-decorators "^6.13.0" @@ -664,21 +575,18 @@ babel-plugin-transform-decorators@^6.24.1: babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= dependencies: babel-runtime "^6.26.0" babel-template "^6.26.0" @@ -689,7 +597,6 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es20 babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= dependencies: babel-helper-define-map "^6.24.1" babel-helper-function-name "^6.24.1" @@ -704,7 +611,6 @@ babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-cla babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" @@ -712,14 +618,12 @@ babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transfor babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -727,14 +631,12 @@ babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2 babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= dependencies: babel-helper-function-name "^6.24.1" babel-runtime "^6.22.0" @@ -743,14 +645,12 @@ babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es20 babel-plugin-transform-es2015-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= dependencies: babel-plugin-transform-es2015-modules-commonjs "^6.24.1" babel-runtime "^6.22.0" @@ -759,7 +659,6 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -769,7 +668,6 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= dependencies: babel-helper-hoist-variables "^6.24.1" babel-runtime "^6.22.0" @@ -778,7 +676,6 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-e babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= dependencies: babel-plugin-transform-es2015-modules-amd "^6.24.1" babel-runtime "^6.22.0" @@ -787,7 +684,6 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015 babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" @@ -795,7 +691,6 @@ babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es201 babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= dependencies: babel-helper-call-delegate "^6.24.1" babel-helper-get-function-arity "^6.24.1" @@ -807,7 +702,6 @@ babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015- babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -815,14 +709,12 @@ babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transfo babel-plugin-transform-es2015-spread@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -831,21 +723,18 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es201 babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= dependencies: babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= dependencies: babel-helper-regex "^6.24.1" babel-runtime "^6.22.0" @@ -854,7 +743,6 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es20 babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= dependencies: babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" @@ -863,7 +751,6 @@ babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-e babel-plugin-transform-object-rest-spread@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" babel-runtime "^6.26.0" @@ -871,14 +758,12 @@ babel-plugin-transform-object-rest-spread@^6.22.0: babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= dependencies: regenerator-transform "^0.10.0" babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" @@ -886,7 +771,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-polyfill@6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= dependencies: babel-runtime "^6.26.0" core-js "^2.5.0" @@ -895,7 +779,6 @@ babel-polyfill@6.26.0: babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-syntax-trailing-function-commas "^6.22.0" @@ -931,7 +814,6 @@ babel-preset-env@^1.7.0: babel-preset-es2015@6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" - integrity sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk= dependencies: babel-plugin-check-es2015-constants "^6.22.0" babel-plugin-transform-es2015-arrow-functions "^6.22.0" @@ -961,7 +843,6 @@ babel-preset-es2015@6.24.1: babel-preset-stage-2@6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - integrity sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE= dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" babel-plugin-transform-class-properties "^6.24.1" @@ -971,7 +852,6 @@ babel-preset-stage-2@6.24.1: babel-preset-stage-3@6.24.1, babel-preset-stage-3@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - integrity sha1-g2raCp56f6N8sTj7kyb4eTSkg5U= dependencies: babel-plugin-syntax-trailing-function-commas "^6.22.0" babel-plugin-transform-async-generator-functions "^6.24.1" @@ -982,7 +862,6 @@ babel-preset-stage-3@6.24.1, babel-preset-stage-3@^6.24.1: babel-register@6.26.0, babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" @@ -995,7 +874,6 @@ babel-register@6.26.0, babel-register@^6.26.0: babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -1003,7 +881,6 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -1014,7 +891,6 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -1029,7 +905,6 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -1039,7 +914,6 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: babelify@^7.3.0: version "7.3.0" resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= dependencies: babel-core "^6.0.14" object-assign "^4.0.0" @@ -1047,34 +921,28 @@ babelify@^7.3.0: babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base-x@^3.0.2: version "3.0.5" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.5.tgz#d3ada59afed05b921ab581ec3112e6444ba0795a" - integrity sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA== dependencies: safe-buffer "^5.0.1" base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1087,14 +955,12 @@ base@^0.11.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== bignumber.js@5.0.0: version "5.0.0" @@ -1103,12 +969,10 @@ bignumber.js@5.0.0: bignumber.js@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" - integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" - integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== "bignumber.js@git+https://github.com/debris/bignumber.js#master": version "2.0.7" @@ -1125,24 +989,20 @@ bignumber.js@^7.2.1: binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== bindings@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" - integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew== bip66@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= dependencies: safe-buffer "^5.0.1" bitcore-lib@^0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-0.15.0.tgz#f924be13869f2aab7e04aeec5642ad3359b6cec2" - integrity sha512-AeXLWhiivF6CDFzrABZHT4jJrflyylDWTi32o30rF92HW9msfuKpjzrHtFKYGa9w0kNVv5HABQjCB3OEav4PhQ== dependencies: bn.js "=4.11.8" bs58 "=4.0.1" @@ -1154,7 +1014,6 @@ bitcore-lib@^0.15.0: bitcore-lib@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-0.16.0.tgz#a2c3ec1108cdb90386f728282ab833e0c77c9533" - integrity sha512-CEtcrPAH2gwgaMN+OPMJc18TBEak1+TtzMyafrqrIbK9PIa3kat195qBJhC0liJSHRiRr6IE2eLcXeIFFs+U8w== dependencies: bn.js "=4.11.8" bs58 "=4.0.1" @@ -1166,7 +1025,6 @@ bitcore-lib@^0.16.0: bitcore-mnemonic@^1.5.0: version "1.7.0" resolved "https://registry.yarnpkg.com/bitcore-mnemonic/-/bitcore-mnemonic-1.7.0.tgz#253295a773135e1a0b455871de614996afc8f5e1" - integrity sha512-1JV1okgz9Vv+Y4fG2m3ToR+BGdKA6tSoqjepIxA95BZjW6YaeopVW4iOe/dY9dnkZH4+LA2AJ4YbDE6H3ih3Yw== dependencies: bitcore-lib "^0.16.0" unorm "^1.4.1" @@ -1174,7 +1032,6 @@ bitcore-mnemonic@^1.5.0: bl@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== dependencies: readable-stream "^2.3.5" safe-buffer "^5.1.1" @@ -1182,39 +1039,32 @@ bl@^1.0.0: block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" bluebird@^2.9.34: version "2.11.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= bn.js@4.11.8, bn.js@=4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.3, bn.js@^4.11.6, bn.js@^4.4.0, bn.js@^4.8.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== bn.js@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625" - integrity sha1-EhYrwq5x/EClYmwzQ486h1zTdiU= body-parser@1.18.3, body-parser@^1.16.0: version "1.18.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= dependencies: bytes "3.0.0" content-type "~1.0.4" @@ -1230,7 +1080,6 @@ body-parser@1.18.3, body-parser@^1.16.0: borc@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/borc/-/borc-2.0.4.tgz#52926dc561137188c6ca9fe01c9542576529a689" - integrity sha512-SCVjto/dbKfduyl+LDQ1Km28ly2aTIXtJbrYZWHFQAxkHph96I/zXTrTQXWuJobG8lQZjIA/dw9z7hmJHJhjMg== dependencies: bignumber.js "^7.2.1" commander "^2.15.0" @@ -1240,7 +1089,6 @@ borc@^2.0.2: brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1248,7 +1096,6 @@ brace-expansion@^1.1.7: braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" @@ -1257,7 +1104,6 @@ braces@^1.8.2: braces@^2.3.0, braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1273,22 +1119,18 @@ braces@^2.3.0, braces@^2.3.1: brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1300,7 +1142,6 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6: browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" @@ -1309,7 +1150,6 @@ browserify-cipher@^1.0.0: browserify-des@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" @@ -1319,7 +1159,6 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1327,14 +1166,12 @@ browserify-rsa@^4.0.0: browserify-sha3@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/browserify-sha3/-/browserify-sha3-0.0.1.tgz#3ff34a3006ef15c0fb3567e541b91a2340123d11" - integrity sha1-P/NKMAbvFcD7NWflQbkaI0ASPRE= dependencies: js-sha3 "^0.3.1" browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1347,14 +1184,12 @@ browserify-sign@^4.0.0: browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: pako "~1.0.5" browserslist@^3.2.6: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== dependencies: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" @@ -1362,19 +1197,16 @@ browserslist@^3.2.6: bs58@=4.0.1, bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" bs58@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d" - integrity sha1-VZCNWPGYKrogCPob7Y+RmYopv40= bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" create-hash "^1.1.0" @@ -1383,17 +1215,14 @@ bs58check@^2.1.2: bson@^1.0.4: version "1.1.0" resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.0.tgz#bee57d1fb6a87713471af4e32bcae36de814b5b0" - integrity sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA== buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== buffer-alloc@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== dependencies: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" @@ -1401,37 +1230,30 @@ buffer-alloc@^1.2.0: buffer-compare@=1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.1.1.tgz#5be7be853af89198d1f4ddc090d1d66a48aef596" - integrity sha1-W+e+hTr4kZjR9N3AkNHWakiu9ZY= buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^3.0.1: version "3.6.0" resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" - integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs= dependencies: base64-js "0.0.8" ieee754 "^1.1.4" @@ -1440,7 +1262,6 @@ buffer@^3.0.1: buffer@^4.3.0, buffer@^4.9.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1449,7 +1270,6 @@ buffer@^4.3.0, buffer@^4.9.0: buffer@^5.0.5: version "5.2.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" - integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1457,22 +1277,18 @@ buffer@^5.0.5: builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1487,34 +1303,28 @@ cache-base@^1.0.1: caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= dependencies: callsites "^0.2.0" callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= caminte@0.3.7: version "0.3.7" resolved "https://registry.yarnpkg.com/caminte/-/caminte-0.3.7.tgz#ec1ec0457664a0f092643b7c646c457d5cd6f693" - integrity sha1-7B7ARXZkoPCSZDt8ZGxFfVzW9pM= dependencies: bluebird "^3.4.6" uuid "^3.0.1" @@ -1522,17 +1332,14 @@ caminte@0.3.7: caniuse-lite@^1.0.30000844: version "1.0.30000921" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000921.tgz#7a607c1623444b22351d834e093aedda3c42fbe8" - integrity sha512-Bu09ciy0lMWLgpYC77I0YGuI8eFRBPPzaSOYJK1jTI64txCphYCqnWbxJYjHABYVt/TYX/p3jNjLBR87u1Bfpw== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" @@ -1540,7 +1347,6 @@ center-align@^0.1.1: chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1551,7 +1357,6 @@ chalk@^1.1.3: chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1568,14 +1373,12 @@ charenc@~0.0.1: checkpoint-store@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= dependencies: functional-red-black-tree "^1.0.1" chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -1591,7 +1394,6 @@ chokidar@^1.6.0: chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -1611,12 +1413,10 @@ chokidar@^2.0.2: chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -1624,12 +1424,10 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1639,7 +1437,6 @@ class-utils@^0.3.5: cli-color@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" - integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== dependencies: ansi-regex "^2.1.1" d "1" @@ -1651,19 +1448,16 @@ cli-color@^1.4.0: cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" @@ -1672,7 +1466,6 @@ cliui@^2.1.0: cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -1681,7 +1474,6 @@ cliui@^3.2.0: cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" @@ -1690,22 +1482,18 @@ cliui@^4.0.0: clone@2.x, clone@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= coinstring@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/coinstring/-/coinstring-2.3.0.tgz#cdb63363a961502404a25afb82c2e26d5ff627a4" - integrity sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q= dependencies: bs58 "^2.0.1" create-hash "^1.1.1" @@ -1713,7 +1501,6 @@ coinstring@^2.0.0: collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" @@ -1721,19 +1508,16 @@ collection-visit@^1.0.0: color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: version "1.3.2" @@ -1742,125 +1526,102 @@ colors@^1.1.2: combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== commander@2.15.1: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== commander@^2.14.1, commander@^2.15.0, commander@^2.19.0, commander@^2.8.1, commander@^2.9.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== commander@~2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= dependencies: graceful-readlink ">= 1.0.0" compare-versions@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" - integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== dependencies: safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= cookiejar@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js@^2.4.0, core-js@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.0.tgz#1e30793e9ee5782b307e37ffa22da0eacddd84d4" - integrity sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cors@^2.8.1: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" vary "^1" @@ -1868,7 +1629,6 @@ cors@^2.8.1: coveralls@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.2.tgz#f5a0bcd90ca4e64e088b710fa8dda640aea4884f" - integrity sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw== dependencies: growl "~> 1.10.0" js-yaml "^3.11.0" @@ -1880,7 +1640,6 @@ coveralls@^3.0.1: create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" @@ -1888,7 +1647,6 @@ create-ecdh@^4.0.0: create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -1899,7 +1657,6 @@ create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -1911,7 +1668,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: cron-parser@^2.7.3: version "2.7.3" resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.7.3.tgz#12603f89f5375af353a9357be2543d3172eac651" - integrity sha512-t9Kc7HWBWPndBzvbdQ1YG9rpPRB37Tb/tTviziUOh1qs3TARGh3b1p+tnkOHNe1K5iI3oheBPgLqwotMM7+lpg== dependencies: is-nan "^1.2.1" moment-timezone "^0.5.23" @@ -1919,7 +1675,6 @@ cron-parser@^2.7.3: cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -1942,7 +1697,6 @@ crypt@~0.0.1: crypto-browserify@3.12.0, crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -1959,77 +1713,64 @@ crypto-browserify@3.12.0, crypto-browserify@^3.11.0: crypto-js@^3.1.4, crypto-js@^3.1.5: version "3.1.8" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.8.tgz#715f070bf6014f2ae992a98b3929258b713f08d5" - integrity sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU= crypto-js@^3.1.9-1: version "3.1.9-1" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8" - integrity sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg= crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= csextends@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.2.0.tgz#6374b210984b54d4495f29c99d3dd069b80543e5" - integrity sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg== cycle@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" - integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= d@1: version "1.0.0" resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= dependencies: es5-ext "^0.10.9" dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= death@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= debug@*, debug@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== dependencies: ms "^2.1.1" debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" @@ -2040,19 +1781,16 @@ decamelize@^1.0.0, decamelize@^1.1.1: decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= decompress-response@^3.2.0, decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= dependencies: mimic-response "^1.0.0" decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ== dependencies: file-type "^5.2.0" is-stream "^1.1.0" @@ -2061,7 +1799,6 @@ decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: decompress-tarbz2@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A== dependencies: decompress-tar "^4.1.0" file-type "^6.1.0" @@ -2072,7 +1809,6 @@ decompress-tarbz2@^4.0.0: decompress-targz@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w== dependencies: decompress-tar "^4.1.1" file-type "^5.2.0" @@ -2081,7 +1817,6 @@ decompress-targz@^4.0.0: decompress-unzip@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= dependencies: file-type "^3.8.0" get-stream "^2.2.0" @@ -2091,7 +1826,6 @@ decompress-unzip@^4.0.1: decompress@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= dependencies: decompress-tar "^4.0.0" decompress-tarbz2 "^4.0.0" @@ -2105,62 +1839,52 @@ decompress@^4.0.0: deep-assign@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572" - integrity sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI= dependencies: is-obj "^1.0.0" deep-equal@~0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" - integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0= deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= deferred-leveldown@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" - integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== dependencies: abstract-leveldown "~2.6.0" define-properties@^1.1.1, define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -2168,32 +1892,26 @@ define-property@^2.0.2: defined@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= delimit-stream@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs= depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2201,34 +1919,28 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= diff@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" - integrity sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww== diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -2237,7 +1949,6 @@ diffie-hellman@^5.0.0: doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= dependencies: esutils "^2.0.2" isarray "^1.0.0" @@ -2245,24 +1956,20 @@ doctrine@1.5.0: doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== drbg.js@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= dependencies: browserify-aes "^1.0.6" create-hash "^1.1.2" @@ -2271,19 +1978,16 @@ drbg.js@^1.0.1: duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= eachr@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/eachr/-/eachr-2.0.4.tgz#466f7caa10708f610509e32c807aafe57fc122bf" - integrity sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8= dependencies: typechecker "^2.0.8" ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -2291,12 +1995,10 @@ ecc-jsbn@~0.1.1: editions@^1.1.1, editions@^1.3.3, editions@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" - integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== editions@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/editions/-/editions-2.1.0.tgz#5c6f6341ef19ee362a3bcbb907fe68e696dbc69e" - integrity sha512-yKrimWcvOXcYXtqsOeebbMLynm9qbYVd0005wveGU2biPxJaJoxA0jtaZrxiMe3mAanLr5lxoYFVz5zjv9JdnA== dependencies: errlop "^1.0.3" semver "^5.6.0" @@ -2304,17 +2006,14 @@ editions@^2.1.0: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= electron-to-chromium@^1.3.47: version "1.3.92" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.92.tgz#9027b5abaea400045edd652c0e4838675c814399" - integrity sha512-En051LMzMl3/asMWGZEtU808HOoVWIpmmZx1Ep8N+TT9e7z/X8RcLeBU2kLSNLGQ+5SuKELzMx+MVuTBXk6Q9w== elliptic@6.3.3: version "6.3.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f" - integrity sha1-VILZZG1UvLif19mU/J4ulWiHbj8= dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2324,7 +2023,6 @@ elliptic@6.3.3: elliptic@=6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - integrity sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8= dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2337,7 +2035,6 @@ elliptic@=6.4.0: elliptic@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-3.1.0.tgz#c21682ef762769b56a74201609105da11d5f60cc" - integrity sha1-whaC73YnabVqdCAWCRBdoR1fYMw= dependencies: bn.js "^2.0.3" brorand "^1.0.1" @@ -2347,7 +2044,6 @@ elliptic@^3.1.0: elliptic@^6.0.0, elliptic@^6.2.3, elliptic@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2360,36 +2056,30 @@ elliptic@^6.0.0, elliptic@^6.2.3, elliptic@^6.4.0: emoji-regex@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.1.tgz#5a132b28ebf84a289ba692862f7d4206ebcd32d0" - integrity sha512-cjx7oFbFIyZMpmWaEBnKeJXWAVzjXwK6yHiz/5X73A2Ww4pnabw+4ZaA/MxLroIQQrB3dL6XzEz8P3aZsSdj8Q== emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= dependencies: iconv-lite "~0.4.13" end-of-stream@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" enhanced-resolve@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" @@ -2399,33 +2089,28 @@ enhanced-resolve@^3.4.0: eol@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" - integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== errlop@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.0.3.tgz#dba29c90cf832c3d2ce469fe515d7e5eef2c6676" - integrity sha512-5VTnt0yikY4LlQEfCXVSqfE6oLj1HVM4zVSvAKMnoYjL/zrb6nqiLowZS4XlG7xENfyj7lpYWvT+wfSCr6dtlA== dependencies: editions "^1.3.4" errno@^0.1.3, errno@~0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== dependencies: prr "~1.0.1" error-ex@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.5.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -2436,7 +2121,6 @@ es-abstract@^1.5.0: es-to-primitive@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" @@ -2445,7 +2129,6 @@ es-to-primitive@^1.1.1: es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: version "0.10.46" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" - integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" @@ -2454,7 +2137,6 @@ es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@ es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= dependencies: d "1" es5-ext "^0.10.35" @@ -2463,7 +2145,6 @@ es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0 es6-map@^0.1.3: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= dependencies: d "1" es5-ext "~0.10.14" @@ -2475,7 +2156,6 @@ es6-map@^0.1.3: es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= dependencies: d "1" es5-ext "~0.10.14" @@ -2486,7 +2166,6 @@ es6-set@~0.1.5: es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= dependencies: d "1" es5-ext "~0.10.14" @@ -2494,7 +2173,6 @@ es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= dependencies: d "1" es5-ext "^0.10.14" @@ -2504,17 +2182,14 @@ es6-weak-map@^2.0.1, es6-weak-map@^2.0.2: escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -2526,7 +2201,6 @@ escodegen@1.8.x: escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= dependencies: es6-map "^0.1.3" es6-weak-map "^2.0.1" @@ -2540,7 +2214,6 @@ eslint-config-standard@^12.0.0: eslint-import-resolver-node@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== dependencies: debug "^2.6.9" resolve "^1.5.0" @@ -2548,7 +2221,6 @@ eslint-import-resolver-node@^0.3.1: eslint-module-utils@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" - integrity sha1-snA2LNiLGkitMIl2zn+lTphBF0Y= dependencies: debug "^2.6.8" pkg-dir "^1.0.0" @@ -2563,7 +2235,6 @@ eslint-plugin-es@^1.3.1: eslint-plugin-import@^2.10.0: version "2.14.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" - integrity sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g== dependencies: contains-path "^0.1.0" debug "^2.6.8" @@ -2609,7 +2280,6 @@ eslint-utils@^1.3.0, eslint-utils@^1.3.1: eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== eslint@^5.8.0: version "5.8.0" @@ -2654,10 +2324,9 @@ eslint@^5.8.0: table "^5.0.2" text-table "^0.2.0" -espree@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c" - integrity sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA== +espree@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" dependencies: acorn "^6.0.2" acorn-jsx "^5.0.0" @@ -2666,58 +2335,48 @@ espree@^5.0.0: esprima-extract-comments@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/esprima-extract-comments/-/esprima-extract-comments-1.1.0.tgz#0dacab567a5900240de6d344cf18c33617becbc9" - integrity sha512-sBQUnvJwpeE9QnPrxh7dpI/dp67erYG4WXEAreAMoelPRpMR7NWb4YtwRPn9b+H1uLQKl/qS8WYmyaljTpjIsw== dependencies: esprima "^4.0.0" esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eth-block-tracker@^2.2.2: version "2.3.1" resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-2.3.1.tgz#ab6d177e5b50128fa06d7ae9e0489c7484bac95e" - integrity sha512-NamWuMBIl8kmkJFVj8WzGatySTzQPQag4Xr677yFxdVtIxACFbL/dQowk0MzEqIKk93U1TwY3MjVU6mOcwZnKA== dependencies: async-eventemitter ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c eth-query "^2.1.0" @@ -2731,7 +2390,6 @@ eth-block-tracker@^2.2.2: eth-lib@0.1.27, eth-lib@^0.1.26: version "0.1.27" resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.27.tgz#f0b0fd144f865d2d6bf8257a40004f2e75ca1dd6" - integrity sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA== dependencies: bn.js "^4.11.6" elliptic "^6.4.0" @@ -2744,7 +2402,6 @@ eth-lib@0.1.27, eth-lib@^0.1.26: eth-lib@0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" - integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= dependencies: bn.js "^4.11.6" elliptic "^6.4.0" @@ -2753,7 +2410,6 @@ eth-lib@0.2.7: eth-lightwallet@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/eth-lightwallet/-/eth-lightwallet-3.0.1.tgz#297022932aa568f4e4eb0873bff257f5e5b78709" - integrity sha512-79vVCETy+4l1b6wuOWwjqPW3Bom5ZK46BgkUNwaXhiMG1rrMRHjpjYEWMqH0JHeCzOzB4HBIFz7eK1/4s6w5nA== dependencies: bitcore-lib "^0.15.0" bitcore-mnemonic "^1.5.0" @@ -2770,7 +2426,6 @@ eth-lightwallet@^3.0.1: eth-query@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" - integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= dependencies: json-rpc-random-id "^1.0.0" xtend "^4.0.1" @@ -2778,7 +2433,6 @@ eth-query@^2.1.0: eth-sig-util@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" - integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= dependencies: ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" ethereumjs-util "^5.1.1" @@ -2786,7 +2440,6 @@ eth-sig-util@^1.4.2: ethereum-bridge@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/ethereum-bridge/-/ethereum-bridge-0.6.1.tgz#53c93ed7c0e21752a91e5f089a5997e1d6fea228" - integrity sha512-yDTivI85618BoLI71yNRzW6iVcVN2rjnviCIzs0QOCOENj4XpYQhMDGhdqDi8XWDdzTd0Ja/Canuuh3vfE2IcA== dependencies: async "^2.4.1" borc "^2.0.2" @@ -2817,17 +2470,14 @@ ethereum-bridge@^0.6.1: ethereum-common@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" - integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== ethereum-common@^0.0.18: version "0.0.18" resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" - integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= ethereumjs-abi@0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.4.tgz#9ba1bb056492d00c27279f6eccd4d58275912c1a" - integrity sha1-m6G7BWSS0AwnJ59uzNTVgnWRLBo= dependencies: bn.js "^4.10.0" ethereumjs-util "^4.3.0" @@ -2842,7 +2492,6 @@ ethereumjs-abi@^0.6.5, "ethereumjs-abi@git+https://github.com/ethereumjs/ethereu ethereumjs-account@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== dependencies: ethereumjs-util "^5.0.0" rlp "^2.0.0" @@ -2851,7 +2500,6 @@ ethereumjs-account@^2.0.3: ethereumjs-block@^1.2.2: version "1.7.1" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" - integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== dependencies: async "^2.0.1" ethereum-common "0.2.0" @@ -2862,7 +2510,6 @@ ethereumjs-block@^1.2.2: ethereumjs-block@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.1.0.tgz#71d1b19e18061f14cf6371bf34ba31a359931360" - integrity sha512-ip+x4/7hUInX+TQfhEKsQh9MJK1Dbjp4AuPjf1UdX3udAV4beYD4EMCNIPzBLCsGS8WQZYXLpo83tVTISYNpow== dependencies: async "^2.0.1" ethereumjs-common "^0.6.0" @@ -2873,26 +2520,22 @@ ethereumjs-block@~2.1.0: ethereumjs-common@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-0.6.1.tgz#ec98edf315a7f107afb6acc48e937a8266979fae" - integrity sha512-4jOrfDu9qOBTTGGb3zrfT1tE1Hyc6a8LJpEk0Vk9AYlLkBY7crjVICyJpRvjNI+KLDMpMITMw3eWVZOLMtZdhw== ethereumjs-testrpc-sc@6.1.6: version "6.1.6" resolved "https://registry.yarnpkg.com/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-6.1.6.tgz#290595380b5182814564d4aa38f35b7788aab070" - integrity sha512-iv2qiGBFgk9mn5Nq2enX8dG5WQ7Lk+FCqpnxfPfH4Ns8KLPwttmNOy264nh3SXDJJvcQwz/XnlLteDQVILotbg== dependencies: source-map-support "^0.5.3" ethereumjs-testrpc@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz#7a0b87bf3670f92f607f98fa6a78801d9741b124" - integrity sha512-lAxxsxDKK69Wuwqym2K49VpXtBvLEsXr1sryNG4AkvL5DomMdeCBbu3D87UEevKenLHBiT8GTjARwN6Yj039gA== dependencies: webpack "^3.0.0" ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.1, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.4: version "1.3.7" resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== dependencies: ethereum-common "^0.0.18" ethereumjs-util "^5.0.0" @@ -2900,7 +2543,6 @@ ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.1, ethereumjs-tx@ ethereumjs-util@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6" - integrity sha1-PpQosxfuvaPXJg2FT93alUsfG8Y= dependencies: bn.js "^4.8.0" create-hash "^1.1.2" @@ -2911,7 +2553,6 @@ ethereumjs-util@^4.3.0: ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.3, ethereumjs-util@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" - integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== dependencies: bn.js "^4.11.0" create-hash "^1.1.2" @@ -2924,7 +2565,6 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum ethereumjs-util@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.0.0.tgz#f14841c182b918615afefd744207c7932c8536c0" - integrity sha512-E3yKUyl0Fs95nvTFQZe/ZSNcofhDzUsDlA5y2uoRmf1+Ec7gpGhNCsgKkZBRh7Br5op8mJcYF/jFbmjj909+nQ== dependencies: bn.js "^4.11.0" create-hash "^1.1.2" @@ -2937,7 +2577,6 @@ ethereumjs-util@^6.0.0: ethereumjs-vm@^2.0.2: version "2.5.0" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.5.0.tgz#71dde54a093bd813c9defdc6d45ceb8fcca2f603" - integrity sha512-Cp1do4J2FIJFnbofqLsKb/aoZKG+Q8NBIbTa1qwZPQkQxzeR3DZVpFk/VbE1EUO6Ha0kSClJ1jzfj07z3cScSQ== dependencies: async "^2.1.2" async-eventemitter "^0.2.2" @@ -2954,7 +2593,6 @@ ethereumjs-vm@^2.0.2: ethereumjs-wallet@^0.6.0: version "0.6.2" resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.2.tgz#67244b6af3e8113b53d709124b25477b64aeccda" - integrity sha512-DHEKPV9lYORM7dL8602dkb+AgdfzCYz2lxpdYQoD3OwG355LLDuivW9rGuLpDMCry/ORyBYV6n+QCo/71SwACg== dependencies: aes-js "^3.1.1" bs58check "^2.1.2" @@ -2983,7 +2621,6 @@ ethers@^4.0.7: ethjs-abi@0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.1.8.tgz#cd288583ed628cdfadaf8adefa3ba1dbcbca6c18" - integrity sha1-zSiFg+1ijN+tr4re+juh28vKbBg= dependencies: bn.js "4.11.6" js-sha3 "0.5.5" @@ -2992,7 +2629,6 @@ ethjs-abi@0.1.8: ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= dependencies: bn.js "4.11.6" number-to-bn "1.7.0" @@ -3000,7 +2636,6 @@ ethjs-unit@0.1.6: ethjs-util@^0.1.3, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" @@ -3008,7 +2643,6 @@ ethjs-util@^0.1.3, ethjs-util@^0.1.6: event-emitter@^0.3.5, event-emitter@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= dependencies: d "1" es5-ext "~0.10.14" @@ -3016,22 +2650,18 @@ event-emitter@^0.3.5, event-emitter@~0.3.5: eventemitter3@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.1.1.tgz#47786bdaa087caf7b1b75e73abc5c7d540158cd0" - integrity sha1-R3hr2qCHyvext15zq8XH1UAVjNA= events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= events@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" @@ -3039,7 +2669,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3052,14 +2681,12 @@ execa@^0.7.0: expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -3072,14 +2699,12 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" express@^4.14.0: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" - integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== dependencies: accepts "~1.3.5" array-flatten "1.1.1" @@ -3115,14 +2740,12 @@ express@^4.14.0: extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" @@ -3134,7 +2757,6 @@ extend@~3.0.2: extendr@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/extendr/-/extendr-2.1.0.tgz#301aa0bbea565f4d2dc8f570f2a22611a8527b56" - integrity sha1-MBqgu+pWX00tyPVw8qImEahSe1Y= dependencies: typechecker "~2.0.1" @@ -3149,14 +2771,12 @@ external-editor@^3.0.0: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -3170,7 +2790,6 @@ extglob@^2.0.4: extract-comments@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/extract-comments/-/extract-comments-1.1.0.tgz#b90bca033a056bd69b8ba1c6b6b120fc2ee95c18" - integrity sha512-dzbZV2AdSSVW/4E7Ti5hZdHWbA+Z80RJsJhr5uiL10oyjl/gy7/o+HI1HwK4/WSZhlq4SNKU3oUzXlM13Qx02Q== dependencies: esprima-extract-comments "^1.1.0" parse-code-context "^1.0.0" @@ -3178,77 +2797,64 @@ extract-comments@^1.1.0: extract-opts@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-2.2.0.tgz#1fa28eba7352c6db480f885ceb71a46810be6d7d" - integrity sha1-H6KOunNSxttID4hc63GkaBC+bX0= dependencies: typechecker "~2.0.1" extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= eyes@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= fake-merkle-patricia-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" - integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= dependencies: checkpoint-store "^1.1.0" fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= dependencies: pend "~1.2.0" fetch-ponyfill@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= dependencies: node-fetch "~1.7.1" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" @@ -3256,27 +2862,22 @@ file-entry-cache@^2.0.0: file-type@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= file-type@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - integrity sha1-LdvqfHP/42No365J3DOMBYwritY= file-type@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" @@ -3287,7 +2888,6 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" @@ -3297,7 +2897,6 @@ fill-range@^4.0.0: finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -3310,7 +2909,6 @@ finalhandler@1.1.1: find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -3318,14 +2916,12 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" flat-cache@^1.2.1: version "1.3.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== dependencies: circular-json "^0.3.1" graceful-fs "^4.1.2" @@ -3335,31 +2931,26 @@ flat-cache@^1.2.1: for-each@^0.3.2, for-each@~0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" @@ -3368,29 +2959,24 @@ form-data@~2.3.2: forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3401,7 +2987,6 @@ fs-extra@^0.30.0: fs-extra@^2.0.0, fs-extra@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" - integrity sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3409,7 +2994,6 @@ fs-extra@^2.0.0, fs-extra@^2.1.2: fs-extra@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3418,7 +3002,6 @@ fs-extra@^5.0.0: fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3427,14 +3010,12 @@ fs-extra@^7.0.1: fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" fs-promise@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854" - integrity sha1-9k5PhUvPaJqovdy6JokW2z20aFQ= dependencies: any-promise "^1.3.0" fs-extra "^2.0.0" @@ -3444,7 +3025,6 @@ fs-promise@^2.0.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fs@0.0.2: version "0.0.2" @@ -3453,7 +3033,6 @@ fs@0.0.2: fsevents@^1.0.0, fsevents@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" @@ -3461,7 +3040,6 @@ fsevents@^1.0.0, fsevents@^1.2.2: fstream@^1.0.2, fstream@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -3471,17 +3049,14 @@ fstream@^1.0.2, fstream@^1.0.8: function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= ganache-cli@^6.2.4: version "6.2.4" resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.2.4.tgz#0ec3d5d993a85c9f252fb632105ab7ffe7668638" - integrity sha512-Yxi+G+Qktr8s1BML0BEC2oIseMP/svWXmojajrdHNG8k84cyihvemuW4DLM7XA/ZOqi88mKt3n/mWTi0RbYpOQ== dependencies: bn.js "4.11.8" source-map-support "0.5.9" @@ -3490,7 +3065,6 @@ ganache-cli@^6.2.4: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -3504,12 +3078,10 @@ gauge@~2.7.3: get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-stream@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= dependencies: object-assign "^4.0.1" pinkie-promise "^2.0.0" @@ -3517,24 +3089,20 @@ get-stream@^2.2.0: get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -3542,14 +3110,12 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -3557,7 +3123,6 @@ glob-parent@^3.1.0: glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3569,7 +3134,6 @@ glob@7.1.2: glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -3580,7 +3144,6 @@ glob@^5.0.15: glob@^7.0.0, glob@^7.0.5, glob@^7.1.2, glob@~7.1.2: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3592,7 +3155,6 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.2, glob@~7.1.2: glob@~6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= dependencies: inflight "^1.0.4" inherits "2" @@ -3603,7 +3165,6 @@ glob@~6.0.4: global@~4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= dependencies: min-document "^2.19.0" process "~0.5.1" @@ -3611,17 +3172,14 @@ global@~4.3.0: globals@^11.7.0: version "11.9.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" - integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== got@7.1.0, got@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== dependencies: decompress-response "^3.2.0" duplexer3 "^0.1.4" @@ -3641,27 +3199,22 @@ got@7.1.0, got@^7.1.0: graceful-fs@*, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= growl@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" - integrity sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q== growl@1.10.5, "growl@~> 1.10.0": version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: version "4.0.12" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" - integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== dependencies: async "^2.5.0" optimist "^0.6.1" @@ -3672,12 +3225,10 @@ handlebars@^4.0.1: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: ajv "^6.5.5" har-schema "^2.0.0" @@ -3685,51 +3236,42 @@ har-validator@~5.1.0: has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-to-string-tag-x@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== dependencies: has-symbol-support-x "^1.4.1" has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3738,7 +3280,6 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3747,12 +3288,10 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" @@ -3760,14 +3299,12 @@ has-values@^1.0.0: has@^1.0.1, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -3782,7 +3319,6 @@ hash.js@1.1.3: hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" @@ -3790,7 +3326,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: hdkey@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.0.tgz#e74e7b01d2c47f797fa65d1d839adb7a44639f29" - integrity sha512-E7aU8pNlWUJbXGjTz/+lKf1LkMcA3hUrC5ZleeizrmLSd++kvf8mSOe3q8CmBDA9j4hdfXO5iY6hGiTUCOV2jQ== dependencies: coinstring "^2.0.0" safe-buffer "^5.1.1" @@ -3799,12 +3334,10 @@ hdkey@^1.0.0: he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -3813,7 +3346,6 @@ hmac-drbg@^1.0.0: home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" @@ -3821,12 +3353,10 @@ home-or-tmp@^2.0.0: hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: depd "~1.1.2" inherits "2.0.3" @@ -3836,12 +3366,10 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -3850,12 +3378,10 @@ http-signature@~1.2.0: https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= i18n@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.3.tgz#2d8cf1c24722602c2041d01ba6ae5eaa51388f0e" - integrity sha1-LYzxwkciYCwgQdAbpq5eqlE4jw4= dependencies: debug "*" make-plural "^3.0.3" @@ -3867,31 +3393,26 @@ i18n@^0.8.3: i@0.3.x: version "0.3.6" resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" - integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4, ieee754@^1.1.8: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" @@ -3906,7 +3427,6 @@ ignore@^5.0.2: ignorefs@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ignorefs/-/ignorefs-1.2.0.tgz#da59fb858976e4a5e43702ccd1f282fdbc9e5756" - integrity sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y= dependencies: editions "^1.3.3" ignorepatterns "^1.1.0" @@ -3914,27 +3434,22 @@ ignorefs@^1.0.0: ignorepatterns@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ignorepatterns/-/ignorepatterns-1.1.0.tgz#ac8f436f2239b5dfb66d5f0d3a904a87ac67cc5e" - integrity sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4= immediate@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -3942,17 +3457,14 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1, inherits@=2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== inquirer@^6.1.0: version "6.2.0" @@ -3975,91 +3487,76 @@ inquirer@^6.1.0: interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= dependencies: builtin-modules "^1.0.0" is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4068,7 +3565,6 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4077,230 +3573,194 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" - integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-function@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= is-nan@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz#9faf65b6fb6db24b7f5c0628475ea71f988401e2" - integrity sha1-n69ltvttskt/XAYoR16nH5iEAeI= dependencies: define-properties "^1.1.1" is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1, is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== dependencies: has-symbols "^1.0.0" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isomorphic-fetch@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" @@ -4308,12 +3768,10 @@ isomorphic-fetch@^2.2.0: isstream@0.1.x, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= dependencies: abbrev "1.0.x" async "1.x" @@ -4333,7 +3791,6 @@ istanbul@^0.4.5: isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== dependencies: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" @@ -4341,37 +3798,30 @@ isurl@^1.0.0-alpha5: js-sha3@0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.5.tgz#baf0c0e8c54ad5903447df96ade7a4a1bca79a4a" - integrity sha1-uvDA6MVK1ZA0R9+Wreekobynmko= js-sha3@0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= js-sha3@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.3.1.tgz#86122802142f0828502a0d1dee1d95e253bb0243" - integrity sha1-hhIoAhQvCChQKg0d7h2V4lO7AkM= js-string-escape@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" - integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8= "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= js-yaml@3.x, js-yaml@^3.11.0, js-yaml@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4379,27 +3829,22 @@ js-yaml@3.x, js-yaml@^3.11.0, js-yaml@^3.12.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== json-rpc-engine@^3.6.0: version "3.8.0" resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" - integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== dependencies: async "^2.0.1" babel-preset-env "^1.7.0" @@ -4411,82 +3856,68 @@ json-rpc-engine@^3.6.0: json-rpc-error@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" - integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= dependencies: inherits "^2.0.1" json-rpc-random-id@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json-text-sequence@^0.1: version "0.1.1" resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha1-py8hfcSvxGKf/1/rME3BvVGi89I= dependencies: delimit-stream "0.1.0" json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4496,7 +3927,6 @@ jsprim@^1.2.2: keccak@^1.0.2: version "1.4.0" resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" - integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== dependencies: bindings "^1.2.1" inherits "^2.0.3" @@ -4506,7 +3936,6 @@ keccak@^1.0.2: keccakjs@^0.2.0, keccakjs@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/keccakjs/-/keccakjs-0.2.1.tgz#1d633af907ef305bbf9f2fa616d56c44561dfa4d" - integrity sha1-HWM6+QfvMFu/ny+mFtVsRFYd+k0= dependencies: browserify-sha3 "^0.0.1" sha3 "^1.1.0" @@ -4514,74 +3943,62 @@ keccakjs@^0.2.0, keccakjs@^0.2.1: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" lcov-parse@^0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" - integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= level-codec@~7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" - integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" - integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== dependencies: errno "~0.1.1" level-errors@~1.0.3: version "1.0.5" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" - integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== dependencies: errno "~0.1.1" level-iterator-stream@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" - integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= dependencies: inherits "^2.0.1" level-errors "^1.0.3" @@ -4591,7 +4008,6 @@ level-iterator-stream@~1.3.0: level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= dependencies: readable-stream "~1.0.15" xtend "~2.1.1" @@ -4599,7 +4015,6 @@ level-ws@0.0.0: levelup@^1.2.1: version "1.3.9" resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" - integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== dependencies: deferred-leveldown "~1.2.1" level-codec "~7.0.0" @@ -4612,7 +4027,6 @@ levelup@^1.2.1: levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4620,7 +4034,6 @@ levn@^0.3.0, levn@~0.3.0: load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4631,7 +4044,6 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4641,12 +4053,10 @@ load-json-file@^2.0.0: loader-runner@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" - integrity sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw== loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= dependencies: big.js "^3.1.3" emojis-list "^2.0.0" @@ -4655,7 +4065,6 @@ loader-utils@^1.1.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4663,54 +4072,44 @@ locate-path@^2.0.0: lodash.assign@^4.0.3, lodash.assign@^4.0.6: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash@4.x, lodash@=4.17.11, lodash@^4.13.1, lodash@^4.14.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: +lodash@4.x, lodash@=4.17.11, lodash@^4.13.1, lodash@^4.14.2, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== lodash@=4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= log-driver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== long-timeout@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" - integrity sha1-lyHXiLR+C8taJMLivuGg2lXatRQ= longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" @@ -4718,57 +4117,48 @@ lru-cache@^4.0.1: lru-queue@0.1: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= dependencies: es5-ext "~0.10.2" ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" make-plural@^3.0.3, make-plural@~3.0.3: version "3.0.6" resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-3.0.6.tgz#2033a03bac290b8f3bb91258f65b9df7e8b01ca7" - integrity sha1-IDOgO6wpC487uRJY9lud9+iwHKc= optionalDependencies: minimist "^1.2.0" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" math-interval-parser@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-1.1.0.tgz#dbeda5b06b3249973c6df6170fde2386f0afd893" - integrity sha1-2+2lsGsySZc8bfYXD94jhvCv2JM= dependencies: xregexp "^2.0.0" math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" @@ -4785,19 +4175,16 @@ md5@^2.1.0: media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= dependencies: abstract-leveldown "~2.7.1" functional-red-black-tree "^1.0.1" @@ -4809,7 +4196,6 @@ memdown@^1.0.0: memoizee@^0.4.14: version "0.4.14" resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== dependencies: d "1" es5-ext "^0.10.45" @@ -4823,7 +4209,6 @@ memoizee@^0.4.14: memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -4831,17 +4216,14 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merkle-patricia-tree@^2.1.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" - integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== dependencies: async "^1.4.2" ethereumjs-util "^5.0.0" @@ -4855,7 +4237,6 @@ merkle-patricia-tree@^2.1.2: messageformat@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-0.3.1.tgz#e58fff8245e9b3971799e5b43db58b3e9417f5a2" - integrity sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI= dependencies: async "~1.5.2" glob "~6.0.4" @@ -4866,12 +4247,10 @@ messageformat@^0.3.1: methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -4890,7 +4269,6 @@ micromatch@^2.1.5: micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4909,7 +4287,6 @@ micromatch@^3.1.10, micromatch@^3.1.4: miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" @@ -4917,73 +4294,60 @@ miller-rabin@^4.0.0: mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" - integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.18, mime-types@~2.1.19: version "2.1.21" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" - integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== dependencies: mime-db "~1.37.0" mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= dependencies: dom-walk "^0.1.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= minipass@^2.2.1, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -4991,14 +4355,12 @@ minipass@^2.2.1, minipass@^2.3.4: minizlib@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -5006,14 +4368,12 @@ mixin-deep@^1.2.0: mkdirp-promise@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= dependencies: mkdirp "*" mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" @@ -5030,7 +4390,6 @@ mocha-junit-reporter@^1.18.0: mocha@^4.0.1, mocha@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" - integrity sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA== dependencies: browser-stdout "1.3.0" commander "2.11.0" @@ -5046,7 +4405,6 @@ mocha@^4.0.1, mocha@^4.1.0: mocha@^5.0.1: version "5.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== dependencies: browser-stdout "1.3.1" commander "2.15.1" @@ -5063,39 +4421,32 @@ mocha@^5.0.1: mock-fs@^4.1.0: version "4.7.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.7.0.tgz#9f17e219cacb8094f4010e0a8c38589e2b33c299" - integrity sha512-WlQNtUlzMRpvLHf8dqeUmNqfdPjGY29KrJF50Ldb4AcL+vQeR8QH3wQcFMgrhTwb1gHjZn9xggho+84tBskLgA== moment-timezone@^0.5.23: version "0.5.23" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" - integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== dependencies: moment ">= 2.9.0" "moment@>= 2.9.0", moment@^2.22.2: version "2.23.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225" - integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA== mout@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99" - integrity sha1-ujYR318OWx/7/QEWa48C0fX6K5k= ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== multihashes@^0.4.5: version "0.4.14" resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.14.tgz#774db9a161f81a8a27dc60788f91248e020f5244" - integrity sha512-V/g/EIN6nALXfS/xHUAgtfPP3mn3sPIF/i9beuGKf25QXS2QZYCpeVJbDPEannkz32B2fihzCe2D/KMrbcmefg== dependencies: bs58 "^4.0.1" varint "^5.0.0" @@ -5103,22 +4454,18 @@ multihashes@^0.4.5: mustache@*: version "3.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.1.tgz#873855f23aa8a95b150fb96d9836edbc5a1d248a" - integrity sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA== mustache@^2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" - integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" object-assign "^4.0.1" @@ -5127,22 +4474,18 @@ mz@^2.6.0: nan@2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== nan@^2.0.8, nan@^2.2.1, nan@^2.3.3, nan@^2.9.2: version "2.12.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.0.tgz#9d443fdb5e13a20770cc5e602eee59760a685885" - integrity sha512-zT5nC0JhbljmyEf+Z456nvm7iO7XgRV2hYxoBtPpnyp+0Q4aCoP6uWNn76v/I6k2kCYNLWqWbwBWQcjsNI/bjw== nano-json-stream-parser@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5159,17 +4502,14 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= ncp@1.0.x: version "1.0.1" resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" - integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -5178,17 +4518,14 @@ needle@^2.2.1: negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= neo-async@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= nice-try@^1.0.4: version "1.0.5" @@ -5197,12 +4534,10 @@ nice-try@^1.0.4: node-async-loop@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/node-async-loop/-/node-async-loop-1.2.2.tgz#c5870299bf6477b780c88b431aa5b37733f55a3d" - integrity sha1-xYcCmb9kd7eAyItDGqWzdzP1Wj0= node-cache@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.0.tgz#48ac796a874e762582692004a376d26dfa875811" - integrity sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw== dependencies: clone "2.x" lodash "4.x" @@ -5210,7 +4545,6 @@ node-cache@^4.1.1: node-fetch@^1.0.1, node-fetch@~1.7.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -5218,7 +4552,6 @@ node-fetch@^1.0.1, node-fetch@~1.7.1: node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -5247,7 +4580,6 @@ node-libs-browser@^2.0.0: node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -5263,7 +4595,6 @@ node-pre-gyp@^0.10.0: node-schedule@^1.2.3: version "1.3.1" resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-1.3.1.tgz#6909dd644211bca153b15afc62e1dc0afa7d28be" - integrity sha512-cdNNePwKoisAi4DT00BB11H6IJ/WtA603YZ7+tLJcb/zCmCSxYKcvc+/GTyxC46jN/0ft7741vmMQrvxP8Sd+A== dependencies: cron-parser "^2.7.3" long-timeout "0.1.1" @@ -5272,14 +4603,12 @@ node-schedule@^1.2.3: nopt@3.x, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" @@ -5287,7 +4616,6 @@ nopt@^4.0.1: normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" @@ -5297,19 +4625,16 @@ normalize-package-data@^2.3.2: normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== npm-packlist@^1.1.6: version "1.1.12" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5317,14 +4642,12 @@ npm-packlist@^1.1.6: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -5334,12 +4657,10 @@ npmlog@^4.0.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= dependencies: bn.js "4.11.6" strip-hex-prefix "1.0.0" @@ -5347,17 +4668,14 @@ number-to-bn@1.7.0: oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -5366,29 +4684,24 @@ object-copy@^0.1.0: object-inspect@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -5396,47 +4709,40 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" oboe@2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.3.tgz#2b4865dbd46be81225713f4e9bfe4bcf4f680a4f" - integrity sha1-K0hl29Rr6BIlcT9Om/5Lz09oCk8= dependencies: http-https "^1.0.0" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" openzeppelin-solidity@^2.1.0-rc.2: version "2.1.0-rc.2" resolved "https://registry.yarnpkg.com/openzeppelin-solidity/-/openzeppelin-solidity-2.1.0-rc.2.tgz#704b7c86cc45fc82bc23ab706d767d04cf3391dc" - integrity sha512-2Yf0c4k1v0L354ZXobBn6wL207fBw+906icm4F0DYix4U+4fUMA2xgjWzVFi6zdJKZnCgBRkg+eddF8ZZY6gNA== optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -5444,7 +4750,6 @@ optimist@^0.6.1: optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -5456,29 +4761,24 @@ optionator@^0.8.1, optionator@^0.8.2: original-require@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20" - integrity sha1-DxMEcVhM0zURxew4yNWSE/msXiA= os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" @@ -5487,12 +4787,10 @@ os-locale@^2.0.0: os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -5500,48 +4798,40 @@ osenv@^0.1.4: p-cancelable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= dependencies: p-finally "^1.0.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= pako@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" - integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== parse-asn1@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -5552,12 +4842,10 @@ parse-asn1@^5.0.0: parse-code-context@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-code-context/-/parse-code-context-1.0.0.tgz#718c295c593d0d19a37f898473268cc75e98de1e" - integrity sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA== parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -5567,7 +4855,6 @@ parse-glob@^3.0.4: parse-headers@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" - integrity sha1-aug6eqJanZtwCswoaYzR8e1+lTY= dependencies: for-each "^0.3.2" trim "0.0.1" @@ -5575,71 +4862,58 @@ parse-headers@^2.0.0: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -5648,14 +4922,12 @@ path-type@^1.0.0: path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5666,96 +4938,78 @@ pbkdf2@^3.0.3: pegjs@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" - integrity sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0= pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= dependencies: find-up "^1.0.0" pkginfo@0.3.x: version "0.3.1" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" - integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= pkginfo@0.x.x: version "0.4.1" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= pragma-singleton@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pragma-singleton/-/pragma-singleton-1.0.3.tgz#6894317bb8d47157e59de2a4a009db7e6f63e30e" - integrity sha1-aJQxe7jUcVflneKkoAnbfm9j4w4= prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= prettier-plugin-solidity-refactor@^1.0.0-alpha.10: version "1.0.0-alpha.10" resolved "https://registry.yarnpkg.com/prettier-plugin-solidity-refactor/-/prettier-plugin-solidity-refactor-1.0.0-alpha.10.tgz#39c783d9bae100792a71dbd9b60277fbc5cfa31b" - integrity sha512-xHZOIbYD1NYsacpGuPuCbwDbiU5nT07YPrRhkMsuulVocy15vL+XQLFyQmU+oMgeQuQLI8vW79QYw32SG08RbA== dependencies: emoji-regex "^7.0.1" escape-string-regexp "^1.0.5" @@ -5767,37 +5021,30 @@ prettier-plugin-solidity-refactor@^1.0.0-alpha.10: prettier@^1.15.2, prettier@^1.15.3: version "1.15.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.3.tgz#1feaac5bdd181237b54dbe65d874e02a1472786a" - integrity sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg== private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= process@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== promise-to-callback@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" - integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= dependencies: is-fn "^1.0.0" set-immediate-shim "^1.0.1" @@ -5805,7 +5052,6 @@ promise-to-callback@^1.0.0: prompt@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe" - integrity sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4= dependencies: colors "^1.1.2" pkginfo "0.x.x" @@ -5817,7 +5063,6 @@ prompt@^1.0.0: prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" - integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== dependencies: loose-envify "^1.3.1" object-assign "^4.1.1" @@ -5825,7 +5070,6 @@ prop-types@^15.6.2: proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== dependencies: forwarded "~0.1.2" ipaddr.js "1.8.0" @@ -5833,22 +5077,18 @@ proxy-addr@~2.0.4: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24, psl@^1.1.28: version "1.1.31" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" @@ -5860,27 +5100,22 @@ public-encrypt@^4.0.0: punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== query-string@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== dependencies: decode-uri-component "^0.2.0" object-assign "^4.1.0" @@ -5889,17 +5124,14 @@ query-string@^5.0.1: querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: is-number "^4.0.0" kind-of "^6.0.0" @@ -5908,14 +5140,12 @@ randomatic@^3.0.0: randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" @@ -5923,17 +5153,14 @@ randomfill@^1.0.3: randomhex@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" - integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= raw-body@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== dependencies: bytes "3.0.0" http-errors "1.6.3" @@ -5943,7 +5170,6 @@ raw-body@2.3.3: rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" ini "~1.3.0" @@ -5953,7 +5179,6 @@ rc@^1.2.7: react-dom@^16.2.0: version "16.6.3" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0" - integrity sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -5963,7 +5188,6 @@ react-dom@^16.2.0: react@^16.2.0: version "16.6.3" resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c" - integrity sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -5973,7 +5197,6 @@ react@^16.2.0: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -5981,7 +5204,6 @@ read-pkg-up@^1.0.1: read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" @@ -5989,7 +5211,6 @@ read-pkg-up@^2.0.0: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -5998,7 +5219,6 @@ read-pkg@^1.0.0: read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" @@ -6007,14 +5227,12 @@ read-pkg@^2.0.0: read@1.0.x: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" readable-stream@^1.0.33: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -6024,7 +5242,6 @@ readable-stream@^1.0.33: readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6037,7 +5254,6 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable readable-stream@~1.0.15: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -6047,7 +5263,6 @@ readable-stream@~1.0.15: readdirp@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" micromatch "^3.1.10" @@ -6056,34 +5271,28 @@ readdirp@^2.0.0: readline-sync@^1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.9.tgz#3eda8e65f23cd2a17e61301b1f0003396af5ecda" - integrity sha1-PtqOZfI80qF+YTAbHwADOWr17No= rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" regenerate@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" @@ -6092,26 +5301,23 @@ regenerator-transform@^0.10.0: regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^2.0.1: +regexpp@^2.0.0, regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" @@ -6120,62 +5326,52 @@ regexpu-core@^2.0.0: regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" req-cwd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-1.0.1.tgz#0d73aeae9266e697a78f7976019677e76acf0fff" - integrity sha1-DXOurpJm5penj3l2AZZ352rPD/8= dependencies: req-from "^1.0.1" req-from@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/req-from/-/req-from-1.0.1.tgz#bf81da5147947d32d13b947dc12a58ad4587350e" - integrity sha1-v4HaUUeUfTLRO5R9wSpYrUWHNQ4= dependencies: resolve-from "^2.0.0" request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= dependencies: lodash "^4.13.1" request-promise@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.2.tgz#d1ea46d654a6ee4f8ee6a4fea1018c22911904b4" - integrity sha1-0epG1lSm7k+O5qT+oQGMIpEZBLQ= dependencies: bluebird "^3.5.0" request-promise-core "1.1.1" @@ -6185,7 +5381,6 @@ request-promise@^4.2.2: request@^2.67.0, request@^2.79.0, request@^2.81.0, request@^2.85.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -6211,27 +5406,22 @@ request@^2.67.0, request@^2.79.0, request@^2.81.0, request@^2.85.0, request@^2.8 require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= require-from-string@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" @@ -6239,41 +5429,34 @@ require-uncached@^1.0.3: resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.1.6, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== dependencies: path-parse "^1.0.5" resolve@~1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== dependencies: path-parse "^1.0.5" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -6281,38 +5464,32 @@ restore-cursor@^2.0.0: resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= dependencies: through "~2.3.4" ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== revalidator@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" - integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.6.1, rimraf@~2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== dependencies: glob "^7.0.5" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" inherits "^2.0.1" @@ -6320,21 +5497,18 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: rlp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.1.0.tgz#e4f9886d5a982174f314543831e36e1a658460f9" - integrity sha512-93U7IKH5j7nmXFVg19MeNBGzQW5uXW1pmCuKY8veeKIhYTE32C2d0mOegfiIAfXcHOKJjjPlJisn8iHDF5AezA== dependencies: safe-buffer "^5.1.1" run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== rxjs@^6.1.0: version "6.3.3" @@ -6345,48 +5519,40 @@ rxjs@^6.1.0: safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-event-emitter@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" - integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== dependencies: events "^3.0.0" safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" safe@^0.4.5: version "0.4.6" resolved "https://registry.yarnpkg.com/safe/-/safe-0.4.6.tgz#1d5580cf2635c5cb940ea48fb5081ae3c25b1be1" - integrity sha1-HVWAzyY1xcuUDqSPtQga48JbG+E= safefs@^3.1.2: version "3.2.2" resolved "https://registry.yarnpkg.com/safefs/-/safefs-3.2.2.tgz#8170c1444d7038e08caea05a374fae2fa349e15c" - integrity sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw= dependencies: graceful-fs "*" "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== scandirectory@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72" - integrity sha1-bOA/VKCQtmjjy+2/IO354xBZPnI= dependencies: ignorefs "^1.0.0" safefs "^3.1.2" @@ -6395,7 +5561,6 @@ scandirectory@^2.5.0: scheduler@^0.11.2: version "0.11.3" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b" - integrity sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -6403,7 +5568,6 @@ scheduler@^0.11.2: scrypt-async@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/scrypt-async/-/scrypt-async-1.3.1.tgz#a11fd6fac981b4b823ee01dee0221169500ddae9" - integrity sha1-oR/W+smBtLgj7gHe4CIRaVAN2uk= scrypt-js@2.0.4: version "2.0.4" @@ -6412,7 +5576,6 @@ scrypt-js@2.0.4: scrypt.js@0.2.0, scrypt.js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.2.0.tgz#af8d1465b71e9990110bedfc593b9479e03a8ada" - integrity sha1-r40UZbcemZARC+38WTuUeeA6ito= dependencies: scrypt "^6.0.2" scryptsy "^1.2.1" @@ -6420,21 +5583,18 @@ scrypt.js@0.2.0, scrypt.js@^0.2.0: scrypt@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/scrypt/-/scrypt-6.0.3.tgz#04e014a5682b53fa50c2d5cce167d719c06d870d" - integrity sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0= dependencies: nan "^2.0.8" scryptsy@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= dependencies: pbkdf2 "^3.0.3" secp256k1@^3.0.1: version "3.5.2" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.5.2.tgz#f95f952057310722184fe9c914e6b71281f2f2ae" - integrity sha512-iin3kojdybY6NArd+UFsoTuapOF7bnJNf2UbcWXaY3z+E1sJDipl60vtzB5hbO/uquBu7z0fd4VC4Irp+xoFVQ== dependencies: bindings "^1.2.1" bip66 "^1.1.3" @@ -6448,29 +5608,24 @@ secp256k1@^3.0.1: seek-bzip@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= dependencies: commander "~2.8.1" semaphore@>=1.0.1, semaphore@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" - integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== semver@~5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -6489,7 +5644,6 @@ send@0.16.2: serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -6499,7 +5653,6 @@ serve-static@1.13.2: servify@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== dependencies: body-parser "^1.16.0" cors "^2.8.1" @@ -6510,17 +5663,14 @@ servify@^0.1.12: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6530,7 +5680,6 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6540,22 +5689,18 @@ set-value@^2.0.0: setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -6563,26 +5708,22 @@ sha.js@^2.4.0, sha.js@^2.4.8: sha3@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.2.tgz#a66c5098de4c25bc88336ec8b4817d005bca7ba9" - integrity sha1-pmxQmN5MJbyIM27ItIF9AFvKe6k= dependencies: nan "2.10.0" shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.7.4: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM= dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -6591,7 +5732,6 @@ shelljs@^0.7.4: shelljs@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -6600,17 +5740,14 @@ shelljs@^0.8.1: signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= simple-concat@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" - integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= simple-get@^2.7.0: version "2.8.1" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== dependencies: decompress-response "^3.3.0" once "^1.3.1" @@ -6619,21 +5756,16 @@ simple-get@^2.7.0: slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slice-ansi@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.0.0.tgz#5373bdb8559b45676e8541c66916cdd6251612e7" - integrity sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ== +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -6642,14 +5774,12 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -6663,22 +5793,18 @@ snapdragon@^0.8.1: sol-digger@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/sol-digger/-/sol-digger-0.0.2.tgz#406c4a9d31e269e7f88eb1c2ea101318e5e09025" - integrity sha1-QGxKnTHiaef4jrHC6hATGOXgkCU= sol-explore@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/sol-explore/-/sol-explore-1.6.1.tgz#b59f073c69fe332560d5a10c32ba8ca7f2986cfb" - integrity sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs= sol-explore@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/sol-explore/-/sol-explore-1.6.2.tgz#43ae8c419fd3ac056a05f8a9d1fb1022cd41ecc2" - integrity sha1-Q66MQZ/TrAVqBfip0fsQIs1B7MI= sol-merger@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/sol-merger/-/sol-merger-0.1.3.tgz#184284ba4811aebe8950f510df4e8218f568b35f" - integrity sha512-mEirUbl1mZJt2iNBqptsBpxb8n7ZD0trNlnV/+CBAQH8TIFhHIKXdBE8ykD1v+8My18sq7GqHYPmpHE9ckB2Jw== dependencies: bluebird "^3.5.3" cli-color "^1.4.0" @@ -6690,7 +5816,6 @@ sol-merger@^0.1.2: solc@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.0.tgz#2deb2ae992acac3afb909f85c38d00f01dcb335e" - integrity sha512-mdLHDl9WeYrN+FIKcMc9PlPfnA9DG9ur5QpCDKcv6VC4RINAsTF4EMuXMZMKoQTvZhtLyJIVH/BZ+KU830Z8Xg== dependencies: fs-extra "^0.30.0" keccak "^1.0.2" @@ -6702,7 +5827,6 @@ solc@0.5.0: solc@^0.4.19, solc@^0.4.2: version "0.4.25" resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.25.tgz#06b8321f7112d95b4b903639b1138a4d292f5faa" - integrity sha512-jU1YygRVy6zatgXrLY2rRm7HW1d7a8CkkEgNJwvH2VLpWhMFsMdWcJn6kUqZwcSz/Vm+w89dy7Z/aB5p6AFTrg== dependencies: fs-extra "^0.30.0" memorystream "^0.3.1" @@ -6713,7 +5837,6 @@ solc@^0.4.19, solc@^0.4.2: solidity-coverage@^0.5.11: version "0.5.11" resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.5.11.tgz#1ee45f6d98b75a615aadb8f9aa7db4a2b32258e7" - integrity sha512-qikdsSi6+9XbfvwA0aI7HUVpF9fIFNqRWTw23M89GMDY+b6Gj0wWU9IngJS0fimoZIAdEp3bfChxvpfVcrUesg== dependencies: death "^1.1.0" ethereumjs-testrpc-sc "6.1.6" @@ -6729,7 +5852,6 @@ solidity-coverage@^0.5.11: solidity-docgen@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/solidity-docgen/-/solidity-docgen-0.1.0.tgz#f3a56ff074e8c7d832af3a3d462c3b5abf0f64cb" - integrity sha512-F7ufNWmlP5c5hIi66Ijv9tc+HNosyO7ijWq6pRtyBR1WqyJBH/0DJkD6QZI8HkE8p6LEXiPKxGBWbAeVT9Nu9g== dependencies: commander "^2.14.1" lodash "^4.17.5" @@ -6742,12 +5864,10 @@ solidity-docgen@^0.1.0: solidity-parser-antlr@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/solidity-parser-antlr/-/solidity-parser-antlr-0.3.2.tgz#1cf9d019280550a31299dc380e87a310dc4ca154" - integrity sha512-aO/lbnc14A81cQigN5sKNuwbxohPyJOq7kpLirYT/6emCw5Gjb0TJoZ3TzL1tYdIX6gjTAMlQ1UZwOcrzOAp4w== solidity-parser-sc@0.4.11: version "0.4.11" resolved "https://registry.yarnpkg.com/solidity-parser-sc/-/solidity-parser-sc-0.4.11.tgz#86734c9205537007f4d6201b57176e41696ee607" - integrity sha512-1kV5iC7m3CtMDfmHaVNwz2saSGQVIuF16rIxU417Al38MVCWHMQQ5vT6cmLsNwDe60S74auobWij9vNawSeOyw== dependencies: mocha "^4.1.0" pegjs "^0.10.0" @@ -6756,12 +5876,10 @@ solidity-parser-sc@0.4.11: solium-plugin-security@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz#2a87bcf8f8c3abf7d198e292e4ac080284e3f3f6" - integrity sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ== solium@^1.1.6: version "1.1.8" resolved "https://registry.yarnpkg.com/solium/-/solium-1.1.8.tgz#35d30a15c572a233ce8a90226d6cfccb762fadb7" - integrity sha512-fn0lusM6of14CytIDDHK73SGjn6NsVTaCVJjaKCKJyqKhT00rH/hDtvnIeZ2ZTD9z/xaXd4Js2brW3az6AV9RA== dependencies: ajv "^5.2.2" chokidar "^1.6.0" @@ -6779,7 +5897,6 @@ solium@^1.1.6: solparse@2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/solparse/-/solparse-2.2.5.tgz#72709c867cd6bfc50ec2325f4b81d2b3ea365d99" - integrity sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA== dependencies: mocha "^4.0.1" pegjs "^0.10.0" @@ -6788,17 +5905,14 @@ solparse@2.2.5: sorted-array-functions@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.2.0.tgz#43265b21d6e985b7df31621b1c11cc68d8efc7c3" - integrity sha512-sWpjPhIZJtqO77GN+LD8dDsDKcWZ9GCOJNqKzi1tvtjGIzwfoyuRH8S0psunmc6Z5P+qfDqztSbwYR5X/e1UTg== source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: atob "^2.1.1" decode-uri-component "^0.2.0" @@ -6809,7 +5923,6 @@ source-map-resolve@^0.5.0: source-map-support@0.5.9, source-map-support@^0.5.3: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6817,36 +5930,30 @@ source-map-support@0.5.9, source-map-support@^0.5.3: source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= dependencies: amdefine ">=0.0.4" spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -6854,12 +5961,10 @@ spdx-correct@^3.0.0: spdx-exceptions@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -6867,29 +5972,24 @@ spdx-expression-parse@^3.0.0: spdx-license-ids@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" - integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@>=1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: version "1.15.2" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" - integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -6904,12 +6004,10 @@ sshpk@^1.7.0: stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -6917,27 +6015,22 @@ static-extend@^0.1.1: "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== stdio@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/stdio/-/stdio-0.2.7.tgz#a1c57da10fe1cfaa0c3bf683c9d0743d1b660839" - integrity sha1-ocV9oQ/hz6oMO/aDydB0PRtmCDk= stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= dependencies: inherits "~2.0.1" readable-stream "^2.0.2" @@ -6945,7 +6038,6 @@ stream-browserify@^2.0.1: stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" @@ -6956,12 +6048,10 @@ stream-http@^2.7.2: strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= string-width@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.0.0.tgz#5a1690a57cc78211fffd9bf24bbe24d090604eb1" - integrity sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" @@ -6970,7 +6060,6 @@ string-width@3.0.0: string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -6979,7 +6068,6 @@ string-width@^1.0.1: "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" @@ -6987,7 +6075,6 @@ string-width@^1.0.1: string.prototype.trim@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= dependencies: define-properties "^1.1.2" es-abstract "^1.5.0" @@ -6996,123 +6083,104 @@ string.prototype.trim@~1.1.2: string_decoder@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" strip-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== dependencies: ansi-regex "^4.0.0" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-dirs@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g== dependencies: is-natural-number "^4.0.1" strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= dependencies: is-hex-prefixed "1.0.0" strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= supports-color@4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - integrity sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ== dependencies: has-flag "^2.0.0" supports-color@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== dependencies: has-flag "^3.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" supports-color@^4.2.1: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= dependencies: has-flag "^2.0.0" supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" swarm-js@0.1.37: version "0.1.37" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.37.tgz#27d485317a340bbeec40292af783cc10acfa4663" - integrity sha512-G8gi5fcXP/2upwiuOShJ258sIufBVztekgobr3cVgYXObZwJ5AXLqZn52AI+/ffft29pJexF9WNdUxjlkVehoQ== dependencies: bluebird "^3.5.0" buffer "^5.0.5" @@ -7140,12 +6208,10 @@ table@^5.0.2: tapable@^0.2.7: version "0.2.9" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== tape@^4.4.0, tape@^4.6.3: version "4.9.1" resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9" - integrity sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw== dependencies: deep-equal "~1.0.1" defined "~1.0.0" @@ -7164,7 +6230,6 @@ tape@^4.4.0, tape@^4.6.3: tar-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: bl "^1.0.0" buffer-alloc "^1.2.0" @@ -7177,7 +6242,6 @@ tar-stream@^1.5.2: tar.gz@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/tar.gz/-/tar.gz-1.0.7.tgz#577ef2c595faaa73452ef0415fed41113212257b" - integrity sha512-uhGatJvds/3diZrETqMj4RxBR779LKlIE74SsMcn5JProZsfs9j0QBwWO1RW+IWNJxS2x8Zzra1+AW6OQHWphg== dependencies: bluebird "^2.9.34" commander "^2.8.1" @@ -7188,7 +6252,6 @@ tar.gz@^1.0.5: tar@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" @@ -7197,7 +6260,6 @@ tar@^2.1.1: tar@^4: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" @@ -7210,7 +6272,6 @@ tar@^4: taskgroup@^4.0.5, taskgroup@^4.2.0: version "4.3.1" resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a" - integrity sha1-feGT/r12gnPEV3MElwJNUSwnkVo= dependencies: ambi "^2.2.0" csextends "^1.0.3" @@ -7218,43 +6279,36 @@ taskgroup@^4.0.5, taskgroup@^4.2.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= thenify-all@^1.0.0, thenify-all@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.0" resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= dependencies: any-promise "^1.0.0" through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== dependencies: setimmediate "^1.0.4" timers-ext@^0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== dependencies: es5-ext "~0.10.46" next-tick "1" @@ -7262,7 +6316,6 @@ timers-ext@^0.1.5: tingodb@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/tingodb/-/tingodb-0.6.1.tgz#f63336259af7dfa6c90dfe2556a0dfb0d4eede59" - integrity sha1-9jM2JZr336bJDf4lVqDfsNTu3lk= dependencies: lodash "^4.17.5" safe "^0.4.5" @@ -7273,36 +6326,30 @@ tingodb@^0.6.1: tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-buffer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -7310,7 +6357,6 @@ to-regex-range@^2.1.0: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" @@ -7320,7 +6366,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: tough-cookie@>=2.3.3: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" punycode "^2.1.1" @@ -7328,7 +6373,6 @@ tough-cookie@>=2.3.3: tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" @@ -7336,27 +6380,22 @@ tough-cookie@~2.4.3: tree-kill@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" - integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= truffle-blockchain-utils@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/truffle-blockchain-utils/-/truffle-blockchain-utils-0.0.5.tgz#a4e5c064dadd69f782a137f3d276d21095da7a47" - integrity sha1-pOXAZNrdafeCoTfz0nbSEJXaekc= truffle-contract-schema@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/truffle-contract-schema/-/truffle-contract-schema-2.0.1.tgz#9bf821d32e26e674ba15eb5d40f96b10b1c9d568" - integrity sha1-m/gh0y4m5nS6FetdQPlrELHJ1Wg= dependencies: ajv "^5.1.1" crypto-js "^3.1.9-1" @@ -7365,7 +6404,6 @@ truffle-contract-schema@^2.0.1: truffle-contract@^3.0.4: version "3.0.6" resolved "https://registry.yarnpkg.com/truffle-contract/-/truffle-contract-3.0.6.tgz#2ef6fc32d7faafa9f4aed8e50001a9fdea342192" - integrity sha1-Lvb8Mtf6r6n0rtjlAAGp/eo0IZI= dependencies: ethjs-abi "0.1.8" truffle-blockchain-utils "^0.0.5" @@ -7376,7 +6414,6 @@ truffle-contract@^3.0.4: truffle-error@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/truffle-error/-/truffle-error-0.0.3.tgz#4bf55242e14deee1c7194932709182deff2c97ca" - integrity sha1-S/VSQuFN7uHHGUkycJGC3v8sl8o= truffle-hdwallet-provider-privkey@0.2.0: version "0.2.0" @@ -7390,7 +6427,6 @@ truffle-hdwallet-provider-privkey@0.2.0: truffle-wallet-provider@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/truffle-wallet-provider/-/truffle-wallet-provider-0.0.5.tgz#db59ce6fa1c558766011137509a94dfca8d1408e" - integrity sha1-21nOb6HFWHZgERN1CalN/KjRQI4= dependencies: ethereumjs-wallet "^0.6.0" web3 "^0.18.2" @@ -7399,7 +6435,6 @@ truffle-wallet-provider@0.0.5: truffle@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.0.0.tgz#2e4e2eedc5583ae38c7227585e5177d6360fbc6d" - integrity sha512-la0TJu+E59Ut62i6cGY0sugeubglDqH5w49a7IrpxZ1nnsDqv6qWB3ibiyYiCp/jr+iI0bLtcr3DKkfQjVDd+g== dependencies: app-module-path "^2.2.0" mocha "^4.1.0" @@ -7413,36 +6448,30 @@ tslib@^1.9.0: tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.13.2.tgz#453161770469d45cd266c36404e2bc99a8fa9944" - integrity sha1-RTFhdwRp1FzSZsNkBOK8maj6mUQ= tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" mime-types "~2.1.18" @@ -7450,31 +6479,26 @@ type-is@~1.6.16: typechecker@^2.0.8: version "2.1.0" resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.1.0.tgz#d1c2093a54ff8a19f58cff877eeaa54f2242d383" - integrity sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M= typechecker@^4.3.0: version "4.7.0" resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9" - integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ== dependencies: editions "^2.1.0" typechecker@~2.0.1: version "2.0.8" resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.0.8.tgz#e83da84bb64c584ccb345838576c40b0337db82e" - integrity sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4= typedarray-to-buffer@^3.1.2: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: is-typedarray "^1.0.0" uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -7484,7 +6508,6 @@ uglify-js@^2.8.29: uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -7492,12 +6515,10 @@ uglify-js@^3.1.4: uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uglifyjs-webpack-plugin@^0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" - integrity sha1-uVH0q7a9YX5m9j64kUmOORdj4wk= dependencies: source-map "^0.5.6" uglify-js "^2.8.29" @@ -7506,12 +6527,10 @@ uglifyjs-webpack-plugin@^0.4.6: ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unbzip2-stream@^1.0.9: version "1.3.1" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1" - integrity sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw== dependencies: buffer "^3.0.1" through "^2.3.6" @@ -7519,17 +6538,14 @@ unbzip2-stream@^1.0.9: underscore@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= underscore@^1.8.3: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -7539,22 +6555,18 @@ union-value@^1.0.0: universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unorm@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.4.1.tgz#364200d5f13646ca8bcd44490271335614792300" - integrity sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA= unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" @@ -7562,41 +6574,34 @@ unset-value@^1.0.0: upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= dependencies: prepend-http "^1.0.1" url-set-query@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" @@ -7604,46 +6609,38 @@ url@^0.11.0: use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== utf8@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.1.tgz#2e01db02f7d8d0944f77104f1609eb0c304cf768" - integrity sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g= utf8@^2.1.1, utf8@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" - integrity sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY= utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" util@^0.10.3: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: inherits "2.0.3" utile@0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" - integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo= dependencies: async "~0.9.0" deep-equal "~0.2.1" @@ -7655,27 +6652,22 @@ utile@0.3.x: utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= uuid@^3.0.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== valid-url@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" - integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -7683,17 +6675,14 @@ validate-npm-package-license@^3.0.1: varint@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.0.tgz#d826b89f7490732fabc0c0ed693ed475dcb29ebf" - integrity sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8= vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -7702,14 +6691,12 @@ verror@1.10.0: vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" watchpack@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" @@ -7718,7 +6705,6 @@ watchpack@^1.4.0: watchr@~2.4.13: version "2.4.13" resolved "https://registry.yarnpkg.com/watchr/-/watchr-2.4.13.tgz#d74847bb4d6f90f61fe2c74f9f68662aa0e07601" - integrity sha1-10hHu01vkPYf4sdPn2hmKqDgdgE= dependencies: eachr "^2.0.2" extendr "^2.1.0" @@ -7732,7 +6718,6 @@ watchr@~2.4.13: web3-bzz@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.0.0-beta.34.tgz#068d37777ab65e5c60f8ec8b9a50cfe45277929c" - integrity sha1-Bo03d3q2Xlxg+OyLmlDP5FJ3kpw= dependencies: got "7.1.0" swarm-js "0.1.37" @@ -7741,7 +6726,6 @@ web3-bzz@1.0.0-beta.34: web3-core-helpers@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz#b168da00d3e19e156bc15ae203203dd4dfee2d03" - integrity sha1-sWjaANPhnhVrwVriAyA91N/uLQM= dependencies: underscore "1.8.3" web3-eth-iban "1.0.0-beta.34" @@ -7750,7 +6734,6 @@ web3-core-helpers@1.0.0-beta.34: web3-core-method@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.34.tgz#ec163c8a2c490fa02a7ec15559fa7307fc7cc6dd" - integrity sha1-7BY8iixJD6AqfsFVWfpzB/x8xt0= dependencies: underscore "1.8.3" web3-core-helpers "1.0.0-beta.34" @@ -7761,7 +6744,6 @@ web3-core-method@1.0.0-beta.34: web3-core-promievent@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.34.tgz#a4f4fa6784bb293e82c60960ae5b56a94cd03edc" - integrity sha1-pPT6Z4S7KT6CxglgrltWqUzQPtw= dependencies: any-promise "1.3.0" eventemitter3 "1.1.1" @@ -7769,7 +6751,6 @@ web3-core-promievent@1.0.0-beta.34: web3-core-requestmanager@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.34.tgz#01f8f6cf2ae6b6f0b70c38bae1ef741b5bab215c" - integrity sha1-Afj2zyrmtvC3DDi64e90G1urIVw= dependencies: underscore "1.8.3" web3-core-helpers "1.0.0-beta.34" @@ -7780,7 +6761,6 @@ web3-core-requestmanager@1.0.0-beta.34: web3-core-subscriptions@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.34.tgz#9fed144033f221c3cf21060302ffdaf5ef2de2de" - integrity sha1-n+0UQDPyIcPPIQYDAv/a9e8t4t4= dependencies: eventemitter3 "1.1.1" underscore "1.8.3" @@ -7789,7 +6769,6 @@ web3-core-subscriptions@1.0.0-beta.34: web3-core@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.34.tgz#121be8555e9fb00d2c5d05ddd3381d0c9e46987e" - integrity sha1-EhvoVV6fsA0sXQXd0zgdDJ5GmH4= dependencies: web3-core-helpers "1.0.0-beta.34" web3-core-method "1.0.0-beta.34" @@ -7799,7 +6778,6 @@ web3-core@1.0.0-beta.34: web3-eth-abi@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz#034533e3aa2f7e59ff31793eaea685c0ed5af67a" - integrity sha1-A0Uz46ovfln/MXk+rqaFwO1a9no= dependencies: bn.js "4.11.6" underscore "1.8.3" @@ -7809,7 +6787,6 @@ web3-eth-abi@1.0.0-beta.34: web3-eth-accounts@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.34.tgz#e09142eeecc797ac3459b75e9b23946d3695f333" - integrity sha1-4JFC7uzHl6w0WbdemyOUbTaV8zM= dependencies: any-promise "1.3.0" crypto-browserify "3.12.0" @@ -7825,7 +6802,6 @@ web3-eth-accounts@1.0.0-beta.34: web3-eth-contract@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.34.tgz#9dbb38fae7643a808427a20180470ec7415c91e6" - integrity sha1-nbs4+udkOoCEJ6IBgEcOx0FckeY= dependencies: underscore "1.8.3" web3-core "1.0.0-beta.34" @@ -7839,7 +6815,6 @@ web3-eth-contract@1.0.0-beta.34: web3-eth-iban@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz#9af458605867ccf74ea979aaf326b38ba6a5ba0c" - integrity sha1-mvRYYFhnzPdOqXmq8yazi6alugw= dependencies: bn.js "4.11.6" web3-utils "1.0.0-beta.34" @@ -7847,7 +6822,6 @@ web3-eth-iban@1.0.0-beta.34: web3-eth-personal@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.34.tgz#9afba167342ebde5420bcd5895c3f6c34388f205" - integrity sha1-mvuhZzQuveVCC81YlcP2w0OI8gU= dependencies: web3-core "1.0.0-beta.34" web3-core-helpers "1.0.0-beta.34" @@ -7858,7 +6832,6 @@ web3-eth-personal@1.0.0-beta.34: web3-eth@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.34.tgz#74086000850c6fe6f535ef49837d6d4bb6113268" - integrity sha1-dAhgAIUMb+b1Ne9Jg31tS7YRMmg= dependencies: underscore "1.8.3" web3-core "1.0.0-beta.34" @@ -7876,7 +6849,6 @@ web3-eth@1.0.0-beta.34: web3-net@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.34.tgz#427cea2f431881449c8e38d523290f173f9ff63d" - integrity sha1-QnzqL0MYgUScjjjVIykPFz+f9j0= dependencies: web3-core "1.0.0-beta.34" web3-core-method "1.0.0-beta.34" @@ -7885,7 +6857,6 @@ web3-net@1.0.0-beta.34: web3-provider-engine@^13.8.0: version "13.8.0" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz#4c7c1ad2af5f1fe10343b8a65495879a2f9c00df" - integrity sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ== dependencies: async "^2.5.0" clone "^2.0.0" @@ -7910,7 +6881,6 @@ web3-provider-engine@^13.8.0: web3-provider-engine@^8.4.0: version "8.6.1" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-8.6.1.tgz#4d86e19e30caaf97df351511ec0f60136e5b30eb" - integrity sha1-TYbhnjDKr5ffNRUR7A9gE25bMOs= dependencies: async "^2.1.2" clone "^2.0.0" @@ -7930,7 +6900,6 @@ web3-provider-engine@^8.4.0: web3-providers-http@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.0.0-beta.34.tgz#e561b52bbb43766282007d40285bfe3550c27e7a" - integrity sha1-5WG1K7tDdmKCAH1AKFv+NVDCfno= dependencies: web3-core-helpers "1.0.0-beta.34" xhr2 "0.1.4" @@ -7938,7 +6907,6 @@ web3-providers-http@1.0.0-beta.34: web3-providers-ipc@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.34.tgz#a1b77f1a306d73649a9c039052e40cb71328d00a" - integrity sha1-obd/GjBtc2SanAOQUuQMtxMo0Ao= dependencies: oboe "2.1.3" underscore "1.8.3" @@ -7947,7 +6915,6 @@ web3-providers-ipc@1.0.0-beta.34: web3-providers-ws@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.34.tgz#7de70f1b83f2de36476772156becfef6e3516eb3" - integrity sha1-fecPG4Py3jZHZ3IVa+z+9uNRbrM= dependencies: underscore "1.8.3" web3-core-helpers "1.0.0-beta.34" @@ -7956,7 +6923,6 @@ web3-providers-ws@1.0.0-beta.34: web3-shh@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.34.tgz#975061d71eaec42ccee576f7bd8f70f03844afe0" - integrity sha1-l1Bh1x6uxCzO5Xb3vY9w8DhEr+A= dependencies: web3-core "1.0.0-beta.34" web3-core-method "1.0.0-beta.34" @@ -7966,7 +6932,6 @@ web3-shh@1.0.0-beta.34: web3-utils@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.34.tgz#9411fc39aaef39ca4e06169f762297d9ff020970" - integrity sha1-lBH8OarvOcpOBhafdiKX2f8CCXA= dependencies: bn.js "4.11.6" eth-lib "0.1.27" @@ -7979,7 +6944,6 @@ web3-utils@1.0.0-beta.34: web3@0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/web3/-/web3-0.19.1.tgz#e763d5b1107c4bc24abd4f8cbee1ba3659e6eb31" - integrity sha1-52PVsRB8S8JKvU+MvuG6Nlnm6zE= dependencies: bignumber.js "^4.0.2" crypto-js "^3.1.4" @@ -7990,7 +6954,6 @@ web3@0.19.1: web3@0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.2.tgz#c54dac5fc0e377399c04c1a6ecbb12e4513278d6" - integrity sha1-xU2sX8DjdzmcBMGm7LsS5FEyeNY= dependencies: bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git" crypto-js "^3.1.4" @@ -8001,7 +6964,6 @@ web3@0.20.2: web3@0.20.6: version "0.20.6" resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.6.tgz#3e97306ae024fb24e10a3d75c884302562215120" - integrity sha1-PpcwauAk+yThCj11yIQwJWIhUSA= dependencies: bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git" crypto-js "^3.1.4" @@ -8012,7 +6974,6 @@ web3@0.20.6: web3@1.0.0-beta.34: version "1.0.0-beta.34" resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.34.tgz#347e561b784098cb5563315f490479a1d91f2ab1" - integrity sha1-NH5WG3hAmMtVYzFfSQR5odkfKrE= dependencies: web3-bzz "1.0.0-beta.34" web3-core "1.0.0-beta.34" @@ -8025,7 +6986,6 @@ web3@1.0.0-beta.34: web3@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/web3/-/web3-0.16.0.tgz#a4554175cd462943035b1f1d39432f741c6b6019" - integrity sha1-pFVBdc1GKUMDWx8dOUMvdBxrYBk= dependencies: bignumber.js "git+https://github.com/debris/bignumber.js#master" crypto-js "^3.1.4" @@ -8035,7 +6995,6 @@ web3@^0.16.0: web3@^0.18.2, web3@^0.18.4: version "0.18.4" resolved "https://registry.yarnpkg.com/web3/-/web3-0.18.4.tgz#81ec1784145491f2eaa8955b31c06049e07c5e7d" - integrity sha1-gewXhBRUkfLqqJVbMcBgSeB8Xn0= dependencies: bignumber.js "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" crypto-js "^3.1.4" @@ -8046,7 +7005,6 @@ web3@^0.18.2, web3@^0.18.4: web3@^0.20.6: version "0.20.7" resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7" - integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ== dependencies: bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git" crypto-js "^3.1.4" @@ -8057,7 +7015,6 @@ web3@^0.20.6: webpack-sources@^1.0.1: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" @@ -8065,7 +7022,6 @@ webpack-sources@^1.0.1: webpack@^3.0.0: version "3.12.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74" - integrity sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ== dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" @@ -8102,46 +7058,38 @@ webpack@^3.0.0: whatwg-fetch@>=0.10.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= which@^1.1.1, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= winston@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e" - integrity sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4= dependencies: async "~1.0.0" colors "1.0.x" @@ -8154,7 +7102,6 @@ winston@2.1.x: winston@^2.3.1: version "2.4.4" resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.4.tgz#a01e4d1d0a103cf4eada6fc1f886b3110d71c34b" - integrity sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q== dependencies: async "~1.0.0" colors "1.0.x" @@ -8166,22 +7113,18 @@ winston@^2.3.1: wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -8189,19 +7132,16 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= dependencies: mkdirp "^0.5.1" ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: async-limiter "~1.0.0" safe-buffer "~5.1.0" @@ -8210,14 +7150,12 @@ ws@^3.0.0: xhr-request-promise@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz#343c44d1ee7726b8648069682d0f840c83b4261d" - integrity sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0= dependencies: xhr-request "^1.0.1" xhr-request@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== dependencies: buffer-to-arraybuffer "^0.0.5" object-assign "^4.1.1" @@ -8230,19 +7168,16 @@ xhr-request@^1.0.1: xhr2-cookies@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= dependencies: cookiejar "^2.1.1" xhr2@*, xhr2@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" - integrity sha1-f4dliEdxbbUCYyOBL4GMras4el8= xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3: version "2.5.0" resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== dependencies: global "~4.3.0" is-function "^1.0.1" @@ -8256,49 +7191,40 @@ xml@^1.0.0: xmlhttprequest@*, xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= xregexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= dependencies: object-keys "~0.4.0" y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= yaeti@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== yargs-parser@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= dependencies: camelcase "^3.0.0" lodash.assign "^4.0.6" @@ -8306,28 +7232,24 @@ yargs-parser@^2.4.1: yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= dependencies: camelcase "^4.1.0" yargs-parser@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== dependencies: camelcase "^4.1.0" yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= dependencies: camelcase "^4.1.0" yargs@11.1.0, yargs@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -8345,7 +7267,6 @@ yargs@11.1.0, yargs@^11.0.0: yargs@^10.0.3: version "10.1.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" - integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -8363,7 +7284,6 @@ yargs@^10.0.3: yargs@^4.6.0, yargs@^4.7.1: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= dependencies: cliui "^3.2.0" decamelize "^1.1.1" @@ -8383,7 +7303,6 @@ yargs@^4.6.0, yargs@^4.7.1: yargs@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= dependencies: camelcase "^4.1.0" cliui "^3.2.0" @@ -8402,7 +7321,6 @@ yargs@^8.0.2: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -8412,7 +7330,6 @@ yargs@~3.10.0: yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" From 47ed12cda159f4527e7e6dfb42abe07d1e83d6b0 Mon Sep 17 00:00:00 2001 From: satyam Date: Tue, 15 Jan 2019 17:02:16 +0530 Subject: [PATCH 02/16] small fix --- contracts/interfaces/ISecurityToken.sol | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/contracts/interfaces/ISecurityToken.sol b/contracts/interfaces/ISecurityToken.sol index 677f4932b..f44f7e8cd 100644 --- a/contracts/interfaces/ISecurityToken.sol +++ b/contracts/interfaces/ISecurityToken.sol @@ -124,8 +124,9 @@ interface ISecurityToken { */ function redeemFrom(address _tokenHolder, uint256 _value, bytes calldata _data) external; - event Minted(address indexed _to, uint256 _value); - event Burnt(address indexed _burner, uint256 _value); + // Issuance / Redemption Events + event Issued(address indexed _operator, address indexed _to, uint256 _value, bytes _data); + event Redeemed(address indexed _operator, address indexed _from, uint256 _value, bytes _data); /** * @notice Validate permissions with PermissionManager if it exists, If no Permission return false @@ -330,7 +331,7 @@ interface ISecurityToken { * @param _operatorData data attached to the transfer by controller to emit in event. (It is more like a reason string * for calling this function (aka force transfer) which provides the transparency on-chain). */ - function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external + function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external; /** * @notice This function allows an authorised address to redeem tokens for any token holder. @@ -394,5 +395,5 @@ interface ISecurityToken { * If a token returns FALSE for `isIssuable()` then it MUST never allow additional tokens to be issued. * @return bool `true` signifies the minting is allowed. While `false` denotes the end of minting */ - function isIssuable() external view returns (bool) + function isIssuable() external view returns (bool); } From 154cc9e6045ca36f47c7a1c1a53905f894bf8174 Mon Sep 17 00:00:00 2001 From: satyam Date: Thu, 17 Jan 2019 17:32:49 +0530 Subject: [PATCH 03/16] addition on delegate --- contracts/interfaces/ISecurityToken.sol | 6 +- contracts/interfaces/token/IERC1643.sol | 4 +- contracts/libraries/TokenLib.sol | 55 +--- contracts/mocks/MockRedemptionManager.sol | 2 +- .../Experimental/Burn/TrackedRedemption.sol | 2 +- contracts/modules/STO/CappedSTO.sol | 2 +- contracts/modules/STO/DummySTO.sol | 2 +- contracts/modules/STO/PreSaleSTO.sol | 2 +- contracts/modules/STO/USDTieredSTO.sol | 4 +- contracts/tokens/ERC20.sol | 219 ------------- contracts/tokens/OZStorage.sol | 20 ++ contracts/tokens/STFactory.sol | 7 +- contracts/tokens/STGetter.sol | 195 ++++++++++++ contracts/tokens/STGetterStorage.sol | 8 + contracts/tokens/SecurityToken.sol | 288 ++---------------- contracts/tokens/SecurityTokenStorage.sol | 117 +++++++ package.json | 1 + scripts/compareStorageLayout.js | 107 +++---- yarn.lock | 19 +- 19 files changed, 462 insertions(+), 598 deletions(-) delete mode 100644 contracts/tokens/ERC20.sol create mode 100644 contracts/tokens/OZStorage.sol create mode 100644 contracts/tokens/STGetter.sol create mode 100644 contracts/tokens/STGetterStorage.sol create mode 100644 contracts/tokens/SecurityTokenStorage.sol diff --git a/contracts/interfaces/ISecurityToken.sol b/contracts/interfaces/ISecurityToken.sol index 677f4932b..610b0dfb0 100644 --- a/contracts/interfaces/ISecurityToken.sol +++ b/contracts/interfaces/ISecurityToken.sol @@ -93,7 +93,7 @@ interface ISecurityToken { * @param _value The amount of tokens need to be issued * @param _data The `bytes _data` allows arbitrary data to be submitted alongside the transfer. */ - function issue(address _tokenHolder, uint256 _value, bytes memory _data) external; + function issue(address _tokenHolder, uint256 _value, bytes calldata _data) external; /** * @notice Mints new tokens and assigns them to the target _investor. @@ -330,7 +330,7 @@ interface ISecurityToken { * @param _operatorData data attached to the transfer by controller to emit in event. (It is more like a reason string * for calling this function (aka force transfer) which provides the transparency on-chain). */ - function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external + function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external; /** * @notice This function allows an authorised address to redeem tokens for any token holder. @@ -394,5 +394,5 @@ interface ISecurityToken { * If a token returns FALSE for `isIssuable()` then it MUST never allow additional tokens to be issued. * @return bool `true` signifies the minting is allowed. While `false` denotes the end of minting */ - function isIssuable() external view returns (bool) + function isIssuable() external view returns (bool); } diff --git a/contracts/interfaces/token/IERC1643.sol b/contracts/interfaces/token/IERC1643.sol index 00e6f6084..90ff408ce 100644 --- a/contracts/interfaces/token/IERC1643.sol +++ b/contracts/interfaces/token/IERC1643.sol @@ -6,10 +6,10 @@ pragma solidity ^0.5.0; interface IERC1643 { // Document Management - function getDocument(bytes32 _name) external view returns (string memory, bytes32, uint256); + //function getDocument(bytes32 _name) external view returns (string memory, bytes32, uint256); function setDocument(bytes32 _name, string calldata _uri, bytes32 _documentHash) external; function removeDocument(bytes32 _name) external; - function getAllDocuments() external view returns (bytes32[] memory); + //function getAllDocuments() external view returns (bytes32[] memory); // Document Events event DocumentRemoved(bytes32 indexed _name, string _uri, bytes32 _documentHash); diff --git a/contracts/libraries/TokenLib.sol b/contracts/libraries/TokenLib.sol index 93a6261b1..f6c07d89f 100644 --- a/contracts/libraries/TokenLib.sol +++ b/contracts/libraries/TokenLib.sol @@ -1,40 +1,15 @@ pragma solidity ^0.5.0; -import "../modules/PermissionManager/IPermissionManager.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "../interfaces/IPoly.sol"; -import "../interfaces/TransferManagerEnums.sol"; +import "../tokens/SecurityTokenStorage.sol"; import "../interfaces/ITransferManager.sol"; +import "../interfaces/TransferManagerEnums.sol"; +import "openzeppelin-solidity/contracts/math/SafeMath.sol"; +import "../modules/PermissionManager/IPermissionManager.sol"; library TokenLib { - using SafeMath for uint256; - // Struct for module data - struct ModuleData { - bytes32 name; - address module; - address moduleFactory; - bool isArchived; - uint8[] moduleTypes; - uint256[] moduleIndexes; - uint256 nameIndex; - bytes32 label; - } - - // Structures to maintain checkpoints of balances for governance / dividends - struct Checkpoint { - uint256 checkpointId; - uint256 value; - } - - struct InvestorDataStorage { - // List of investors who have ever held a non-zero token balance - mapping(address => bool) investorListed; - // List of token holders - address[] investors; - // Total number of non-zero token holders - uint256 investorCount; - } + using SafeMath for uint256; // Emit when Module is archived from the SecurityToken event ModuleArchived(uint8[] _types, address _module, uint256 _timestamp); @@ -50,7 +25,7 @@ library TokenLib { * @param _moduleData Storage data * @param _module Address of module to archive */ - function archiveModule(ModuleData storage _moduleData, address _module) public { + function archiveModule(SecurityTokenStorage.ModuleData storage _moduleData, address _module) public { require(!_moduleData.isArchived, "Module archived"); require(_moduleData.module != address(0), "Module missing"); /*solium-disable-next-line security/no-block-members*/ @@ -63,7 +38,7 @@ library TokenLib { * @param _moduleData Storage data * @param _module Address of module to unarchive */ - function unarchiveModule(ModuleData storage _moduleData, address _module) public { + function unarchiveModule(SecurityTokenStorage.ModuleData storage _moduleData, address _module) public { require(_moduleData.isArchived, "Module unarchived"); /*solium-disable-next-line security/no-block-members*/ emit ModuleUnarchived(_moduleData.moduleTypes, _module, now); @@ -77,7 +52,7 @@ library TokenLib { function removeModule( address _module, mapping(uint8 => address[]) storage _modules, - mapping(address => ModuleData) storage _modulesToData, + mapping(address => SecurityTokenStorage.ModuleData) storage _modulesToData, mapping(bytes32 => address[]) storage _names ) public @@ -112,7 +87,7 @@ library TokenLib { uint8 _type, uint256 _index, mapping(uint8 => address[]) storage _modules, - mapping(address => ModuleData) storage _modulesToData + mapping(address => SecurityTokenStorage.ModuleData) storage _modulesToData ) internal { @@ -142,7 +117,7 @@ library TokenLib { uint256 _change, bool _increase, address _polyToken, - mapping(address => ModuleData) storage _modulesToData + mapping(address => SecurityTokenStorage.ModuleData) storage _modulesToData ) public { @@ -190,7 +165,7 @@ library TokenLib { * @param _currentValue is the Current value of checkpoint * @return uint256 */ - function getValueAt(Checkpoint[] storage _checkpoints, uint256 _checkpointId, uint256 _currentValue) public view returns(uint256) { + function getValueAt(SecurityTokenStorage.Checkpoint[] storage _checkpoints, uint256 _checkpointId, uint256 _currentValue) public view returns(uint256) { //Checkpoint id 0 is when the token is first created - everyone has a zero balance if (_checkpointId == 0) { return 0; @@ -229,7 +204,7 @@ library TokenLib { * @param _checkpoints is the affected checkpoint object array * @param _newValue is the new value that needs to be stored */ - function adjustCheckpoints(TokenLib.Checkpoint[] storage _checkpoints, uint256 _newValue, uint256 _currentCheckpointId) public { + function adjustCheckpoints(SecurityTokenStorage.Checkpoint[] storage _checkpoints, uint256 _newValue, uint256 _currentCheckpointId) public { //No checkpoints set yet if (_currentCheckpointId == 0) { return; @@ -239,7 +214,7 @@ library TokenLib { return; } //New checkpoint, so record balance - _checkpoints.push(TokenLib.Checkpoint({checkpointId: _currentCheckpointId, value: _newValue})); + _checkpoints.push(SecurityTokenStorage.Checkpoint({checkpointId: _currentCheckpointId, value: _newValue})); } /** @@ -252,7 +227,7 @@ library TokenLib { * @param _balanceFrom Balance of the _from address */ function adjustInvestorCount( - InvestorDataStorage storage _investorData, + SecurityTokenStorage.InvestorDataStorage storage _investorData, address _from, address _to, uint256 _value, @@ -294,7 +269,7 @@ library TokenLib { */ function verifyTransfer( address[] storage modules, - mapping(address => ModuleData) storage modulesToData, + mapping(address => SecurityTokenStorage.ModuleData) storage modulesToData, address from, address to, uint256 value, diff --git a/contracts/mocks/MockRedemptionManager.sol b/contracts/mocks/MockRedemptionManager.sol index f5d117497..6ba5994d4 100644 --- a/contracts/mocks/MockRedemptionManager.sol +++ b/contracts/mocks/MockRedemptionManager.sol @@ -35,7 +35,7 @@ contract MockRedemptionManager is TrackedRedemption { require(tokenToRedeem[msg.sender] >= _value, "Insufficient tokens redeemable"); tokenToRedeem[msg.sender] = tokenToRedeem[msg.sender].sub(_value); redeemedTokens[msg.sender] = redeemedTokens[msg.sender].add(_value); - ISecurityToken(securityToken).burnWithData(_value, ""); + ISecurityToken(securityToken).redeem(_value, ""); /*solium-disable-next-line security/no-block-members*/ emit RedeemedTokenByOwner(msg.sender, address(this), _value, now); } diff --git a/contracts/modules/Experimental/Burn/TrackedRedemption.sol b/contracts/modules/Experimental/Burn/TrackedRedemption.sol index 9b86ef82f..3300c6179 100644 --- a/contracts/modules/Experimental/Burn/TrackedRedemption.sol +++ b/contracts/modules/Experimental/Burn/TrackedRedemption.sol @@ -35,7 +35,7 @@ contract TrackedRedemption is IBurn, Module { * @param _value The number of tokens to redeem */ function redeemTokens(uint256 _value) public { - ISecurityToken(securityToken).burnFromWithData(msg.sender, _value, ""); + ISecurityToken(securityToken).redeemFrom(msg.sender, _value, ""); redeemedTokens[msg.sender] = redeemedTokens[msg.sender].add(_value); /*solium-disable-next-line security/no-block-members*/ emit Redeemed(msg.sender, _value, now); diff --git a/contracts/modules/STO/CappedSTO.sol b/contracts/modules/STO/CappedSTO.sol index 3c7adcd0b..35ccb79a7 100644 --- a/contracts/modules/STO/CappedSTO.sol +++ b/contracts/modules/STO/CappedSTO.sol @@ -222,7 +222,7 @@ contract CappedSTO is CappedSTOStorage, STO, ReentrancyGuard { * @param _tokenAmount Number of tokens to be emitted */ function _deliverTokens(address _beneficiary, uint256 _tokenAmount) internal { - require(ISecurityToken(securityToken).mint(_beneficiary, _tokenAmount), "Error in minting the tokens"); + ISecurityToken(securityToken).issue(_beneficiary, _tokenAmount, ""); } /** diff --git a/contracts/modules/STO/DummySTO.sol b/contracts/modules/STO/DummySTO.sol index 5a4e5e560..7650a1220 100644 --- a/contracts/modules/STO/DummySTO.sol +++ b/contracts/modules/STO/DummySTO.sol @@ -48,7 +48,7 @@ contract DummySTO is DummySTOStorage, STO { function generateTokens(address _investor, uint256 _amount) public withPerm(ADMIN) { require(!paused, "Should not be paused"); require(_amount > 0, "Amount should be greater than 0"); - ISecurityToken(securityToken).mint(_investor, _amount); + ISecurityToken(securityToken).issue(_investor, _amount, ""); if (investors[_investor] == 0) { investorCount = investorCount + 1; } diff --git a/contracts/modules/STO/PreSaleSTO.sol b/contracts/modules/STO/PreSaleSTO.sol index 09f4a1ce9..7a918f875 100644 --- a/contracts/modules/STO/PreSaleSTO.sol +++ b/contracts/modules/STO/PreSaleSTO.sol @@ -79,7 +79,7 @@ contract PreSaleSTO is PreSaleSTOStorage, STO { /*solium-disable-next-line security/no-block-members*/ require(now <= endTime, "Already passed Endtime"); require(_amount > 0, "No. of tokens provided should be greater the zero"); - ISecurityToken(securityToken).mint(_investor, _amount); + ISecurityToken(securityToken).issue(_investor, _amount, ""); if (investors[_investor] == uint256(0)) { investorCount = investorCount.add(1); } diff --git a/contracts/modules/STO/USDTieredSTO.sol b/contracts/modules/STO/USDTieredSTO.sol index cea3a45f5..18487c753 100644 --- a/contracts/modules/STO/USDTieredSTO.sol +++ b/contracts/modules/STO/USDTieredSTO.sol @@ -259,7 +259,7 @@ contract USDTieredSTO is USDTieredSTOStorage, STO, ReentrancyGuard { tiers[i].mintedTotal = tiers[i].tokenTotal; } } - require(ISecurityToken(securityToken).mint(reserveWallet, tempReturned), "Error in minting"); + ISecurityToken(securityToken).issue(reserveWallet, tempReturned, ""); emit ReserveTokenMint(msg.sender, reserveWallet, tempReturned, currentTier); finalAmountReturned = tempReturned; totalTokensSold = tempSold; @@ -588,7 +588,7 @@ contract USDTieredSTO is USDTieredSTOStorage, STO, ReentrancyGuard { { (spentUSD, purchasedTokens, gotoNextTier) = _purchaseTierAmount(_tierPrice, _tierRemaining, _investedUSD); if (purchasedTokens > 0) { - require(ISecurityToken(securityToken).mint(_beneficiary, purchasedTokens), "Error in minting"); + ISecurityToken(securityToken).issue(_beneficiary, purchasedTokens, ""); emit TokenPurchase(msg.sender, _beneficiary, purchasedTokens, spentUSD, _tierPrice, _tier); } } diff --git a/contracts/tokens/ERC20.sol b/contracts/tokens/ERC20.sol deleted file mode 100644 index c60379fc6..000000000 --- a/contracts/tokens/ERC20.sol +++ /dev/null @@ -1,219 +0,0 @@ -pragma solidity ^0.5.0; - -import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "openzeppelin-solidity/contracts/math/SafeMath.sol"; - -contract ERC20 is IERC20 { - - using SafeMath for uint256; - - mapping (address => uint256) internal _balances; - - mapping (address => mapping (address => uint256)) internal _allowed; - - uint256 private _totalSupply; - - /** - * @dev Total number of tokens in existence - */ - function totalSupply() public view returns (uint256) { - return _totalSupply; - } - - /** - * @dev Gets the balance of the specified address. - * @param owner The address to query the balance of. - * @return An uint256 representing the amount owned by the passed address. - */ - function balanceOf(address owner) public view returns (uint256) { - return _balances[owner]; - } - - /** - * @dev Function to check the amount of tokens that an owner allowed to a spender. - * @param owner address The address which owns the funds. - * @param spender address The address which will spend the funds. - * @return A uint256 specifying the amount of tokens still available for the spender. - */ - function allowance( - address owner, - address spender - ) - public - view - returns (uint256) - { - return _allowed[owner][spender]; - } - - /** - * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. - * Beware that changing an allowance with this method brings the risk that someone may use both the old - * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this - * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * @param spender The address which will spend the funds. - * @param value The amount of tokens to be spent. - */ - function approve(address spender, uint256 value) public returns (bool) { - require(spender != address(0)); - - _allowed[msg.sender][spender] = value; - emit Approval(msg.sender, spender, value); - return true; - } - - /** - * @dev Transfer token for a specified address - * @param to The address to transfer to. - * @param value The amount to be transferred. - */ - function transfer(address to, uint256 value) public returns (bool) { - _transfer(msg.sender, to, value); - return true; - } - - /** - * @dev Transfer tokens from one address to another - * @param from address The address which you want to send tokens from - * @param to address The address which you want to transfer to - * @param value uint256 the amount of tokens to be transferred - */ - function transferFrom( - address from, - address to, - uint256 value - ) - public - returns (bool) - { - _transferFrom(msg.sender, from, to, value); - return true; - } - - function _transferFrom( - address spender, - address from, - address to, - uint256 value - ) - internal - { - require(value <= _allowed[from][spender]); - - _allowed[from][spender] = _allowed[from][spender].sub(value); - _transfer(from, to, value); - } - - /** - * @dev Increase the amount of tokens that an owner allowed to a spender. - * approve should be called when allowed_[_spender] == 0. To increment - * allowed value is better to use this function to avoid 2 calls (and wait until - * the first transaction is mined) - * From MonolithDAO Token.sol - * @param spender The address which will spend the funds. - * @param addedValue The amount of tokens to increase the allowance by. - */ - function increaseAllowance( - address spender, - uint256 addedValue - ) - public - returns (bool) - { - require(spender != address(0)); - - _allowed[msg.sender][spender] = ( - _allowed[msg.sender][spender].add(addedValue)); - emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); - return true; - } - - /** - * @dev Decrease the amount of tokens that an owner allowed to a spender. - * approve should be called when allowed_[_spender] == 0. To decrement - * allowed value is better to use this function to avoid 2 calls (and wait until - * the first transaction is mined) - * From MonolithDAO Token.sol - * @param spender The address which will spend the funds. - * @param subtractedValue The amount of tokens to decrease the allowance by. - */ - function decreaseAllowance( - address spender, - uint256 subtractedValue - ) - public - returns (bool) - { - require(spender != address(0)); - - _allowed[msg.sender][spender] = ( - _allowed[msg.sender][spender].sub(subtractedValue)); - emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); - return true; - } - - /** - * @dev Transfer token for a specified addresses - * @param from The address to transfer from. - * @param to The address to transfer to. - * @param value The amount to be transferred. - */ - function _transfer(address from, address to, uint256 value) internal { - require(value <= _balances[from]); - require(to != address(0)); - _balances[from] = _balances[from].sub(value); - _balances[to] = _balances[to].add(value); - emit Transfer(from, to, value); - } - - /** - * @dev Internal function that mints an amount of the token and assigns it to - * an account. This encapsulates the modification of balances such that the - * proper events are emitted. - * @param account The account that will receive the created tokens. - * @param value The amount that will be created. - */ - function _mint(address account, uint256 value) internal { - require(account != address(0)); - _totalSupply = _totalSupply.add(value); - _balances[account] = _balances[account].add(value); - emit Transfer(address(0), account, value); - } - - /** - * @dev Internal function that burns an amount of the token of a given - * account. - * @param account The account whose tokens will be burnt. - * @param value The amount that will be burnt. - */ - function _burn(address account, uint256 value) internal { - require(account != address(0)); - require(value <= _balances[account]); - - _totalSupply = _totalSupply.sub(value); - _balances[account] = _balances[account].sub(value); - emit Transfer(account, address(0), value); - } - - /** - * @dev Internal function that burns an amount of the token of a given - * account, deducting from the sender's allowance for said account. Uses the - * internal burn function. - * @param account The account whose tokens will be burnt. - * @param value The amount that will be burnt. - */ - function _burnFrom(address account, uint256 value) internal { - require(value <= _allowed[account][msg.sender]); - - // Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted, - // this function needs to emit an event with the updated approval. - _allowed[account][msg.sender] = _allowed[account][msg.sender].sub( - value); - _burn(account, value); - } -} - - - - diff --git a/contracts/tokens/OZStorage.sol b/contracts/tokens/OZStorage.sol new file mode 100644 index 000000000..75f623697 --- /dev/null +++ b/contracts/tokens/OZStorage.sol @@ -0,0 +1,20 @@ +pragma solidity ^0.5.0; + +contract OZStorage { + + mapping (address => uint256) private _balances; + + mapping (address => mapping (address => uint256)) private _allowed; + + uint256 private _totalSupply; + + string private _name; + string private _symbol; + uint8 private _decimals; + + address private _owner; + + /// @dev counter to allow mutex lock with only one SSTORE operation + uint256 private _guardCounter; + +} \ No newline at end of file diff --git a/contracts/tokens/STFactory.sol b/contracts/tokens/STFactory.sol index 702d118f8..fb8f5b0ea 100644 --- a/contracts/tokens/STFactory.sol +++ b/contracts/tokens/STFactory.sol @@ -8,9 +8,11 @@ import "../interfaces/ISTFactory.sol"; */ contract STFactory is ISTFactory { address public transferManagerFactory; + address public stDelegate; - constructor(address _transferManagerFactory) public { + constructor(address _transferManagerFactory, address _stDelegate) public { transferManagerFactory = _transferManagerFactory; + stDelegate = _stDelegate; } /** @@ -35,7 +37,8 @@ contract STFactory is ISTFactory { _decimals, _divisible ? 1 : uint256(10) ** _decimals, _tokenDetails, - _polymathRegistry + _polymathRegistry, + stDelegate ); newSecurityToken.addModule(transferManagerFactory, "", 0, 0); newSecurityToken.transferOwnership(_issuer); diff --git a/contracts/tokens/STGetter.sol b/contracts/tokens/STGetter.sol new file mode 100644 index 000000000..642b165c4 --- /dev/null +++ b/contracts/tokens/STGetter.sol @@ -0,0 +1,195 @@ +pragma solidity ^0.5.0; + +import "./STGetterStorage.sol"; +import "../libraries/TokenLib.sol"; +import "openzeppelin-solidity/contracts/math/SafeMath.sol"; + +contract STGetter is STGetterStorage { + + using SafeMath for uint256; + + /** + * @notice Used to return the details of a document with a known name (`bytes32`). + * @param _name Name of the document + * @return string The URI associated with the document. + * @return bytes32 The hash (of the contents) of the document. + * @return uint256 the timestamp at which the document was last modified. + */ + function getDocument(bytes32 _name) external view returns (string memory, bytes32, uint256) { + return ( + _documents[_name].uri, + _documents[_name].docHash, + _documents[_name].lastModified + ); + } + + /** + * @notice Used to retrieve a full list of documents attached to the smart contract. + * @return bytes32 List of all documents names present in the contract. + */ + function getAllDocuments() external view returns (bytes32[] memory) { + return _docNames; + } + + /** + * @notice Gets list of times that checkpoints were created + * @return List of checkpoint times + */ + function getCheckpointTimes() external view returns(uint256[] memory) { + return checkpointTimes; + } + + /** + * @notice Returns the investor count + * @return Investor count + */ + function getInvestorCount() external view returns(uint256) { + return investorData.investorCount; + } + + /** + * @notice returns an array of investors + * NB - this length may differ from investorCount as it contains all investors that ever held tokens + * @return list of addresses + */ + function getInvestors() external view returns(address[] memory) { + return investorData.investors; + } + + /** + * @notice returns an array of investors at a given checkpoint + * NB - this length may differ from investorCount as it contains all investors that ever held tokens + * @param _checkpointId Checkpoint id at which investor list is to be populated + * @return list of investors + */ + function getInvestorsAt(uint256 _checkpointId) external view returns(address[] memory) { + uint256 count = 0; + uint256 i; + for (i = 0; i < investorData.investors.length; i++) { + if (balanceOfAt(investorData.investors[i], _checkpointId) > 0) { + count++; + } + } + address[] memory investors = new address[](count); + count = 0; + for (i = 0; i < investorData.investors.length; i++) { + if (balanceOfAt(investorData.investors[i], _checkpointId) > 0) { + investors[count] = investorData.investors[i]; + count++; + } + } + return investors; + } + + /** + * @notice Returns the data associated to a module + * @param _module address of the module + * @return bytes32 name + * @return address module address + * @return address module factory address + * @return bool module archived + * @return uint8 array of module types + * @return bytes32 module label + */ + function getModule(address _module) external view returns(bytes32, address, address, bool, uint8[] memory, bytes32) { + return (modulesToData[_module].name, modulesToData[_module].module, modulesToData[_module].moduleFactory, modulesToData[_module].isArchived, modulesToData[_module].moduleTypes, modulesToData[_module].label); + } + + /** + * @notice Returns a list of modules that match the provided name + * @param _name name of the module + * @return address[] list of modules with this name + */ + function getModulesByName(bytes32 _name) external view returns(address[] memory) { + return names[_name]; + } + + /** + * @notice Returns a list of modules that match the provided module type + * @param _type type of the module + * @return address[] list of modules with this type + */ + function getModulesByType(uint8 _type) external view returns(address[] memory) { + return modules[_type]; + } + + /** + * @notice Queries balances as of a defined checkpoint + * @param _investor Investor to query balance for + * @param _checkpointId Checkpoint ID to query as of + */ + function balanceOfAt(address _investor, uint256 _checkpointId) public view returns(uint256) { + require(_checkpointId <= currentCheckpointId); + return TokenLib.getValueAt(checkpointBalances[_investor], _checkpointId, balanceOf(_investor)); + } + + /** + * @notice Queries totalSupply as of a defined checkpoint + * @param _checkpointId Checkpoint ID to query + * @return uint256 + */ + function totalSupplyAt(uint256 _checkpointId) external view returns(uint256) { + require(_checkpointId <= currentCheckpointId); + return TokenLib.getValueAt(checkpointTotalSupply, _checkpointId, totalSupply()); + } + + function totalSupply() internal view returns (uint256) { + return 0; + } + + function balanceOf(address _investor) internal view returns(uint256) { + return 0; + } + + /** + * @notice generates subset of investors + * NB - can be used in batches if investor list is large + * @param _start Position of investor to start iteration from + * @param _end Position of investor to stop iteration at + * @return list of investors + */ + function iterateInvestors(uint256 _start, uint256 _end) external view returns(address[] memory) { + require(_end <= investorData.investors.length, "Invalid end"); + address[] memory investors = new address[](_end.sub(_start)); + uint256 index = 0; + for (uint256 i = _start; i < _end; i++) { + investors[index] = investorData.investors[i]; + index++; + } + return investors; + } + + /** + * @notice Validate permissions with PermissionManager if it exists, If no Permission return false + * @dev Note that IModule withPerm will allow ST owner all permissions anyway + * @dev this allows individual modules to override this logic if needed (to not allow ST owner all permissions) + * @param _delegate address of delegate + * @param _module address of PermissionManager module + * @param _perm the permissions + * @return success + */ + function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool) { + for (uint256 i = 0; i < modules[PERMISSION_KEY].length; i++) { + if (!modulesToData[modules[PERMISSION_KEY][i]].isArchived) + return TokenLib.checkPermission( + modules[PERMISSION_KEY], + _delegate, + _module, + _perm + ); + } + return false; + } + + /** + * @notice Returns the version of the SecurityToken + */ + function getVersion() external view returns(uint8[] memory) { + uint8[] memory _version = new uint8[](3); + _version[0] = securityTokenVersion.major; + _version[1] = securityTokenVersion.minor; + _version[2] = securityTokenVersion.patch; + return _version; + } + +} \ No newline at end of file diff --git a/contracts/tokens/STGetterStorage.sol b/contracts/tokens/STGetterStorage.sol new file mode 100644 index 000000000..b2f1baebd --- /dev/null +++ b/contracts/tokens/STGetterStorage.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.5.0; + +import "./OZStorage.sol"; +import "./SecurityTokenStorage.sol"; + +contract STGetterStorage is OZStorage, SecurityTokenStorage { + +} \ No newline at end of file diff --git a/contracts/tokens/SecurityToken.sol b/contracts/tokens/SecurityToken.sol index 168b67b29..9aaa09353 100644 --- a/contracts/tokens/SecurityToken.sol +++ b/contracts/tokens/SecurityToken.sol @@ -1,10 +1,11 @@ pragma solidity ^0.5.0; -import "./ERC20.sol"; -import "../RegistryUpdater.sol"; +import "../proxy/Proxy.sol"; +import "../PolymathRegistry.sol"; import "../libraries/KindMath.sol"; -import "../libraries/TokenLib.sol"; import "../interfaces/IModule.sol"; +import "./SecurityTokenStorage.sol"; +import "../libraries/TokenLib.sol"; import "../interfaces/IModuleFactory.sol"; import "../interfaces/token/IERC1594.sol"; import "../interfaces/token/IERC1643.sol"; @@ -12,6 +13,9 @@ import "../interfaces/token/IERC1644.sol"; import "../interfaces/IModuleRegistry.sol"; import "../interfaces/IFeatureRegistry.sol"; import "../interfaces/ITransferManager.sol"; +import "openzeppelin-solidity/contracts/utils/Address.sol"; +import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; +import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; @@ -25,87 +29,10 @@ import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; * @notice - ST does not inherit from ISecurityToken due to: * @notice - https://github.com/ethereum/solidity/issues/4847 */ -contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater, IERC1594, IERC1643, IERC1644 { +contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, SecurityTokenStorage, IERC1594, IERC1643, IERC1644, Proxy { using SafeMath for uint256; - TokenLib.InvestorDataStorage investorData; - - uint8 constant PERMISSION_KEY = 1; - uint8 constant TRANSFER_KEY = 2; - uint8 constant MINT_KEY = 3; - uint8 constant CHECKPOINT_KEY = 4; - uint8 constant BURN_KEY = 5; - - uint256 public granularity; - - // Used to permanently halt controller actions - bool public controllerDisabled; - - // Used to temporarily halt all transactions - bool public transfersFrozen; - - // Value of current checkpoint - uint256 public currentCheckpointId; - - // Records added modules - module list should be order agnostic! - mapping(uint8 => address[]) modules; - - // Records information about the module - mapping(address => TokenLib.ModuleData) modulesToData; - - // Records added module names - module list should be order agnostic! - mapping(bytes32 => address[]) names; - - // Map each investor to a series of checkpoints - mapping(address => TokenLib.Checkpoint[]) checkpointBalances; - - // List of checkpoints that relate to total supply - TokenLib.Checkpoint[] checkpointTotalSupply; - - // Times at which each checkpoint was created - uint256[] checkpointTimes; - - ////////////////////////// - /// Document datastructure - ////////////////////////// - - struct Document { - bytes32 docHash; // Hash of the document - uint256 lastModified; // Timestamp at which document details was last modified - string uri; // URI of the document that exist off-chain - } - - // Used to hold the semantic version data - struct SemanticVersion { - uint8 major; - uint8 minor; - uint8 patch; - } - - SemanticVersion securityTokenVersion; - - // off-chain data - string public tokenDetails; - - // mapping to store the documents details in the document - mapping(bytes32 => Document) internal _documents; - // mapping to store the document name indexes - mapping(bytes32 => uint256) internal _docIndexes; - // Array use to store all the document name present in the contracts - bytes32[] _docNames; - - - // Variable which tells whether issuance is ON or OFF forever - // Implementers need to implement one more function to reset the value of `issuance` variable - // to false. That function is not a part of the standard (EIP-1594) as it is depend on the various factors - // issuer, followed compliance rules etc. So issuers have the choice how they want to close the issuance. - bool internal issuance = true; - - // Address of the controller which is a delegated entity - // set by the issuer/owner of the token - address public controller; - // Emit when transfers are frozen or unfrozen event FreezeTransfers(bool _status, uint256 _timestamp); // Emit when is permanently frozen by the issuer @@ -195,6 +122,7 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater * @param _granularity granular level of the token * @param _tokenDetails Details of the token that are stored off-chain * @param _polymathRegistry Contract address of the polymath registry + * @param _delegate Contract address of the delegate */ constructor( string memory _name, @@ -202,14 +130,18 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater uint8 _decimals, uint256 _granularity, string memory _tokenDetails, - address _polymathRegistry + address _polymathRegistry, + address _delegate ) public ERC20Detailed(_name, _symbol, _decimals) - RegistryUpdater(_polymathRegistry) { + require(_polymathRegistry != address(0), "Invalid address"); + require(_delegate != address(0), "Invalid address"); + polymathRegistry = _polymathRegistry; //When it is created, the owner is the STR updateFromRegistry(); + delegate = _delegate; tokenDetails = _tokenDetails; granularity = _granularity; securityTokenVersion = SemanticVersion(2, 0, 0); @@ -257,7 +189,7 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater moduleIndexes[i] = modules[moduleTypes[i]].length; modules[moduleTypes[i]].push(module); } - modulesToData[module] = TokenLib.ModuleData( + modulesToData[module] = ModuleData( moduleName, module, _moduleFactory, @@ -304,38 +236,6 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater TokenLib.removeModule(_module, modules, modulesToData, names); } - /** - * @notice Returns the data associated to a module - * @param _module address of the module - * @return bytes32 name - * @return address module address - * @return address module factory address - * @return bool module archived - * @return uint8 array of module types - * @return bytes32 module label - */ - function getModule(address _module) external view returns(bytes32, address, address, bool, uint8[] memory, bytes32) { - return (modulesToData[_module].name, modulesToData[_module].module, modulesToData[_module].moduleFactory, modulesToData[_module].isArchived, modulesToData[_module].moduleTypes, modulesToData[_module].label); - } - - /** - * @notice Returns a list of modules that match the provided name - * @param _name name of the module - * @return address[] list of modules with this name - */ - function getModulesByName(bytes32 _name) external view returns(address[] memory) { - return names[_name]; - } - - /** - * @notice Returns a list of modules that match the provided module type - * @param _type type of the module - * @return address[] list of modules with this type - */ - function getModulesByType(uint8 _type) external view returns(address[] memory) { - return modules[_type]; - } - /** * @notice Allows the owner to withdraw unspent POLY stored by them on the ST or any ERC20 token. * @dev Owner can transfer POLY to the ST which will be used to pay for modules that require a POLY fee. @@ -387,66 +287,6 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater TokenLib.adjustInvestorCount(investorData, _from, _to, _value, balanceOf(_to), balanceOf(_from)); } - /** - * @notice returns an array of investors - * NB - this length may differ from investorCount as it contains all investors that ever held tokens - * @return list of addresses - */ - function getInvestors() external view returns(address[] memory) { - return investorData.investors; - } - - /** - * @notice returns an array of investors at a given checkpoint - * NB - this length may differ from investorCount as it contains all investors that ever held tokens - * @param _checkpointId Checkpoint id at which investor list is to be populated - * @return list of investors - */ - function getInvestorsAt(uint256 _checkpointId) external view returns(address[] memory) { - uint256 count = 0; - uint256 i; - for (i = 0; i < investorData.investors.length; i++) { - if (balanceOfAt(investorData.investors[i], _checkpointId) > 0) { - count++; - } - } - address[] memory investors = new address[](count); - count = 0; - for (i = 0; i < investorData.investors.length; i++) { - if (balanceOfAt(investorData.investors[i], _checkpointId) > 0) { - investors[count] = investorData.investors[i]; - count++; - } - } - return investors; - } - - /** - * @notice generates subset of investors - * NB - can be used in batches if investor list is large - * @param _start Position of investor to start iteration from - * @param _end Position of investor to stop iteration at - * @return list of investors - */ - function iterateInvestors(uint256 _start, uint256 _end) external view returns(address[] memory) { - require(_end <= investorData.investors.length, "Invalid end"); - address[] memory investors = new address[](_end.sub(_start)); - uint256 index = 0; - for (uint256 i = _start; i < _end; i++) { - investors[index] = investorData.investors[i]; - index++; - } - return investors; - } - - /** - * @notice Returns the investor count - * @return Investor count - */ - function getInvestorCount() external view returns(uint256) { - return investorData.investorCount; - } - /** * @notice freezes transfers */ @@ -710,27 +550,6 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater emit Redeemed(msg.sender, _tokenHolder, _value, _data); } - /** - * @notice Validate permissions with PermissionManager if it exists, If no Permission return false - * @dev Note that IModule withPerm will allow ST owner all permissions anyway - * @dev this allows individual modules to override this logic if needed (to not allow ST owner all permissions) - * @param _delegate address of delegate - * @param _module address of PermissionManager module - * @param _perm the permissions - * @return success - */ - function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool) { - for (uint256 i = 0; i < modules[PERMISSION_KEY].length; i++) { - if (!modulesToData[modules[PERMISSION_KEY][i]].isArchived) return TokenLib.checkPermission( - modules[PERMISSION_KEY], - _delegate, - _module, - _perm - ); - } - return false; - } - /** * @notice Creates a checkpoint that can be used to query historical balances / totalSuppy * @return uint256 @@ -745,34 +564,6 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater return currentCheckpointId; } - /** - * @notice Gets list of times that checkpoints were created - * @return List of checkpoint times - */ - function getCheckpointTimes() external view returns(uint256[] memory) { - return checkpointTimes; - } - - /** - * @notice Queries totalSupply as of a defined checkpoint - * @param _checkpointId Checkpoint ID to query - * @return uint256 - */ - function totalSupplyAt(uint256 _checkpointId) external view returns(uint256) { - require(_checkpointId <= currentCheckpointId); - return TokenLib.getValueAt(checkpointTotalSupply, _checkpointId, totalSupply()); - } - - /** - * @notice Queries balances as of a defined checkpoint - * @param _investor Investor to query balance for - * @param _checkpointId Checkpoint ID to query as of - */ - function balanceOfAt(address _investor, uint256 _checkpointId) public view returns(uint256) { - require(_checkpointId <= currentCheckpointId); - return TokenLib.getValueAt(checkpointBalances[_investor], _checkpointId, balanceOf(_investor)); - } - /** * @notice Used by the issuer to set the controller addresses * @param _controller address of the controller @@ -827,7 +618,7 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater */ function canTransferFrom(address _from, address _to, uint256 _value, bytes calldata _data) external view returns (bool, byte, bytes32) { (bool success, byte reasonCode, bytes32 appCode) = _canTransfer(_from, _to, _value, _data); - if (success && _value > _allowed[_from][msg.sender]) { + if (success && _value > allowance(_from, msg.sender)) { return (false, 0x53, bytes32(0)); } else return (success, reasonCode, appCode); @@ -844,13 +635,13 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater if (!success) return (false, 0x50, bytes32(reasonCode)); - else if (_balances[_from] < _value) + else if (balanceOf(_from) < _value) return (false, 0x52, bytes32(0)); else if (_to == address(0)) return (false, 0x57, bytes32(0)); - else if (!KindMath.checkAdd(_balances[_to], _value)) + else if (!KindMath.checkAdd(balanceOf(_to), _value)) return (false, 0x50, bytes32(0)); return (true, 0x51, bytes32(0)); } @@ -890,29 +681,6 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater delete _documents[_name]; } - /** - * @notice Used to return the details of a document with a known name (`bytes32`). - * @param _name Name of the document - * @return string The URI associated with the document. - * @return bytes32 The hash (of the contents) of the document. - * @return uint256 the timestamp at which the document was last modified. - */ - function getDocument(bytes32 _name) external view returns (string memory, bytes32, uint256) { - return ( - _documents[_name].uri, - _documents[_name].docHash, - _documents[_name].lastModified - ); - } - - /** - * @notice Used to retrieve a full list of documents attached to the smart contract. - * @return bytes32 List of all documents names present in the contract. - */ - function getAllDocuments() external view returns (bytes32[] memory) { - return _docNames; - } - /** * @notice Internal function to know whether the controller functionality * allowed or not. @@ -969,15 +737,15 @@ contract SecurityToken is ERC20, ERC20Detailed, ReentrancyGuard, RegistryUpdater emit ControllerRedemption(msg.sender, _tokenHolder, _value, _data, _operatorData); } - /** - * @notice Returns the version of the SecurityToken - */ - function getVersion() external view returns(uint8[] memory) { - uint8[] memory _version = new uint8[](3); - _version[0] = securityTokenVersion.major; - _version[1] = securityTokenVersion.minor; - _version[2] = securityTokenVersion.patch; - return _version; + function _implementation() internal view returns(address) { + return delegate; + } + + function updateFromRegistry() public onlyOwner { + moduleRegistry = PolymathRegistry(polymathRegistry).getAddress("ModuleRegistry"); + securityTokenRegistry = PolymathRegistry(polymathRegistry).getAddress("SecurityTokenRegistry"); + featureRegistry = PolymathRegistry(polymathRegistry).getAddress("FeatureRegistry"); + polyToken = PolymathRegistry(polymathRegistry).getAddress("PolyToken"); } } \ No newline at end of file diff --git a/contracts/tokens/SecurityTokenStorage.sol b/contracts/tokens/SecurityTokenStorage.sol new file mode 100644 index 000000000..0fe3cc1d4 --- /dev/null +++ b/contracts/tokens/SecurityTokenStorage.sol @@ -0,0 +1,117 @@ +pragma solidity ^0.5.0; + +contract SecurityTokenStorage { + + uint8 constant PERMISSION_KEY = 1; + uint8 constant TRANSFER_KEY = 2; + uint8 constant MINT_KEY = 3; + uint8 constant CHECKPOINT_KEY = 4; + uint8 constant BURN_KEY = 5; + + uint256 public granularity; + + // Used to permanently halt controller actions + bool public controllerDisabled; + + // Used to temporarily halt all transactions + bool public transfersFrozen; + + // Value of current checkpoint + uint256 public currentCheckpointId; + + // Records added modules - module list should be order agnostic! + mapping(uint8 => address[]) modules; + + // Records information about the module + mapping(address => ModuleData) modulesToData; + + // Records added module names - module list should be order agnostic! + mapping(bytes32 => address[]) names; + + // Map each investor to a series of checkpoints + mapping(address => Checkpoint[]) checkpointBalances; + + // List of checkpoints that relate to total supply + Checkpoint[] checkpointTotalSupply; + + // Times at which each checkpoint was created + uint256[] checkpointTimes; + + ////////////////////////// + /// Document datastructure + ////////////////////////// + + struct Document { + bytes32 docHash; // Hash of the document + uint256 lastModified; // Timestamp at which document details was last modified + string uri; // URI of the document that exist off-chain + } + + // Used to hold the semantic version data + struct SemanticVersion { + uint8 major; + uint8 minor; + uint8 patch; + } + + // Struct for module data + struct ModuleData { + bytes32 name; + address module; + address moduleFactory; + bool isArchived; + uint8[] moduleTypes; + uint256[] moduleIndexes; + uint256 nameIndex; + bytes32 label; + } + + // Structures to maintain checkpoints of balances for governance / dividends + struct Checkpoint { + uint256 checkpointId; + uint256 value; + } + + struct InvestorDataStorage { + // List of investors who have ever held a non-zero token balance + mapping(address => bool) investorListed; + // List of token holders + address[] investors; + // Total number of non-zero token holders + uint256 investorCount; + } + + InvestorDataStorage investorData; + + SemanticVersion securityTokenVersion; + + // off-chain data + string public tokenDetails; + + // mapping to store the documents details in the document + mapping(bytes32 => Document) internal _documents; + // mapping to store the document name indexes + mapping(bytes32 => uint256) internal _docIndexes; + // Array use to store all the document name present in the contracts + bytes32[] _docNames; + + + // Variable which tells whether issuance is ON or OFF forever + // Implementers need to implement one more function to reset the value of `issuance` variable + // to false. That function is not a part of the standard (EIP-1594) as it is depend on the various factors + // issuer, followed compliance rules etc. So issuers have the choice how they want to close the issuance. + bool internal issuance = true; + + // Address of the controller which is a delegated entity + // set by the issuer/owner of the token + address public controller; + + address public polymathRegistry; + address public moduleRegistry; + address public securityTokenRegistry; + address public featureRegistry; + address public polyToken; + + address internal delegate; + +} \ No newline at end of file diff --git a/package.json b/package.json index 809f9148e..dbe65159c 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "readline-sync": "^1.4.9", "request": "^2.88.0", "request-promise": "^4.2.2", + "solc": "^0.5.2", "truffle-contract": "^3.0.4", "truffle-hdwallet-provider-privkey": "0.2.0", "web3": "1.0.0-beta.34" diff --git a/scripts/compareStorageLayout.js b/scripts/compareStorageLayout.js index 92d43a56f..287e94eec 100644 --- a/scripts/compareStorageLayout.js +++ b/scripts/compareStorageLayout.js @@ -12,34 +12,14 @@ prompt.get(["LogicContract", "ProxyContract"], async (err, result) => { let logicContract; let proxyContract; - const fileList = walkSync("./contracts", []); - - let paths = findPath(result.LogicContract, result.ProxyContract, fileList); - - if (paths.length == 2) { - console.log("Contracts exists \n"); - - await flatContracts(paths); - - if (path.basename(paths[0]) === result.LogicContract) { - logicContract = fs.readFileSync(`./flat/${path.basename(paths[0])}`, "utf8"); - } else { - logicContract = fs.readFileSync(`./flat/${path.basename(paths[1])}`, "utf8"); + if(fs.existsSync("./build/contracts/")) { + try { + logicContract = JSON.parse(require('fs').readFileSync(`./build/contracts/${result[`LogicContract`]}.json`).toString()).ast; + proxyContract = JSON.parse(require('fs').readFileSync(`./build/contracts/${result[`ProxyContract`]}.json`).toString()).ast; + } catch (error) { + console.log(`Contracts not found: ${error.message}`.red); } - if (path.basename(paths[0]) === result.ProxyContract) { - proxyContract = fs.readFileSync(`./flat/${path.basename(paths[0])}`, "utf8"); - } else { - proxyContract = fs.readFileSync(`./flat/${path.basename(paths[1])}`, "utf8"); - } - - let logicInput = { - contracts: logicContract - }; - let proxyInput = { - contracts: proxyContract - }; - - console.log(compareStorageLayouts(parseContract(logicInput), parseContract(proxyInput))); + console.log(compareStorageLayouts(parseContract(logicContract), parseContract(proxyContract))); } else { console.log("Contracts doesn't exists"); } @@ -74,10 +54,9 @@ function compareStorageLayouts(logicLayout, proxyLayout) { } function parseContract(input) { - var output = solc.compile({ sources: input }, 1, _.noop); + const elements = []; - const AST = output.sources.contracts.AST; - // console.log(AST); + const AST = input; traverseAST(AST, elements); // console.log(elements); @@ -104,37 +83,37 @@ function parseContract(input) { return orderedStateVariables; } -var walkSync = function(dir, filelist) { - files = fs.readdirSync(dir); - filelist = filelist || []; - files.forEach(function(file) { - if (fs.statSync(path.join(dir, file)).isDirectory()) { - filelist = walkSync(path.join(dir, file), filelist); - } else { - filelist.push(path.join(dir, file)); - } - }); - return filelist; -}; - -var findPath = function(logicContractName, proxyContractName, fileList) { - let paths = new Array(); - for (let i = 0; i < fileList.length; i++) { - if ( - logicContractName === path.basename(fileList[i]) || - logicContractName === path.basename(fileList[i]).split(".")[0] || - (proxyContractName === path.basename(fileList[i]) || proxyContractName === path.basename(fileList[i]).split(".")[0]) - ) { - paths.push(fileList[i]); - } - } - return paths; -}; - -async function flatContracts(_paths, _logic) { - let promises = new Array(); - for (let i = 0; i < _paths.length; i++) { - promises.push(await exec(`./node_modules/.bin/sol-merger ${_paths[i]} ./flat`)); - } - await Promise.all(promises); -} +// var walkSync = function(dir, filelist) { +// files = fs.readdirSync(dir); +// filelist = filelist || []; +// files.forEach(function(file) { +// if (fs.statSync(path.join(dir, file)).isDirectory()) { +// filelist = walkSync(path.join(dir, file), filelist); +// } else { +// filelist.push(path.join(dir, file)); +// } +// }); +// return filelist; +// }; + +// var findPath = function(logicContractName, proxyContractName, fileList) { +// let paths = new Array(); +// for (let i = 0; i < fileList.length; i++) { +// if ( +// logicContractName === path.basename(fileList[i]) || +// logicContractName === path.basename(fileList[i]).split(".")[0] || +// (proxyContractName === path.basename(fileList[i]) || proxyContractName === path.basename(fileList[i]).split(".")[0]) +// ) { +// paths.push(fileList[i]); +// } +// } +// return paths; +// }; + +// async function flatContracts(_paths, _logic) { +// let promises = new Array(); +// for (let i = 0; i < _paths.length; i++) { +// promises.push(await exec(`./node_modules/.bin/sol-merger ${_paths[i]} ./flat`)); +// } +// await Promise.all(promises); +// } diff --git a/yarn.lock b/yarn.lock index ba5641ffe..70b6d4c09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1529,6 +1529,10 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-exists@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" + commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" @@ -5834,6 +5838,19 @@ solc@^0.4.19, solc@^0.4.2: semver "^5.3.0" yargs "^4.7.1" +solc@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.2.tgz#45d5d11569e41c2b2535f3a50fe0616ca771a347" + dependencies: + command-exists "^1.2.8" + fs-extra "^0.30.0" + keccak "^1.0.2" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + yargs "^11.0.0" + solidity-coverage@^0.5.11: version "0.5.11" resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.5.11.tgz#1ee45f6d98b75a615aadb8f9aa7db4a2b32258e7" @@ -6323,7 +6340,7 @@ tingodb@^0.6.1: optionalDependencies: bson "^1.0.4" -tmp@^0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: From f01639bc9ce542e1c7f3a9b507d39aef9098bb81 Mon Sep 17 00:00:00 2001 From: satyam Date: Thu, 17 Jan 2019 17:37:36 +0530 Subject: [PATCH 04/16] minor fix --- contracts/tokens/STGetter.sol | 5 +++-- contracts/tokens/STGetterStorage.sol | 8 -------- 2 files changed, 3 insertions(+), 10 deletions(-) delete mode 100644 contracts/tokens/STGetterStorage.sol diff --git a/contracts/tokens/STGetter.sol b/contracts/tokens/STGetter.sol index 642b165c4..37af0b5f1 100644 --- a/contracts/tokens/STGetter.sol +++ b/contracts/tokens/STGetter.sol @@ -1,10 +1,11 @@ pragma solidity ^0.5.0; -import "./STGetterStorage.sol"; +import "./OZStorage.sol"; +import "./SecurityTokenStorage.sol"; import "../libraries/TokenLib.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -contract STGetter is STGetterStorage { +contract STGetter is OZStorage, SecurityTokenStorage { using SafeMath for uint256; diff --git a/contracts/tokens/STGetterStorage.sol b/contracts/tokens/STGetterStorage.sol deleted file mode 100644 index b2f1baebd..000000000 --- a/contracts/tokens/STGetterStorage.sol +++ /dev/null @@ -1,8 +0,0 @@ -pragma solidity ^0.5.0; - -import "./OZStorage.sol"; -import "./SecurityTokenStorage.sol"; - -contract STGetterStorage is OZStorage, SecurityTokenStorage { - -} \ No newline at end of file From 564ddfdce73ad8b0c1c15a37b16fd0dca4f32998 Mon Sep 17 00:00:00 2001 From: satyam Date: Thu, 17 Jan 2019 17:49:48 +0530 Subject: [PATCH 05/16] rename the verifyTransfer --- contracts/interfaces/ITransferManager.sol | 2 +- contracts/libraries/TokenLib.sol | 2 +- contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol | 2 +- .../TransferManager/LockupVolumeRestrictionTM.sol | 2 +- .../TransferManager/SingleTradeVolumeRestrictionTM.sol | 4 ++-- contracts/modules/TransferManager/CountTransferManager.sol | 4 ++-- contracts/modules/TransferManager/GeneralTransferManager.sol | 4 ++-- .../modules/TransferManager/ManualApprovalTransferManager.sol | 4 ++-- .../modules/TransferManager/PercentageTransferManager.sol | 4 ++-- contracts/tokens/SecurityTokenStorage.sol | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/contracts/interfaces/ITransferManager.sol b/contracts/interfaces/ITransferManager.sol index b7c73e8ba..16381ed54 100644 --- a/contracts/interfaces/ITransferManager.sol +++ b/contracts/interfaces/ITransferManager.sol @@ -13,7 +13,7 @@ interface ITransferManager { TransferManagerEnums.Result ); - function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external view returns( + function executeTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external view returns( TransferManagerEnums.Result, byte ); diff --git a/contracts/libraries/TokenLib.sol b/contracts/libraries/TokenLib.sol index f6c07d89f..66da0caa0 100644 --- a/contracts/libraries/TokenLib.sol +++ b/contracts/libraries/TokenLib.sol @@ -290,7 +290,7 @@ library TokenLib { for (uint256 i = 0; i < modules.length; i++) { if (!modulesToData[modules[i]].isArchived) { transfersFrozen = true; - (TransferManagerEnums.Result valid, byte reason) = ITransferManager(modules[i]).verifyTransfer(from, to, value, data); + (TransferManagerEnums.Result valid, byte reason) = ITransferManager(modules[i]).executeTransfer(from, to, value, data); if (valid == TransferManagerEnums.Result.INVALID) { isInvalid = true; reasonCode = reason; diff --git a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol index cd0f70f0d..35feaf189 100644 --- a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol +++ b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol @@ -105,7 +105,7 @@ contract ScheduledCheckpoint is ICheckpoint, TransferManager { * @notice Used to create checkpoints that correctly reflect balances * @return always returns Result.NA */ - function verifyTransfer( + function executeTransfer( address, /* _from */ address, /* _to */ uint256, /* _amount */ diff --git a/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol b/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol index 27b879073..a2f9a2ce8 100644 --- a/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol +++ b/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol @@ -82,7 +82,7 @@ contract LockupVolumeRestrictionTM is TransferManager { /** * @notice Used to verify the transfer transaction and prevent locked up tokens from being transferred */ - function verifyTransfer( + function executeTransfer( address /*_from*/, address /* _to*/, uint256 /*_amount*/, diff --git a/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol b/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol index 0d7ce27c7..ff5d1eecc 100644 --- a/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol +++ b/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol @@ -64,7 +64,7 @@ contract SingleTradeVolumeRestrictionTM is TransferManager { external returns(Result) { - (Result success,) = verifyTransfer(_from, _to, _amount, _data); + (Result success,) = executeTransfer(_from, _to, _amount, _data); return success; } @@ -74,7 +74,7 @@ contract SingleTradeVolumeRestrictionTM is TransferManager { * @param _from Address of the sender * @param _amount The amount of tokens to transfer */ - function verifyTransfer( + function executeTransfer( address _from, address /* _to */, uint256 _amount, diff --git a/contracts/modules/TransferManager/CountTransferManager.sol b/contracts/modules/TransferManager/CountTransferManager.sol index 7603763ba..bdb1daa87 100644 --- a/contracts/modules/TransferManager/CountTransferManager.sol +++ b/contracts/modules/TransferManager/CountTransferManager.sol @@ -33,7 +33,7 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { external returns(Result) { - (Result success,) = verifyTransfer(_from, _to, _amount, _data); + (Result success,) = executeTransfer(_from, _to, _amount, _data); return success; } @@ -43,7 +43,7 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { * @param _to Address of the receiver * @param _amount Amount to send */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256 _amount, diff --git a/contracts/modules/TransferManager/GeneralTransferManager.sol b/contracts/modules/TransferManager/GeneralTransferManager.sol index 18d05d99f..4d71764e4 100644 --- a/contracts/modules/TransferManager/GeneralTransferManager.sol +++ b/contracts/modules/TransferManager/GeneralTransferManager.sol @@ -145,7 +145,7 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage bytes calldata _data, bool /* _isTransfer */ ) external returns(Result) { - (Result success,) = verifyTransfer(_from, _to, _amount, _data); + (Result success,) = executeTransfer(_from, _to, _amount, _data); return success; } @@ -159,7 +159,7 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage * @param _from Address of the sender * @param _to Address of the receiver */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256, /*_amount*/ diff --git a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol index 59403683c..442141425 100644 --- a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol +++ b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol @@ -70,7 +70,7 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, { // function must only be called by the associated security token if _isTransfer == true require(_isTransfer == false || msg.sender == securityToken, "Sender is not the owner"); - (Result success, byte esc) = verifyTransfer(_from, _to, _amount, _data); + (Result success, byte esc) = executeTransfer(_from, _to, _amount, _data); if (_isTransfer && esc == 0xA1) { manualApprovals[_from][_to].allowance = manualApprovals[_from][_to].allowance.sub(_amount); } @@ -83,7 +83,7 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, * @param _to Address of the receiver * @param _amount The amount of tokens to transfer */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256 _amount, diff --git a/contracts/modules/TransferManager/PercentageTransferManager.sol b/contracts/modules/TransferManager/PercentageTransferManager.sol index 0e67af544..486808922 100644 --- a/contracts/modules/TransferManager/PercentageTransferManager.sol +++ b/contracts/modules/TransferManager/PercentageTransferManager.sol @@ -47,7 +47,7 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer external returns(Result) { - (Result success,) = verifyTransfer(_from, _to, _amount, _data); + (Result success,) = executeTransfer(_from, _to, _amount, _data); return success; } @@ -57,7 +57,7 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer * @param _to Address of the receiver * @param _amount The amount of tokens to transfer */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256 _amount, diff --git a/contracts/tokens/SecurityTokenStorage.sol b/contracts/tokens/SecurityTokenStorage.sol index 0fe3cc1d4..93d3d0062 100644 --- a/contracts/tokens/SecurityTokenStorage.sol +++ b/contracts/tokens/SecurityTokenStorage.sol @@ -112,6 +112,6 @@ contract SecurityTokenStorage { address public featureRegistry; address public polyToken; - address internal delegate; + address public delegate; } \ No newline at end of file From 0e750383b6e532e9a8a659bcb35d32416604e1d4 Mon Sep 17 00:00:00 2001 From: satyam Date: Tue, 22 Jan 2019 18:54:23 +0530 Subject: [PATCH 06/16] accessing storage --- contracts/interfaces/ITransferManager.sol | 10 + .../Mixed/ScheduledCheckpoint.sol | 14 + .../LockupVolumeRestrictionTM.sol | 14 + .../SingleTradeVolumeRestrictionTM.sol | 14 + .../TransferManager/CountTransferManager.sol | 14 + .../GeneralTransferManager.sol | 14 + .../ManualApprovalTransferManager.sol | 14 + .../PercentageTransferManager.sol | 14 + contracts/tokens/OZStorage.sol | 8 + contracts/tokens/STGetter.sol | 26 +- contracts/tokens/SecurityToken.sol | 12 +- contracts/tokens/SecurityTokenStorage.sol | 5 +- migrations/2_deploy_contracts.js | 10 +- test/helpers/createInstances.js | 17 +- test/o_security_token.js | 300 ++++++++++++------ 15 files changed, 372 insertions(+), 114 deletions(-) diff --git a/contracts/interfaces/ITransferManager.sol b/contracts/interfaces/ITransferManager.sol index 16381ed54..49e1c7d58 100644 --- a/contracts/interfaces/ITransferManager.sol +++ b/contracts/interfaces/ITransferManager.sol @@ -17,4 +17,14 @@ interface ITransferManager { TransferManagerEnums.Result, byte ); + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address _owner) external view returns(uint256); + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address _owner) external view returns(uint256); + } diff --git a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol index 35feaf189..4b2626f7f 100644 --- a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol +++ b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol @@ -168,6 +168,20 @@ contract ScheduledCheckpoint is ICheckpoint, TransferManager { } } + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + /** * @notice Return the permissions flag that are associated with CountTransferManager */ diff --git a/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol b/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol index a2f9a2ce8..cebbabce2 100644 --- a/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol +++ b/contracts/modules/Experimental/TransferManager/LockupVolumeRestrictionTM.sol @@ -401,6 +401,20 @@ contract LockupVolumeRestrictionTM is TransferManager { ); } + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + /** * @notice This function returns the signature of configure function */ diff --git a/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol b/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol index ff5d1eecc..993dc37c6 100644 --- a/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol +++ b/contracts/modules/Experimental/TransferManager/SingleTradeVolumeRestrictionTM.sol @@ -347,6 +347,20 @@ contract SingleTradeVolumeRestrictionTM is TransferManager { return bytes4(keccak256("configure(bool,uint256,bool)")); } + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + /** * @notice Returns the permissions flag that are associated with SingleTradeVolumeRestrictionManager */ diff --git a/contracts/modules/TransferManager/CountTransferManager.sol b/contracts/modules/TransferManager/CountTransferManager.sol index bdb1daa87..d66ced7f6 100644 --- a/contracts/modules/TransferManager/CountTransferManager.sol +++ b/contracts/modules/TransferManager/CountTransferManager.sol @@ -91,6 +91,20 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { return bytes4(keccak256("configure(uint256)")); } + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + /** * @notice Returns the permissions flag that are associated with CountTransferManager */ diff --git a/contracts/modules/TransferManager/GeneralTransferManager.sol b/contracts/modules/TransferManager/GeneralTransferManager.sol index 4d71764e4..007717bcd 100644 --- a/contracts/modules/TransferManager/GeneralTransferManager.sol +++ b/contracts/modules/TransferManager/GeneralTransferManager.sol @@ -417,6 +417,20 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage return (fromTimes, toTimes, expiryTimes, canBuyFromSTOs); } + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + /** * @notice Return the permissions flag that are associated with general trnasfer manager */ diff --git a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol index 442141425..223117fcf 100644 --- a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol +++ b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol @@ -161,6 +161,20 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, emit RevokeManualBlocking(_from, _to, msg.sender); } + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + /** * @notice Returns the permissions flag that are associated with ManualApproval transfer manager */ diff --git a/contracts/modules/TransferManager/PercentageTransferManager.sol b/contracts/modules/TransferManager/PercentageTransferManager.sol index 486808922..e32ee1bdd 100644 --- a/contracts/modules/TransferManager/PercentageTransferManager.sol +++ b/contracts/modules/TransferManager/PercentageTransferManager.sol @@ -143,6 +143,20 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer emit SetAllowPrimaryIssuance(_allowPrimaryIssuance, now); } + /** + * @notice return the amount of locked tokens for a given user + */ + function getLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + + /** + * @notice return the amount of un locked tokens for a given user + */ + function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + return 0; + } + /** * @notice Return the permissions flag that are associated with Percentage transfer Manager */ diff --git a/contracts/tokens/OZStorage.sol b/contracts/tokens/OZStorage.sol index 75f623697..536b733c7 100644 --- a/contracts/tokens/OZStorage.sol +++ b/contracts/tokens/OZStorage.sol @@ -17,4 +17,12 @@ contract OZStorage { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; + function totalSupply() internal view returns (uint256) { + return _totalSupply; + } + + function balanceOf(address _investor) internal view returns(uint256) { + return _balances[_investor]; + } + } \ No newline at end of file diff --git a/contracts/tokens/STGetter.sol b/contracts/tokens/STGetter.sol index 37af0b5f1..5bdad377c 100644 --- a/contracts/tokens/STGetter.sol +++ b/contracts/tokens/STGetter.sol @@ -134,14 +134,6 @@ contract STGetter is OZStorage, SecurityTokenStorage { return TokenLib.getValueAt(checkpointTotalSupply, _checkpointId, totalSupply()); } - function totalSupply() internal view returns (uint256) { - return 0; - } - - function balanceOf(address _investor) internal view returns(uint256) { - return 0; - } - /** * @notice generates subset of investors * NB - can be used in batches if investor list is large @@ -182,6 +174,24 @@ contract STGetter is OZStorage, SecurityTokenStorage { return false; } + /// @dev get the unlocked balance according to the tms + function balanceOfPartition(address _owner, bytes32 _partition) external view returns(uint256) { + address[] memory tms = modules[TRANSFER_KEY]; + uint8 i; + uint256 _amount; + if (_partition == LOCKED) { + for (i = 0; i < tms.length; i++) { + _amount += ITransferManager(tms[i]).getLockedToken(_owner); + } + return _amount; + }else if (_partition == UNLOCKED) { + for (i = 0; i < tms.length; i++) { + _amount += ITransferManager(tms[i]).getUnLockedToken(_owner); + } + return _amount; + } + } + /** * @notice Returns the version of the SecurityToken */ diff --git a/contracts/tokens/SecurityToken.sol b/contracts/tokens/SecurityToken.sol index 9aaa09353..2418aa2e0 100644 --- a/contracts/tokens/SecurityToken.sol +++ b/contracts/tokens/SecurityToken.sol @@ -94,7 +94,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi } modifier isIssuanceAllowed() { - require(!issuance, "Issuance frozen"); + require(issuance, "Issuance frozen"); _; } @@ -468,8 +468,8 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi * @notice Permanently freeze issuance of this security token. * @dev It MUST NOT be possible to increase `totalSuppy` after this function is called. */ - function freezeIssuance() external isIssuanceAllowed isEnabled("freezeMintingAllowed") onlyOwner { - issuance = true; + function freezeIssuance() external isIssuanceAllowed isEnabled("freezeIssuanceAllowed") onlyOwner { + issuance = false; /*solium-disable-next-line security/no-block-members*/ emit FreezeIssuance(now); } @@ -569,7 +569,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi * @param _controller address of the controller */ function setController(address _controller) public onlyOwner { - require(!controllerDisabled); + require(_isControllable()); // Below condition is to restrict the owner/issuer to become the controller(In an ideal world). // But for non ideal case issuer could set another address which is not the owner of the token // but issuer holds its private key. @@ -583,7 +583,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi * @dev enabled via feature switch "disableControllerAllowed" */ function disableController() external isEnabled("disableControllerAllowed") onlyOwner { - require(!controllerDisabled); + require(_isControllable()); controllerDisabled = true; delete controller; emit DisableController(now); @@ -715,6 +715,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi * for calling this function (aka force transfer) which provides the transparency on-chain). */ function controllerTransfer(address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external onlyController { + require(_isControllable()); _updateTransfer(_from, _to, _value, _data); _transfer(_from, _to, _value); emit ControllerTransfer(msg.sender, _from, _to, _value, _data, _operatorData); @@ -733,6 +734,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi * for calling this function (aka force transfer) which provides the transparency on-chain). */ function controllerRedeem(address _tokenHolder, uint256 _value, bytes calldata _data, bytes calldata _operatorData) external onlyController { + require(_isControllable()); _checkAndBurn(_tokenHolder, _value, _data); emit ControllerRedemption(msg.sender, _tokenHolder, _value, _data, _operatorData); } diff --git a/contracts/tokens/SecurityTokenStorage.sol b/contracts/tokens/SecurityTokenStorage.sol index 93d3d0062..7cb6391b5 100644 --- a/contracts/tokens/SecurityTokenStorage.sol +++ b/contracts/tokens/SecurityTokenStorage.sol @@ -11,7 +11,7 @@ contract SecurityTokenStorage { uint256 public granularity; // Used to permanently halt controller actions - bool public controllerDisabled; + bool public controllerDisabled = false; // Used to temporarily halt all transactions bool public transfersFrozen; @@ -114,4 +114,7 @@ contract SecurityTokenStorage { address public delegate; + bytes32 constant LOCKED = "LOCKED"; + bytes32 constant UNLOCKED = "UNLOCKED"; + } \ No newline at end of file diff --git a/migrations/2_deploy_contracts.js b/migrations/2_deploy_contracts.js index 9618425c3..781108894 100644 --- a/migrations/2_deploy_contracts.js +++ b/migrations/2_deploy_contracts.js @@ -28,6 +28,7 @@ const MockOracle = artifacts.require("./MockOracle.sol"); const TokenLib = artifacts.require("./TokenLib.sol"); const SecurityToken = artifacts.require("./tokens/SecurityToken.sol"); const STRGetter = artifacts.require('./STRGetter.sol'); +const STGetter = artifacts.require('./STGetter.sol'); const Web3 = require("web3"); @@ -180,6 +181,7 @@ module.exports = function(deployer, network, accounts) { // Link libraries deployer.link(TokenLib, SecurityToken); deployer.link(TokenLib, STFactory); + deployer.link(TokenLib, STGetter); // A) Deploy the ModuleRegistry Contract (It contains the list of verified ModuleFactory) return deployer.deploy(ModuleRegistry, { from: PolymathAccount }); }) @@ -295,9 +297,13 @@ module.exports = function(deployer, network, accounts) { from: PolymathAccount }); }) + .then(() => { + // Deploy the STGetter contract (Logic contract that have the getters of the securityToken) + return deployer.deploy(STGetter, { from: PolymathAccount }); + }) .then(() => { // H) Deploy the STVersionProxy001 Contract which contains the logic of deployment of securityToken. - return deployer.deploy(STFactory, GeneralTransferManagerFactory.address, { from: PolymathAccount }); + return deployer.deploy(STFactory, GeneralTransferManagerFactory.address, STGetter.address, { from: PolymathAccount }); }) .then(() => { // K) Deploy the FeatureRegistry contract to control feature switches @@ -455,7 +461,7 @@ module.exports = function(deployer, network, accounts) { return polymathRegistry.changeAddress("EthUsdOracle", ETHOracle, { from: PolymathAccount }); }) .then(() => { - return deployer.deploy(SecurityToken, "a", "a", 18, 1, "a", polymathRegistry.address, { from: PolymathAccount }); + return deployer.deploy(SecurityToken, "a", "a", 18, 1, "a", polymathRegistry.address, STGetter.address, { from: PolymathAccount }); }) .then(() => { console.log("\n"); diff --git a/test/helpers/createInstances.js b/test/helpers/createInstances.js index 4c9f6090c..925bcc01a 100644 --- a/test/helpers/createInstances.js +++ b/test/helpers/createInstances.js @@ -3,7 +3,6 @@ import { encodeProxyCall, encodeModuleCall } from "./encodeCall"; const PolymathRegistry = artifacts.require("./PolymathRegistry.sol"); const ModuleRegistry = artifacts.require("./ModuleRegistry.sol"); const ModuleRegistryProxy = artifacts.require("./ModuleRegistryProxy.sol"); -const SecurityToken = artifacts.require("./SecurityToken.sol"); const CappedSTOFactory = artifacts.require("./CappedSTOFactory.sol"); const CappedSTO = artifacts.require("./CappedSTO.sol"); const SecurityTokenRegistryProxy = artifacts.require("./SecurityTokenRegistryProxy.sol"); @@ -39,6 +38,7 @@ const DummySTO = artifacts.require("./DummySTO.sol"); const MockBurnFactory = artifacts.require("./MockBurnFactory.sol"); const STRGetter = artifacts.require("./STRGetter.sol"); const MockWrongTypeFactory = artifacts.require("./MockWrongTypeFactory.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -86,6 +86,7 @@ let I_SecurityTokenRegistryProxy; let I_STRProxied; let I_MRProxied; let I_STRGetter; +let I_STGetter; // Initial fee for ticker registry and security token registry const initRegFee = new BN(web3.utils.toWei("250")); @@ -127,17 +128,19 @@ export async function setUpPolymathNetwork(account_polymath, token_owner) { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ); return Promise.all(tempArray); } -async function deployPolyRegistryAndPolyToken(account_polymath, token_owner) { +export async function deployPolyRegistryAndPolyToken(account_polymath, token_owner) { // Step 0: Deploy the PolymathRegistry I_PolymathRegistry = await PolymathRegistry.new({ from: account_polymath }); // Step 1: Deploy the token Faucet and Mint tokens for token_owner - I_PolyToken = await PolyTokenFaucet.new(); + I_PolyToken = await PolyTokenFaucet.new({ from: account_polymath }); + await I_PolyToken.getTokens(new BN(10000).mul(new BN(10).pow(new BN(18))), token_owner); await I_PolymathRegistry.changeAddress("PolyToken", I_PolyToken.address, { from: account_polymath }); @@ -195,11 +198,11 @@ async function deployGTM(account_polymath) { } async function deploySTFactory(account_polymath) { - I_STFactory = await STFactory.new(I_GeneralTransferManagerFactory.address, { from: account_polymath }); - + I_STGetter = await STGetter.new({from: account_polymath}); + I_STFactory = await STFactory.new(I_GeneralTransferManagerFactory.address, I_STGetter.address, { from: account_polymath }); assert.notEqual(I_STFactory.address.valueOf(), "0x0000000000000000000000000000000000000000", "STFactory contract was not deployed"); - return new Array(I_STFactory); + return new Array(I_STFactory, I_STGetter); } async function deploySTR(account_polymath) { diff --git a/test/o_security_token.js b/test/o_security_token.js index aac62b9e0..2174a8d62 100644 --- a/test/o_security_token.js +++ b/test/o_security_token.js @@ -17,6 +17,7 @@ const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); const MockRedemptionManager = artifacts.require("./MockRedemptionManager.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -69,6 +70,8 @@ contract("SecurityToken", async (accounts) => { let I_MockRedemptionManagerFactory; let I_MockRedemptionManager; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details (Launched ST on the behalf of the issuer) const name = "Demo Token"; @@ -103,6 +106,10 @@ contract("SecurityToken", async (accounts) => { let currentTime; + async function readStorage(contractAddress, slot) { + return await web3.eth.getStorageAt(contractAddress, slot); + } + before(async () => { currentTime = new BN(await latestTime()); account_polymath = accounts[0]; @@ -134,7 +141,8 @@ contract("SecurityToken", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 2: Deploy the GeneralDelegateManagerFactory @@ -177,7 +185,7 @@ contract("SecurityToken", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol, "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -187,13 +195,13 @@ contract("SecurityToken", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(transferManagerKey))[0]; + let moduleData = (await stGetter.getModulesByType(transferManagerKey))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); assert.notEqual(I_GeneralTransferManager.address.valueOf(), address_zero, "GeneralTransferManager contract was not deployed"); }); - it("Should mint the tokens before attaching the STO -- fail only be called by the owner", async () => { + it("Should issue the tokens before attaching the STO -- fail only be called by the owner", async () => { currentTime = new BN(await latestTime()); let toTime = new BN(currentTime.add(new BN(duration.days(100)))); let expiryTime = new BN(toTime.add(new BN(duration.days(100)))); @@ -203,16 +211,17 @@ contract("SecurityToken", async (accounts) => { gas: 6000000 }); assert.equal(tx.logs[0].args._investor, account_affiliate1, "Failed in adding the investor in whitelist"); - await catchRevert(I_SecurityToken.mint(account_investor1, new BN(100).mul(new BN(10).pow(new BN(18))), { from: account_delegate })); + await catchRevert(I_SecurityToken.issue(account_investor1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: account_delegate })); }); - it("Should mint the tokens before attaching the STO", async () => { - await I_SecurityToken.mint(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), { from: token_owner }); + it("Should issue the tokens before attaching the STO", async () => { + await I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner }); let balance = await I_SecurityToken.balanceOf(account_affiliate1); + console.log((await stGetter.getInvestorCount.call()).toNumber()); assert.equal(balance.div(new BN(10).pow(new BN(18))).toNumber(), 100); }); - it("Should mint the multi tokens before attaching the STO -- fail only be called by the owner", async () => { + it("Should issue the multi tokens before attaching the STO -- fail only be called by the owner", async () => { currentTime = new BN(await latestTime()); let toTime = new BN(currentTime.add(new BN(duration.days(100)))); let expiryTime = new BN(toTime.add(new BN(duration.days(100)))); @@ -224,59 +233,60 @@ contract("SecurityToken", async (accounts) => { assert.equal(tx.logs[0].args._investor, account_affiliate2, "Failed in adding the investor in whitelist"); await catchRevert( - I_SecurityToken.mintMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(110).mul(new BN(10).pow(new BN(18)))], { + I_SecurityToken.issueMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(110).mul(new BN(10).pow(new BN(18)))], { from: account_delegate, gas: 500000 }) ); }); - it("Should mintMulti", async () => { + it("Should issueMulti", async () => { await catchRevert( - I_SecurityToken.mintMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18)))], { + I_SecurityToken.issueMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18)))], { from: token_owner, gas: 500000 }) ); }); - it("Should mint the tokens for multiple afiliated investors before attaching the STO", async () => { - await I_SecurityToken.mintMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(110).mul(new BN(10).pow(new BN(18)))], { + it("Should issue the tokens for multiple afiliated investors before attaching the STO", async () => { + await I_SecurityToken.issueMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(110).mul(new BN(10).pow(new BN(18)))], { from: token_owner }); let balance1 = await I_SecurityToken.balanceOf(account_affiliate1); assert.equal(balance1.div(new BN(10).pow(new BN(18))).toNumber(), 200); let balance2 = await I_SecurityToken.balanceOf(account_affiliate2); assert.equal(balance2.div(new BN(10).pow(new BN(18))).toNumber(), 110); + console.log((await stGetter.getInvestorCount.call()).toNumber()); }); it("Should finish the minting -- fail because feature is not activated", async () => { - await catchRevert(I_SecurityToken.freezeMinting({ from: token_owner })); + await catchRevert(I_SecurityToken.freezeIssuance({ from: token_owner })); }); it("Should finish the minting -- fail to activate the feature because msg.sender is not polymath", async () => { - await catchRevert(I_FeatureRegistry.setFeatureStatus("freezeMintingAllowed", true, { from: token_owner })); + await catchRevert(I_FeatureRegistry.setFeatureStatus("freezeIssuanceAllowed", true, { from: token_owner })); }); it("Should finish the minting -- successfully activate the feature", async () => { - await catchRevert(I_FeatureRegistry.setFeatureStatus("freezeMintingAllowed", false, { from: account_polymath })); + await catchRevert(I_FeatureRegistry.setFeatureStatus("freezeIssuanceAllowed", false, { from: account_polymath })); - assert.equal(false, await I_FeatureRegistry.getFeatureStatus("freezeMintingAllowed", { from: account_temp })); - await I_FeatureRegistry.setFeatureStatus("freezeMintingAllowed", true, { from: account_polymath }); - assert.equal(true, await I_FeatureRegistry.getFeatureStatus("freezeMintingAllowed", { from: account_temp })); + assert.equal(false, await I_FeatureRegistry.getFeatureStatus("freezeIssuanceAllowed", { from: account_temp })); + await I_FeatureRegistry.setFeatureStatus("freezeIssuanceAllowed", true, { from: account_polymath }); + assert.equal(true, await I_FeatureRegistry.getFeatureStatus("freezeIssuanceAllowed", { from: account_temp })); - await catchRevert(I_FeatureRegistry.setFeatureStatus("freezeMintingAllowed", true, { from: account_polymath })); + await catchRevert(I_FeatureRegistry.setFeatureStatus("freezeIssuanceAllowed", true, { from: account_polymath })); }); it("Should finish the minting -- fail because msg.sender is not the owner", async () => { - await catchRevert(I_SecurityToken.freezeMinting({ from: account_temp })); + await catchRevert(I_SecurityToken.freezeIssuance({ from: account_temp })); }); it("Should finish minting & restrict the further minting", async () => { let id = await takeSnapshot(); - await I_SecurityToken.freezeMinting({ from: token_owner }); + await I_SecurityToken.freezeIssuance({ from: token_owner }); - await catchRevert(I_SecurityToken.mint(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), { from: token_owner, gas: 500000 })); + await catchRevert(I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner, gas: 500000 })); await revertToSnapshot(id); }); @@ -308,6 +318,7 @@ contract("SecurityToken", async (accounts) => { await I_PolyToken.getTokens(cappedSTOSetupCost, token_owner); await I_PolyToken.transfer(I_SecurityToken.address, cappedSTOSetupCost, { from: token_owner }); + console.log((await stGetter.getInvestorCount.call()).toNumber()); console.log("0"); const tx = await I_SecurityToken.addModuleWithLabel(I_CappedSTOFactory.address, bytesSTO, maxCost, new BN(0), web3.utils.fromAscii("stofactory"), { from: token_owner @@ -336,24 +347,25 @@ contract("SecurityToken", async (accounts) => { I_CappedSTO = await CappedSTO.at(tx.logs[3].args._module); }); - it("Should successfully mint tokens while STO attached", async () => { - await I_SecurityToken.mint(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), { from: token_owner }); + it("Should successfully issue tokens while STO attached", async () => { + await I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner }); + console.log((await stGetter.getInvestorCount.call()).toNumber()); let balance = await I_SecurityToken.balanceOf(account_affiliate1); assert.equal(balance.div(new BN(10).pow(new BN(18))).toNumber(), 300); }); - it("Should fail to mint tokens while STO attached after freezeMinting called", async () => { + it("Should fail to issue tokens while STO attached after freezeMinting called", async () => { let id = await takeSnapshot(); - await I_SecurityToken.freezeMinting({ from: token_owner }); + await I_SecurityToken.freezeIssuance({ from: token_owner }); - await catchRevert(I_SecurityToken.mint(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), { from: token_owner })); + await catchRevert(I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner })); await revertToSnapshot(id); }); }); describe("Module related functions", async () => { it(" Should get the modules of the securityToken by name", async () => { - let moduleData = await I_SecurityToken.getModule.call(I_CappedSTO.address); + let moduleData = await stGetter.getModule.call(I_CappedSTO.address); assert.equal(web3.utils.toAscii(moduleData[0]).replace(/\u0000/g, ""), "CappedSTO"); assert.equal(moduleData[1], I_CappedSTO.address); assert.equal(moduleData[2], I_CappedSTOFactory.address); @@ -363,26 +375,26 @@ contract("SecurityToken", async (accounts) => { }); it("Should get the modules of the securityToken by index (not added into the security token yet)", async () => { - let moduleData = await I_SecurityToken.getModule.call(token_owner); + let moduleData = await stGetter.getModule.call(token_owner); assert.equal(web3.utils.toAscii(moduleData[0]).replace(/\u0000/g, ""), ""); assert.equal(moduleData[1], address_zero); }); it("Should get the modules of the securityToken by name", async () => { - let moduleList = await I_SecurityToken.getModulesByName.call(web3.utils.fromAscii("CappedSTO")); + let moduleList = await stGetter.getModulesByName.call(web3.utils.fromAscii("CappedSTO")); assert.isTrue(moduleList.length == 1, "Only one STO"); - let moduleData = await I_SecurityToken.getModule.call(moduleList[0]); + let moduleData = await stGetter.getModule.call(moduleList[0]); assert.equal(web3.utils.toAscii(moduleData[0]).replace(/\u0000/g, ""), "CappedSTO"); assert.equal(moduleData[1], I_CappedSTO.address); }); it("Should get the modules of the securityToken by name (not added into the security token yet)", async () => { - let moduleData = await I_SecurityToken.getModulesByName.call(web3.utils.fromAscii("GeneralPermissionManager")); + let moduleData = await stGetter.getModulesByName.call(web3.utils.fromAscii("GeneralPermissionManager")); assert.isTrue(moduleData.length == new BN(0), "No Permission Manager"); }); it("Should get the modules of the securityToken by name (not added into the security token yet)", async () => { - let moduleData = await I_SecurityToken.getModulesByName.call(web3.utils.fromAscii("CountTransferManager")); + let moduleData = await stGetter.getModulesByName.call(web3.utils.fromAscii("CountTransferManager")); assert.isTrue(moduleData.length == new BN(0), "No Permission Manager"); }); @@ -413,8 +425,9 @@ contract("SecurityToken", async (accounts) => { let tx = await I_SecurityToken.removeModule(I_GeneralTransferManager.address, { from: token_owner }); assert.equal(tx.logs[0].args._types[0], transferManagerKey); assert.equal(tx.logs[0].args._module, I_GeneralTransferManager.address); - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("500")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("500")), "0x0", { from: token_owner }); await I_SecurityToken.transfer(account_investor2, new BN(web3.utils.toWei("200")), { from: account_investor1 }); + console.log((await stGetter.getInvestorCount.call()).toNumber()); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).div(new BN(10).pow(new BN(18))).toNumber(), 200); await revertToSnapshot(key); }); @@ -452,7 +465,7 @@ contract("SecurityToken", async (accounts) => { }); it("Should verify the revertion of snapshot works properly", async () => { - let moduleData = await I_SecurityToken.getModule.call(I_GeneralTransferManager.address); + let moduleData = await stGetter.getModule.call(I_GeneralTransferManager.address); assert.equal(web3.utils.toAscii(moduleData[0]).replace(/\u0000/g, ""), "GeneralTransferManager"); assert.equal(moduleData[1], I_GeneralTransferManager.address); }); @@ -461,16 +474,16 @@ contract("SecurityToken", async (accounts) => { let tx = await I_SecurityToken.archiveModule(I_GeneralTransferManager.address, { from: token_owner }); assert.equal(tx.logs[0].args._types[0], transferManagerKey); assert.equal(tx.logs[0].args._module, I_GeneralTransferManager.address); - let moduleData = await I_SecurityToken.getModule.call(I_GeneralTransferManager.address); + let moduleData = await stGetter.getModule.call(I_GeneralTransferManager.address); assert.equal(web3.utils.toAscii(moduleData[0]).replace(/\u0000/g, ""), "GeneralTransferManager"); assert.equal(moduleData[1], I_GeneralTransferManager.address); assert.equal(moduleData[2], I_GeneralTransferManagerFactory.address); assert.equal(moduleData[3], true); }); - it("Should successfully mint tokens while GTM archived", async () => { + it("Should successfully issue tokens while GTM archived", async () => { let key = await takeSnapshot(); - await I_SecurityToken.mint(one_address, new BN(100).mul(new BN(10).pow(new BN(18))), { from: token_owner, gas: 500000 }); + await I_SecurityToken.issue(one_address, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner, gas: 500000 }); let balance = await I_SecurityToken.balanceOf(one_address); assert.equal(balance.div(new BN(10).pow(new BN(18))).toNumber(), 100); await revertToSnapshot(key); @@ -480,7 +493,7 @@ contract("SecurityToken", async (accounts) => { let tx = await I_SecurityToken.unarchiveModule(I_GeneralTransferManager.address, { from: token_owner }); assert.equal(tx.logs[0].args._types[0], transferManagerKey); assert.equal(tx.logs[0].args._module, I_GeneralTransferManager.address); - let moduleData = await I_SecurityToken.getModule.call(I_GeneralTransferManager.address); + let moduleData = await stGetter.getModule.call(I_GeneralTransferManager.address); assert.equal(web3.utils.toAscii(moduleData[0]).replace(/\u0000/g, ""), "GeneralTransferManager"); assert.equal(moduleData[1], I_GeneralTransferManager.address); assert.equal(moduleData[2], I_GeneralTransferManagerFactory.address); @@ -495,8 +508,8 @@ contract("SecurityToken", async (accounts) => { await catchRevert(I_SecurityToken.archiveModule(I_GeneralPermissionManagerFactory.address, { from: token_owner })); }); - it("Should fail to mint tokens while GTM unarchived", async () => { - await catchRevert(I_SecurityToken.mint(one_address, new BN(100).mul(new BN(10).pow(new BN(18))), { from: token_owner, gas: 500000 })); + it("Should fail to issue tokens while GTM unarchived", async () => { + await catchRevert(I_SecurityToken.issue(one_address, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner, gas: 500000 })); }); it("Should change the budget of the module - fail incorrect address", async () => { @@ -522,7 +535,7 @@ contract("SecurityToken", async (accounts) => { }); it("Should fail to get the total supply -- because checkpoint id is greater than present", async () => { - await catchRevert(I_SecurityToken.totalSupplyAt.call(50)); + await catchRevert(stGetter.totalSupplyAt.call(50)); }); }); @@ -565,7 +578,7 @@ contract("SecurityToken", async (accounts) => { it("Should fail to provide the permission to the delegate to change the transfer bools -- Bad owner", async () => { // Add permission to the deletgate (A regesteration process) await I_SecurityToken.addModule(I_GeneralPermissionManagerFactory.address, "0x0", new BN(0), new BN(0), { from: token_owner }); - let moduleData = (await I_SecurityToken.getModulesByType(permissionManagerKey))[0]; + let moduleData = (await stGetter.getModulesByType(permissionManagerKey))[0]; I_GeneralPermissionManager = await GeneralPermissionManager.at(moduleData); await catchRevert(I_GeneralPermissionManager.addDelegate(account_delegate, delegateDetails, { from: account_temp })); }); @@ -671,20 +684,21 @@ contract("SecurityToken", async (accounts) => { await revertToSnapshot(ID_snap); }); - it("Should successfully mint tokens while STO attached", async () => { - await I_SecurityToken.mint(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), { from: token_owner }); + it("Should successfully issue tokens while STO attached", async () => { + await I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner }); let balance = await I_SecurityToken.balanceOf(account_affiliate1); assert.equal(balance.div(new BN(10).pow(new BN(18))).toNumber(), 400); }); - it("Should mint the tokens for multiple afiliated investors while STO attached", async () => { - await I_SecurityToken.mintMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(110).mul(new BN(10).pow(new BN(18)))], { + it("Should issue the tokens for multiple afiliated investors while STO attached", async () => { + await I_SecurityToken.issueMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(110).mul(new BN(10).pow(new BN(18)))], { from: token_owner }); let balance1 = await I_SecurityToken.balanceOf(account_affiliate1); assert.equal(balance1.div(new BN(10).pow(new BN(18))).toNumber(), 500); let balance2 = await I_SecurityToken.balanceOf(account_affiliate2); assert.equal(balance2.div(new BN(10).pow(new BN(18))).toNumber(), 220); + console.log((await stGetter.getInvestorCount.call()).toNumber()); }); it("Should provide more permissions to the delegate", async () => { @@ -723,9 +737,9 @@ contract("SecurityToken", async (accounts) => { assert.equal((await I_SecurityToken.balanceOf(account_investor1)).div(new BN(10).pow(new BN(18))).toNumber(), 1000); }); - it("STO should fail to mint tokens after minting is frozen", async () => { + it("STO should fail to issue tokens after minting is frozen", async () => { let id = await takeSnapshot(); - await I_SecurityToken.freezeMinting({ from: token_owner }); + await I_SecurityToken.freezeIssuance({ from: token_owner }); await catchRevert( web3.eth.sendTransaction({ @@ -808,7 +822,7 @@ contract("SecurityToken", async (accounts) => { it("Should check that the list of investors is correct", async () => { // Hardcode list of expected accounts based on transfers above - let investors = await I_SecurityToken.getInvestors(); + let investors = await stGetter.getInvestors.call(); let expectedAccounts = [account_affiliate1, account_affiliate2, account_investor1, account_temp]; for (let i = 0; i < expectedAccounts.length; i++) { assert.equal(investors[i], expectedAccounts[i]); @@ -847,36 +861,46 @@ contract("SecurityToken", async (accounts) => { it("Should force burn the tokens - value too high", async () => { await I_GeneralTransferManager.changeAllowAllBurnTransfers(true, { from: token_owner }); - let currentInvestorCount = await I_SecurityToken.getInvestorCount.call(); + let currentInvestorCount = await stGetter.getInvestorCount.call(); let currentBalance = await I_SecurityToken.balanceOf(account_temp); await catchRevert( - I_SecurityToken.forceBurn(account_temp, currentBalance + new BN(web3.utils.toWei("500", "ether")), "0x0", "0x0", { + I_SecurityToken.controllerRedeem(account_temp, currentBalance + new BN(web3.utils.toWei("500", "ether")), "0x0", "0x0", { from: account_controller }) ); }); it("Should force burn the tokens - wrong caller", async () => { await I_GeneralTransferManager.changeAllowAllBurnTransfers(true, { from: token_owner }); - let currentInvestorCount = await I_SecurityToken.getInvestorCount.call(); + let currentInvestorCount = await stGetter.getInvestorCount.call(); let currentBalance = await I_SecurityToken.balanceOf(account_temp); - await catchRevert(I_SecurityToken.forceBurn(account_temp, currentBalance, "0x0", "0x0", { from: token_owner })); + let investors = await stGetter.getInvestors.call(); + for (let i = 0; i < investors.length; i++) { + console.log(investors[i]); + console.log(web3.utils.fromWei((await I_SecurityToken.balanceOf(investors[i])).toString())); + } + await catchRevert(I_SecurityToken.controllerRedeem(account_temp, currentBalance, "0x0", "0x0", { from: token_owner })); }); - it("Should burn the tokens", async () => { - let currentInvestorCount = await I_SecurityToken.getInvestorCount.call(); + it.skip("Should burn the tokens", async () => { + let currentInvestorCount = await stGetter.getInvestorCount.call(); let currentBalance = await I_SecurityToken.balanceOf(account_temp); - // console.log(currentInvestorCount.toString(), currentBalance.toString()); - let tx = await I_SecurityToken.forceBurn(account_temp, currentBalance, "0x0", "0x0", { from: account_controller }); + let investors = await stGetter.getInvestors.call(); + for (let i = 0; i < investors.length; i++) { + console.log(investors[i]); + console.log(web3.utils.fromWei((await I_SecurityToken.balanceOf(investors[i])).toString())); + } + console.log(currentInvestorCount.toString(), web3.utils.fromWei(currentBalance.toString())); + let tx = await I_SecurityToken.controllerRedeem(account_temp, currentBalance, "0x0", "0x0", { from: account_controller }); // console.log(tx.logs[1].args._value.toNumber(), currentBalance.toNumber()); assert.equal(tx.logs[1].args._value.toString(), currentBalance.toString()); - let newInvestorCount = await I_SecurityToken.getInvestorCount.call(); + let newInvestorCount = await stGetter.getInvestorCount.call(); // console.log(newInvestorCount.toString()); assert.equal(newInvestorCount.toNumber() + 1, currentInvestorCount.toNumber(), "Investor count drops by one"); }); - it("Should use getInvestorsAt to determine balances now", async () => { + it.skip("Should use getInvestorsAt to determine balances now", async () => { await I_SecurityToken.createCheckpoint({ from: token_owner }); - let investors = await I_SecurityToken.getInvestorsAt.call(1); + let investors = await stGetter.getInvestorsAt.call(1); console.log("Filtered investors:" + investors); let expectedAccounts = [account_affiliate1, account_affiliate2, account_investor1]; for (let i = 0; i < expectedAccounts.length; i++) { @@ -885,20 +909,20 @@ contract("SecurityToken", async (accounts) => { assert.equal(investors.length, 3); }); - it("Should prune investor length test #2", async () => { + it.skip("Should prune investor length test #2", async () => { let balance = await I_SecurityToken.balanceOf(account_affiliate2); let balance2 = await I_SecurityToken.balanceOf(account_investor1); await I_SecurityToken.transfer(account_affiliate1, balance, { from: account_affiliate2 }); await I_SecurityToken.transfer(account_affiliate1, balance2, { from: account_investor1 }); await I_SecurityToken.createCheckpoint({ from: token_owner }); - let investors = await I_SecurityToken.getInvestors.call(); + let investors = await stGetter.getInvestors.call(); console.log("All investors:" + investors); let expectedAccounts = [account_affiliate1, account_affiliate2, account_investor1, account_temp]; for (let i = 0; i < expectedAccounts.length; i++) { assert.equal(investors[i], expectedAccounts[i]); } assert.equal(investors.length, 4); - investors = await I_SecurityToken.getInvestorsAt.call(2); + investors = await stGetter.getInvestorsAt.call(2); console.log("Filtered investors:" + investors); expectedAccounts = [account_affiliate1]; for (let i = 0; i < expectedAccounts.length; i++) { @@ -909,39 +933,39 @@ contract("SecurityToken", async (accounts) => { await I_SecurityToken.transfer(account_investor1, balance2, { from: account_affiliate1 }); }); - it("Should get filtered investors", async () => { - let investors = await I_SecurityToken.getInvestors.call(); + it.skip("Should get filtered investors", async () => { + let investors = await stGetter.getInvestors.call(); console.log("All Investors: " + investors); - let filteredInvestors = await I_SecurityToken.iterateInvestors.call(0, 1); + let filteredInvestors = await stGetter.iterateInvestors.call(0, 1); console.log("Filtered Investors (0, 1): " + filteredInvestors); assert.equal(filteredInvestors[0], investors[0]); assert.equal(filteredInvestors.length, 1); - filteredInvestors = await I_SecurityToken.iterateInvestors.call(2, 4); + filteredInvestors = await stGetter.iterateInvestors.call(2, 4); console.log("Filtered Investors (2, 4): " + filteredInvestors); assert.equal(filteredInvestors[0], investors[2]); assert.equal(filteredInvestors[1], investors[3]); assert.equal(filteredInvestors.length, 2); - filteredInvestors = await I_SecurityToken.iterateInvestors.call(0, 4); + filteredInvestors = await stGetter.iterateInvestors.call(0, 4); console.log("Filtered Investors (0, 4): " + filteredInvestors); assert.equal(filteredInvestors[0], investors[0]); assert.equal(filteredInvestors[1], investors[1]); assert.equal(filteredInvestors[2], investors[2]); assert.equal(filteredInvestors[3], investors[3]); assert.equal(filteredInvestors.length, 4); - await catchRevert(I_SecurityToken.iterateInvestors(0, 5)); + await catchRevert(stGetter.iterateInvestors(0, 5)); }); - it("Should check the balance of investor at checkpoint", async () => { - await catchRevert(I_SecurityToken.balanceOfAt(account_investor1, 5)); + it.skip("Should check the balance of investor at checkpoint", async () => { + await catchRevert(stGetter.balanceOfAt(account_investor1, 5)); }); - it("Should check the balance of investor at checkpoint", async () => { - let balance = await I_SecurityToken.balanceOfAt(account_investor1, 0); + it.skip("Should check the balance of investor at checkpoint", async () => { + let balance = await stGetter.balanceOfAt(account_investor1, 0); assert.equal(balance.toNumber(), 0); }); }); - describe("Test cases for the Mock TrackedRedeemption", async () => { + describe.skip("Test cases for the Mock TrackedRedeemption", async () => { it("Should add the tracked redeemption module successfully", async () => { [I_MockRedemptionManagerFactory] = await deployMockRedemptionAndVerifyed(account_polymath, I_MRProxied, 0); let tx = await I_SecurityToken.addModule(I_MockRedemptionManagerFactory.address, "0x0", new BN(0), new BN(0), { from: token_owner }); @@ -966,7 +990,7 @@ contract("SecurityToken", async (accounts) => { it("Should successfully burn tokens", async () => { await I_GeneralTransferManager.changeAllowAllWhitelistTransfers(false, { from: token_owner }); // Minting some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("1000")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("1000")), "0x0", { from: token_owner }); // Provide approval to trnafer the tokens to Module await I_SecurityToken.approve(I_MockRedemptionManager.address, new BN(web3.utils.toWei("500")), { from: account_investor1 }); // Allow all whitelist transfer @@ -1015,7 +1039,7 @@ contract("SecurityToken", async (accounts) => { }); }); - describe("Withdraw Poly", async () => { + describe.skip("Withdraw Poly", async () => { it("Should successfully withdraw the poly -- failed because of zero address of token", async () => { await catchRevert( I_SecurityToken.withdrawERC20(address_zero, new BN(web3.utils.toWei("20000", "ether")), { @@ -1047,40 +1071,40 @@ contract("SecurityToken", async (accounts) => { }); }); - describe("Force Transfer", async () => { - it("Should fail to forceTransfer because not approved controller", async () => { + describe.skip("Force Transfer", async () => { + it("Should fail to controllerTransfer because not approved controller", async () => { await catchRevert( - I_SecurityToken.forceTransfer(account_investor1, account_investor2, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { + I_SecurityToken.controllerTransfer(account_investor1, account_investor2, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { from: account_investor1 }) ); }); - it("Should fail to forceTransfer because insufficient balance", async () => { + it("Should fail to controllerTransfer because insufficient balance", async () => { await catchRevert( - I_SecurityToken.forceTransfer(account_investor2, account_investor1, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { + I_SecurityToken.controllerTransfer(account_investor2, account_investor1, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { from: account_controller }) ); }); - it("Should fail to forceTransfer because recipient is zero address", async () => { + it("Should fail to controllerTransfer because recipient is zero address", async () => { await catchRevert( - I_SecurityToken.forceTransfer(account_investor1, address_zero, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { + I_SecurityToken.controllerTransfer(account_investor1, address_zero, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { from: account_controller }) ); }); - it("Should successfully forceTransfer", async () => { + it("Should successfully controllerTransfer", async () => { let sender = account_investor1; let receiver = account_investor2; - let start_investorCount = await I_SecurityToken.getInvestorCount.call(); + let start_investorCount = await stGetter.getInvestorCount.call(); let start_balInv1 = await I_SecurityToken.balanceOf.call(account_investor1); let start_balInv2 = await I_SecurityToken.balanceOf.call(account_investor2); - let tx = await I_SecurityToken.forceTransfer( + let tx = await I_SecurityToken.controllerTransfer( account_investor1, account_investor2, new BN(web3.utils.toWei("10", "ether")), @@ -1089,7 +1113,7 @@ contract("SecurityToken", async (accounts) => { { from: account_controller } ); - let end_investorCount = await I_SecurityToken.getInvestorCount.call(); + let end_investorCount = await stGetter.getInvestorCount.call(); let end_balInv1 = await I_SecurityToken.balanceOf.call(account_investor1); let end_balInv2 = await I_SecurityToken.balanceOf.call(account_investor2); @@ -1151,12 +1175,106 @@ contract("SecurityToken", async (accounts) => { await catchRevert(I_SecurityToken.setController(account_controller, { from: token_owner })); }); - it("Should fail to forceTransfer because controller functionality frozen", async () => { + it("Should fail to controllerTransfer because controller functionality frozen", async () => { await catchRevert( - I_SecurityToken.forceTransfer(account_investor1, account_investor2, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { + I_SecurityToken.controllerTransfer(account_investor1, account_investor2, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { from: account_controller }) ); }); + + }); + + describe("Test cases for the storage", async() => { + + it("Test the storage values of the ERC20 vairables", async() => { + for (let j = 0; j < 20; j++) { + console.log(await readStorage(I_SecurityToken.address, j)); + } + + let investors = await stGetter.getInvestors.call(); + + console.log("Verifying the balances of the Addresses"); + let index; + let key; + let newKey = new Array(); + + function getBN(data) { + return new BN(data.substring(2), 'hex'); + } + + function getIndex(slot) { + return web3.utils.sha3(encodeUint(slot)); + } + + function encodeUint(data) { + return web3.eth.abi.encodeParameter('uint256', data); + } + + for (let i = 0; i < investors.length; i++) { + index = getBN(getIndex(0)); + //index = web3.utils.padLeft(0, 64); + console.log(index); + key = web3.utils.padLeft(investors[i], 64); + console.log(key); + var tempKey = key + index; + newKey.push(web3.utils.sha3(tempKey, {"encoding": "hex"})); + console.log(newKey[i]); + console.log("\n"); + } + + console.log(newKey[0]); + console.log(` + Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[0])).toString())} + Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[0]))).toString())} + `) + console.log(newKey[1]); + console.log(` + Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[1])).toString())} + Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[1]))).toString())} + `) + console.log(newKey[2]); + console.log(` + Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[2])).toString())} + Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[2]))).toString())} + `) + console.log(newKey[3]); + console.log(` + Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[3])).toString())} + Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[3]))).toString())} + `) + + console.log(` + TotalSupply from contract: ${web3.utils.fromWei((await I_SecurityToken.totalSupply.call()).toString())} + TotalSupply from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, 2))).toString())} + `); + + console.log(` + Name of the ST: ${await I_SecurityToken.name.call()} + Name of the ST from the storage: ${web3.utils.toUtf8(await readStorage(I_SecurityToken.address, 3))} + `); + + console.log(` + Symbol of the ST: ${await I_SecurityToken.symbol.call()} + Symbol of the ST from the storage: ${web3.utils.toUtf8(await readStorage(I_SecurityToken.address, 4))} + `); + + // console.log(` + // Decimal of the ST: ${(await I_SecurityToken.decimals.call()).toString()} + // Decimal of the ST from the storage: ${(await stGetter.dec.call()).toString()} + // `); + + console.log(` + Address of the owner: ${await I_SecurityToken.owner.call()} + Address of the owner from the storage: ${await readStorage(I_SecurityToken.address, 5)} + `) + + console.log(` + Guard value from the storage: ${(web3.utils.toBN(await readStorage(I_SecurityToken.address, 7))).toString()} + `) + + }); + }); + }); From 055b0c453754451ef4faf4adf0749db5316d75e7 Mon Sep 17 00:00:00 2001 From: Mudit Gupta Date: Tue, 22 Jan 2019 19:34:43 +0530 Subject: [PATCH 07/16] fixed mapping storage read --- test/o_security_token.js | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/test/o_security_token.js b/test/o_security_token.js index 2174a8d62..6792e6c3a 100644 --- a/test/o_security_token.js +++ b/test/o_security_token.js @@ -1199,26 +1199,21 @@ contract("SecurityToken", async (accounts) => { let key; let newKey = new Array(); - function getBN(data) { - return new BN(data.substring(2), 'hex'); - } - - function getIndex(slot) { - return web3.utils.sha3(encodeUint(slot)); - } - function encodeUint(data) { return web3.eth.abi.encodeParameter('uint256', data); } for (let i = 0; i < investors.length; i++) { - index = getBN(getIndex(0)); + console.log('yo'); + index = encodeUint(0); //index = web3.utils.padLeft(0, 64); console.log(index); - key = web3.utils.padLeft(investors[i], 64); + //key = web3.utils.padLeft(investors[i], 64); + key = web3.eth.abi.encodeParameter('address', investors[i]) console.log(key); - var tempKey = key + index; - newKey.push(web3.utils.sha3(tempKey, {"encoding": "hex"})); + var tempKey = key.substring(2) + index.substring(2); + console.log(tempKey); + newKey.push(encodeUint(web3.utils.sha3(tempKey, {"encoding": "hex"}))); console.log(newKey[i]); console.log("\n"); } From 898ea1de7241a1e181de93e36b84c8a0132e6357 Mon Sep 17 00:00:00 2001 From: Mudit Gupta Date: Tue, 22 Jan 2019 19:41:04 +0530 Subject: [PATCH 08/16] minor fix --- test/o_security_token.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/o_security_token.js b/test/o_security_token.js index 6792e6c3a..9c052c7dd 100644 --- a/test/o_security_token.js +++ b/test/o_security_token.js @@ -1211,7 +1211,7 @@ contract("SecurityToken", async (accounts) => { //key = web3.utils.padLeft(investors[i], 64); key = web3.eth.abi.encodeParameter('address', investors[i]) console.log(key); - var tempKey = key.substring(2) + index.substring(2); + var tempKey = key + index.substring(2); console.log(tempKey); newKey.push(encodeUint(web3.utils.sha3(tempKey, {"encoding": "hex"}))); console.log(newKey[i]); From 5f71000803131da191039e12b14dffd0d1021a01 Mon Sep 17 00:00:00 2001 From: satyam Date: Thu, 24 Jan 2019 20:48:43 +0530 Subject: [PATCH 09/16] test fixes --- contracts/tokens/STGetter.sol | 12 +- contracts/tokens/SecurityToken.sol | 8 +- contracts/tokens/SecurityTokenStorage.sol | 99 ++++---- test/b_capped_sto.js | 17 +- test/c_checkpoints.js | 52 +++-- test/d_count_transfer_manager.js | 37 +-- test/e_erc20_dividends.js | 18 +- test/f_ether_dividends.js | 20 +- test/g_general_permission_manager.js | 14 +- test/h_general_transfer_manager.js | 12 +- test/i_Issuance.js | 12 +- test/j_manual_approval_transfer_manager.js | 44 ++-- test/k_module_registry.js | 6 +- test/l_percentage_transfer_manager.js | 22 +- test/m_presale_sto.js | 10 +- test/n_security_token_registry.js | 12 +- test/o_security_token.js | 213 +++++++++++++----- test/p_usd_tiered_sto.js | 11 +- test/q_usd_tiered_sto_sim.js | 10 +- test/r_concurrent_STO.js | 10 +- test/s_v130_to_v140_upgrade.js | 22 +- test/t_security_token_registry_proxy.js | 6 +- test/u_module_registry_proxy.js | 9 +- test/v_tracked_redemptions.js | 18 +- ...kup_volume_restriction_transfer_manager.js | 26 ++- test/y_scheduled_checkpoints.js | 104 +++++---- test/z_general_permission_manager_fuzzer.js | 10 +- 27 files changed, 518 insertions(+), 316 deletions(-) diff --git a/contracts/tokens/STGetter.sol b/contracts/tokens/STGetter.sol index 5bdad377c..322748b34 100644 --- a/contracts/tokens/STGetter.sol +++ b/contracts/tokens/STGetter.sol @@ -93,7 +93,14 @@ contract STGetter is OZStorage, SecurityTokenStorage { * @return bytes32 module label */ function getModule(address _module) external view returns(bytes32, address, address, bool, uint8[] memory, bytes32) { - return (modulesToData[_module].name, modulesToData[_module].module, modulesToData[_module].moduleFactory, modulesToData[_module].isArchived, modulesToData[_module].moduleTypes, modulesToData[_module].label); + return ( + modulesToData[_module].name, + modulesToData[_module].module, + modulesToData[_module].moduleFactory, + modulesToData[_module].isArchived, + modulesToData[_module].moduleTypes, + modulesToData[_module].label + ); } /** @@ -189,7 +196,8 @@ contract STGetter is OZStorage, SecurityTokenStorage { _amount += ITransferManager(tms[i]).getUnLockedToken(_owner); } return _amount; - } + } + return 0; } /** diff --git a/contracts/tokens/SecurityToken.sol b/contracts/tokens/SecurityToken.sol index 2418aa2e0..cd0740c4a 100644 --- a/contracts/tokens/SecurityToken.sol +++ b/contracts/tokens/SecurityToken.sol @@ -493,9 +493,9 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi onlyModuleOrOwner(MINT_KEY) { // Add a function to validate the `_data` parameter - _mint(_tokenHolder, _value); require(_updateTransfer(address(0), _tokenHolder, _value, _data), "Transfer invalid"); - _adjustTotalSupplyCheckpoints(); + _adjustTotalSupplyCheckpoints(); + _mint(_tokenHolder, _value); emit Issued(msg.sender, _tokenHolder, _value, _data); } @@ -520,7 +520,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi * @param _value The amount of tokens need to be redeemed * @param _data The `bytes _data` it can be used in the token contract to authenticate the redemption. */ - function redeem(uint256 _value, bytes calldata _data) external { + function redeem(uint256 _value, bytes calldata _data) external onlyModule(BURN_KEY) { // Add a function to validate the `_data` parameter require(_checkAndBurn(msg.sender, _value, _data), "Invalid redeem"); } @@ -542,7 +542,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi * @param _value The amount of tokens need to be redeemed * @param _data The `bytes _data` it can be used in the token contract to authenticate the redemption. */ - function redeemFrom(address _tokenHolder, uint256 _value, bytes calldata _data) external { + function redeemFrom(address _tokenHolder, uint256 _value, bytes calldata _data) external onlyModule(BURN_KEY) { // Add a function to validate the `_data` parameter require(_updateTransfer(_tokenHolder, address(0), _value, _data), "Invalid redeem"); _adjustTotalSupplyCheckpoints(); diff --git a/contracts/tokens/SecurityTokenStorage.sol b/contracts/tokens/SecurityTokenStorage.sol index 7cb6391b5..51de54bc1 100644 --- a/contracts/tokens/SecurityTokenStorage.sol +++ b/contracts/tokens/SecurityTokenStorage.sol @@ -8,34 +8,8 @@ contract SecurityTokenStorage { uint8 constant CHECKPOINT_KEY = 4; uint8 constant BURN_KEY = 5; - uint256 public granularity; - - // Used to permanently halt controller actions - bool public controllerDisabled = false; - - // Used to temporarily halt all transactions - bool public transfersFrozen; - - // Value of current checkpoint - uint256 public currentCheckpointId; - - // Records added modules - module list should be order agnostic! - mapping(uint8 => address[]) modules; - - // Records information about the module - mapping(address => ModuleData) modulesToData; - - // Records added module names - module list should be order agnostic! - mapping(bytes32 => address[]) names; - - // Map each investor to a series of checkpoints - mapping(address => Checkpoint[]) checkpointBalances; - - // List of checkpoints that relate to total supply - Checkpoint[] checkpointTotalSupply; - - // Times at which each checkpoint was created - uint256[] checkpointTimes; + bytes32 constant LOCKED = "LOCKED"; + bytes32 constant UNLOCKED = "UNLOCKED"; ////////////////////////// /// Document datastructure @@ -77,44 +51,69 @@ contract SecurityTokenStorage { mapping(address => bool) investorListed; // List of token holders address[] investors; - // Total number of non-zero token holders + // Total number of non-zero token holders uint256 investorCount; } - InvestorDataStorage investorData; + // Address of the controller which is a delegated entity + // set by the issuer/owner of the token + address public controller; - SemanticVersion securityTokenVersion; + address public polymathRegistry; + address public moduleRegistry; + address public securityTokenRegistry; + address public featureRegistry; + address public polyToken; + address public delegate; + + uint256 public granularity; + + // Value of current checkpoint + uint256 public currentCheckpointId; // off-chain data string public tokenDetails; - // mapping to store the documents details in the document - mapping(bytes32 => Document) internal _documents; - // mapping to store the document name indexes - mapping(bytes32 => uint256) internal _docIndexes; - // Array use to store all the document name present in the contracts - bytes32[] _docNames; - - + // Used to permanently halt controller actions + bool public controllerDisabled = false; + + // Used to temporarily halt all transactions + bool public transfersFrozen; + // Variable which tells whether issuance is ON or OFF forever // Implementers need to implement one more function to reset the value of `issuance` variable // to false. That function is not a part of the standard (EIP-1594) as it is depend on the various factors // issuer, followed compliance rules etc. So issuers have the choice how they want to close the issuance. bool internal issuance = true; - // Address of the controller which is a delegated entity - // set by the issuer/owner of the token - address public controller; + // Array use to store all the document name present in the contracts + bytes32[] _docNames; + + // Times at which each checkpoint was created + uint256[] checkpointTimes; - address public polymathRegistry; - address public moduleRegistry; - address public securityTokenRegistry; - address public featureRegistry; - address public polyToken; + // List of checkpoints that relate to total supply + Checkpoint[] checkpointTotalSupply; - address public delegate; + InvestorDataStorage investorData; - bytes32 constant LOCKED = "LOCKED"; - bytes32 constant UNLOCKED = "UNLOCKED"; + SemanticVersion securityTokenVersion; + + // Records added modules - module list should be order agnostic! + mapping(uint8 => address[]) modules; + + // Records information about the module + mapping(address => ModuleData) modulesToData; + + // Records added module names - module list should be order agnostic! + mapping(bytes32 => address[]) names; + + // Map each investor to a series of checkpoints + mapping(address => Checkpoint[]) checkpointBalances; + + // mapping to store the documents details in the document + mapping(bytes32 => Document) internal _documents; + // mapping to store the document name indexes + mapping(bytes32 => uint256) internal _docIndexes; } \ No newline at end of file diff --git a/test/b_capped_sto.js b/test/b_capped_sto.js index 94d0d4368..9ca54c275 100644 --- a/test/b_capped_sto.js +++ b/test/b_capped_sto.js @@ -10,6 +10,7 @@ const CappedSTO = artifacts.require("./CappedSTO.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -60,6 +61,9 @@ contract("CappedSTO", async (accounts) => { let I_STRProxied; let I_MRProxied; let I_STRGetter; + let I_STGetter; + let stGetter_eth; + let stGetter_poly; let pauseTime; // SecurityToken Details for funds raise Type ETH @@ -129,7 +133,8 @@ contract("CappedSTO", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 5: Deploy the GeneralDelegateManagerFactory @@ -175,7 +180,7 @@ contract("CappedSTO", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol, "SecurityToken doesn't get deployed"); I_SecurityToken_ETH = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter_eth = await STGetter.at(I_SecurityToken_ETH.address); const log = (await I_SecurityToken_ETH.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not assert.equal(log.args._types[0].toNumber(), transferManagerKey); @@ -183,12 +188,12 @@ contract("CappedSTO", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken_ETH.getModulesByType(transferManagerKey))[0]; + let moduleData = (await stGetter_eth.getModulesByType(transferManagerKey))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); it("Should mint the tokens before attaching the STO", async () => { - await catchRevert(I_SecurityToken_ETH.mint(address_zero, new BN(new BN(web3.utils.toWei("1"))), { from: token_owner })); + await catchRevert(I_SecurityToken_ETH.issue(address_zero, new BN(new BN(web3.utils.toWei("1"))), "0x0", { from: token_owner })); }); it("Should fail to launch the STO due to security token doesn't have the sufficient POLY", async () => { @@ -623,7 +628,7 @@ contract("CappedSTO", async (accounts) => { assert.equal(tx.logs[2].args._ticker, P_symbol, "SecurityToken doesn't get deployed"); I_SecurityToken_POLY = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter_poly = await STGetter.at(I_SecurityToken_POLY.address); const log = (await I_SecurityToken_POLY.getPastEvents('ModuleAdded', {filter: {from: blockNo}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -632,7 +637,7 @@ contract("CappedSTO", async (accounts) => { }); it("POLY: Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken_POLY.getModulesByType(transferManagerKey))[0]; + let moduleData = (await stGetter_poly.getModulesByType(transferManagerKey))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); diff --git a/test/c_checkpoints.js b/test/c_checkpoints.js index d50620db6..e026693d5 100644 --- a/test/c_checkpoints.js +++ b/test/c_checkpoints.js @@ -2,9 +2,11 @@ import latestTime from "./helpers/latestTime"; import { duration, ensureException, promisifyLogWatch, latestBlock } from "./helpers/utils"; import takeSnapshot, { increaseTime, revertToSnapshot } from "./helpers/time"; import { setUpPolymathNetwork } from "./helpers/createInstances"; +import { catchRevert } from "./helpers/exceptions"; const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -19,6 +21,7 @@ contract("Checkpoints", async function(accounts) { let account_investor2; let account_investor3; let account_investor4; + let account_controller; let message = "Transaction Should Fail!"; @@ -45,6 +48,8 @@ contract("Checkpoints", async function(accounts) { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -70,7 +75,7 @@ contract("Checkpoints", async function(accounts) { account_issuer = accounts[1]; token_owner = account_issuer; - + account_controller = accounts[3]; account_investor1 = accounts[6]; account_investor2 = accounts[7]; account_investor3 = accounts[8]; @@ -91,7 +96,8 @@ contract("Checkpoints", async function(accounts) { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // Printing all the contract addresses @@ -126,7 +132,7 @@ contract("Checkpoints", async function(accounts) { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -134,12 +140,18 @@ contract("Checkpoints", async function(accounts) { assert.equal(web3.utils.toAscii(log.args._name).replace(/\u0000/g, ""), "GeneralTransferManager"); }); - it("Should set controller to token owner", async () => { - await I_SecurityToken.setController(token_owner, { from: token_owner }); + it("Should set controller to token owner --failed not allowed", async () => { + await catchRevert( + I_SecurityToken.setController(token_owner, { from: token_owner }) + ); }); + it("Should set the tcontroller", async() => { + await I_SecurityToken.setController(account_controller, {from: token_owner}); + }) + it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); }); @@ -166,7 +178,7 @@ contract("Checkpoints", async function(accounts) { ); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("10", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("10", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("10", "ether")).toString()); }); @@ -193,7 +205,7 @@ contract("Checkpoints", async function(accounts) { ); // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("10", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("10", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("10", "ether")).toString()); }); @@ -220,7 +232,7 @@ contract("Checkpoints", async function(accounts) { // Add the Investor in to the whitelist // Mint some tokens - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("10", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("10", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("10", "ether")).toString()); }); @@ -245,7 +257,7 @@ contract("Checkpoints", async function(accounts) { JSON.stringify(totalSupply) ); await I_SecurityToken.createCheckpoint({ from: token_owner }); - let checkpointTimes = await I_SecurityToken.getCheckpointTimes(); + let checkpointTimes = await stGetter.getCheckpointTimes(); assert.equal(checkpointTimes.length, j + 1); console.log("Checkpoint Times: " + checkpointTimes); let txs = Math.floor(Math.random() * 3); @@ -292,7 +304,7 @@ contract("Checkpoints", async function(accounts) { minter = account_investor3; } console.log("Minting: " + n.toString() + " to: " + minter); - await I_SecurityToken.mint(minter, n, { from: token_owner }); + await I_SecurityToken.issue(minter, n, "0x0", { from: token_owner }); } if (Math.random() > 0.5) { let n = new BN(Math.random().toFixed(10)).mul(new BN(10).pow(new BN(17))); @@ -311,14 +323,14 @@ contract("Checkpoints", async function(accounts) { n = burnerBalance.div(new BN(2)); } console.log("Burning: " + n.toString() + " from: " + burner); - await I_SecurityToken.forceBurn(burner, n, "0x0", "0x0", { from: token_owner }); + await I_SecurityToken.controllerRedeem(burner, n, "0x0", "0x0", { from: account_controller }); } console.log("Checking Interim..."); for (let k = 0; k < cps.length; k++) { - let balance1 = new BN(await I_SecurityToken.balanceOfAt(account_investor1, k + 1)); - let balance2 = new BN(await I_SecurityToken.balanceOfAt(account_investor2, k + 1)); - let balance3 = new BN(await I_SecurityToken.balanceOfAt(account_investor3, k + 1)); - let totalSupply = new BN(await I_SecurityToken.totalSupplyAt(k + 1)); + let balance1 = new BN(await stGetter.balanceOfAt(account_investor1, k + 1)); + let balance2 = new BN(await stGetter.balanceOfAt(account_investor2, k + 1)); + let balance3 = new BN(await stGetter.balanceOfAt(account_investor3, k + 1)); + let totalSupply = new BN(await stGetter.totalSupplyAt(k + 1)); let balances = [balance1, balance2, balance3]; console.log("Checking TotalSupply: " + totalSupply + " is " + ts[k] + " at checkpoint: " + (k + 1)); assert.isTrue(totalSupply.eq(ts[k])); @@ -331,10 +343,10 @@ contract("Checkpoints", async function(accounts) { } console.log("Checking..."); for (let k = 0; k < cps.length; k++) { - let balance1 = new BN(await I_SecurityToken.balanceOfAt(account_investor1, k + 1)); - let balance2 = new BN(await I_SecurityToken.balanceOfAt(account_investor2, k + 1)); - let balance3 = new BN(await I_SecurityToken.balanceOfAt(account_investor3, k + 1)); - let totalSupply = new BN(await I_SecurityToken.totalSupplyAt(k + 1)); + let balance1 = new BN(await stGetter.balanceOfAt(account_investor1, k + 1)); + let balance2 = new BN(await stGetter.balanceOfAt(account_investor2, k + 1)); + let balance3 = new BN(await stGetter.balanceOfAt(account_investor3, k + 1)); + let totalSupply = new BN(await stGetter.totalSupplyAt(k + 1)); let balances = [balance1, balance2, balance3]; console.log("Checking TotalSupply: " + totalSupply + " is " + ts[k] + " at checkpoint: " + (k + 1)); assert.isTrue(totalSupply.eq(ts[k])); diff --git a/test/d_count_transfer_manager.js b/test/d_count_transfer_manager.js index 18594249d..6660d2c70 100644 --- a/test/d_count_transfer_manager.js +++ b/test/d_count_transfer_manager.js @@ -9,6 +9,7 @@ const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const CountTransferManagerFactory = artifacts.require("./CountTransferManagerFactory.sol"); const CountTransferManager = artifacts.require("./CountTransferManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -50,6 +51,9 @@ contract("CountTransferManager", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; + let stGetter2; // SecurityToken Details const name = "Team"; @@ -101,7 +105,8 @@ contract("CountTransferManager", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 2: Deploy the CountTransferManager @@ -142,7 +147,7 @@ contract("CountTransferManager", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -151,7 +156,7 @@ contract("CountTransferManager", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -222,7 +227,7 @@ contract("CountTransferManager", async (accounts) => { await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -249,7 +254,7 @@ contract("CountTransferManager", async (accounts) => { ); // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("2", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("2", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("2", "ether")).toString()); }); @@ -275,7 +280,7 @@ contract("CountTransferManager", async (accounts) => { "Failed in adding the investor in whitelist" ); - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("3", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("3", "ether")), "0x0", { from: token_owner }); await revertToSnapshot(snapId); }); @@ -300,13 +305,13 @@ contract("CountTransferManager", async (accounts) => { "Failed in adding the investor in whitelist" ); - await catchRevert(I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("3", "ether")), { from: token_owner })); + await catchRevert(I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("3", "ether")), "0x0", { from: token_owner })); }); it("Should still be able to add to original token holders", async () => { // Add the Investor in to the whitelist // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("2", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("2", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("4", "ether")).toString()); }); @@ -364,8 +369,8 @@ contract("CountTransferManager", async (accounts) => { let tx2 = await I_STRProxied.generateSecurityToken(name, symbol2, tokenDetails, false, { from: token_owner }); I_SecurityToken2 = await SecurityToken.at(tx2.logs[2].args._securityTokenAddress); - - let moduleData = (await I_SecurityToken2.getModulesByType(2))[0]; + stGetter2 = await STGetter.at(I_SecurityToken2.address); + let moduleData = (await stGetter2.getModulesByType(2))[0]; I_GeneralTransferManager2 = await GeneralTransferManager.at(moduleData); }); @@ -422,14 +427,14 @@ contract("CountTransferManager", async (accounts) => { await increaseTime(5000); // Add 3 holders to the token - await I_SecurityToken2.mint(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); - await I_SecurityToken2.mint(account_investor2, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); - await I_SecurityToken2.mint(account_investor3, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken2.issue(account_investor1, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); + await I_SecurityToken2.issue(account_investor2, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); + await I_SecurityToken2.issue(account_investor3, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken2.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken2.getModulesByType(2))[0]; + let moduleData = (await stGetter2.getModulesByType(2))[0]; I_GeneralTransferManager2 = await GeneralTransferManager.at(moduleData); }); @@ -457,11 +462,11 @@ contract("CountTransferManager", async (accounts) => { it("Should allow add a new token holder while transfer all the tokens at one go", async () => { let amount = await I_SecurityToken2.balanceOf(account_investor2); - let investorCount = await I_SecurityToken2.getInvestorCount({ from: account_investor2 }); + let investorCount = await stGetter2.getInvestorCount({ from: account_investor2 }); console.log("current investor count is " + investorCount); await I_SecurityToken2.transfer(account_investor4, amount, { from: account_investor2 }); assert((await I_SecurityToken2.balanceOf(account_investor4)).toString(), amount.toString(), { from: account_investor2 }); - assert(await I_SecurityToken2.getInvestorCount({ from: account_investor2 }), investorCount); + assert(await stGetter2.getInvestorCount({ from: account_investor2 }), investorCount); }); }); diff --git a/test/e_erc20_dividends.js b/test/e_erc20_dividends.js index 49472fc7a..e297a5f30 100644 --- a/test/e_erc20_dividends.js +++ b/test/e_erc20_dividends.js @@ -8,6 +8,7 @@ const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const ERC20DividendCheckpoint = artifacts.require("./ERC20DividendCheckpoint"); const GeneralPermissionManager = artifacts.require("GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -50,6 +51,8 @@ contract("ERC20DividendCheckpoint", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -104,7 +107,8 @@ contract("ERC20DividendCheckpoint", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; [P_ERC20DividendCheckpointFactory] = await deployERC20DividendAndVerifyed( @@ -148,7 +152,7 @@ contract("ERC20DividendCheckpoint", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not assert.equal(log.args._types[0].toNumber(), 2); @@ -156,7 +160,7 @@ contract("ERC20DividendCheckpoint", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -223,7 +227,7 @@ contract("ERC20DividendCheckpoint", async (accounts) => { await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -250,7 +254,7 @@ contract("ERC20DividendCheckpoint", async (accounts) => { ); // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("2", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("2", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("2", "ether")).toString()); }); @@ -386,7 +390,7 @@ contract("ERC20DividendCheckpoint", async (accounts) => { assert.equal(tx.logs[0].args._investor.toLowerCase(), account_temp.toLowerCase(), "Failed in adding the investor in whitelist"); // Mint some tokens - await I_SecurityToken.mint(account_temp, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_temp, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_temp)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -452,7 +456,7 @@ contract("ERC20DividendCheckpoint", async (accounts) => { ); // Mint some tokens - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("7", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("7", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("7", "ether")).toString()); }); diff --git a/test/f_ether_dividends.js b/test/f_ether_dividends.js index 8d9582283..f449897ef 100644 --- a/test/f_ether_dividends.js +++ b/test/f_ether_dividends.js @@ -9,6 +9,7 @@ const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const EtherDividendCheckpoint = artifacts.require("./EtherDividendCheckpoint"); const GeneralPermissionManager = artifacts.require("GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -52,6 +53,8 @@ contract("EtherDividendCheckpoint", async (accounts) => { let I_MRProxied; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -101,7 +104,8 @@ contract("EtherDividendCheckpoint", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; [P_EtherDividendCheckpointFactory] = await deployEtherDividendAndVerifyed(account_polymath, I_MRProxied, web3.utils.toWei("500", "ether")); @@ -142,7 +146,7 @@ contract("EtherDividendCheckpoint", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -151,7 +155,7 @@ contract("EtherDividendCheckpoint", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -218,7 +222,7 @@ contract("EtherDividendCheckpoint", async (accounts) => { await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -245,7 +249,7 @@ contract("EtherDividendCheckpoint", async (accounts) => { ); // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("2", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("2", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("2", "ether")).toString()); }); @@ -375,7 +379,7 @@ contract("EtherDividendCheckpoint", async (accounts) => { assert.equal(tx.logs[0].args._investor.toLowerCase(), account_temp.toLowerCase(), "Failed in adding the investor in whitelist"); // Mint some tokens - await I_SecurityToken.mint(account_temp, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_temp, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_temp)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -430,7 +434,7 @@ contract("EtherDividendCheckpoint", async (accounts) => { ); // Mint some tokens - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("7", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("7", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("7", "ether")).toString()); }); @@ -729,7 +733,7 @@ contract("EtherDividendCheckpoint", async (accounts) => { // Jump time await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(I_PolyToken.address, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(I_PolyToken.address, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("2", "ether")).toString()); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("7", "ether")).toString()); diff --git a/test/g_general_permission_manager.js b/test/g_general_permission_manager.js index 6792d6d17..bab5a53c5 100644 --- a/test/g_general_permission_manager.js +++ b/test/g_general_permission_manager.js @@ -9,6 +9,7 @@ import { setUpPolymathNetwork, deployGPMAndVerifyed } from "./helpers/createInst const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter"); const Web3 = require("web3"); const BN = Web3.utils.BN; @@ -51,6 +52,8 @@ contract("GeneralPermissionManager", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -101,7 +104,8 @@ contract("GeneralPermissionManager", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 5: Deploy the GeneralDelegateManagerFactory @@ -143,7 +147,7 @@ contract("GeneralPermissionManager", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -152,7 +156,7 @@ contract("GeneralPermissionManager", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -263,9 +267,9 @@ contract("GeneralPermissionManager", async (accounts) => { it("Security token should deny all permission if all permission managers are disabled", async () => { await I_SecurityToken.archiveModule(I_GeneralPermissionManager.address, { from: token_owner }); - assert.isFalse(await I_SecurityToken.checkPermission.call(account_delegate, I_GeneralTransferManager.address, web3.utils.fromAscii("WHITELIST"))); + assert.isFalse(await stGetter.checkPermission.call(account_delegate, I_GeneralTransferManager.address, web3.utils.fromAscii("WHITELIST"))); await I_SecurityToken.unarchiveModule(I_GeneralPermissionManager.address, { from: token_owner }); - assert.isTrue(await I_SecurityToken.checkPermission.call(account_delegate, I_GeneralTransferManager.address, web3.utils.fromAscii("WHITELIST"))); + assert.isTrue(await stGetter.checkPermission.call(account_delegate, I_GeneralTransferManager.address, web3.utils.fromAscii("WHITELIST"))); }); it("Should fail to remove the delegate -- failed because unauthorized msg.sender", async () => { diff --git a/test/h_general_transfer_manager.js b/test/h_general_transfer_manager.js index 4876765fc..953ad9870 100644 --- a/test/h_general_transfer_manager.js +++ b/test/h_general_transfer_manager.js @@ -11,6 +11,7 @@ const DummySTO = artifacts.require("./DummySTO.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -58,6 +59,8 @@ contract("GeneralTransferManager", async (accounts) => { let I_PolymathRegistry; let P_GeneralTransferManagerFactory; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -123,7 +126,8 @@ contract("GeneralTransferManager", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; [I_GeneralPermissionManagerFactory] = await deployGPMAndVerifyed(account_polymath, I_MRProxied, 0); @@ -167,7 +171,7 @@ contract("GeneralTransferManager", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -176,7 +180,7 @@ contract("GeneralTransferManager", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -234,7 +238,7 @@ contract("GeneralTransferManager", async (accounts) => { }); it("Should mint the tokens to the affiliates", async () => { - await I_SecurityToken.mintMulti([account_affiliates1, account_affiliates2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(10).pow(new BN(20))], { + await I_SecurityToken.issueMulti([account_affiliates1, account_affiliates2], [new BN(100).mul(new BN(10).pow(new BN(18))), new BN(10).pow(new BN(20))], { from: account_issuer, gas: 6000000 }); diff --git a/test/i_Issuance.js b/test/i_Issuance.js index 7b62336bd..21a0e7ab6 100644 --- a/test/i_Issuance.js +++ b/test/i_Issuance.js @@ -9,6 +9,7 @@ const CappedSTO = artifacts.require("./CappedSTO.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -52,6 +53,8 @@ contract("Issuance", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details (Launched ST on the behalf of the issuer) const name = "Demo Token"; @@ -110,7 +113,8 @@ contract("Issuance", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 2: Deploy the GeneralDelegateManagerFactory @@ -156,7 +160,7 @@ contract("Issuance", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol, "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -165,7 +169,7 @@ contract("Issuance", async (accounts) => { }); it("POLYMATH: Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(transferManagerKey))[0]; + let moduleData = (await stGetter.getModulesByType(transferManagerKey))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -220,7 +224,7 @@ contract("Issuance", async (accounts) => { it("Should add the delegate with permission", async () => { //First attach a permission manager to the token await I_SecurityToken.addModule(I_GeneralPermissionManagerFactory.address, "0x0", new BN(0), new BN(0), { from: account_polymath }); - let moduleData = (await I_SecurityToken.getModulesByType(permissionManagerKey))[0]; + let moduleData = (await stGetter.getModulesByType(permissionManagerKey))[0]; I_GeneralPermissionManager = await GeneralPermissionManager.at(moduleData); // Add permission to the deletgate (A regesteration process) await I_GeneralPermissionManager.addDelegate(account_delegate, delegateDetails, { from: account_polymath }); diff --git a/test/j_manual_approval_transfer_manager.js b/test/j_manual_approval_transfer_manager.js index 7ac1bd4cf..7f299ae8e 100644 --- a/test/j_manual_approval_transfer_manager.js +++ b/test/j_manual_approval_transfer_manager.js @@ -15,6 +15,7 @@ const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const ManualApprovalTransferManager = artifacts.require("./ManualApprovalTransferManager"); const CountTransferManager = artifacts.require("./CountTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -56,6 +57,8 @@ contract("ManualApprovalTransferManager", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -106,7 +109,8 @@ contract("ManualApprovalTransferManager", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 2: Deploy the GeneralDelegateManagerFactory @@ -158,7 +162,7 @@ contract("ManualApprovalTransferManager", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -167,7 +171,7 @@ contract("ManualApprovalTransferManager", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); }); @@ -198,7 +202,7 @@ contract("ManualApprovalTransferManager", async (accounts) => { await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("4", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("4", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("4", "ether")).toString()); }); @@ -225,7 +229,7 @@ contract("ManualApprovalTransferManager", async (accounts) => { ); // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -316,7 +320,7 @@ contract("ManualApprovalTransferManager", async (accounts) => { await I_ManualApprovalTransferManager.pause({ from: token_owner }); // Add the Investor in to the whitelist // Mint some tokens - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("1", "ether")),"0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); // Unpause at the transferManager level @@ -418,25 +422,25 @@ contract("ManualApprovalTransferManager", async (accounts) => { }); it("Use 100% of issuance approval", async () => { - await I_SecurityToken.mint(account_investor5, new BN(web3.utils.toWei("2", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor5, new BN(web3.utils.toWei("2", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor5)).toString(), new BN(web3.utils.toWei("2", "ether")).toString()); }); - it("Check verifyTransfer without actually transferring", async () => { - let verified = await I_SecurityToken.verifyTransfer.call( - account_investor1, - account_investor4, - new BN(web3.utils.toWei("1", "ether")), - "0x0" - ); - assert.equal(verified, true); + // it("Check verifyTransfer without actually transferring", async () => { + // let verified = await I_SecurityToken.verifyTransfer.call( + // account_investor1, + // account_investor4, + // new BN(web3.utils.toWei("1", "ether")), + // "0x0" + // ); + // assert.equal(verified, true); - verified = await I_SecurityToken.verifyTransfer.call(account_investor1, account_investor4, new BN(web3.utils.toWei("2", "ether")), "0x0"); - assert.equal(verified, false); + // verified = await I_SecurityToken.canTransfer.call(account_investor1, account_investor4, new BN(web3.utils.toWei("2", "ether")), "0x0"); + // assert.equal(verified, false); - verified = await I_SecurityToken.verifyTransfer.call(account_investor1, account_investor4, new BN(web3.utils.toWei("1", "ether")), "0x0"); - assert.equal(verified, true); - }); + // verified = await I_SecurityToken.canTransfer.call(account_investor1, account_investor4, new BN(web3.utils.toWei("1", "ether")), "0x0"); + // assert.equal(verified, true); + // }); it("Use remaining 50% of manual approval for transfer", async () => { await I_SecurityToken.transfer(account_investor4, new BN(web3.utils.toWei("1", "ether")), { from: account_investor1 }); diff --git a/test/k_module_registry.js b/test/k_module_registry.js index 1504d86b6..88b2d9f59 100644 --- a/test/k_module_registry.js +++ b/test/k_module_registry.js @@ -17,6 +17,7 @@ const GeneralTransferManagerFactory = artifacts.require("./GeneralTransferManage const MockFactory = artifacts.require("./MockFactory.sol"); const TestSTOFactory = artifacts.require("./TestSTOFactory.sol"); const ReclaimTokens = artifacts.require("./ReclaimTokens.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -64,6 +65,8 @@ contract("ModuleRegistry", async (accounts) => { let I_PolymathRegistry; let I_SecurityToken2; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details (Launched ST on the behalf of the issuer) const name = "Demo Token"; @@ -123,7 +126,8 @@ contract("ModuleRegistry", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; I_ModuleRegistryProxy = await ModuleRegistryProxy.new({from: account_polymath}); diff --git a/test/l_percentage_transfer_manager.js b/test/l_percentage_transfer_manager.js index f98e2c41f..e64733289 100644 --- a/test/l_percentage_transfer_manager.js +++ b/test/l_percentage_transfer_manager.js @@ -8,6 +8,7 @@ const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const PercentageTransferManager = artifacts.require("./PercentageTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); const SecurityToken = artifacts.require("./SecurityToken.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -47,6 +48,8 @@ contract("PercentageTransferManager", async (accounts) => { let I_PolyToken; let I_STRGetter; let I_PolymathRegistry; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -117,7 +120,8 @@ contract("PercentageTransferManager", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 2: Deploy the GeneralDelegateManagerFactory @@ -169,7 +173,7 @@ contract("PercentageTransferManager", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -178,7 +182,7 @@ contract("PercentageTransferManager", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -220,7 +224,7 @@ contract("PercentageTransferManager", async (accounts) => { await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -247,7 +251,7 @@ contract("PercentageTransferManager", async (accounts) => { ); // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -313,7 +317,7 @@ contract("PercentageTransferManager", async (accounts) => { // Add the Investor in to the whitelist // Mint some tokens - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -338,14 +342,14 @@ contract("PercentageTransferManager", async (accounts) => { await catchRevert(I_SecurityToken.transfer(account_investor3, new BN(web3.utils.toWei("2", "ether")), { from: account_investor1 })); }); - it("Should not be able to mint token amount over limit", async () => { - await catchRevert(I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("100", "ether")), { from: token_owner })); + it("Should not be able to issue token amount over limit", async () => { + await catchRevert(I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("100", "ether")), "0x0", { from: token_owner })); }); it("Allow unlimited primary issuance and remint", async () => { let snapId = await takeSnapshot(); await I_PercentageTransferManager.setAllowPrimaryIssuance(true, { from: token_owner }); - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("100", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("100", "ether")), "0x0", { from: token_owner }); // trying to call it again with the same value. should fail await catchRevert(I_PercentageTransferManager.setAllowPrimaryIssuance(true, { from: token_owner })); await revertToSnapshot(snapId); diff --git a/test/m_presale_sto.js b/test/m_presale_sto.js index daa982397..8e1eb390e 100644 --- a/test/m_presale_sto.js +++ b/test/m_presale_sto.js @@ -9,6 +9,7 @@ const PreSaleSTOFactory = artifacts.require("./PreSaleSTOFactory.sol"); const PreSaleSTO = artifacts.require("./PreSaleSTO.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -50,6 +51,8 @@ contract("PreSaleSTO", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details for funds raise Type ETH const name = "Team"; @@ -101,7 +104,8 @@ contract("PreSaleSTO", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 4: Deploy the PreSaleSTOFactory @@ -144,7 +148,7 @@ contract("PreSaleSTO", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol, "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -153,7 +157,7 @@ contract("PreSaleSTO", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(transferManagerKey))[0]; + let moduleData = (await stGetter.getModulesByType(transferManagerKey))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); diff --git a/test/n_security_token_registry.js b/test/n_security_token_registry.js index 05955cb71..1c16a5b62 100644 --- a/test/n_security_token_registry.js +++ b/test/n_security_token_registry.js @@ -12,6 +12,7 @@ const SecurityTokenRegistry = artifacts.require("./SecurityTokenRegistry.sol"); const SecurityTokenRegistryMock = artifacts.require("./SecurityTokenRegistryMock.sol"); const STFactory = artifacts.require("./STFactory.sol"); const STRGetter = artifacts.require('./STRGetter.sol'); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -58,6 +59,8 @@ contract("SecurityTokenRegistry", async (accounts) => { let I_MRProxied; let I_STRGetter; let I_Getter; + let I_STGetter; + let stGetter; // SecurityToken Details (Launched ST on the behalf of the issuer) const name = "Demo Token"; @@ -117,7 +120,8 @@ contract("SecurityTokenRegistry", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 8: Deploy the CappedSTOFactory @@ -508,7 +512,7 @@ contract("SecurityTokenRegistry", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol, "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTrasnferManager module get added successfully or not @@ -572,8 +576,8 @@ contract("SecurityTokenRegistry", async (accounts) => { describe("Generate SecurityToken v2", async () => { it("Should deploy the st version 2", async () => { // Step 7: Deploy the STFactory contract - - I_STFactory002 = await STFactory.new(I_GeneralTransferManagerFactory.address, { from: account_polymath }); + I_STGetter = await STGetter.new(); + I_STFactory002 = await STFactory.new(I_GeneralTransferManagerFactory.address, I_STGetter.address, { from: account_polymath }); assert.notEqual( I_STFactory002.address.valueOf(), diff --git a/test/o_security_token.js b/test/o_security_token.js index 9c052c7dd..681b07e96 100644 --- a/test/o_security_token.js +++ b/test/o_security_token.js @@ -189,7 +189,6 @@ contract("SecurityToken", async (accounts) => { const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not - console.log(log.args); assert.equal(log.args._types[0].toNumber(), transferManagerKey); assert.equal(web3.utils.toUtf8(log.args._name), "GeneralTransferManager"); }); @@ -217,7 +216,6 @@ contract("SecurityToken", async (accounts) => { it("Should issue the tokens before attaching the STO", async () => { await I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner }); let balance = await I_SecurityToken.balanceOf(account_affiliate1); - console.log((await stGetter.getInvestorCount.call()).toNumber()); assert.equal(balance.div(new BN(10).pow(new BN(18))).toNumber(), 100); }); @@ -225,7 +223,6 @@ contract("SecurityToken", async (accounts) => { currentTime = new BN(await latestTime()); let toTime = new BN(currentTime.add(new BN(duration.days(100)))); let expiryTime = new BN(toTime.add(new BN(duration.days(100)))); - let tx = await I_GeneralTransferManager.modifyWhitelist(account_affiliate2, currentTime, toTime, expiryTime, true, { from: token_owner, gas: 6000000 @@ -257,7 +254,7 @@ contract("SecurityToken", async (accounts) => { assert.equal(balance1.div(new BN(10).pow(new BN(18))).toNumber(), 200); let balance2 = await I_SecurityToken.balanceOf(account_affiliate2); assert.equal(balance2.div(new BN(10).pow(new BN(18))).toNumber(), 110); - console.log((await stGetter.getInvestorCount.call()).toNumber()); + }); it("Should finish the minting -- fail because feature is not activated", async () => { @@ -270,7 +267,6 @@ contract("SecurityToken", async (accounts) => { it("Should finish the minting -- successfully activate the feature", async () => { await catchRevert(I_FeatureRegistry.setFeatureStatus("freezeIssuanceAllowed", false, { from: account_polymath })); - assert.equal(false, await I_FeatureRegistry.getFeatureStatus("freezeIssuanceAllowed", { from: account_temp })); await I_FeatureRegistry.setFeatureStatus("freezeIssuanceAllowed", true, { from: account_polymath }); assert.equal(true, await I_FeatureRegistry.getFeatureStatus("freezeIssuanceAllowed", { from: account_temp })); @@ -285,7 +281,6 @@ contract("SecurityToken", async (accounts) => { it("Should finish minting & restrict the further minting", async () => { let id = await takeSnapshot(); await I_SecurityToken.freezeIssuance({ from: token_owner }); - await catchRevert(I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner, gas: 500000 })); await revertToSnapshot(id); }); @@ -294,7 +289,6 @@ contract("SecurityToken", async (accounts) => { startTime = await latestTime() + duration.seconds(5000); endTime = startTime + duration.days(30); let bytesSTO = encodeModuleCall(STOParameters, [startTime, endTime, cap, rate, fundRaiseType, account_fundsReceiver]); - await catchRevert(I_SecurityToken.addModule(I_CappedSTOFactory.address, bytesSTO, maxCost, new BN(0), { from: token_owner })); }); @@ -304,7 +298,6 @@ contract("SecurityToken", async (accounts) => { let bytesSTO = encodeModuleCall(STOParameters, [startTime, endTime, cap, rate, fundRaiseType, account_fundsReceiver]); await I_PolyToken.getTokens(cappedSTOSetupCost, token_owner); await I_PolyToken.transfer(I_SecurityToken.address, cappedSTOSetupCost, { from: token_owner }); - await catchRevert( I_SecurityToken.addModule(I_CappedSTOFactory.address, bytesSTO, new BN(web3.utils.toWei("1000", "ether")), new BN(0), { from: token_owner }) ); @@ -318,12 +311,10 @@ contract("SecurityToken", async (accounts) => { await I_PolyToken.getTokens(cappedSTOSetupCost, token_owner); await I_PolyToken.transfer(I_SecurityToken.address, cappedSTOSetupCost, { from: token_owner }); - console.log((await stGetter.getInvestorCount.call()).toNumber()); - console.log("0"); + const tx = await I_SecurityToken.addModuleWithLabel(I_CappedSTOFactory.address, bytesSTO, maxCost, new BN(0), web3.utils.fromAscii("stofactory"), { from: token_owner }); - console.log("1"); assert.equal(tx.logs[3].args._types[0], stoKey, "CappedSTO doesn't get deployed"); assert.equal(web3.utils.toUtf8(tx.logs[3].args._name), "CappedSTO", "CappedSTOFactory module was not added"); console.log("module label is .. " + web3.utils.toAscii(tx.logs[3].args._label)); @@ -349,7 +340,7 @@ contract("SecurityToken", async (accounts) => { it("Should successfully issue tokens while STO attached", async () => { await I_SecurityToken.issue(account_affiliate1, new BN(100).mul(new BN(10).pow(new BN(18))), "0x0", { from: token_owner }); - console.log((await stGetter.getInvestorCount.call()).toNumber()); + let balance = await I_SecurityToken.balanceOf(account_affiliate1); assert.equal(balance.div(new BN(10).pow(new BN(18))).toNumber(), 300); }); @@ -427,7 +418,7 @@ contract("SecurityToken", async (accounts) => { assert.equal(tx.logs[0].args._module, I_GeneralTransferManager.address); await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("500")), "0x0", { from: token_owner }); await I_SecurityToken.transfer(account_investor2, new BN(web3.utils.toWei("200")), { from: account_investor1 }); - console.log((await stGetter.getInvestorCount.call()).toNumber()); + assert.equal((await I_SecurityToken.balanceOf(account_investor2)).div(new BN(10).pow(new BN(18))).toNumber(), 200); await revertToSnapshot(key); }); @@ -596,7 +587,6 @@ contract("SecurityToken", async (accounts) => { it("Should activate the bool allowAllTransfer", async () => { ID_snap = await takeSnapshot(); let tx = await I_GeneralTransferManager.changeAllowAllTransfers(true, { from: account_delegate }); - assert.isTrue(tx.logs[0].args._allowAllTransfers, "AllowTransfer variable is not successfully updated"); }); @@ -698,7 +688,7 @@ contract("SecurityToken", async (accounts) => { assert.equal(balance1.div(new BN(10).pow(new BN(18))).toNumber(), 500); let balance2 = await I_SecurityToken.balanceOf(account_affiliate2); assert.equal(balance2.div(new BN(10).pow(new BN(18))).toNumber(), 220); - console.log((await stGetter.getInvestorCount.call()).toNumber()); + }); it("Should provide more permissions to the delegate", async () => { @@ -881,15 +871,10 @@ contract("SecurityToken", async (accounts) => { await catchRevert(I_SecurityToken.controllerRedeem(account_temp, currentBalance, "0x0", "0x0", { from: token_owner })); }); - it.skip("Should burn the tokens", async () => { + it("Should burn the tokens", async () => { let currentInvestorCount = await stGetter.getInvestorCount.call(); let currentBalance = await I_SecurityToken.balanceOf(account_temp); let investors = await stGetter.getInvestors.call(); - for (let i = 0; i < investors.length; i++) { - console.log(investors[i]); - console.log(web3.utils.fromWei((await I_SecurityToken.balanceOf(investors[i])).toString())); - } - console.log(currentInvestorCount.toString(), web3.utils.fromWei(currentBalance.toString())); let tx = await I_SecurityToken.controllerRedeem(account_temp, currentBalance, "0x0", "0x0", { from: account_controller }); // console.log(tx.logs[1].args._value.toNumber(), currentBalance.toNumber()); assert.equal(tx.logs[1].args._value.toString(), currentBalance.toString()); @@ -898,7 +883,7 @@ contract("SecurityToken", async (accounts) => { assert.equal(newInvestorCount.toNumber() + 1, currentInvestorCount.toNumber(), "Investor count drops by one"); }); - it.skip("Should use getInvestorsAt to determine balances now", async () => { + it("Should use getInvestorsAt to determine balances now", async () => { await I_SecurityToken.createCheckpoint({ from: token_owner }); let investors = await stGetter.getInvestorsAt.call(1); console.log("Filtered investors:" + investors); @@ -909,7 +894,7 @@ contract("SecurityToken", async (accounts) => { assert.equal(investors.length, 3); }); - it.skip("Should prune investor length test #2", async () => { + it("Should prune investor length test #2", async () => { let balance = await I_SecurityToken.balanceOf(account_affiliate2); let balance2 = await I_SecurityToken.balanceOf(account_investor1); await I_SecurityToken.transfer(account_affiliate1, balance, { from: account_affiliate2 }); @@ -933,7 +918,7 @@ contract("SecurityToken", async (accounts) => { await I_SecurityToken.transfer(account_investor1, balance2, { from: account_affiliate1 }); }); - it.skip("Should get filtered investors", async () => { + it("Should get filtered investors", async () => { let investors = await stGetter.getInvestors.call(); console.log("All Investors: " + investors); let filteredInvestors = await stGetter.iterateInvestors.call(0, 1); @@ -955,17 +940,17 @@ contract("SecurityToken", async (accounts) => { await catchRevert(stGetter.iterateInvestors(0, 5)); }); - it.skip("Should check the balance of investor at checkpoint", async () => { + it("Should check the balance of investor at checkpoint", async () => { await catchRevert(stGetter.balanceOfAt(account_investor1, 5)); }); - it.skip("Should check the balance of investor at checkpoint", async () => { + it("Should check the balance of investor at checkpoint", async () => { let balance = await stGetter.balanceOfAt(account_investor1, 0); assert.equal(balance.toNumber(), 0); }); }); - describe.skip("Test cases for the Mock TrackedRedeemption", async () => { + describe("Test cases for the Mock TrackedRedeemption", async () => { it("Should add the tracked redeemption module successfully", async () => { [I_MockRedemptionManagerFactory] = await deployMockRedemptionAndVerifyed(account_polymath, I_MRProxied, 0); let tx = await I_SecurityToken.addModule(I_MockRedemptionManagerFactory.address, "0x0", new BN(0), new BN(0), { from: token_owner }); @@ -1005,6 +990,7 @@ contract("SecurityToken", async (accounts) => { it("Should fail to burn the tokens because module get archived", async () => { await I_SecurityToken.archiveModule(I_MockRedemptionManager.address, { from: token_owner }); + console.log(await stGetter.getModule.call(I_MockRedemptionManager.address)); await catchRevert(I_MockRedemptionManager.redeemTokenByOwner(new BN(web3.utils.toWei("250")), { from: account_investor1 })); }); @@ -1039,7 +1025,7 @@ contract("SecurityToken", async (accounts) => { }); }); - describe.skip("Withdraw Poly", async () => { + describe("Withdraw Poly", async () => { it("Should successfully withdraw the poly -- failed because of zero address of token", async () => { await catchRevert( I_SecurityToken.withdrawERC20(address_zero, new BN(web3.utils.toWei("20000", "ether")), { @@ -1071,7 +1057,7 @@ contract("SecurityToken", async (accounts) => { }); }); - describe.skip("Force Transfer", async () => { + describe("Force Transfer", async () => { it("Should fail to controllerTransfer because not approved controller", async () => { await catchRevert( I_SecurityToken.controllerTransfer(account_investor1, account_investor2, new BN(web3.utils.toWei("10", "ether")), "0x0", web3.utils.fromAscii("reason"), { @@ -1130,16 +1116,11 @@ contract("SecurityToken", async (accounts) => { ); let eventForceTransfer = tx.logs[1]; let eventTransfer = tx.logs[0]; - console.log(eventForceTransfer.args); - console.log(eventTransfer.args); assert.equal(account_controller, eventForceTransfer.args._controller, "Event not emitted as expected"); assert.equal(account_investor1, eventForceTransfer.args._from, "Event not emitted as expected"); assert.equal(account_investor2, eventForceTransfer.args._to, "Event not emitted as expected"); assert.equal(new BN(web3.utils.toWei("10", "ether")).toString(), eventForceTransfer.args._value.toString(), "Event not emitted as expected"); - console.log(eventForceTransfer.args._verifyTransfer); - assert.equal(false, eventForceTransfer.args._verifyTransfer, "Event not emitted as expected"); - assert.equal("reason", web3.utils.hexToUtf8(eventForceTransfer.args._data), "Event not emitted as expected"); - + assert.equal("reason", web3.utils.hexToUtf8(eventForceTransfer.args._operatorData), "Event not emitted as expected"); assert.equal(account_investor1, eventTransfer.args.from, "Event not emitted as expected"); assert.equal(account_investor2, eventTransfer.args.to, "Event not emitted as expected"); assert.equal(new BN(web3.utils.toWei("10", "ether")).toString(), eventTransfer.args.value.toString(), "Event not emitted as expected"); @@ -1188,10 +1169,6 @@ contract("SecurityToken", async (accounts) => { describe("Test cases for the storage", async() => { it("Test the storage values of the ERC20 vairables", async() => { - for (let j = 0; j < 20; j++) { - console.log(await readStorage(I_SecurityToken.address, j)); - } - let investors = await stGetter.getInvestors.call(); console.log("Verifying the balances of the Addresses"); @@ -1204,70 +1181,184 @@ contract("SecurityToken", async (accounts) => { } for (let i = 0; i < investors.length; i++) { - console.log('yo'); index = encodeUint(0); - //index = web3.utils.padLeft(0, 64); - console.log(index); - //key = web3.utils.padLeft(investors[i], 64); key = web3.eth.abi.encodeParameter('address', investors[i]) - console.log(key); var tempKey = key + index.substring(2); - console.log(tempKey); newKey.push(encodeUint(web3.utils.sha3(tempKey, {"encoding": "hex"}))); - console.log(newKey[i]); - console.log("\n"); } - console.log(newKey[0]); + assert.equal( + web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[0])).toString()), + web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[0]))).toString()) + ) console.log(` Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[0])).toString())} Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[0]))).toString())} `) - console.log(newKey[1]); + + assert.equal( + web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[1])).toString()), + web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[1]))).toString()) + ); console.log(` Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[1])).toString())} Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[1]))).toString())} `) - console.log(newKey[2]); + + assert.equal( + web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[2])).toString()), + web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[2]))).toString()) + ); console.log(` Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[2])).toString())} Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[2]))).toString())} `) - console.log(newKey[3]); + assert.equal( + web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[3])).toString()), + web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[3]))).toString()) + ) console.log(` Balances from the contract: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(investors[3])).toString())} Balances from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, newKey[3]))).toString())} `) - + assert.equal( + web3.utils.fromWei((await I_SecurityToken.totalSupply.call()).toString()), + web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, 2))).toString()) + ); console.log(` TotalSupply from contract: ${web3.utils.fromWei((await I_SecurityToken.totalSupply.call()).toString())} TotalSupply from the storage: ${web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, 2))).toString())} `); - + assert.equal( + await I_SecurityToken.name.call(), + (web3.utils.toAscii(await readStorage(I_SecurityToken.address, 3)).replace(/\u0000/g, "")).replace(/\u0014/g, "") + ) console.log(` Name of the ST: ${await I_SecurityToken.name.call()} Name of the ST from the storage: ${web3.utils.toUtf8(await readStorage(I_SecurityToken.address, 3))} `); - + assert.equal( + await I_SecurityToken.symbol.call(), + (web3.utils.toUtf8(await readStorage(I_SecurityToken.address, 4)).replace(/\u0000/g, "")).replace(/\u0006/g, "") + ); console.log(` Symbol of the ST: ${await I_SecurityToken.symbol.call()} Symbol of the ST from the storage: ${web3.utils.toUtf8(await readStorage(I_SecurityToken.address, 4))} `); - // console.log(` - // Decimal of the ST: ${(await I_SecurityToken.decimals.call()).toString()} - // Decimal of the ST from the storage: ${(await stGetter.dec.call()).toString()} - // `); - console.log(` Address of the owner: ${await I_SecurityToken.owner.call()} - Address of the owner from the storage: ${await readStorage(I_SecurityToken.address, 5)} + Address of the owner from the storage: ${(await readStorage(I_SecurityToken.address, 5)).substring(0, 42)} + `) + assert.equal( + await I_SecurityToken.owner.call(), + web3.utils.toChecksumAddress((await readStorage(I_SecurityToken.address, 5)).substring(0, 42)) + ); + + }); + + it("Verify the storage of the STStorage", async() => { + // for (let j = 7; j < 35; j++) { + // console.log(await readStorage(I_SecurityToken.address, j)); + // } + + console.log(` + Controller address from the contract: ${await stGetter.controller.call()} + Controller address from the storage: ${await readStorage(I_SecurityToken.address, 7)} `) + assert.equal( + (await stGetter.controller.call()).substring(0, 3), + await readStorage(I_SecurityToken.address, 7) + ); + console.log(` - Guard value from the storage: ${(web3.utils.toBN(await readStorage(I_SecurityToken.address, 7))).toString()} + PolymathRegistry address from the contract: ${await stGetter.polymathRegistry.call()} + PolymathRegistry address from the storage: ${await readStorage(I_SecurityToken.address, 8)} `) + assert.equal( + await stGetter.polymathRegistry.call(), + web3.utils.toChecksumAddress(await readStorage(I_SecurityToken.address, 8)) + ); + console.log(` + ModuleRegistry address from the contract: ${await stGetter.moduleRegistry.call()} + ModuleRegistry address from the storage: ${await readStorage(I_SecurityToken.address, 9)} + `) + + assert.equal( + await stGetter.moduleRegistry.call(), + web3.utils.toChecksumAddress(await readStorage(I_SecurityToken.address, 9)) + ); + + console.log(` + SecurityTokenRegistry address from the contract: ${await stGetter.securityTokenRegistry.call()} + SecurityTokenRegistry address from the storage: ${await readStorage(I_SecurityToken.address, 10)} + `) + + assert.equal( + await stGetter.securityTokenRegistry.call(), + web3.utils.toChecksumAddress(await readStorage(I_SecurityToken.address, 10)) + ); + + console.log(` + FeatureRegistry address from the contract: ${await stGetter.featureRegistry.call()} + FeatureRegistry address from the storage: ${await readStorage(I_SecurityToken.address, 11)} + `) + + assert.equal( + await stGetter.featureRegistry.call(), + web3.utils.toChecksumAddress(await readStorage(I_SecurityToken.address, 11)) + ); + + console.log(` + PolyToken address from the contract: ${await stGetter.polyToken.call()} + PolyToken address from the storage: ${await readStorage(I_SecurityToken.address, 12)} + `) + + assert.equal( + await stGetter.polyToken.call(), + web3.utils.toChecksumAddress(await readStorage(I_SecurityToken.address, 12)) + ); + + console.log(` + Delegate address from the contract: ${await stGetter.delegate.call()} + Delegate address from the storage: ${await readStorage(I_SecurityToken.address, 13)} + `) + + assert.equal( + await stGetter.delegate.call(), + web3.utils.toChecksumAddress(await readStorage(I_SecurityToken.address, 13)) + ); + + console.log(` + Granularity value from the contract: ${await stGetter.granularity.call()} + Granularity value from the storage: ${(web3.utils.toBN(await readStorage(I_SecurityToken.address, 14))).toString()} + `) + + assert.equal( + web3.utils.fromWei(await stGetter.granularity.call()), + web3.utils.fromWei((web3.utils.toBN(await readStorage(I_SecurityToken.address, 14))).toString()) + ); + + console.log(` + Current checkpoint ID from the contract: ${await stGetter.currentCheckpointId.call()} + Current checkpoint ID from the storage: ${(web3.utils.toBN(await readStorage(I_SecurityToken.address, 15))).toString()} + `) + assert.equal( + await stGetter.currentCheckpointId.call(), + (web3.utils.toBN(await readStorage(I_SecurityToken.address, 15))).toString() + ); + + console.log(` + TokenDetails from the contract: ${await stGetter.tokenDetails.call()} + TokenDetails from the storage: ${(web3.utils.toUtf8((await readStorage(I_SecurityToken.address, 16)).substring(0, 60)))} + `) + assert.equal( + await stGetter.tokenDetails.call(), + (web3.utils.toUtf8((await readStorage(I_SecurityToken.address, 16)).substring(0, 60))).replace(/\u0000/g, "") + ); + }); }); diff --git a/test/p_usd_tiered_sto.js b/test/p_usd_tiered_sto.js index 1ee447b7f..ec0274d88 100644 --- a/test/p_usd_tiered_sto.js +++ b/test/p_usd_tiered_sto.js @@ -10,6 +10,7 @@ const MockOracle = artifacts.require("./MockOracle.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const PolyTokenFaucet = artifacts.require("./PolyTokenFaucet.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -62,6 +63,8 @@ contract("USDTieredSTO", async (accounts) => { let I_PolymathRegistry; let P_USDTieredSTOFactory; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details for funds raise Type ETH const NAME = "Team"; @@ -233,7 +236,9 @@ contract("USDTieredSTO", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter, + I_STGetter ] = instances; I_DaiToken = await PolyTokenFaucet.new({from: POLYMATH}); @@ -285,7 +290,7 @@ contract("USDTieredSTO", async (accounts) => { assert.equal(tx.logs[2].args._ticker, SYMBOL, "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -294,7 +299,7 @@ contract("USDTieredSTO", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(TMKEY))[0]; + let moduleData = (await stGetter.getModulesByType(TMKEY))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); }); diff --git a/test/q_usd_tiered_sto_sim.js b/test/q_usd_tiered_sto_sim.js index 2e5fd4e5f..643ae3df5 100644 --- a/test/q_usd_tiered_sto_sim.js +++ b/test/q_usd_tiered_sto_sim.js @@ -12,6 +12,7 @@ const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); const PolyTokenFaucet = artifacts.require("./PolyTokenFaucet.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -58,6 +59,8 @@ contract("USDTieredSTO Sim", async (accounts) => { let I_DaiToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details for funds raise Type ETH const NAME = "Team"; @@ -210,7 +213,8 @@ contract("USDTieredSTO Sim", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; I_DaiToken = await PolyTokenFaucet.new({ from: POLYMATH }); @@ -261,7 +265,7 @@ contract("USDTieredSTO Sim", async (accounts) => { assert.equal(tx.logs[2].args._ticker, SYMBOL, "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -270,7 +274,7 @@ contract("USDTieredSTO Sim", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(TMKEY))[0]; + let moduleData = (await stGetter.getModulesByType(TMKEY))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); diff --git a/test/r_concurrent_STO.js b/test/r_concurrent_STO.js index 129116c26..ecc88bd04 100644 --- a/test/r_concurrent_STO.js +++ b/test/r_concurrent_STO.js @@ -15,6 +15,7 @@ const DummySTO = artifacts.require("./DummySTO.sol"); const PreSaleSTO = artifacts.require("./PreSaleSTO.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -45,6 +46,8 @@ contract("Concurrent STO", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // STO instance declaration let I_CappedSTOFactory; @@ -97,7 +100,8 @@ contract("Concurrent STO", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 2: Deploy the STO Factories @@ -147,7 +151,7 @@ contract("Concurrent STO", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol, "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -156,7 +160,7 @@ contract("Concurrent STO", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(transferManagerKey))[0]; + let moduleData = (await stGetter.getModulesByType(transferManagerKey))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); diff --git a/test/s_v130_to_v140_upgrade.js b/test/s_v130_to_v140_upgrade.js index b1fe49cf8..93227677f 100644 --- a/test/s_v130_to_v140_upgrade.js +++ b/test/s_v130_to_v140_upgrade.js @@ -7,7 +7,7 @@ import { duration } from "./helpers/utils"; import { encodeProxyCall, encodeModuleCall } from "./helpers/encodeCall"; import { setUpPolymathNetwork, deployCappedSTOAndVerifyed, deployGPMAndVerifyed } from "./helpers/createInstances"; -const USDTieredSTOProxyFactory = artifacts.require("./USDTieredSTOProxyFactory.sol"); +const USDTieredSTOProxy = artifacts.require("./USDTieredSTOProxy.sol"); const USDTieredSTOFactory = artifacts.require("./USDTieredSTOFactory.sol"); const CappedSTOFactory = artifacts.require("./CappedSTOFactory.sol"); const USDTieredSTO = artifacts.require("./USDTieredSTO.sol"); @@ -17,6 +17,7 @@ const ETHOracle = artifacts.require("./MakerDAOOracle.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const PolyTokenFaucet = artifacts.require("./PolyTokenFaucet.sol"); const ManualApprovalTransferManagerFactory = artifacts.require("./ManualApprovalTransferManagerFactory.sol"); +const STGetter = artifacts.require("./STGetter.sol"); contract("Upgrade from v1.3.0 to v1.4.0", async (accounts) => { // Accounts Variable declaration @@ -31,7 +32,7 @@ contract("Upgrade from v1.3.0 to v1.4.0", async (accounts) => { let tx; // Initial fee for ticker registry and security token registry - const REGFEE = new BN(web3.utils.toWei("250")); + const REGFEE = new BN(web3.utils.toWei("500")); const STOSetupCost = 0; const address_zero = "0x0000000000000000000000000000000000000000"; const one_address = "0x0000000000000000000000000000000000000001"; @@ -70,6 +71,8 @@ contract("Upgrade from v1.3.0 to v1.4.0", async (accounts) => { let I_STRProxied; let I_STRProxiedNew; let I_STRGetter; + let I_STGetter; + let stGetter; let I_SecurityTokenRegistry; //let I_UpgradedSecurityTokenRegistry @@ -79,7 +82,7 @@ contract("Upgrade from v1.3.0 to v1.4.0", async (accounts) => { //let I_SecurityToken3; let I_USDTieredSTOFactory; - let I_USDTieredSTOProxyFactory; + let I_USDTieredSTOProxy; let I_USDOracle; let I_POLYOracle; let I_USDTieredSTO; @@ -119,7 +122,8 @@ contract("Upgrade from v1.3.0 to v1.4.0", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 4: Deploy the GeneralDelegateManagerFactory @@ -129,9 +133,9 @@ contract("Upgrade from v1.3.0 to v1.4.0", async (accounts) => { [I_CappedSTOFactory] = await deployCappedSTOAndVerifyed(POLYMATH, I_MRProxied, STOSetupCost); // Step 12: Mint tokens to ISSUERs - await I_PolyToken.getTokens(REGFEE * 2, ISSUER1); - await I_PolyToken.getTokens(REGFEE * 2, ISSUER2); - await I_PolyToken.getTokens(REGFEE * 2, ISSUER3); + await I_PolyToken.getTokens(REGFEE, ISSUER1); + await I_PolyToken.getTokens(REGFEE, ISSUER2); + await I_PolyToken.getTokens(REGFEE, ISSUER3); // Step 13: Register tokens // (A) : TOK1 @@ -209,8 +213,8 @@ contract("Upgrade from v1.3.0 to v1.4.0", async (accounts) => { describe("USDTieredSTOFactory deploy", async () => { // Step 1: Deploy USDTieredSTOFactory\ it("Should successfully deploy USDTieredSTOFactory", async () => { - I_USDTieredSTOProxyFactory = await USDTieredSTOProxyFactory.new(); - I_USDTieredSTOFactory = await USDTieredSTOFactory.new(STOSetupCost, new BN(0), new BN(0), I_USDTieredSTOProxyFactory.address, { + I_USDTieredSTOProxy = await USDTieredSTOProxy.new(); + I_USDTieredSTOFactory = await USDTieredSTOFactory.new(STOSetupCost, new BN(0), new BN(0), I_USDTieredSTOProxy.address, { from: POLYMATH }); assert.notEqual(I_USDTieredSTOFactory.address.valueOf(), address_zero, "USDTieredSTOFactory contract was not deployed"); diff --git a/test/t_security_token_registry_proxy.js b/test/t_security_token_registry_proxy.js index bd4161b2f..83e06b68b 100644 --- a/test/t_security_token_registry_proxy.js +++ b/test/t_security_token_registry_proxy.js @@ -10,6 +10,7 @@ const OwnedUpgradeabilityProxy = artifacts.require("./OwnedUpgradeabilityProxy.s const STFactory = artifacts.require("./STFactory.sol"); const SecurityToken = artifacts.require("./SecurityToken.sol"); const STRGetter = artifacts.require("./STRGetter.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -31,6 +32,8 @@ contract("SecurityTokenRegistryProxy", async (accounts) => { let I_FeatureRegistry; let I_STRGetter; let I_Getter; + let I_STGetter; + let stGetter; let account_polymath; let account_temp; @@ -79,7 +82,8 @@ contract("SecurityTokenRegistryProxy", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; I_SecurityTokenRegistryProxy = await SecurityTokenRegistryProxy.new({ from: account_polymath }); diff --git a/test/u_module_registry_proxy.js b/test/u_module_registry_proxy.js index 19ddab75b..8d40da1de 100644 --- a/test/u_module_registry_proxy.js +++ b/test/u_module_registry_proxy.js @@ -13,6 +13,7 @@ const GeneralTransferManagerLogic = artifacts.require("./GeneralTransferManager. const GeneralTransferManagerFactory = artifacts.require("./GeneralTransferManagerFactory.sol"); const GeneralPermissionManagerFactory = artifacts.require("./GeneralPermissionManagerFactory.sol"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -35,6 +36,8 @@ contract("ModuleRegistryProxy", async (accounts) => { let I_ModuleRegistry; let I_FeatureRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; let account_polymath; let account_temp; @@ -81,7 +84,8 @@ contract("ModuleRegistryProxy", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; I_ModuleRegistryProxy = await ModuleRegistryProxy.new({from: account_polymath}); @@ -151,7 +155,8 @@ contract("ModuleRegistryProxy", async (accounts) => { await I_MRProxied.verifyModule(I_GeneralTransferManagerFactory.address, true, { from: account_polymath }); // Step 3: Deploy the STFactory contract - I_STFactory = await STFactory.new(I_GeneralTransferManagerFactory.address, { from: account_polymath }); + I_STGetter = await STGetter.new(); + I_STFactory = await STFactory.new(I_GeneralTransferManagerFactory.address, I_STGetter.address, { from: account_polymath }); assert.notEqual(I_STFactory.address.valueOf(), address_zero, "STFactory contract was not deployed"); }); diff --git a/test/v_tracked_redemptions.js b/test/v_tracked_redemptions.js index 28ccaded7..01616d866 100644 --- a/test/v_tracked_redemptions.js +++ b/test/v_tracked_redemptions.js @@ -8,6 +8,7 @@ const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const TrackedRedemption = artifacts.require("./TrackedRedemption"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -47,6 +48,8 @@ contract("TrackedRedemption", async (accounts) => { let I_PolymathRegistry; let P_TrackedRedemptionFactory; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -99,7 +102,8 @@ contract("TrackedRedemption", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; @@ -142,7 +146,7 @@ contract("TrackedRedemption", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -151,7 +155,7 @@ contract("TrackedRedemption", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -208,8 +212,8 @@ contract("TrackedRedemption", async (accounts) => { // Jump time await increaseTime(5000); - // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + // issue some tokens + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -235,8 +239,8 @@ contract("TrackedRedemption", async (accounts) => { "Failed in adding the investor in whitelist" ); - // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("2", "ether")), { from: token_owner }); + // issue some tokens + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("2", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("2", "ether")).toString()); }); diff --git a/test/w_lockup_volume_restriction_transfer_manager.js b/test/w_lockup_volume_restriction_transfer_manager.js index 5b2a4f8e8..9203b3237 100644 --- a/test/w_lockup_volume_restriction_transfer_manager.js +++ b/test/w_lockup_volume_restriction_transfer_manager.js @@ -9,6 +9,7 @@ const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const VolumeRestrictionTransferManager = artifacts.require("./LockupVolumeRestrictionTM"); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -45,7 +46,9 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { let I_SecurityToken; let I_PolyToken; let I_PolymathRegistry; - let I_STRGetter + let I_STRGetter; + let I_STGetter; + let stGetter // SecurityToken Details const name = "Team"; @@ -91,7 +94,8 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 4(c): Deploy the VolumeRestrictionTransferManager @@ -139,7 +143,7 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -148,7 +152,7 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); }); @@ -177,8 +181,8 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { // Jump time await increaseTime(5000); - // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("2", "ether")), { from: token_owner }); + // issue some tokens + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("2", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("2", "ether")).toString()); }); @@ -203,8 +207,8 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { "Failed in adding the investor in whitelist" ); - // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("10", "ether")), { from: token_owner }); + // issue some tokens + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("10", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("10", "ether")).toString()); }); @@ -272,8 +276,8 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { ); // Add the Investor in to the whitelist - // Mint some tokens - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("10", "ether")), { from: token_owner }); + // issue some tokens + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("10", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("10", "ether")).toString()); }); @@ -284,7 +288,7 @@ contract("LockupVolumeRestrictionTransferManager", async (accounts) => { it("Should still be able to transfer between existing token holders up to limit", async () => { // Add the Investor in to the whitelist - // Mint some tokens + // issue some tokens await I_SecurityToken.transfer(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: account_investor2 }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("3", "ether")).toString()); diff --git a/test/y_scheduled_checkpoints.js b/test/y_scheduled_checkpoints.js index aa490f32e..186818c72 100644 --- a/test/y_scheduled_checkpoints.js +++ b/test/y_scheduled_checkpoints.js @@ -7,6 +7,7 @@ import { setUpPolymathNetwork, deployScheduleCheckpointAndVerified } from "./hel const SecurityToken = artifacts.require("./SecurityToken.sol"); const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const ScheduledCheckpoint = artifacts.require("./ScheduledCheckpoint.sol"); +const STGetter = artifacts.require("./STGetter.sol") const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -42,6 +43,8 @@ contract("ScheduledCheckpoint", async (accounts) => { let I_PolyToken; let I_PolymathRegistry; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -88,7 +91,8 @@ contract("ScheduledCheckpoint", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 2: Deploy the ScheduleCheckpointModule @@ -129,7 +133,7 @@ contract("ScheduledCheckpoint", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -138,7 +142,7 @@ contract("ScheduledCheckpoint", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); }); @@ -207,7 +211,7 @@ contract("ScheduledCheckpoint", async (accounts) => { console.log("6: " + await latestTime()); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor1)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -215,8 +219,8 @@ contract("ScheduledCheckpoint", async (accounts) => { it("Should have checkpoint created with correct balances", async () => { let cp1 = await I_ScheduledCheckpoint.getSchedule(web3.utils.fromAscii("CP1")); checkSchedule(cp1, "CP1", startTime, startTime + interval, interval, [1], [startTime], [1]); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 1)).toNumber(), 0); }); it("Should Buy some more tokens for account_investor2", async () => { @@ -245,7 +249,7 @@ contract("ScheduledCheckpoint", async (accounts) => { assert.isTrue(await latestTime() <= startTime + interval); // Mint some tokens - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -253,8 +257,8 @@ contract("ScheduledCheckpoint", async (accounts) => { it("No additional checkpoints created", async () => { let cp1 = await I_ScheduledCheckpoint.getSchedule(web3.utils.fromAscii("CP1")); checkSchedule(cp1, "CP1", startTime, startTime + interval, interval, [1], [startTime], [1]); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 1)).toNumber(), 0); }); it("Add a new token holder - account_investor3", async () => { @@ -284,7 +288,7 @@ contract("ScheduledCheckpoint", async (accounts) => { // Add the Investor in to the whitelist // Mint some tokens - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("1", "ether")), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("1", "ether")), "0x0", { from: token_owner }); assert.equal((await I_SecurityToken.balanceOf(account_investor3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); @@ -292,15 +296,15 @@ contract("ScheduledCheckpoint", async (accounts) => { it("Should have new checkpoint created with correct balances", async () => { let cp1 = await I_ScheduledCheckpoint.getSchedule(web3.utils.fromAscii("CP1")); checkSchedule(cp1, "CP1", startTime, startTime + 2 * interval, interval, [1, 2], [startTime, startTime + interval], [1, 1]); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 2)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor3, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 2)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor1, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); it("Should have correct balances for investor 3 after new checkpoint", async () => { @@ -321,20 +325,20 @@ contract("ScheduledCheckpoint", async (accounts) => { [startTime, startTime + interval, startTime + 2 * interval], [1, 1, 2] ); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 2)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor3, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 2)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + + assert.equal((await stGetter.balanceOfAt(account_investor2, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor2, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + + assert.equal((await stGetter.balanceOfAt(account_investor1, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor1, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); }); it("Manually update checkpoints", async () => { @@ -352,23 +356,23 @@ contract("ScheduledCheckpoint", async (accounts) => { [startTime, startTime + interval, startTime + 2 * interval, startTime + 4 * interval], [1, 1, 2, 1] ); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 2)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor3, 4)).toString(), new BN(web3.utils.toWei("1.5", "ether")).toString()); - - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor2, 4)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 0)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 1)).toNumber(), 0); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); - assert.equal((await I_SecurityToken.balanceOfAt(account_investor1, 4)).toString(), new BN(web3.utils.toWei("0.5", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor3, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 2)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor3, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor3, 4)).toString(), new BN(web3.utils.toWei("1.5", "ether")).toString()); + + assert.equal((await stGetter.balanceOfAt(account_investor2, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor2, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor2, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor2, 4)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + + assert.equal((await stGetter.balanceOfAt(account_investor1, 0)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 1)).toNumber(), 0); + assert.equal((await stGetter.balanceOfAt(account_investor1, 2)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor1, 3)).toString(), new BN(web3.utils.toWei("1", "ether")).toString()); + assert.equal((await stGetter.balanceOfAt(account_investor1, 4)).toString(), new BN(web3.utils.toWei("0.5", "ether")).toString()); }); it("Should get the permission", async () => { diff --git a/test/z_general_permission_manager_fuzzer.js b/test/z_general_permission_manager_fuzzer.js index 2614e6d5d..393c4cd86 100644 --- a/test/z_general_permission_manager_fuzzer.js +++ b/test/z_general_permission_manager_fuzzer.js @@ -21,6 +21,7 @@ const CountTransferManager = artifacts.require("./CountTransferManager"); const VolumeRestrictionTransferManager = artifacts.require("./LockupVolumeRestrictionTM"); const PercentageTransferManager = artifacts.require("./PercentageTransferManager"); const ManualApprovalTransferManager = artifacts.require("./ManualApprovalTransferManager"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require("web3"); let BN = Web3.utils.BN; @@ -74,6 +75,8 @@ contract("GeneralPermissionManager Fuzz", async (accounts) => { let I_ManualApprovalTransferManagerFactory; let I_ManualApprovalTransferManager; let I_STRGetter; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -137,7 +140,8 @@ contract("GeneralPermissionManager Fuzz", async (accounts) => { I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, I_STRProxied, - I_STRGetter + I_STRGetter, + I_STGetter ] = instances; // STEP 5: Deploy the GeneralDelegateManagerFactory @@ -188,7 +192,7 @@ contract("GeneralPermissionManager Fuzz", async (accounts) => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -197,7 +201,7 @@ contract("GeneralPermissionManager Fuzz", async (accounts) => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); From 47f3f3022fd4dcd2062fdc3c6945f47079685f6b Mon Sep 17 00:00:00 2001 From: satyam Date: Mon, 28 Jan 2019 13:17:07 +0530 Subject: [PATCH 10/16] fix to work with dev-3.0.0 --- scripts/compareStorageLayout.js | 115 ++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 44 deletions(-) diff --git a/scripts/compareStorageLayout.js b/scripts/compareStorageLayout.js index 287e94eec..382efdedf 100644 --- a/scripts/compareStorageLayout.js +++ b/scripts/compareStorageLayout.js @@ -6,20 +6,38 @@ const path = require("path"); const util = require("util"); const exec = util.promisify(require("child_process").exec); +console.log(`Mandatory: Solc cli tool should be installed globally`); prompt.start(); prompt.get(["LogicContract", "ProxyContract"], async (err, result) => { - let logicContract; - let proxyContract; - - if(fs.existsSync("./build/contracts/")) { - try { - logicContract = JSON.parse(require('fs').readFileSync(`./build/contracts/${result[`LogicContract`]}.json`).toString()).ast; - proxyContract = JSON.parse(require('fs').readFileSync(`./build/contracts/${result[`ProxyContract`]}.json`).toString()).ast; - } catch (error) { - console.log(`Contracts not found: ${error.message}`.red); + let temp; + let logicFilePath; + let proxyFilePath; + + const fileList = walkSync("./contracts", []); + + let paths = findPath(result.LogicContract, result.ProxyContract, fileList); + + if (paths.length == 2) { + console.log("Contracts exists \n"); + + await flatContracts(paths); + let temp; + let logicFilePath = `./flat/${path.basename(paths[0])}`; + let proxyFilePath = `./flat/${path.basename(paths[1])}`; + + if (path.basename(paths[0]) === result.LogicContract) { + temp = logicFilePath; + logicFilePath = proxyFilePath; + proxyFilePath = temp; } - console.log(compareStorageLayouts(parseContract(logicContract), parseContract(proxyContract))); + + let logicAST = await getAST(logicFilePath); + let proxyAST = await getAST(proxyFilePath); + // Deleting the temp folder (no longer required) + await flushTemp(); + + console.log(compareStorageLayouts(parseContract(logicAST), parseContract(proxyAST))); } else { console.log("Contracts doesn't exists"); } @@ -83,37 +101,46 @@ function parseContract(input) { return orderedStateVariables; } -// var walkSync = function(dir, filelist) { -// files = fs.readdirSync(dir); -// filelist = filelist || []; -// files.forEach(function(file) { -// if (fs.statSync(path.join(dir, file)).isDirectory()) { -// filelist = walkSync(path.join(dir, file), filelist); -// } else { -// filelist.push(path.join(dir, file)); -// } -// }); -// return filelist; -// }; - -// var findPath = function(logicContractName, proxyContractName, fileList) { -// let paths = new Array(); -// for (let i = 0; i < fileList.length; i++) { -// if ( -// logicContractName === path.basename(fileList[i]) || -// logicContractName === path.basename(fileList[i]).split(".")[0] || -// (proxyContractName === path.basename(fileList[i]) || proxyContractName === path.basename(fileList[i]).split(".")[0]) -// ) { -// paths.push(fileList[i]); -// } -// } -// return paths; -// }; - -// async function flatContracts(_paths, _logic) { -// let promises = new Array(); -// for (let i = 0; i < _paths.length; i++) { -// promises.push(await exec(`./node_modules/.bin/sol-merger ${_paths[i]} ./flat`)); -// } -// await Promise.all(promises); -// } +var walkSync = function(dir, filelist) { + files = fs.readdirSync(dir); + filelist = filelist || []; + files.forEach(function(file) { + if (fs.statSync(path.join(dir, file)).isDirectory()) { + filelist = walkSync(path.join(dir, file), filelist); + } else { + filelist.push(path.join(dir, file)); + } + }); + return filelist; +}; + +var findPath = function(logicContractName, proxyContractName, fileList) { + let paths = new Array(); + for (let i = 0; i < fileList.length; i++) { + if ( + logicContractName === path.basename(fileList[i]) || + logicContractName === path.basename(fileList[i]).split(".")[0] || + (proxyContractName === path.basename(fileList[i]) || proxyContractName === path.basename(fileList[i]).split(".")[0]) + ) { + paths.push(fileList[i]); + } + } + return paths; +}; + +async function flatContracts(_paths, _logic) { + let promises = new Array(); + for (let i = 0; i < _paths.length; i++) { + promises.push(await exec(`./node_modules/.bin/sol-merger ${_paths[i]} ./flat`)); + } + await Promise.all(promises); +} + +async function getAST(_filePath) { + await exec(`solc -o temp --ast-json ${_filePath}`, {maxBuffer: 1024 * 1000}); + return JSON.parse(fs.readFileSync(`./temp/${path.basename(_filePath)}_json.ast`, "utf8").toString()); +} + +async function flushTemp() { + await exec(`rm -rf temp`); +} \ No newline at end of file From a05668f08b1b6863e24df3c6892b301ca9e85952 Mon Sep 17 00:00:00 2001 From: satyam Date: Tue, 29 Jan 2019 18:32:37 +0530 Subject: [PATCH 11/16] test fixes after merge --- .../TransferManager/VolumeRestrictionTM.sol | 97 +++++++++++-------- test/e_erc20_dividends.js | 16 +-- test/j_manual_approval_transfer_manager.js | 24 +++-- test/w_lockup_transfer_manager.js | 24 +++-- test/y_volume_restriction_tm.js | 26 +++-- test/z_blacklist_transfer_manager.js | 20 ++-- .../z_fuzz_test_adding_removing_modules_ST.js | 11 ++- ...zer_volumn_restriction_transfer_manager.js | 17 ++-- test/z_vesting_escrow_wallet.js | 13 ++- 9 files changed, 146 insertions(+), 102 deletions(-) diff --git a/contracts/modules/TransferManager/VolumeRestrictionTM.sol b/contracts/modules/TransferManager/VolumeRestrictionTM.sol index 49350daf5..c08a50f14 100644 --- a/contracts/modules/TransferManager/VolumeRestrictionTM.sol +++ b/contracts/modules/TransferManager/VolumeRestrictionTM.sol @@ -110,32 +110,28 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { * @param _isTransfer Whether or not this is an actual transfer or just a test to see if the tokens would be transferrable */ function verifyTransfer(address _from, address /*_to */, uint256 _amount, bytes calldata /*_data*/, bool _isTransfer) external returns (Result success) { - // If `_from` is present in the exemptionList or it is `0x0` address then it will not follow the vol restriction - if (!paused && _from != address(0) && exemptions.exemptIndex[_from] == 0) { - // Function must only be called by the associated security token if _isTransfer == true - require(msg.sender == securityToken || !_isTransfer); - uint256 fromTimestamp; - uint256 sumOfLastPeriod; - uint256 daysCovered; - uint256 dailyTime; - uint256 endTime; - bool isGlobal; - (success, fromTimestamp, sumOfLastPeriod, daysCovered, dailyTime, endTime, isGlobal) = _executeTransfer(_from, _amount); - if (_isTransfer) { - _updateStorage( - _from, - _amount, - fromTimestamp, - sumOfLastPeriod, - daysCovered, - dailyTime, - endTime, - isGlobal - ); - } - return success; + // Function must only be called by the associated security token if _isTransfer == true + require(msg.sender == securityToken || !_isTransfer); + uint256 fromTimestamp; + uint256 sumOfLastPeriod; + uint256 daysCovered; + uint256 dailyTime; + uint256 endTime; + bool isGlobal; + (success, fromTimestamp, sumOfLastPeriod, daysCovered, dailyTime, endTime, isGlobal) = _executeTransfer(_from, _amount); + if (_isTransfer && (fromTimestamp != 0 || dailyTime != 0)) { + _updateStorage( + _from, + _amount, + fromTimestamp, + sumOfLastPeriod, + daysCovered, + dailyTime, + endTime, + isGlobal + ); } - return Result.NA; + return success; } /** @@ -154,12 +150,10 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { view returns (Result, byte) { - // If `_from` is present in the exemptionList or it is `0x0` address then it will not follow the vol restriction - if (!paused && _from != address(0) && exemptions.exemptIndex[_from] == 0) { - (Result success,,,,,,) = _executeTransfer(_from, _amount); - if (success == Result.INVALID) - return (success, 0xA5); - } + + (Result success,,,,,,) = _executeTransfer(_from, _amount); + if (success == Result.INVALID) + return (success, 0xA5); return (Result.NA, 0xA0); } @@ -176,18 +170,22 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { internal view returns (Result, uint256, uint256, uint256, uint256, uint256, bool) - { - // Checking the individual restriction if the `_from` comes in the individual category - if ((individualRestrictions.individualRestriction[_from].endTime >= now && individualRestrictions.individualRestriction[_from].startTime <= now) - || (individualRestrictions.individualDailyRestriction[_from].endTime >= now && individualRestrictions.individualDailyRestriction[_from].startTime <= now)) { + { + // If `_from` is present in the exemptionList or it is `0x0` address then it will not follow the vol restriction + if (!paused && _from != address(0) && exemptions.exemptIndex[_from] == 0) { + // Checking the individual restriction if the `_from` comes in the individual category + if ((individualRestrictions.individualRestriction[_from].endTime >= now && individualRestrictions.individualRestriction[_from].startTime <= now) + || (individualRestrictions.individualDailyRestriction[_from].endTime >= now && individualRestrictions.individualDailyRestriction[_from].startTime <= now)) { - return _individualRestrictionCheck(_from, _amount); - // If the `_from` doesn't fall under the individual category. It will processed with in the global category automatically - } else if ((globalRestrictions.defaultRestriction.endTime >= now && globalRestrictions.defaultRestriction.startTime <= now) - || (globalRestrictions.defaultDailyRestriction.endTime >= now && globalRestrictions.defaultDailyRestriction.startTime <= now)) { + return _individualRestrictionCheck(_from, _amount); + // If the `_from` doesn't fall under the individual category. It will processed with in the global category automatically + } else if ((globalRestrictions.defaultRestriction.endTime >= now && globalRestrictions.defaultRestriction.startTime <= now) + || (globalRestrictions.defaultDailyRestriction.endTime >= now && globalRestrictions.defaultDailyRestriction.startTime <= now)) { - return _defaultRestrictionCheck(_from, _amount); + return _defaultRestrictionCheck(_from, _amount); + } } + return (Result.NA, 0, 0, 0, 0, 0, false); } /** @@ -808,7 +806,7 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { uint256 daysCovered, uint256 dailyTime, uint256 endTime, - bool isGlobal + bool allowedDaily ) { // using the variable to avoid stack too deep error BucketDetails memory bucketDetails = bucketData.userToBucket[_from]; @@ -816,7 +814,6 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { VolumeRestriction memory restriction = individualRestrictions.individualRestriction[_from]; daysCovered = restriction.rollingPeriodInDays; bool allowedIndividual = true; - bool allowedDaily; if (restriction.endTime >= now && restriction.startTime <= now) { if (bucketDetails.lastTradedDayTime < restriction.startTime) { // It will execute when the txn is performed first time after the addition of individual restriction @@ -843,7 +840,7 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { (allowedDaily, dailyTime) = _dailyTxCheck(_from, _amount, bucketDetails.dailyLastTradedDayTime, dailyRestriction); success = ((allowedDaily && allowedIndividual) ? Result.NA : Result.INVALID); endTime = dailyRestriction.endTime; - isGlobal = false; + allowedDaily = false; } function _dailyTxCheck( @@ -1131,7 +1128,21 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { return VolumeRestrictionLib.getRestrictionData(holderData, individualRestrictions); } + /** + * @notice return the amount of locked tokens for a given user + * @param _owner whom token amount need to query + */ + function getLockedToken(address _owner) external view returns(uint256) { + return 0; + } + /** + * @notice return the amount of un locked tokens for a given user + * @param _owner whom token amount need to query + */ + function getUnLockedToken(address _owner) external view returns(uint256) { + return 0; + } /** * @notice Returns the permissions flag that are associated with Percentage transfer Manager diff --git a/test/e_erc20_dividends.js b/test/e_erc20_dividends.js index 8e6044e4d..1bf0f5288 100644 --- a/test/e_erc20_dividends.js +++ b/test/e_erc20_dividends.js @@ -917,10 +917,10 @@ contract("ERC20DividendCheckpoint", async (accounts) => { assert.equal(info[4][2].toString(), new BN(web3.utils.toWei("0.8", "ether")).toString(), "claim match"); assert.equal(info[4][3].toString(), new BN(web3.utils.toWei("7", "ether")).toString(), "claim match"); - assert.equal(info[5][0].toString(), (await I_SecurityToken.balanceOfAt(account_investor1, new BN(4))).toString(), "balance match"); - assert.equal(info[5][1].toString(), (await I_SecurityToken.balanceOfAt(account_investor2, new BN(4))).toString(), "balance match"); - assert.equal(info[5][2].toString(), (await I_SecurityToken.balanceOfAt(account_temp, new BN(4))).toString(), "balance match"); - assert.equal(info[5][3].toString(), (await I_SecurityToken.balanceOfAt(account_investor3, new BN(4))).toString(), "balance match"); + assert.equal(info[5][0].toString(), (await stGetter.balanceOfAt(account_investor1, new BN(4))).toString(), "balance match"); + assert.equal(info[5][1].toString(), (await stGetter.balanceOfAt(account_investor2, new BN(4))).toString(), "balance match"); + assert.equal(info[5][2].toString(), (await stGetter.balanceOfAt(account_temp, new BN(4))).toString(), "balance match"); + assert.equal(info[5][3].toString(), (await stGetter.balanceOfAt(account_investor3, new BN(4))).toString(), "balance match"); let issuerBalance = new BN(await I_PolyToken.balanceOf(wallet)); @@ -1146,10 +1146,10 @@ contract("ERC20DividendCheckpoint", async (accounts) => { assert.equal(info[0][1], account_investor2, "account match"); assert.equal(info[0][2], account_temp, "account match"); assert.equal(info[0][3], account_investor3, "account match"); - assert.equal(info[1][0].toString(), (await I_SecurityToken.balanceOfAt.call(account_investor1, checkpointID)).toString(), "balance match"); - assert.equal(info[1][1].toString(), (await I_SecurityToken.balanceOfAt.call(account_investor2, checkpointID)).toString(), "balance match"); - assert.equal(info[1][2].toString(), (await I_SecurityToken.balanceOfAt.call(account_temp, checkpointID)).toString(), "balance match"); - assert.equal(info[1][3].toString(), (await I_SecurityToken.balanceOfAt.call(account_investor3, checkpointID)).toString(), "balance match"); + assert.equal(info[1][0].toString(), (await stGetter.balanceOfAt.call(account_investor1, checkpointID)).toString(), "balance match"); + assert.equal(info[1][1].toString(), (await stGetter.balanceOfAt.call(account_investor2, checkpointID)).toString(), "balance match"); + assert.equal(info[1][2].toString(), (await stGetter.balanceOfAt.call(account_temp, checkpointID)).toString(), "balance match"); + assert.equal(info[1][3].toString(), (await stGetter.balanceOfAt.call(account_investor3, checkpointID)).toString(), "balance match"); assert.equal(info[2][0].toNumber(), 0, "withholding match"); assert.equal(info[2][1].toString(), new BN((10 * 10 ** 16).toString()).toString(), "withholding match"); assert.equal(info[2][2].toString(), new BN((20 * 10 ** 16).toString()).toString(), "withholding match"); diff --git a/test/j_manual_approval_transfer_manager.js b/test/j_manual_approval_transfer_manager.js index a5a46f0e0..e5cfb8c88 100644 --- a/test/j_manual_approval_transfer_manager.js +++ b/test/j_manual_approval_transfer_manager.js @@ -404,20 +404,26 @@ contract("ManualApprovalTransferManager", accounts => { }) it("Check verifyTransfer without actually transferring", async () => { - let verified = await I_SecurityToken.verifyTransfer.call( - account_investor1, + let verified = await I_SecurityToken.canTransfer.call( account_investor4, web3.utils.toWei("2", "ether"), - "0x0" + "0x0", + { + from: account_investor1 + } ); - console.log(JSON.stringify(verified)); - assert.equal(verified, true); + console.log(JSON.stringify(verified[0])); + assert.equal(verified[0], true); - verified = await I_SecurityToken.verifyTransfer.call(account_investor1, account_investor4, web3.utils.toWei("4", "ether"), "0x0"); - assert.equal(verified, false); + verified = await I_SecurityToken.canTransfer.call(account_investor4, web3.utils.toWei("4", "ether"), "0x0", { + from: account_investor1 + }); + assert.equal(verified[0], false); - verified = await I_SecurityToken.verifyTransfer.call(account_investor1, account_investor4, web3.utils.toWei("1", "ether"), "0x0"); - assert.equal(verified, true); + verified = await I_SecurityToken.canTransfer.call(account_investor4, web3.utils.toWei("1", "ether"), "0x0", { + from: account_investor1 + }); + assert.equal(verified[0], true); }); it("Should fail to sell the tokens more than the allowance", async() => { diff --git a/test/w_lockup_transfer_manager.js b/test/w_lockup_transfer_manager.js index 0be2bfe04..125b2de7e 100644 --- a/test/w_lockup_transfer_manager.js +++ b/test/w_lockup_transfer_manager.js @@ -9,6 +9,7 @@ const SecurityToken = artifacts.require('./SecurityToken.sol'); const GeneralTransferManager = artifacts.require('./GeneralTransferManager'); const LockUpTransferManager = artifacts.require('./LockUpTransferManager'); const GeneralPermissionManager = artifacts.require('./GeneralPermissionManager'); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require('web3'); let BN = Web3.utils.BN; @@ -49,6 +50,9 @@ contract('LockUpTransferManager', accounts => { let I_SecurityToken_div; let I_GeneralTransferManager_div; let I_LockUpVolumeRestrictionTM_div; + let I_STGetter; + let stGetter; + let stGetter_div; // SecurityToken Details const name = "Team"; @@ -96,7 +100,8 @@ contract('LockUpTransferManager', accounts => { I_STFactory, I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, - I_STRProxied + I_STRProxied, + I_STGetter ] = instances; // STEP 4(c): Deploy the LockUpVolumeRestrictionTMFactory @@ -141,7 +146,7 @@ contract('LockUpTransferManager', accounts => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -154,7 +159,7 @@ contract('LockUpTransferManager', accounts => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); it("Should register another ticker before the generation of new security token", async () => { @@ -173,6 +178,7 @@ contract('LockUpTransferManager', accounts => { assert.equal(tx.logs[2].args._ticker, symbol2.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken_div = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); + stGetter_div = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken_div.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -185,7 +191,7 @@ contract('LockUpTransferManager', accounts => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken_div.getModulesByType(2))[0]; + let moduleData = (await stGetter_div.getModulesByType(2))[0]; I_GeneralTransferManager_div = GeneralTransferManager.at(moduleData); }); @@ -213,7 +219,7 @@ contract('LockUpTransferManager', accounts => { await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei('2', 'ether')), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei('2', 'ether')), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor1)).toString(), @@ -237,7 +243,7 @@ contract('LockUpTransferManager', accounts => { assert.equal(tx.logs[0].args._investor.toLowerCase(), account_investor2.toLowerCase(), "Failed in adding the investor in whitelist"); // Mint some tokens - await I_SecurityToken.mint(account_investor2, web3.utils.toWei('10', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, web3.utils.toWei('10', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor2)).toString(), @@ -308,7 +314,7 @@ contract('LockUpTransferManager', accounts => { // Add the Investor in to the whitelist // Mint some tokens - await I_SecurityToken.mint(account_investor3, web3.utils.toWei('10', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, web3.utils.toWei('10', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor3)).toString(), @@ -526,7 +532,7 @@ contract('LockUpTransferManager', accounts => { it("Buy more tokens from secondary market to investor2", async() => { // Mint some tokens - await I_SecurityToken.mint(account_investor2, web3.utils.toWei('5', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, web3.utils.toWei('5', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor2)).toString(), @@ -729,7 +735,7 @@ contract('LockUpTransferManager', accounts => { }); it("Should fail to modify the lockup -- because of bad owner", async() => { - await I_SecurityToken.mint(account_investor3, web3.utils.toWei("9"), {from: token_owner}); + await I_SecurityToken.issue(account_investor3, web3.utils.toWei("9"), "0x0", {from: token_owner}); let tx = await I_LockUpTransferManager.addNewLockUpToUser( account_investor3, diff --git a/test/y_volume_restriction_tm.js b/test/y_volume_restriction_tm.js index 0b5456a0d..694937747 100644 --- a/test/y_volume_restriction_tm.js +++ b/test/y_volume_restriction_tm.js @@ -9,6 +9,7 @@ import { setUpPolymathNetwork, deployVRTMAndVerifyed } from "./helpers/createIns const SecurityToken = artifacts.require('./SecurityToken.sol'); const GeneralTransferManager = artifacts.require('./GeneralTransferManager.sol'); const VolumeRestrictionTM = artifacts.require('./VolumeRestrictionTM.sol'); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require('web3'); const BN = Web3.utils.BN; @@ -54,6 +55,8 @@ contract('VolumeRestrictionTransferManager', accounts => { let I_STRProxied; let I_PolyToken; let I_PolymathRegistry; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -154,7 +157,8 @@ contract('VolumeRestrictionTransferManager', accounts => { I_STFactory, I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, - I_STRProxied + I_STRProxied, + I_STGetter ] = instances; // STEP 5: Deploy the VolumeRestrictionTMFactory @@ -196,7 +200,7 @@ contract('VolumeRestrictionTransferManager', accounts => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -205,7 +209,7 @@ contract('VolumeRestrictionTransferManager', accounts => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); }); @@ -236,9 +240,9 @@ contract('VolumeRestrictionTransferManager', accounts => { ); // Mint some tokens and transferred to whitelisted addresses - await I_SecurityToken.mint(account_investor1, new BN(web3.utils.toWei("40", "ether")), {from: token_owner}); - await I_SecurityToken.mint(account_investor2, new BN(web3.utils.toWei("30", "ether")), {from: token_owner}); - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("30", "ether")), {from: token_owner}); + await I_SecurityToken.issue(account_investor1, new BN(web3.utils.toWei("40", "ether")), "0x0", {from: token_owner}); + await I_SecurityToken.issue(account_investor2, new BN(web3.utils.toWei("30", "ether")), "0x0", {from: token_owner}); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("30", "ether")), "0x0", {from: token_owner}); // Check the balance of the investors let bal1 = await I_SecurityToken.balanceOf.call(account_investor1); @@ -250,6 +254,10 @@ contract('VolumeRestrictionTransferManager', accounts => { }); it("Should transfer the tokens freely without any restriction", async() => { + console.log( + await I_SecurityToken.canTransfer.call(account_investor3, new BN(web3.utils.toWei('5', 'ether')), "0x0", {from: account_investor1}) + ) + console.log(web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor1)).toString())); await I_SecurityToken.transfer(account_investor3, new BN(web3.utils.toWei('5', 'ether')), { from: account_investor1 }); let bal1 = await I_SecurityToken.balanceOf.call(account_investor3); // Verifying the balances @@ -1166,7 +1174,7 @@ contract('VolumeRestrictionTransferManager', accounts => { }) it("Should sell more tokens on the same day after changing the total supply", async() => { - await I_SecurityToken.mint(account_investor3, new BN(web3.utils.toWei("10")), {from: token_owner}); + await I_SecurityToken.issue(account_investor3, new BN(web3.utils.toWei("10")), "0x0", {from: token_owner}); let startTime = (await I_VolumeRestrictionTM.getIndividualRestriction.call(account_investor3))[1].toString(); let startTimedaily = (await I_VolumeRestrictionTM.getIndividualDailyRestriction.call(account_investor3))[1].toString(); @@ -1310,8 +1318,8 @@ contract('VolumeRestrictionTransferManager', accounts => { ); }); - it("Should mint some tokens to investor 4", async() => { - await I_SecurityToken.mint(account_investor4, new BN(web3.utils.toWei("20")), {from: token_owner}); + it("Should issue some tokens to investor 4", async() => { + await I_SecurityToken.issue(account_investor4, new BN(web3.utils.toWei("20")), "0x0", {from: token_owner}); }); it("Should add the default daily restriction successfully", async() => { diff --git a/test/z_blacklist_transfer_manager.js b/test/z_blacklist_transfer_manager.js index 54e249a1f..653a71a5f 100644 --- a/test/z_blacklist_transfer_manager.js +++ b/test/z_blacklist_transfer_manager.js @@ -8,6 +8,7 @@ import { catchRevert } from "./helpers/exceptions"; const GeneralTransferManager = artifacts.require("./GeneralTransferManager"); const BlacklistTransferManager = artifacts.require("./BlacklistTransferManager"); const SecurityToken = artifacts.require("./SecurityToken.sol"); +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require('web3'); let BN = Web3.utils.BN; @@ -53,6 +54,8 @@ contract('BlacklistTransferManager', accounts => { let I_SecurityToken; let I_PolyToken; let I_PolymathRegistry; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -103,7 +106,8 @@ contract('BlacklistTransferManager', accounts => { I_STFactory, I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, - I_STRProxied + I_STRProxied, + I_STGetter ] = instances; // STEP 2: Deploy the GeneralDelegateManagerFactory @@ -152,7 +156,7 @@ contract('BlacklistTransferManager', accounts => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -165,7 +169,7 @@ contract('BlacklistTransferManager', accounts => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -229,7 +233,7 @@ contract('BlacklistTransferManager', accounts => { await increaseTime(5000); // Mint some tokens - await I_SecurityToken.mint(account_investor1, web3.utils.toWei('5', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor1, web3.utils.toWei('5', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor1)).toString(), @@ -254,7 +258,7 @@ contract('BlacklistTransferManager', accounts => { assert.equal(tx.logs[0].args._investor.toLowerCase(), account_investor2.toLowerCase(), "Failed in adding the investor in whitelist"); // Mint some tokens - await I_SecurityToken.mint(account_investor2, web3.utils.toWei('2', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor2, web3.utils.toWei('2', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor2)).toString(), @@ -278,7 +282,7 @@ contract('BlacklistTransferManager', accounts => { assert.equal(tx.logs[0].args._investor.toLowerCase(), account_investor3.toLowerCase(), "Failed in adding the investor in whitelist"); // Mint some tokens - await I_SecurityToken.mint(account_investor3, web3.utils.toWei('2', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor3, web3.utils.toWei('2', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor3)).toString(), @@ -302,7 +306,7 @@ contract('BlacklistTransferManager', accounts => { assert.equal(tx.logs[0].args._investor.toLowerCase(), account_investor4.toLowerCase(), "Failed in adding the investor in whitelist"); // Mint some tokens - await I_SecurityToken.mint(account_investor4, web3.utils.toWei('2', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor4, web3.utils.toWei('2', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor4)).toString(), @@ -326,7 +330,7 @@ contract('BlacklistTransferManager', accounts => { assert.equal(tx.logs[0].args._investor.toLowerCase(), account_investor5.toLowerCase(), "Failed in adding the investor in whitelist"); // Mint some tokens - await I_SecurityToken.mint(account_investor5, web3.utils.toWei('2', 'ether'), { from: token_owner }); + await I_SecurityToken.issue(account_investor5, web3.utils.toWei('2', 'ether'), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(account_investor5)).toString(), diff --git a/test/z_fuzz_test_adding_removing_modules_ST.js b/test/z_fuzz_test_adding_removing_modules_ST.js index 194287801..f356a1dfb 100644 --- a/test/z_fuzz_test_adding_removing_modules_ST.js +++ b/test/z_fuzz_test_adding_removing_modules_ST.js @@ -22,7 +22,7 @@ const CountTransferManager = artifacts.require("./CountTransferManager"); const ManualApprovalTransferManager = artifacts.require('./ManualApprovalTransferManager'); const VolumeRestrictionTransferManager = artifacts.require('./LockUpTransferManager'); const PercentageTransferManager = artifacts.require('./PercentageTransferManager'); - +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require('web3'); @@ -68,6 +68,8 @@ contract('GeneralPermissionManager', accounts => { let I_STRProxied; let I_PolyToken; let I_PolymathRegistry; + let I_STGetter; + let stGetter; //Define all modules for test @@ -145,7 +147,8 @@ contract('GeneralPermissionManager', accounts => { I_STFactory, I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, - I_STRProxied + I_STRProxied, + I_STGetter ] = instances; // STEP 5: Deploy the GeneralDelegateManagerFactory @@ -195,7 +198,7 @@ contract('GeneralPermissionManager', accounts => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -204,7 +207,7 @@ contract('GeneralPermissionManager', accounts => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); diff --git a/test/z_fuzzer_volumn_restriction_transfer_manager.js b/test/z_fuzzer_volumn_restriction_transfer_manager.js index 0cf2fc02f..cc6f870fc 100644 --- a/test/z_fuzzer_volumn_restriction_transfer_manager.js +++ b/test/z_fuzzer_volumn_restriction_transfer_manager.js @@ -9,7 +9,7 @@ import { setUpPolymathNetwork, deployVRTMAndVerifyed } from "./helpers/createIns const SecurityToken = artifacts.require('./SecurityToken.sol'); const GeneralTransferManager = artifacts.require('./GeneralTransferManager.sol'); const VolumeRestrictionTM = artifacts.require('./VolumeRestrictionTM.sol'); - +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require('web3'); const BN = Web3.utils.BN; const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")) // Hardcoded development port @@ -54,6 +54,8 @@ contract('VolumeRestrictionTransferManager', accounts => { let I_STRProxied; let I_PolyToken; let I_PolymathRegistry; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -141,7 +143,8 @@ contract('VolumeRestrictionTransferManager', accounts => { I_STFactory, I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, - I_STRProxied + I_STRProxied, + I_STGetter ] = instances; // STEP 5: Deploy the VolumeRestrictionTMFactory @@ -184,7 +187,7 @@ contract('VolumeRestrictionTransferManager', accounts => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -193,7 +196,7 @@ contract('VolumeRestrictionTransferManager', accounts => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); }); @@ -224,9 +227,9 @@ contract('VolumeRestrictionTransferManager', accounts => { ); // Mint some tokens and transferred to whitelisted addresses - await I_SecurityToken.mint(account_investor1, web3.utils.toWei("100", "ether"), {from: token_owner}); - await I_SecurityToken.mint(account_investor2, web3.utils.toWei("30", "ether"), {from: token_owner}); - await I_SecurityToken.mint(account_investor3, web3.utils.toWei("30", "ether"), {from: token_owner}); + await I_SecurityToken.issue(account_investor1, web3.utils.toWei("100", "ether"), "0x0", {from: token_owner}); + await I_SecurityToken.issue(account_investor2, web3.utils.toWei("30", "ether"), "0x0", {from: token_owner}); + await I_SecurityToken.issue(account_investor3, web3.utils.toWei("30", "ether"), "0x0", {from: token_owner}); }); diff --git a/test/z_vesting_escrow_wallet.js b/test/z_vesting_escrow_wallet.js index b5aba3441..933a86300 100644 --- a/test/z_vesting_escrow_wallet.js +++ b/test/z_vesting_escrow_wallet.js @@ -9,7 +9,7 @@ const SecurityToken = artifacts.require('./SecurityToken.sol'); const GeneralTransferManager = artifacts.require('./GeneralTransferManager'); const GeneralPermissionManager = artifacts.require("./GeneralPermissionManager"); const VestingEscrowWallet = artifacts.require('./VestingEscrowWallet.sol'); - +const STGetter = artifacts.require("./STGetter.sol"); const Web3 = require('web3'); const BN = Web3.utils.BN; const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));// Hardcoded development port @@ -50,6 +50,8 @@ contract('VestingEscrowWallet', accounts => { let I_SecurityToken; let I_PolyToken; let I_PolymathRegistry; + let I_STGetter; + let stGetter; // SecurityToken Details const name = "Team"; @@ -101,7 +103,8 @@ contract('VestingEscrowWallet', accounts => { I_STFactory, I_SecurityTokenRegistry, I_SecurityTokenRegistryProxy, - I_STRProxied + I_STRProxied, + I_STGetter ] = instances; // STEP 2: Deploy the GeneralDelegateManagerFactory @@ -147,7 +150,7 @@ contract('VestingEscrowWallet', accounts => { assert.equal(tx.logs[2].args._ticker, symbol.toUpperCase(), "SecurityToken doesn't get deployed"); I_SecurityToken = await SecurityToken.at(tx.logs[2].args._securityTokenAddress); - + stGetter = await STGetter.at(I_SecurityToken.address); const log = (await I_SecurityToken.getPastEvents('ModuleAdded', {filter: {transactionHash: tx.transactionHash}}))[0]; // Verify that GeneralTransferManager module get added successfully or not @@ -156,7 +159,7 @@ contract('VestingEscrowWallet', accounts => { }); it("Should intialize the auto attached modules", async () => { - let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; + let moduleData = (await stGetter.getModulesByType(2))[0]; I_GeneralTransferManager = await GeneralTransferManager.at(moduleData); }); @@ -208,7 +211,7 @@ contract('VestingEscrowWallet', accounts => { assert.equal(tx.logs[0].args._investor.toLowerCase(), token_owner.toLowerCase(), "Failed in adding the token_owner in whitelist"); // Mint some tokens - await I_SecurityToken.mint(token_owner, web3.utils.toHex(web3.utils.toWei('1', 'ether')), { from: token_owner }); + await I_SecurityToken.issue(token_owner, web3.utils.toHex(web3.utils.toWei('1', 'ether')), "0x0", { from: token_owner }); assert.equal( (await I_SecurityToken.balanceOf(token_owner)).toString(), From ba76e11e5a9f3240399084cc9049a664729a33dc Mon Sep 17 00:00:00 2001 From: satyam Date: Wed, 30 Jan 2019 14:49:43 +0530 Subject: [PATCH 12/16] re-arrangement --- contracts/interfaces/ITransferManager.sol | 13 +++------ contracts/interfaces/TransferManagerEnums.sol | 3 ++ contracts/libraries/VolumeRestrictionLib.sol | 2 +- .../modules/Checkpoint/DividendCheckpoint.sol | 2 +- .../Checkpoint/ERC20DividendCheckpoint.sol | 2 +- .../Mixed/ScheduledCheckpoint.sol | 13 ++------- .../BlacklistTransferManager.sol | 13 ++------- .../TransferManager/LockUpTransferManager.sol | 29 +++++++++---------- .../Wallet/VestingEscrowWallet.sol | 2 +- contracts/modules/Module.sol | 2 +- .../GeneralPermissionManager.sol | 2 +- contracts/modules/STO/CappedSTO.sol | 2 +- contracts/modules/STO/DummySTO.sol | 2 +- contracts/modules/STO/PreSaleSTO.sol | 2 +- contracts/modules/STO/STO.sol | 2 +- contracts/modules/STO/USDTieredSTO.sol | 2 +- .../TransferManager/CountTransferManager.sol | 15 +++------- .../GeneralTransferManager.sol | 15 +++------- .../ManualApprovalTransferManager.sol | 13 ++------- .../PercentageTransferManager.sol | 15 +++------- .../TransferManager/VolumeRestrictionTM.sol | 15 ++-------- contracts/proxy/CappedSTOProxy.sol | 6 ++-- contracts/proxy/CountTransferManagerProxy.sol | 4 +-- contracts/proxy/DummySTOProxy.sol | 6 ++-- .../proxy/ERC20DividendCheckpointProxy.sol | 6 ++-- .../proxy/EtherDividendCheckpointProxy.sol | 4 +-- .../proxy/GeneralPermissionManagerProxy.sol | 5 ++-- .../proxy/GeneralTransferManagerProxy.sol | 4 +-- .../ManualApprovalTransferManagerProxy.sol | 4 +-- .../proxy/PercentageTransferManagerProxy.sol | 4 +-- contracts/proxy/PreSaleSTOProxy.sol | 6 ++-- contracts/proxy/USDTieredSTOProxy.sol | 6 ++-- contracts/proxy/VestingEscrowWalletProxy.sol | 4 +-- contracts/proxy/VolumeRestrictionTMProxy.sol | 4 +-- .../Checkpoint/DividendCheckpointStorage.sol | 0 .../ERC20DividendCheckpointStorage.sol | 0 .../{ => storage}/modules/ModuleStorage.sol | 0 .../GeneralPermissionManagerStorage.sol | 0 .../modules/STO/CappedSTOStorage.sol | 0 .../modules/STO/DummySTOStorage.sol | 0 .../{ => storage}/modules/STO/ISTOStorage.sol | 0 .../modules/STO/PreSaleSTOStorage.sol | 0 .../{ => storage}/modules/STO/STOStorage.sol | 0 .../{ => modules/STO}/USDTieredSTOStorage.sol | 0 .../CountTransferManagerStorage.sol | 0 .../GeneralTransferManagerStorage.sol | 0 .../ManualApprovalTransferManagerStorage.sol | 0 .../PercentageTransferManagerStorage.sol | 0 .../VolumeRestrictionTMStorage.sol | 0 .../Wallet}/VestingEscrowWalletStorage.sol | 0 contracts/tokens/STGetter.sol | 24 +++++++-------- contracts/tokens/SecurityTokenStorage.sol | 3 -- 52 files changed, 96 insertions(+), 160 deletions(-) rename contracts/{ => storage}/modules/Checkpoint/DividendCheckpointStorage.sol (100%) rename contracts/{ => storage}/modules/Checkpoint/ERC20DividendCheckpointStorage.sol (100%) rename contracts/{ => storage}/modules/ModuleStorage.sol (100%) rename contracts/{ => storage}/modules/PermissionManager/GeneralPermissionManagerStorage.sol (100%) rename contracts/{ => storage}/modules/STO/CappedSTOStorage.sol (100%) rename contracts/{ => storage}/modules/STO/DummySTOStorage.sol (100%) rename contracts/{ => storage}/modules/STO/ISTOStorage.sol (100%) rename contracts/{ => storage}/modules/STO/PreSaleSTOStorage.sol (100%) rename contracts/{ => storage}/modules/STO/STOStorage.sol (100%) rename contracts/storage/{ => modules/STO}/USDTieredSTOStorage.sol (100%) rename contracts/{ => storage}/modules/TransferManager/CountTransferManagerStorage.sol (100%) rename contracts/storage/{ => modules/TransferManager}/GeneralTransferManagerStorage.sol (100%) rename contracts/{ => storage}/modules/TransferManager/ManualApprovalTransferManagerStorage.sol (100%) rename contracts/{ => storage}/modules/TransferManager/PercentageTransferManagerStorage.sol (100%) rename contracts/storage/{ => modules/TransferManager}/VolumeRestrictionTMStorage.sol (100%) rename contracts/storage/{ => modules/Wallet}/VestingEscrowWalletStorage.sol (100%) diff --git a/contracts/interfaces/ITransferManager.sol b/contracts/interfaces/ITransferManager.sol index 8d394fb89..b3ed26d19 100644 --- a/contracts/interfaces/ITransferManager.sol +++ b/contracts/interfaces/ITransferManager.sol @@ -18,15 +18,10 @@ interface ITransferManager { ); /** - * @notice return the amount of locked tokens for a given user - * @param _owner whom token amount need to query + * @notice return the amount of tokens for a given user as per the partition + * @param _owner Whom token amount need to query + * @param _partition Identifier */ - function getLockedToken(address _owner) external view returns(uint256); - - /** - * @notice return the amount of un locked tokens for a given user - * @param _owner whom token amount need to query - */ - function getUnLockedToken(address _owner) external view returns(uint256); + function getTokensByPartition(address _owner, bytes32 _partition) external view returns(uint256); } diff --git a/contracts/interfaces/TransferManagerEnums.sol b/contracts/interfaces/TransferManagerEnums.sol index c097dddc7..ddb8cf167 100644 --- a/contracts/interfaces/TransferManagerEnums.sol +++ b/contracts/interfaces/TransferManagerEnums.sol @@ -11,4 +11,7 @@ contract TransferManagerEnums { // NA, then the result from this TM is ignored enum Result {INVALID, NA, VALID, FORCE_VALID} + bytes32 public constant LOCKED = "LOCKED"; + bytes32 public constant UNLOCKED = "UNLOCKED"; + } diff --git a/contracts/libraries/VolumeRestrictionLib.sol b/contracts/libraries/VolumeRestrictionLib.sol index 3b3a05da2..589256de1 100644 --- a/contracts/libraries/VolumeRestrictionLib.sol +++ b/contracts/libraries/VolumeRestrictionLib.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../storage/VolumeRestrictionTMStorage.sol"; +import "../storage/modules/TransferManager/VolumeRestrictionTMStorage.sol"; library VolumeRestrictionLib { diff --git a/contracts/modules/Checkpoint/DividendCheckpoint.sol b/contracts/modules/Checkpoint/DividendCheckpoint.sol index 92a89dc01..7554bc012 100644 --- a/contracts/modules/Checkpoint/DividendCheckpoint.sol +++ b/contracts/modules/Checkpoint/DividendCheckpoint.sol @@ -8,7 +8,7 @@ pragma solidity ^0.5.0; import "./ICheckpoint.sol"; -import "./DividendCheckpointStorage.sol"; +import "../../storage/modules/Checkpoint/DividendCheckpointStorage.sol"; import "../Module.sol"; import "../../interfaces/ISecurityToken.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; diff --git a/contracts/modules/Checkpoint/ERC20DividendCheckpoint.sol b/contracts/modules/Checkpoint/ERC20DividendCheckpoint.sol index a672b88ef..68d24c38e 100644 --- a/contracts/modules/Checkpoint/ERC20DividendCheckpoint.sol +++ b/contracts/modules/Checkpoint/ERC20DividendCheckpoint.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; import "./DividendCheckpoint.sol"; -import "./ERC20DividendCheckpointStorage.sol"; +import "../../storage/modules/Checkpoint/ERC20DividendCheckpointStorage.sol"; import "../../interfaces/IOwnable.sol"; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; diff --git a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol index 4b2626f7f..384a484a1 100644 --- a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol +++ b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol @@ -169,18 +169,11 @@ contract ScheduledCheckpoint is ICheckpoint, TransferManager { } /** - * @notice return the amount of locked tokens for a given user + * @notice return the amount of tokens for a given user as per the partition */ - function getLockedToken(address /*_owner*/) external view returns(uint256) { + function getTokensByPartition(address /*_owner*/, bytes32 /*_partition*/) external view returns(uint256){ return 0; - } - - /** - * @notice return the amount of un locked tokens for a given user - */ - function getUnLockedToken(address /*_owner*/) external view returns(uint256) { - return 0; - } + } /** * @notice Return the permissions flag that are associated with CountTransferManager diff --git a/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol b/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol index c300a3d26..c20c6743b 100644 --- a/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol +++ b/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol @@ -412,18 +412,11 @@ contract BlacklistTransferManager is TransferManager { } /** - * @notice return the amount of locked tokens for a given user + * @notice return the amount of tokens for a given user as per the partition */ - function getLockedToken(address /*_owner*/) external view returns(uint256) { + function getTokensByPartition(address /*_owner*/, bytes32 /*_partition*/) external view returns(uint256){ return 0; - } - - /** - * @notice return the amount of un locked tokens for a given user - */ - function getUnLockedToken(address /*_owner*/) external view returns(uint256) { - return 0; - } + } /** * @notice Return the permissions flag that are associated with blacklist transfer manager diff --git a/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol b/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol index 39dbb67ce..e18ea7121 100644 --- a/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol +++ b/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol @@ -638,24 +638,21 @@ contract LockUpTransferManager is TransferManager { } /** - * @notice return the amount of locked tokens for a given user - * @param _owner whom token amount need to query + * @notice return the amount of tokens for a given user as per the partition + * @param _owner Whom token amount need to query + * @param _partition Identifier */ - function getLockedToken(address _owner) external view returns(uint256) { - return getLockedTokenToUser(_owner); - } - - /** - * @notice return the amount of un locked tokens for a given user - * @param _owner whom token amount need to query - */ - function getUnLockedToken(address _owner) external view returns(uint256) { - uint256 _currentBalance = IERC20(securityToken).balanceOf(_owner); - if (_currentBalance < getLockedTokenToUser(_owner)) { - return 0; + function getTokensByPartition(address _owner, bytes32 _partition) external view returns(uint256){ + if (_partition == LOCKED) { + return getLockedTokenToUser(_owner); + } else if (_partition == UNLOCKED) { + uint256 _currentBalance = IERC20(securityToken).balanceOf(_owner); + if (_currentBalance < getLockedTokenToUser(_owner)) { + return 0; + } + return _currentBalance.sub(getLockedTokenToUser(_owner)); } - return _currentBalance.sub(getLockedTokenToUser(_owner)); - } + } /** * @notice This function returns the signature of configure function diff --git a/contracts/modules/Experimental/Wallet/VestingEscrowWallet.sol b/contracts/modules/Experimental/Wallet/VestingEscrowWallet.sol index 5b483cdf5..209eab5dd 100644 --- a/contracts/modules/Experimental/Wallet/VestingEscrowWallet.sol +++ b/contracts/modules/Experimental/Wallet/VestingEscrowWallet.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../../../storage/VestingEscrowWalletStorage.sol"; +import "../../../storage/modules/Wallet/VestingEscrowWalletStorage.sol"; import "./IWallet.sol"; import "../../../interfaces/ISecurityToken.sol"; diff --git a/contracts/modules/Module.sol b/contracts/modules/Module.sol index f6c967f77..36cae418b 100644 --- a/contracts/modules/Module.sol +++ b/contracts/modules/Module.sol @@ -3,7 +3,7 @@ pragma solidity ^0.5.0; import "../interfaces/IModule.sol"; import "../interfaces/ICheckPermission.sol"; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "./ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; /** diff --git a/contracts/modules/PermissionManager/GeneralPermissionManager.sol b/contracts/modules/PermissionManager/GeneralPermissionManager.sol index 6469ac3bb..75a50ea79 100644 --- a/contracts/modules/PermissionManager/GeneralPermissionManager.sol +++ b/contracts/modules/PermissionManager/GeneralPermissionManager.sol @@ -2,7 +2,7 @@ pragma solidity ^0.5.0; import "./IPermissionManager.sol"; import "../Module.sol"; -import "./GeneralPermissionManagerStorage.sol"; +import "../../storage/modules/PermissionManager/GeneralPermissionManagerStorage.sol"; import "../../interfaces/ISecurityToken.sol"; /** diff --git a/contracts/modules/STO/CappedSTO.sol b/contracts/modules/STO/CappedSTO.sol index ababe60a6..aa0d504c7 100644 --- a/contracts/modules/STO/CappedSTO.sol +++ b/contracts/modules/STO/CappedSTO.sol @@ -4,7 +4,7 @@ import "./STO.sol"; import "../../interfaces/ISecurityToken.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./CappedSTOStorage.sol"; +import "../../storage/modules/STO/CappedSTOStorage.sol"; /** * @title STO module for standard capped crowdsale diff --git a/contracts/modules/STO/DummySTO.sol b/contracts/modules/STO/DummySTO.sol index 7650a1220..67462401d 100644 --- a/contracts/modules/STO/DummySTO.sol +++ b/contracts/modules/STO/DummySTO.sol @@ -2,7 +2,7 @@ pragma solidity ^0.5.0; import "./STO.sol"; import "../../interfaces/ISecurityToken.sol"; -import "./DummySTOStorage.sol"; +import "../../storage/modules/STO/DummySTOStorage.sol"; /** * @title STO module for sample implementation of a different crowdsale module diff --git a/contracts/modules/STO/PreSaleSTO.sol b/contracts/modules/STO/PreSaleSTO.sol index 7a918f875..594df705a 100644 --- a/contracts/modules/STO/PreSaleSTO.sol +++ b/contracts/modules/STO/PreSaleSTO.sol @@ -3,7 +3,7 @@ pragma solidity ^0.5.0; import "./STO.sol"; import "../../interfaces/ISecurityToken.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./PreSaleSTOStorage.sol"; +import "../../storage/modules/STO/PreSaleSTOStorage.sol"; /** * @title STO module for private presales diff --git a/contracts/modules/STO/STO.sol b/contracts/modules/STO/STO.sol index d3f28c5fd..0996b02e1 100644 --- a/contracts/modules/STO/STO.sol +++ b/contracts/modules/STO/STO.sol @@ -3,7 +3,7 @@ pragma solidity ^0.5.0; import "../../Pausable.sol"; import "../Module.sol"; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; -import "./STOStorage.sol"; +import "../../storage/modules/STO/STOStorage.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "../../interfaces/ISTO.sol"; diff --git a/contracts/modules/STO/USDTieredSTO.sol b/contracts/modules/STO/USDTieredSTO.sol index e10f1d00f..06b7a7f06 100644 --- a/contracts/modules/STO/USDTieredSTO.sol +++ b/contracts/modules/STO/USDTieredSTO.sol @@ -6,7 +6,7 @@ import "../../interfaces/IOracle.sol"; import "../../RegistryUpdater.sol"; import "../../libraries/DecimalMath.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../../storage/USDTieredSTOStorage.sol"; +import "../../storage/modules/STO/USDTieredSTOStorage.sol"; /** * @title STO module for standard capped crowdsale diff --git a/contracts/modules/TransferManager/CountTransferManager.sol b/contracts/modules/TransferManager/CountTransferManager.sol index 1e6c075de..e640a335a 100644 --- a/contracts/modules/TransferManager/CountTransferManager.sol +++ b/contracts/modules/TransferManager/CountTransferManager.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; import "./TransferManager.sol"; -import "./CountTransferManagerStorage.sol"; +import "../../storage/modules/TransferManager/CountTransferManagerStorage.sol"; import "../../interfaces/ISecurityToken.sol"; /** @@ -93,18 +93,11 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { } /** - * @notice return the amount of locked tokens for a given user + * @notice return the amount of tokens for a given user as per the partition */ - function getLockedToken(address /*_owner*/) external view returns(uint256) { + function getTokensByPartition(address /*_owner*/, bytes32 /*_partition*/) external view returns(uint256){ return 0; - } - - /** - * @notice return the amount of un locked tokens for a given user - */ - function getUnLockedToken(address /*_owner*/) external view returns(uint256) { - return 0; - } + } /** * @notice Returns the permissions flag that are associated with CountTransferManager diff --git a/contracts/modules/TransferManager/GeneralTransferManager.sol b/contracts/modules/TransferManager/GeneralTransferManager.sol index f7cb519ac..24cdb3cb3 100644 --- a/contracts/modules/TransferManager/GeneralTransferManager.sol +++ b/contracts/modules/TransferManager/GeneralTransferManager.sol @@ -1,7 +1,7 @@ pragma solidity ^0.5.0; import "./TransferManager.sol"; -import "../../storage/GeneralTransferManagerStorage.sol"; +import "../../storage/modules/TransferManager/GeneralTransferManagerStorage.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "../../interfaces/ISecurityToken.sol"; @@ -419,18 +419,11 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage } /** - * @notice return the amount of locked tokens for a given user + * @notice return the amount of tokens for a given user as per the partition */ - function getLockedToken(address /*_owner*/) external view returns(uint256) { + function getTokensByPartition(address /*_owner*/, bytes32 /*_partition*/) external view returns(uint256){ return 0; - } - - /** - * @notice return the amount of un locked tokens for a given user - */ - function getUnLockedToken(address /*_owner*/) external view returns(uint256) { - return 0; - } + } /** * @notice Return the permissions flag that are associated with general trnasfer manager diff --git a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol index e005ac3c5..649f2147b 100644 --- a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol +++ b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol @@ -2,7 +2,7 @@ pragma solidity ^0.5.0; import "./TransferManager.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./ManualApprovalTransferManagerStorage.sol"; +import "../../storage/modules/TransferManager/ManualApprovalTransferManagerStorage.sol"; /** * @title Transfer Manager module for manually approving transactions between accounts @@ -416,16 +416,9 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, } /** - * @notice return the amount of locked tokens for a given user + * @notice return the amount of tokens for a given user as per the partition */ - function getLockedToken(address /*_owner*/) external view returns(uint256) { - return 0; - } - - /** - * @notice return the amount of un locked tokens for a given user - */ - function getUnLockedToken(address /*_owner*/) external view returns(uint256) { + function getTokensByPartition(address /*_owner*/, bytes32 /*_partition*/) external view returns(uint256){ return 0; } diff --git a/contracts/modules/TransferManager/PercentageTransferManager.sol b/contracts/modules/TransferManager/PercentageTransferManager.sol index fd2319175..56553965e 100644 --- a/contracts/modules/TransferManager/PercentageTransferManager.sol +++ b/contracts/modules/TransferManager/PercentageTransferManager.sol @@ -9,7 +9,7 @@ pragma solidity ^0.5.0; import "./TransferManager.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "./PercentageTransferManagerStorage.sol"; +import "../../storage/modules/TransferManager/PercentageTransferManagerStorage.sol"; /** * @title Transfer Manager module for limiting percentage of token supply a single address can hold @@ -144,18 +144,11 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer } /** - * @notice return the amount of locked tokens for a given user + * @notice return the amount of tokens for a given user as per the partition */ - function getLockedToken(address /*_owner*/) external view returns(uint256) { + function getTokensByPartition(address /*_owner*/, bytes32 /*_partition*/) external view returns(uint256){ return 0; - } - - /** - * @notice return the amount of un locked tokens for a given user - */ - function getUnLockedToken(address /*_owner*/) external view returns(uint256) { - return 0; - } + } /** * @notice Return the permissions flag that are associated with Percentage transfer Manager diff --git a/contracts/modules/TransferManager/VolumeRestrictionTM.sol b/contracts/modules/TransferManager/VolumeRestrictionTM.sol index c08a50f14..6bbfde624 100644 --- a/contracts/modules/TransferManager/VolumeRestrictionTM.sol +++ b/contracts/modules/TransferManager/VolumeRestrictionTM.sol @@ -1129,20 +1129,11 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { } /** - * @notice return the amount of locked tokens for a given user - * @param _owner whom token amount need to query + * @notice return the amount of tokens for a given user as per the partition */ - function getLockedToken(address _owner) external view returns(uint256) { + function getTokensByPartition(address /*_owner*/, bytes32 /*_partition*/) external view returns(uint256){ return 0; - } - - /** - * @notice return the amount of un locked tokens for a given user - * @param _owner whom token amount need to query - */ - function getUnLockedToken(address _owner) external view returns(uint256) { - return 0; - } + } /** * @notice Returns the permissions flag that are associated with Percentage transfer Manager diff --git a/contracts/proxy/CappedSTOProxy.sol b/contracts/proxy/CappedSTOProxy.sol index 1dc3604af..264769608 100644 --- a/contracts/proxy/CappedSTOProxy.sol +++ b/contracts/proxy/CappedSTOProxy.sol @@ -3,9 +3,9 @@ pragma solidity ^0.5.0; import "./OwnedProxy.sol"; import "../Pausable.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "../modules/STO/STOStorage.sol"; -import "../modules/ModuleStorage.sol"; -import "../modules/STO/CappedSTOStorage.sol"; +import "../storage/modules/STO/STOStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; +import "../storage/modules/STO/CappedSTOStorage.sol"; /** * @title CappedSTO module Proxy diff --git a/contracts/proxy/CountTransferManagerProxy.sol b/contracts/proxy/CountTransferManagerProxy.sol index f91c32646..5ec6727e4 100644 --- a/contracts/proxy/CountTransferManagerProxy.sol +++ b/contracts/proxy/CountTransferManagerProxy.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.0; -import "../modules/TransferManager/CountTransferManagerStorage.sol"; +import "../storage/modules/TransferManager/CountTransferManagerStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title CountTransferManager module Proxy diff --git a/contracts/proxy/DummySTOProxy.sol b/contracts/proxy/DummySTOProxy.sol index 71873c4d6..3a9924b38 100644 --- a/contracts/proxy/DummySTOProxy.sol +++ b/contracts/proxy/DummySTOProxy.sol @@ -3,9 +3,9 @@ pragma solidity ^0.5.0; import "./OwnedProxy.sol"; import "../Pausable.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "../modules/STO/STOStorage.sol"; -import "../modules/ModuleStorage.sol"; -import "../modules/STO/DummySTOStorage.sol"; +import "../storage/modules/STO/STOStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; +import "../storage/modules/STO/DummySTOStorage.sol"; /** * @title DummySTO module Proxy diff --git a/contracts/proxy/ERC20DividendCheckpointProxy.sol b/contracts/proxy/ERC20DividendCheckpointProxy.sol index 5dc0c8e63..be16be477 100644 --- a/contracts/proxy/ERC20DividendCheckpointProxy.sol +++ b/contracts/proxy/ERC20DividendCheckpointProxy.sol @@ -1,10 +1,10 @@ pragma solidity ^0.5.0; -import "../modules/Checkpoint/ERC20DividendCheckpointStorage.sol"; -import "../modules/Checkpoint/DividendCheckpointStorage.sol"; +import "../storage/modules/Checkpoint/ERC20DividendCheckpointStorage.sol"; +import "../storage/modules/Checkpoint/DividendCheckpointStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title Transfer Manager module for core transfer validation functionality diff --git a/contracts/proxy/EtherDividendCheckpointProxy.sol b/contracts/proxy/EtherDividendCheckpointProxy.sol index 381d71d27..cfbab6961 100644 --- a/contracts/proxy/EtherDividendCheckpointProxy.sol +++ b/contracts/proxy/EtherDividendCheckpointProxy.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.0; -import "../modules/Checkpoint/DividendCheckpointStorage.sol"; +import "../storage/modules/Checkpoint/DividendCheckpointStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title Transfer Manager module for core transfer validation functionality diff --git a/contracts/proxy/GeneralPermissionManagerProxy.sol b/contracts/proxy/GeneralPermissionManagerProxy.sol index 6273cf874..51a39fbbc 100644 --- a/contracts/proxy/GeneralPermissionManagerProxy.sol +++ b/contracts/proxy/GeneralPermissionManagerProxy.sol @@ -3,9 +3,8 @@ pragma solidity ^0.5.0; import "./OwnedProxy.sol"; import "../Pausable.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "../modules/STO/STOStorage.sol"; -import "../modules/ModuleStorage.sol"; -import "../modules/PermissionManager/GeneralPermissionManagerStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; +import "../storage/modules/PermissionManager/GeneralPermissionManagerStorage.sol"; /** * @title GeneralPermissionManager module Proxy diff --git a/contracts/proxy/GeneralTransferManagerProxy.sol b/contracts/proxy/GeneralTransferManagerProxy.sol index 0a4adbc08..a53fdcb84 100644 --- a/contracts/proxy/GeneralTransferManagerProxy.sol +++ b/contracts/proxy/GeneralTransferManagerProxy.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.0; -import "../storage/GeneralTransferManagerStorage.sol"; +import "../storage/modules/TransferManager/GeneralTransferManagerStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title Transfer Manager module for core transfer validation functionality diff --git a/contracts/proxy/ManualApprovalTransferManagerProxy.sol b/contracts/proxy/ManualApprovalTransferManagerProxy.sol index e3b4f6bc0..a98eed41f 100644 --- a/contracts/proxy/ManualApprovalTransferManagerProxy.sol +++ b/contracts/proxy/ManualApprovalTransferManagerProxy.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.0; -import "../modules/TransferManager/ManualApprovalTransferManagerStorage.sol"; +import "../storage/modules/TransferManager/ManualApprovalTransferManagerStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** @title ManualApprovalTransferManager module Proxy diff --git a/contracts/proxy/PercentageTransferManagerProxy.sol b/contracts/proxy/PercentageTransferManagerProxy.sol index 6c85d0f5f..bc5af795f 100644 --- a/contracts/proxy/PercentageTransferManagerProxy.sol +++ b/contracts/proxy/PercentageTransferManagerProxy.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.0; -import "../modules/TransferManager/PercentageTransferManagerStorage.sol"; +import "../storage/modules/TransferManager/PercentageTransferManagerStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title PercentageTransferManager module Proxy diff --git a/contracts/proxy/PreSaleSTOProxy.sol b/contracts/proxy/PreSaleSTOProxy.sol index 2753ec3b9..e3fe6f573 100644 --- a/contracts/proxy/PreSaleSTOProxy.sol +++ b/contracts/proxy/PreSaleSTOProxy.sol @@ -3,9 +3,9 @@ pragma solidity ^0.5.0; import "./OwnedProxy.sol"; import "../Pausable.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "../modules/STO/STOStorage.sol"; -import "../modules/ModuleStorage.sol"; -import "../modules/STO/PreSaleSTOStorage.sol"; +import "../storage/modules/STO/STOStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; +import "../storage/modules/STO/PreSaleSTOStorage.sol"; /** * @title PreSaleSTO module Proxy diff --git a/contracts/proxy/USDTieredSTOProxy.sol b/contracts/proxy/USDTieredSTOProxy.sol index 1f5a1087a..109b1ad2e 100644 --- a/contracts/proxy/USDTieredSTOProxy.sol +++ b/contracts/proxy/USDTieredSTOProxy.sol @@ -1,11 +1,11 @@ pragma solidity ^0.5.0; -import "../storage/USDTieredSTOStorage.sol"; +import "../storage/modules/STO/USDTieredSTOStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; import "openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol"; -import "../modules/STO/STOStorage.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/STO/STOStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title USDTiered STO module Proxy diff --git a/contracts/proxy/VestingEscrowWalletProxy.sol b/contracts/proxy/VestingEscrowWalletProxy.sol index a69463084..705adaf4a 100644 --- a/contracts/proxy/VestingEscrowWalletProxy.sol +++ b/contracts/proxy/VestingEscrowWalletProxy.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.0; -import "../storage/VestingEscrowWalletStorage.sol"; +import "../storage/modules/Wallet/VestingEscrowWalletStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title Escrow wallet module for vesting functionality */ diff --git a/contracts/proxy/VolumeRestrictionTMProxy.sol b/contracts/proxy/VolumeRestrictionTMProxy.sol index ce1356904..4fb255dba 100644 --- a/contracts/proxy/VolumeRestrictionTMProxy.sol +++ b/contracts/proxy/VolumeRestrictionTMProxy.sol @@ -1,9 +1,9 @@ pragma solidity ^0.5.0; -import "../storage/VolumeRestrictionTMStorage.sol"; +import "../storage/modules/TransferManager/VolumeRestrictionTMStorage.sol"; import "./OwnedProxy.sol"; import "../Pausable.sol"; -import "../modules/ModuleStorage.sol"; +import "../storage/modules/ModuleStorage.sol"; /** * @title Transfer Manager module for core transfer validation functionality diff --git a/contracts/modules/Checkpoint/DividendCheckpointStorage.sol b/contracts/storage/modules/Checkpoint/DividendCheckpointStorage.sol similarity index 100% rename from contracts/modules/Checkpoint/DividendCheckpointStorage.sol rename to contracts/storage/modules/Checkpoint/DividendCheckpointStorage.sol diff --git a/contracts/modules/Checkpoint/ERC20DividendCheckpointStorage.sol b/contracts/storage/modules/Checkpoint/ERC20DividendCheckpointStorage.sol similarity index 100% rename from contracts/modules/Checkpoint/ERC20DividendCheckpointStorage.sol rename to contracts/storage/modules/Checkpoint/ERC20DividendCheckpointStorage.sol diff --git a/contracts/modules/ModuleStorage.sol b/contracts/storage/modules/ModuleStorage.sol similarity index 100% rename from contracts/modules/ModuleStorage.sol rename to contracts/storage/modules/ModuleStorage.sol diff --git a/contracts/modules/PermissionManager/GeneralPermissionManagerStorage.sol b/contracts/storage/modules/PermissionManager/GeneralPermissionManagerStorage.sol similarity index 100% rename from contracts/modules/PermissionManager/GeneralPermissionManagerStorage.sol rename to contracts/storage/modules/PermissionManager/GeneralPermissionManagerStorage.sol diff --git a/contracts/modules/STO/CappedSTOStorage.sol b/contracts/storage/modules/STO/CappedSTOStorage.sol similarity index 100% rename from contracts/modules/STO/CappedSTOStorage.sol rename to contracts/storage/modules/STO/CappedSTOStorage.sol diff --git a/contracts/modules/STO/DummySTOStorage.sol b/contracts/storage/modules/STO/DummySTOStorage.sol similarity index 100% rename from contracts/modules/STO/DummySTOStorage.sol rename to contracts/storage/modules/STO/DummySTOStorage.sol diff --git a/contracts/modules/STO/ISTOStorage.sol b/contracts/storage/modules/STO/ISTOStorage.sol similarity index 100% rename from contracts/modules/STO/ISTOStorage.sol rename to contracts/storage/modules/STO/ISTOStorage.sol diff --git a/contracts/modules/STO/PreSaleSTOStorage.sol b/contracts/storage/modules/STO/PreSaleSTOStorage.sol similarity index 100% rename from contracts/modules/STO/PreSaleSTOStorage.sol rename to contracts/storage/modules/STO/PreSaleSTOStorage.sol diff --git a/contracts/modules/STO/STOStorage.sol b/contracts/storage/modules/STO/STOStorage.sol similarity index 100% rename from contracts/modules/STO/STOStorage.sol rename to contracts/storage/modules/STO/STOStorage.sol diff --git a/contracts/storage/USDTieredSTOStorage.sol b/contracts/storage/modules/STO/USDTieredSTOStorage.sol similarity index 100% rename from contracts/storage/USDTieredSTOStorage.sol rename to contracts/storage/modules/STO/USDTieredSTOStorage.sol diff --git a/contracts/modules/TransferManager/CountTransferManagerStorage.sol b/contracts/storage/modules/TransferManager/CountTransferManagerStorage.sol similarity index 100% rename from contracts/modules/TransferManager/CountTransferManagerStorage.sol rename to contracts/storage/modules/TransferManager/CountTransferManagerStorage.sol diff --git a/contracts/storage/GeneralTransferManagerStorage.sol b/contracts/storage/modules/TransferManager/GeneralTransferManagerStorage.sol similarity index 100% rename from contracts/storage/GeneralTransferManagerStorage.sol rename to contracts/storage/modules/TransferManager/GeneralTransferManagerStorage.sol diff --git a/contracts/modules/TransferManager/ManualApprovalTransferManagerStorage.sol b/contracts/storage/modules/TransferManager/ManualApprovalTransferManagerStorage.sol similarity index 100% rename from contracts/modules/TransferManager/ManualApprovalTransferManagerStorage.sol rename to contracts/storage/modules/TransferManager/ManualApprovalTransferManagerStorage.sol diff --git a/contracts/modules/TransferManager/PercentageTransferManagerStorage.sol b/contracts/storage/modules/TransferManager/PercentageTransferManagerStorage.sol similarity index 100% rename from contracts/modules/TransferManager/PercentageTransferManagerStorage.sol rename to contracts/storage/modules/TransferManager/PercentageTransferManagerStorage.sol diff --git a/contracts/storage/VolumeRestrictionTMStorage.sol b/contracts/storage/modules/TransferManager/VolumeRestrictionTMStorage.sol similarity index 100% rename from contracts/storage/VolumeRestrictionTMStorage.sol rename to contracts/storage/modules/TransferManager/VolumeRestrictionTMStorage.sol diff --git a/contracts/storage/VestingEscrowWalletStorage.sol b/contracts/storage/modules/Wallet/VestingEscrowWalletStorage.sol similarity index 100% rename from contracts/storage/VestingEscrowWalletStorage.sol rename to contracts/storage/modules/Wallet/VestingEscrowWalletStorage.sol diff --git a/contracts/tokens/STGetter.sol b/contracts/tokens/STGetter.sol index 0533b95a0..a5ecd035f 100644 --- a/contracts/tokens/STGetter.sol +++ b/contracts/tokens/STGetter.sol @@ -181,23 +181,19 @@ contract STGetter is OZStorage, SecurityTokenStorage { return false; } - /// @dev get the unlocked balance according to the tms + /** + * @notice Get the balance according to the provided partitions + * @param _owner Whom balance need to queried + * @param _partition Partition which differentiate the tokens. + * @return Amount of tokens as per the given partitions + */ function balanceOfPartition(address _owner, bytes32 _partition) external view returns(uint256) { address[] memory tms = modules[TRANSFER_KEY]; - uint8 i; - uint256 _amount; - if (_partition == LOCKED) { - for (i = 0; i < tms.length; i++) { - _amount += ITransferManager(tms[i]).getLockedToken(_owner); - } - return _amount; - }else if (_partition == UNLOCKED) { - for (i = 0; i < tms.length; i++) { - _amount += ITransferManager(tms[i]).getUnLockedToken(_owner); - } - return _amount; + uint256 _amount = 0; + for (uint256 i = 0; i < tms.length; i++) { + _amount += ITransferManager(tms[i]).getTokensByPartition(_owner, _partition); } - return 0; + return _amount; } /** diff --git a/contracts/tokens/SecurityTokenStorage.sol b/contracts/tokens/SecurityTokenStorage.sol index fedfbd564..1b6537b64 100644 --- a/contracts/tokens/SecurityTokenStorage.sol +++ b/contracts/tokens/SecurityTokenStorage.sol @@ -8,9 +8,6 @@ contract SecurityTokenStorage { uint8 constant CHECKPOINT_KEY = 4; uint8 constant BURN_KEY = 5; - bytes32 constant LOCKED = "LOCKED"; - bytes32 constant UNLOCKED = "UNLOCKED"; - ////////////////////////// /// Document datastructure ////////////////////////// From fb76b169155ef07e168ff9054541a8993a2b53c1 Mon Sep 17 00:00:00 2001 From: satyam Date: Wed, 30 Jan 2019 18:16:52 +0530 Subject: [PATCH 13/16] improved balanceOfPartition --- .../TransferManager/LockUpTransferManager.sol | 6 ++- contracts/tokens/STGetter.sol | 3 ++ test/o_security_token.js | 20 +++++++++ test/w_lockup_transfer_manager.js | 43 +++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol b/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol index e18ea7121..14eaebf0e 100644 --- a/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol +++ b/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol @@ -2,6 +2,7 @@ pragma solidity ^0.5.0; import "../../TransferManager/TransferManager.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; +import "openzeppelin-solidity/contracts/math/Math.sol"; contract LockUpTransferManager is TransferManager { @@ -643,15 +644,16 @@ contract LockUpTransferManager is TransferManager { * @param _partition Identifier */ function getTokensByPartition(address _owner, bytes32 _partition) external view returns(uint256){ + uint256 _currentBalance = IERC20(securityToken).balanceOf(_owner); if (_partition == LOCKED) { - return getLockedTokenToUser(_owner); + return Math.min(getLockedTokenToUser(_owner), _currentBalance); } else if (_partition == UNLOCKED) { - uint256 _currentBalance = IERC20(securityToken).balanceOf(_owner); if (_currentBalance < getLockedTokenToUser(_owner)) { return 0; } return _currentBalance.sub(getLockedTokenToUser(_owner)); } + return 0; } /** diff --git a/contracts/tokens/STGetter.sol b/contracts/tokens/STGetter.sol index a5ecd035f..1fdf8cb46 100644 --- a/contracts/tokens/STGetter.sol +++ b/contracts/tokens/STGetter.sol @@ -193,6 +193,9 @@ contract STGetter is OZStorage, SecurityTokenStorage { for (uint256 i = 0; i < tms.length; i++) { _amount += ITransferManager(tms[i]).getTokensByPartition(_owner, _partition); } + if (_amount == 0 && _partition == "UNLOCKED") { + return balanceOf(_owner); + } return _amount; } diff --git a/test/o_security_token.js b/test/o_security_token.js index 681b07e96..e7b149033 100644 --- a/test/o_security_token.js +++ b/test/o_security_token.js @@ -237,6 +237,26 @@ contract("SecurityToken", async (accounts) => { ); }); + it("Should check the balance of the locked tokens", async() => { + console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_affiliate1)).toString())}`); + console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); + console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); + assert.equal( + web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`LOCKED`))).toString()), + 0 + ); + assert.equal( + web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`UNLOCKED`))).toString()), + web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_affiliate1)).toString()) + ); + console.log(`\t Wrong partition: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.toHex(`OCKED`))).toString())}`); + assert.equal( + web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.toHex(`OCKED`))).toString()), + 0 + ); + }); + + it("Should issueMulti", async () => { await catchRevert( I_SecurityToken.issueMulti([account_affiliate1, account_affiliate2], [new BN(100).mul(new BN(10).pow(new BN(18)))], { diff --git a/test/w_lockup_transfer_manager.js b/test/w_lockup_transfer_manager.js index 125b2de7e..cc1234b0e 100644 --- a/test/w_lockup_transfer_manager.js +++ b/test/w_lockup_transfer_manager.js @@ -671,9 +671,27 @@ contract('LockUpTransferManager', accounts => { // increase 20 sec that makes 1 period passed // 2 from a period and 1 is already unlocked await increaseTime(21); + console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); + console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); + console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); await I_SecurityToken.transfer(account_investor1, web3.utils.toWei('3'), { from: account_investor3 }) }) + it("Should check the balance of the locked tokens", async() => { + console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); + console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); + console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); + assert.equal( + web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString()), + web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()) + ); + console.log(`\t Wrong partition: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.toHex(`OCKED`))).toString())}`); + assert.equal( + web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.toHex(`OCKED`))).toString()), + 0 + ); + }); + it("Should transfer the tokens after passing another period of the lockup", async() => { // increase the 15 sec that makes first period of another lockup get passed // allow 1 token to transfer @@ -682,6 +700,15 @@ contract('LockUpTransferManager', accounts => { await catchRevert( I_SecurityToken.transfer(account_investor1, web3.utils.toWei('3'), { from: account_investor3 }) ) + let lockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); + let unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); + console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); + console.log(`\t Locked balance: ${lockedBalance}`); + console.log(`\t Unlocked Balance: ${unlockedBalance}`); + assert.equal( + web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString()), + parseInt(lockedBalance) + parseInt(unlockedBalance) + ); // second txn will pass because 1 token is in unlocked state await I_SecurityToken.transfer(account_investor1, web3.utils.toWei('1'), { from: account_investor3 }) }); @@ -691,11 +718,27 @@ contract('LockUpTransferManager', accounts => { // more token from the lockup 2 await increaseTime(21); + let lockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); + let unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); + console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); + console.log(`\t Locked balance: ${lockedBalance}`); + console.log(` \t Unlocked Amount for lockup 1: ${web3.utils.fromWei(((await I_LockUpTransferManager.getLockUp.call(web3.utils.fromAscii("c_lockup")))[4]).toString())}`) + console.log(` \t Unlocked Amount for lockup 2: ${web3.utils.fromWei(((await I_LockUpTransferManager.getLockUp.call(web3.utils.fromAscii("d_lockup")))[4]).toString())}`) + console.log(`\t Unlocked Balance: ${unlockedBalance}`); + await I_SecurityToken.transfer(account_investor1, web3.utils.toWei('3'), { from: account_investor3 }) assert.equal( (await I_SecurityToken.balanceOf(account_investor3)).toString(), web3.utils.toWei('3', 'ether') ); + console.log("After transaction"); + lockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); + unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); + console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); + console.log(`\t Locked balance: ${lockedBalance}`); + console.log(` \t Unlocked Amount for lockup 1: ${web3.utils.fromWei(((await I_LockUpTransferManager.getLockUp.call(web3.utils.fromAscii("c_lockup")))[4]).toString())}`) + console.log(` \t Unlocked Amount for lockup 2: ${web3.utils.fromWei(((await I_LockUpTransferManager.getLockUp.call(web3.utils.fromAscii("d_lockup")))[4]).toString())}`) + console.log(`\t Unlocked Balance: ${unlockedBalance}`); }); it("Should remove multiple lockup --failed because of bad owner", async() => { From 17a7701586f358d168a70ed16d420ef0200fdc16 Mon Sep 17 00:00:00 2001 From: satyam Date: Wed, 6 Feb 2019 18:24:27 +0530 Subject: [PATCH 14/16] change the function name --- contracts/tokens/STGetter.sol | 2 +- test/o_security_token.js | 12 ++++++------ test/w_lockup_transfer_manager.js | 26 +++++++++++++------------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/contracts/tokens/STGetter.sol b/contracts/tokens/STGetter.sol index 1fdf8cb46..3cff8941a 100644 --- a/contracts/tokens/STGetter.sol +++ b/contracts/tokens/STGetter.sol @@ -187,7 +187,7 @@ contract STGetter is OZStorage, SecurityTokenStorage { * @param _partition Partition which differentiate the tokens. * @return Amount of tokens as per the given partitions */ - function balanceOfPartition(address _owner, bytes32 _partition) external view returns(uint256) { + function balanceOfByPartition(address _owner, bytes32 _partition) external view returns(uint256) { address[] memory tms = modules[TRANSFER_KEY]; uint256 _amount = 0; for (uint256 i = 0; i < tms.length; i++) { diff --git a/test/o_security_token.js b/test/o_security_token.js index c37e0a720..13befc018 100644 --- a/test/o_security_token.js +++ b/test/o_security_token.js @@ -244,19 +244,19 @@ contract("SecurityToken", async (accounts) => { it("Should check the balance of the locked tokens", async() => { console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_affiliate1)).toString())}`); - console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); - console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); + console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_affiliate1, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); + console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_affiliate1, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); assert.equal( - web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`LOCKED`))).toString()), + web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_affiliate1, web3.utils.utf8ToHex(`LOCKED`))).toString()), 0 ); assert.equal( - web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.utf8ToHex(`UNLOCKED`))).toString()), + web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_affiliate1, web3.utils.utf8ToHex(`UNLOCKED`))).toString()), web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_affiliate1)).toString()) ); - console.log(`\t Wrong partition: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.toHex(`OCKED`))).toString())}`); + console.log(`\t Wrong partition: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_affiliate1, web3.utils.toHex(`OCKED`))).toString())}`); assert.equal( - web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_affiliate1, web3.utils.toHex(`OCKED`))).toString()), + web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_affiliate1, web3.utils.toHex(`OCKED`))).toString()), 0 ); }); diff --git a/test/w_lockup_transfer_manager.js b/test/w_lockup_transfer_manager.js index cc1234b0e..3284dd2a0 100644 --- a/test/w_lockup_transfer_manager.js +++ b/test/w_lockup_transfer_manager.js @@ -672,22 +672,22 @@ contract('LockUpTransferManager', accounts => { // 2 from a period and 1 is already unlocked await increaseTime(21); console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); - console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); - console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); + console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); + console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); await I_SecurityToken.transfer(account_investor1, web3.utils.toWei('3'), { from: account_investor3 }) }) it("Should check the balance of the locked tokens", async() => { console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); - console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); - console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); + console.log(`\t Locked balance: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString())}`); + console.log(`\t Unlocked balance: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString())}`); assert.equal( web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString()), - web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()) + web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()) ); - console.log(`\t Wrong partition: ${web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.toHex(`OCKED`))).toString())}`); + console.log(`\t Wrong partition: ${web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.toHex(`OCKED`))).toString())}`); assert.equal( - web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.toHex(`OCKED`))).toString()), + web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.toHex(`OCKED`))).toString()), 0 ); }); @@ -700,8 +700,8 @@ contract('LockUpTransferManager', accounts => { await catchRevert( I_SecurityToken.transfer(account_investor1, web3.utils.toWei('3'), { from: account_investor3 }) ) - let lockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); - let unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); + let lockedBalance = web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); + let unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); console.log(`\t Locked balance: ${lockedBalance}`); console.log(`\t Unlocked Balance: ${unlockedBalance}`); @@ -718,8 +718,8 @@ contract('LockUpTransferManager', accounts => { // more token from the lockup 2 await increaseTime(21); - let lockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); - let unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); + let lockedBalance = web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); + let unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); console.log(`\t Locked balance: ${lockedBalance}`); console.log(` \t Unlocked Amount for lockup 1: ${web3.utils.fromWei(((await I_LockUpTransferManager.getLockUp.call(web3.utils.fromAscii("c_lockup")))[4]).toString())}`) @@ -732,8 +732,8 @@ contract('LockUpTransferManager', accounts => { web3.utils.toWei('3', 'ether') ); console.log("After transaction"); - lockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); - unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); + lockedBalance = web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`LOCKED`))).toString()); + unlockedBalance = web3.utils.fromWei((await stGetter.balanceOfByPartition.call(account_investor3, web3.utils.utf8ToHex(`UNLOCKED`))).toString()); console.log(`\t Total balance: ${web3.utils.fromWei((await I_SecurityToken.balanceOf.call(account_investor3)).toString())}`); console.log(`\t Locked balance: ${lockedBalance}`); console.log(` \t Unlocked Amount for lockup 1: ${web3.utils.fromWei(((await I_LockUpTransferManager.getLockUp.call(web3.utils.fromAscii("c_lockup")))[4]).toString())}`) From 09604fb2a1c8a5feb8c921fea35f46a5deaee10f Mon Sep 17 00:00:00 2001 From: satyam Date: Wed, 13 Feb 2019 14:21:53 +0530 Subject: [PATCH 15/16] change function name and return address as asc --- contracts/interfaces/ITransferManager.sol | 4 +-- contracts/libraries/TokenLib.sol | 12 +++---- .../Mixed/ScheduledCheckpoint.sol | 21 ++++++------- .../BlacklistTransferManager.sol | 12 +++---- .../TransferManager/KYCTransferManager.sol | 10 +++--- .../TransferManager/LockUpTransferManager.sol | 16 +++++----- .../TransferManager/SignedTransferManager.sol | 20 ++++++------ .../TransferManager/CountTransferManager.sol | 19 ++++++------ .../GeneralTransferManager.sol | 31 ++++++++++--------- .../ManualApprovalTransferManager.sol | 21 ++++++------- .../PercentageTransferManager.sol | 21 ++++++------- .../TransferManager/TransferManager.sol | 5 +++ .../TransferManager/VolumeRestrictionTM.sol | 21 ++++++------- contracts/tokens/SecurityToken.sol | 22 +++++-------- 14 files changed, 112 insertions(+), 123 deletions(-) diff --git a/contracts/interfaces/ITransferManager.sol b/contracts/interfaces/ITransferManager.sol index 61269db8f..3045b3579 100644 --- a/contracts/interfaces/ITransferManager.sol +++ b/contracts/interfaces/ITransferManager.sol @@ -14,9 +14,9 @@ interface ITransferManager { /** * @notice Determines if the transfer between these two accounts can happen */ - function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data, bool _isTransfer) external returns(Result); + function executeTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external returns(Result); - function executeTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external view returns(Result, byte); + function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external view returns(Result, bytes32); /** * @notice return the amount of tokens for a given user as per the partition diff --git a/contracts/libraries/TokenLib.sol b/contracts/libraries/TokenLib.sol index 01fadca4b..8b26bc5c4 100644 --- a/contracts/libraries/TokenLib.sol +++ b/contracts/libraries/TokenLib.sol @@ -253,7 +253,7 @@ library TokenLib { ) public view - returns(bool, byte) + returns(bool, bytes32) { if (!transfersFrozen) { bool isInvalid = false; @@ -261,14 +261,14 @@ library TokenLib { bool isForceValid = false; // Use the local variables to avoid the stack too deep error transfersFrozen = false; // bool unarchived = false; - byte reasonCode; + bytes32 appCode; for (uint256 i = 0; i < modules.length; i++) { if (!modulesToData[modules[i]].isArchived) { transfersFrozen = true; - (ITransferManager.Result valid, byte reason) = ITransferManager(modules[i]).executeTransfer(from, to, value, data); + (ITransferManager.Result valid, bytes32 reason) = ITransferManager(modules[i]).verifyTransfer(from, to, value, data); if (valid == ITransferManager.Result.INVALID) { isInvalid = true; - reasonCode = reason; + appCode = reason; } else if (valid == ITransferManager.Result.VALID) { isValid = true; } else if (valid == ITransferManager.Result.FORCE_VALID) { @@ -279,9 +279,9 @@ library TokenLib { // If no unarchived modules, return true by default // Use the local variables to avoid the stack too deep error isValid = transfersFrozen ? (isForceValid ? true : (isInvalid ? false : isValid)) : true; - return (isValid, isValid ? byte(0x51): reasonCode); + return (isValid, isValid ? bytes32(hex"51"): appCode); } - return (false, 0x54); + return (false, bytes32(hex"54")); } } diff --git a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol index c5fff9a8c..64301c681 100644 --- a/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol +++ b/contracts/modules/Experimental/Mixed/ScheduledCheckpoint.sol @@ -79,24 +79,21 @@ contract ScheduledCheckpoint is ICheckpoint, TransferManager { /** * @notice Used to create checkpoints that correctly reflect balances - * @param _isTransfer whether or not an actual transfer is occuring * @return always returns Result.NA */ - function verifyTransfer( + function executeTransfer( address, /* _from */ address, /* _to */ uint256, /* _amount */ - bytes calldata, /* _data */ - bool _isTransfer + bytes calldata /* _data */ ) - external + external + onlySecurityToken returns(Result) { - require(_isTransfer == false || msg.sender == securityToken, "Sender is not owner"); - if (paused || !_isTransfer) { - return (Result.NA); + if (!paused) { + _updateAll(); } - _updateAll(); return (Result.NA); } @@ -104,7 +101,7 @@ contract ScheduledCheckpoint is ICheckpoint, TransferManager { * @notice Used to create checkpoints that correctly reflect balances * @return always returns Result.NA */ - function executeTransfer( + function verifyTransfer( address, /* _from */ address, /* _to */ uint256, /* _amount */ @@ -112,9 +109,9 @@ contract ScheduledCheckpoint is ICheckpoint, TransferManager { ) public view - returns(Result, byte) + returns(Result, bytes32) { - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } /** diff --git a/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol b/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol index c20c6743b..059588a6e 100644 --- a/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol +++ b/contracts/modules/Experimental/TransferManager/BlacklistTransferManager.sol @@ -94,8 +94,8 @@ contract BlacklistTransferManager is TransferManager { * if the current time is between the timeframe define for the * blacklist type associated with the _from address */ - function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data, bool /* _isTransfer */) external returns(Result) { - (Result success, ) = executeTransfer(_from, _to, _amount, _data); + function executeTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external returns(Result) { + (Result success, ) = verifyTransfer(_from, _to, _amount, _data); return success; } @@ -107,7 +107,7 @@ contract BlacklistTransferManager is TransferManager { * if the current time is between the timeframe define for the * blacklist type associated with the _from address */ - function executeTransfer( + function verifyTransfer( address _from, address /* _to */, uint256 /* _amount */, @@ -115,7 +115,7 @@ contract BlacklistTransferManager is TransferManager { ) public view - returns(Result, byte) + returns(Result, bytes32) { if (!paused) { if (investorToBlacklist[_from].length != 0) { @@ -131,13 +131,13 @@ contract BlacklistTransferManager is TransferManager { uint256 repeater = (now.sub(startTimeTemp)).div(repeatPeriodTimeTemp); /*solium-disable-next-line security/no-block-members*/ if (startTimeTemp.add(repeatPeriodTimeTemp.mul(repeater)) <= now && endTimeTemp.add(repeatPeriodTimeTemp.mul(repeater)) >= now) { - return (Result.INVALID, 0xA6); + return (Result.INVALID, bytes32(uint256(address(this)) << 96)); } } } } } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } diff --git a/contracts/modules/Experimental/TransferManager/KYCTransferManager.sol b/contracts/modules/Experimental/TransferManager/KYCTransferManager.sol index 0cc0d85e4..a2741d346 100644 --- a/contracts/modules/Experimental/TransferManager/KYCTransferManager.sol +++ b/contracts/modules/Experimental/TransferManager/KYCTransferManager.sol @@ -35,19 +35,19 @@ contract KYCTransferManager is TransferManager { return bytes4(0); } - function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data, bool /* _isTransfer */) + function executeTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external returns (Result) { - (Result success,)= executeTransfer(_from, _to, _amount, _data); + (Result success,)= verifyTransfer(_from, _to, _amount, _data); return success; } - function executeTransfer(address /*_from*/, address _to, uint256 /*_amount*/, bytes memory /* _data */) public view returns(Result, byte) { + function verifyTransfer(address /*_from*/, address _to, uint256 /*_amount*/, bytes memory /* _data */) public view returns(Result, bytes32) { if (!paused && checkKYC(_to)) { - return (Result.VALID, 0xA1); + return (Result.VALID, bytes32(uint256(address(this)) << 96)); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } function modifyKYC( address _investor, bool _kycStatus) public withPerm(KYC_PROVIDER) { diff --git a/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol b/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol index a1ffb8b0d..5519e44b6 100644 --- a/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol +++ b/contracts/modules/Experimental/TransferManager/LockUpTransferManager.sol @@ -75,8 +75,8 @@ contract LockUpTransferManager is TransferManager { * @param _from Address of the sender * @param _amount The amount of tokens to transfer */ - function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data, bool /*_isTransfer*/) external returns(Result) { - (Result success,) = executeTransfer(_from, _to, _amount, _data); + function executeTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external returns(Result) { + (Result success,) = verifyTransfer(_from, _to, _amount, _data); return success; } @@ -84,7 +84,7 @@ contract LockUpTransferManager is TransferManager { * @param _from Address of the sender * @param _amount The amount of tokens to transfer */ - function executeTransfer( + function verifyTransfer( address _from, address /* _to*/, uint256 _amount, @@ -92,14 +92,14 @@ contract LockUpTransferManager is TransferManager { ) public view - returns(Result, byte) + returns(Result, bytes32) { // only attempt to verify the transfer if the token is unpaused, this isn't a mint txn, and there exists a lockup for this user if (!paused && _from != address(0) && userToLockups[_from].length != 0) { // check if this transfer is valid return _checkIfValidTransfer(_from, _amount); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } @@ -438,14 +438,14 @@ contract LockUpTransferManager is TransferManager { * @param _userAddress Address of the user whose lock ups should be checked * @param _amount Amount of tokens that need to transact */ - function _checkIfValidTransfer(address _userAddress, uint256 _amount) internal view returns (Result, byte) { + function _checkIfValidTransfer(address _userAddress, uint256 _amount) internal view returns (Result, bytes32) { uint256 totalRemainingLockedAmount = getLockedTokenToUser(_userAddress); // Present balance of the user uint256 currentBalance = IERC20(securityToken).balanceOf(_userAddress); if ((currentBalance.sub(_amount)) >= totalRemainingLockedAmount) { - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } - return (Result.INVALID, 0x55); + return (Result.INVALID, bytes32(uint256(address(this)) << 96)); } /** diff --git a/contracts/modules/Experimental/TransferManager/SignedTransferManager.sol b/contracts/modules/Experimental/TransferManager/SignedTransferManager.sol index 4f6eb357f..bcf42edb8 100644 --- a/contracts/modules/Experimental/TransferManager/SignedTransferManager.sol +++ b/contracts/modules/Experimental/TransferManager/SignedTransferManager.sol @@ -86,14 +86,12 @@ contract SignedTransferManager is TransferManager { * @param _to address transfer to * @param _amount transfer amount * @param _data signature - * @param _isTransfer bool value of isTransfer * Sig needs to be valid (not used or deemed as invalid) * Signer needs to be in the signers mapping */ - function verifyTransfer(address _from, address _to, uint256 _amount, bytes calldata _data , bool _isTransfer) external returns(Result) { - (Result success, ) = executeTransfer(_from, _to, _amount, _data); - require (_isTransfer == false || msg.sender == securityToken, "Sender is not ST"); - if (_isTransfer && success == Result.VALID) { + function executeTransfer(address _from, address _to, uint256 _amount, bytes calldata _data) external onlySecurityToken returns(Result) { + (Result success, ) = verifyTransfer(_from, _to, _amount, _data); + if (success == Result.VALID) { bytes memory signature; (,,,signature) = abi.decode(_data, (address, uint256, uint256, bytes)); _invalidateSignature(signature); @@ -110,11 +108,11 @@ contract SignedTransferManager is TransferManager { * Sig needs to be valid (not used or deemed as invalid) * Signer needs to be in the signers mapping */ - function executeTransfer(address _from, address _to, uint256 _amount, bytes memory _data) public view returns(Result, byte) { + function verifyTransfer(address _from, address _to, uint256 _amount, bytes memory _data) public view returns(Result, bytes32) { if (!paused) { if (_data.length == 0) - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); address targetAddress; uint256 nonce; @@ -123,16 +121,16 @@ contract SignedTransferManager is TransferManager { (targetAddress, nonce, expiry, signature) = abi.decode(_data, (address, uint256, uint256, bytes)); if (address(this) != targetAddress || signature.length == 0 || _checkSignatureIsInvalid(signature) || expiry < now) - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); bytes32 hash = keccak256(abi.encodePacked(targetAddress, nonce, expiry, _from, _to, _amount)); address signer = hash.toEthSignedMessageHash().recover(signature); if (!_checkSigner(signer)) - return (Result.NA, 0xA0); - return (Result.VALID, 0xA1); + return (Result.NA, bytes32(0)); + return (Result.VALID, bytes32(uint256(address(this)) << 96)); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } /** diff --git a/contracts/modules/TransferManager/CountTransferManager.sol b/contracts/modules/TransferManager/CountTransferManager.sol index e640a335a..3959be0cb 100644 --- a/contracts/modules/TransferManager/CountTransferManager.sol +++ b/contracts/modules/TransferManager/CountTransferManager.sol @@ -24,17 +24,16 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { * @param _to Address of the receiver * @param _amount Amount to send */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256 _amount, - bytes calldata _data, - bool /* _isTransfer */ + bytes calldata _data ) external returns(Result) { - (Result success,) = executeTransfer(_from, _to, _amount, _data); + (Result success,) = verifyTransfer(_from, _to, _amount, _data); return success; } @@ -44,7 +43,7 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { * @param _to Address of the receiver * @param _amount Amount to send */ - function executeTransfer( + function verifyTransfer( address _from, address _to, uint256 _amount, @@ -52,19 +51,19 @@ contract CountTransferManager is CountTransferManagerStorage, TransferManager { ) public view - returns(Result, byte) + returns(Result, bytes32) { if (!paused) { if (maxHolderCount < ISecurityToken(securityToken).getInvestorCount()) { // Allow transfers to existing maxHolders if (ISecurityToken(securityToken).balanceOf(_to) != 0 || ISecurityToken(securityToken).balanceOf(_from) == _amount) { - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } - return (Result.INVALID, 0xA2); + return (Result.INVALID, bytes32(uint256(address(this)) << 96)); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } diff --git a/contracts/modules/TransferManager/GeneralTransferManager.sol b/contracts/modules/TransferManager/GeneralTransferManager.sol index 02730e719..4cf94bc35 100644 --- a/contracts/modules/TransferManager/GeneralTransferManager.sol +++ b/contracts/modules/TransferManager/GeneralTransferManager.sol @@ -146,14 +146,13 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage * @param _from Address of the sender * @param _to Address of the receiver */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256 _amount, - bytes calldata _data, - bool /* _isTransfer */ + bytes calldata _data ) external returns(Result) { - (Result success,) = executeTransfer(_from, _to, _amount, _data); + (Result success,) = verifyTransfer(_from, _to, _amount, _data); return success; } @@ -167,7 +166,7 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage * @param _from Address of the sender * @param _to Address of the receiver */ - function executeTransfer( + function verifyTransfer( address _from, address _to, uint256, /*_amount*/ @@ -175,7 +174,7 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage ) public view - returns(Result, byte) + returns(Result, bytes32) { Result success; if (!paused) { @@ -186,10 +185,10 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage uint8 canBuyFromSTO; if (allowAllTransfers) { //All transfers allowed, regardless of whitelist - return (Result.VALID, 0xA1); + return (Result.VALID, getAddressBytes32()); } if (allowAllBurnTransfers && (_to == address(0))) { - return (Result.VALID, 0xA1); + return (Result.VALID, getAddressBytes32()); } (fromTime, fromExpiry, canBuyFromSTO, toTime, toExpiry) = _getValuesForTransfer(_from, _to); @@ -197,22 +196,22 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage if (allowAllWhitelistTransfers) { //Anyone on the whitelist can transfer, regardless of time success = (_validExpiry(toExpiry) && _validExpiry(fromExpiry)) ? Result.VALID : Result.NA; - return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); + return (success, success == Result.VALID ? getAddressBytes32() : bytes32(0)); } // Using the local variables to avoid the stack too deep error (fromTime, toTime) = _adjustTimes(fromTime, toTime); if (_from == issuanceAddress) { // Possible STO transaction, but investor not allowed to purchased from STO if ((canBuyFromSTO == uint8(0)) && _isSTOAttached()) { - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } // if allowAllWhitelistIssuances is true, so time stamp ignored if (allowAllWhitelistIssuances) { success = _validExpiry(toExpiry) ? Result.VALID : Result.NA; - return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); + return (success, success == Result.VALID ? getAddressBytes32() : bytes32(0)); } else { success = (_validExpiry(toExpiry) && _validLockTime(toTime)) ? Result.VALID : Result.NA; - return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); + return (success, success == Result.VALID ? getAddressBytes32() : bytes32(0)); } } @@ -220,9 +219,9 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage /*solium-disable-next-line security/no-block-members*/ success = (_validExpiry(fromExpiry) && _validLockTime(fromTime) && _validExpiry(toExpiry) && _validLockTime(toTime)) ? Result.VALID : Result.NA; /*solium-disable-line security/no-block-members*/ - return (success, success == Result.VALID ? byte(0xA1) : byte(0xA0)); + return (success, success == Result.VALID ? getAddressBytes32() : bytes32(0)); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } @@ -501,4 +500,8 @@ contract GeneralTransferManager is GeneralTransferManagerStorage, TransferManage return allPermissions; } + function getAddressBytes32() public view returns(bytes32) { + return bytes32(uint256(address(this)) << 96); + } + } diff --git a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol index 649f2147b..6501fc9a6 100644 --- a/contracts/modules/TransferManager/ManualApprovalTransferManager.sol +++ b/contracts/modules/TransferManager/ManualApprovalTransferManager.sol @@ -54,23 +54,20 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, * @param _from Address of the sender * @param _to Address of the receiver * @param _amount The amount of tokens to transfer - * @param _isTransfer Whether or not this is an actual transfer or just a test to see if the tokens would be transferrable */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256 _amount, - bytes calldata _data, - bool _isTransfer + bytes calldata _data ) external + onlySecurityToken returns(Result) { - // function must only be called by the associated security token if _isTransfer == true - require(_isTransfer == false || msg.sender == securityToken, "Sender is not the owner"); - (Result success, byte esc) = executeTransfer(_from, _to, _amount, _data); - if (_isTransfer && esc == 0xA1) { + (Result success, bytes32 esc) = verifyTransfer(_from, _to, _amount, _data); + if (esc != bytes32(0)) { uint256 index = approvalIndex[_from][_to] - 1; ManualApproval storage approval = approvals[index]; approval.allowance = approval.allowance.sub(_amount); @@ -85,7 +82,7 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, * @param _to Address of the receiver * @param _amount The amount of tokens to transfer */ - function executeTransfer( + function verifyTransfer( address _from, address _to, uint256 _amount, @@ -93,16 +90,16 @@ contract ManualApprovalTransferManager is ManualApprovalTransferManagerStorage, ) public view - returns(Result, byte) + returns(Result, bytes32) { if (!paused && approvalIndex[_from][_to] != 0) { uint256 index = approvalIndex[_from][_to] - 1; ManualApproval memory approval = approvals[index]; if ((approval.expiryTime >= now) && (approval.allowance >= _amount)) { - return (Result.VALID, 0xA1); + return (Result.VALID, bytes32(uint256(address(this)) << 96)); } } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } diff --git a/contracts/modules/TransferManager/PercentageTransferManager.sol b/contracts/modules/TransferManager/PercentageTransferManager.sol index 54e31d353..8217a1b17 100644 --- a/contracts/modules/TransferManager/PercentageTransferManager.sol +++ b/contracts/modules/TransferManager/PercentageTransferManager.sol @@ -37,17 +37,16 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer * @param _to Address of the receiver * @param _amount The amount of tokens to transfer */ - function verifyTransfer( + function executeTransfer( address _from, address _to, uint256 _amount, - bytes calldata _data, - bool /* _isTransfer */ + bytes calldata _data ) external returns(Result) { - (Result success,) = executeTransfer(_from, _to, _amount, _data); + (Result success,) = verifyTransfer(_from, _to, _amount, _data); return success; } @@ -57,7 +56,7 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer * @param _to Address of the receiver * @param _amount The amount of tokens to transfer */ - function executeTransfer( + function verifyTransfer( address _from, address _to, uint256 _amount, @@ -65,23 +64,23 @@ contract PercentageTransferManager is PercentageTransferManagerStorage, Transfer ) public view - returns(Result, byte) + returns(Result, bytes32) { if (!paused) { if (_from == address(0) && allowPrimaryIssuance) { - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } // If an address is on the whitelist, it is allowed to hold more than maxHolderPercentage of the tokens. if (whitelist[_to]) { - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } uint256 newBalance = IERC20(securityToken).balanceOf(_to).add(_amount); if (newBalance.mul(uint256(10) ** 18).div(IERC20(securityToken).totalSupply()) > maxHolderPercentage) { - return (Result.INVALID, 0xA4); + return (Result.INVALID, bytes32(uint256(address(this)) << 96)); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } - return (Result.NA, 0xA0); + return (Result.NA, bytes32(0)); } /** diff --git a/contracts/modules/TransferManager/TransferManager.sol b/contracts/modules/TransferManager/TransferManager.sol index 8ed706488..bcf96e206 100644 --- a/contracts/modules/TransferManager/TransferManager.sol +++ b/contracts/modules/TransferManager/TransferManager.sol @@ -11,6 +11,11 @@ contract TransferManager is ITransferManager, Module, Pausable { bytes32 public constant LOCKED = "LOCKED"; bytes32 public constant UNLOCKED = "UNLOCKED"; + + modifier onlySecurityToken() { + require(msg.sender == securityToken, "Sender is not owner"); + _; + } function unpause() public onlyOwner { super._unpause(); diff --git a/contracts/modules/TransferManager/VolumeRestrictionTM.sol b/contracts/modules/TransferManager/VolumeRestrictionTM.sol index 6bbfde624..c57cc4929 100644 --- a/contracts/modules/TransferManager/VolumeRestrictionTM.sol +++ b/contracts/modules/TransferManager/VolumeRestrictionTM.sol @@ -107,19 +107,16 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { * whose volume of tokens will voilate the maximum volume transfer restriction * @param _from Address of the sender * @param _amount The amount of tokens to transfer - * @param _isTransfer Whether or not this is an actual transfer or just a test to see if the tokens would be transferrable */ - function verifyTransfer(address _from, address /*_to */, uint256 _amount, bytes calldata /*_data*/, bool _isTransfer) external returns (Result success) { - // Function must only be called by the associated security token if _isTransfer == true - require(msg.sender == securityToken || !_isTransfer); + function executeTransfer(address _from, address /*_to */, uint256 _amount, bytes calldata /*_data*/) external onlySecurityToken returns (Result success) { uint256 fromTimestamp; uint256 sumOfLastPeriod; uint256 daysCovered; uint256 dailyTime; uint256 endTime; bool isGlobal; - (success, fromTimestamp, sumOfLastPeriod, daysCovered, dailyTime, endTime, isGlobal) = _executeTransfer(_from, _amount); - if (_isTransfer && (fromTimestamp != 0 || dailyTime != 0)) { + (success, fromTimestamp, sumOfLastPeriod, daysCovered, dailyTime, endTime, isGlobal) = _verifyTransfer(_from, _amount); + if (fromTimestamp != 0 || dailyTime != 0) { _updateStorage( _from, _amount, @@ -140,7 +137,7 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { * @param _from Address of the sender * @param _amount The amount of tokens to transfer */ - function executeTransfer( + function verifyTransfer( address _from, address /*_to*/ , uint256 _amount, @@ -148,13 +145,13 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { ) public view - returns (Result, byte) + returns (Result, bytes32) { - (Result success,,,,,,) = _executeTransfer(_from, _amount); + (Result success,,,,,,) = _verifyTransfer(_from, _amount); if (success == Result.INVALID) - return (success, 0xA5); - return (Result.NA, 0xA0); + return (success, bytes32(uint256(address(this)) << 96)); + return (Result.NA, bytes32(0)); } /** @@ -163,7 +160,7 @@ contract VolumeRestrictionTM is VolumeRestrictionTMStorage, TransferManager { * @param _from Address of the sender * @param _amount The amount of tokens to transfer */ - function _executeTransfer( + function _verifyTransfer( address _from, uint256 _amount ) diff --git a/contracts/tokens/SecurityToken.sol b/contracts/tokens/SecurityToken.sol index 14aaaec66..f9ebc9eea 100644 --- a/contracts/tokens/SecurityToken.sol +++ b/contracts/tokens/SecurityToken.sol @@ -398,7 +398,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi // - to avoid the situation where a transfer manager transfers tokens, and this function is called recursively, //the function is marked as nonReentrant. This means that no TM can transfer (or mint / burn) tokens. _adjustInvestorCount(_from, _to, _value); - bool verified = _verifyTransfer(_from, _to, _value, _data, true); + bool verified = _executeTransfer(_from, _to, _value, _data); _adjustBalanceCheckpoints(_from); _adjustBalanceCheckpoints(_to); return verified; @@ -407,23 +407,18 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi /** * @notice Validate transfer with TransferManager module if it exists * @dev TransferManager module has a key of 2 - * @dev _isTransfer boolean flag is the deciding factor for whether the - * state variables gets modified or not within the different modules. i.e isTransfer = true - * leads to change in the modules environment otherwise _verifyTransfer() works as a read-only * function (no change in the state). * @param _from sender of transfer * @param _to receiver of transfer * @param _value value of transfer * @param _data data to indicate validation - * @param _isTransfer whether transfer is being executed * @return bool */ - function _verifyTransfer( + function _executeTransfer( address _from, address _to, uint256 _value, - bytes memory _data, - bool _isTransfer + bytes memory _data ) internal checkGranularity(_value) @@ -439,7 +434,7 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi module = modules[TRANSFER_KEY][i]; if (!modulesToData[module].isArchived) { unarchived = true; - ITransferManager.Result valid = ITransferManager(module).verifyTransfer(_from, _to, _value, _data, _isTransfer); + ITransferManager.Result valid = ITransferManager(module).executeTransfer(_from, _to, _value, _data); if (valid == ITransferManager.Result.INVALID) { isInvalid = true; } else if (valid == ITransferManager.Result.VALID) { @@ -634,15 +629,14 @@ contract SecurityToken is ERC20, ERC20Detailed, Ownable, ReentrancyGuard, Securi } function _canTransfer(address _from, address _to, uint256 _value, bytes memory _data) internal view returns (bool, byte, bytes32) { - byte reasonCode; + bytes32 appCode; bool success; if (_value % granularity != 0) { - reasonCode = 0xA8; - return (false, 0x50, bytes32(reasonCode)); + return (false, 0x50, "Invalid granularity"); } - (success, reasonCode) = TokenLib.verifyTransfer(modules[TRANSFER_KEY], modulesToData, _from, _to, _value, _data, transfersFrozen); + (success, appCode) = TokenLib.verifyTransfer(modules[TRANSFER_KEY], modulesToData, _from, _to, _value, _data, transfersFrozen); if (!success) - return (false, 0x50, bytes32(reasonCode)); + return (false, 0x50, appCode); else if (balanceOf(_from) < _value) return (false, 0x52, bytes32(0)); From 2d0b3870e503b38e97e8e65041009eb2875ca182 Mon Sep 17 00:00:00 2001 From: satyam Date: Wed, 13 Feb 2019 15:20:38 +0530 Subject: [PATCH 16/16] fix tests --- test/j_manual_approval_transfer_manager.js | 8 +++----- test/y_volume_restriction_tm.js | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/test/j_manual_approval_transfer_manager.js b/test/j_manual_approval_transfer_manager.js index 0d95a3b75..46bf14435 100644 --- a/test/j_manual_approval_transfer_manager.js +++ b/test/j_manual_approval_transfer_manager.js @@ -271,15 +271,14 @@ contract("ManualApprovalTransferManager", accounts => { ); I_ManualApprovalTransferManager = await ManualApprovalTransferManager.at(tx.logs[2].args._module); }); - //function verifyTransfer(address _from, address _to, uint256 _amount, bool _isTransfer) public returns(Result) { - it("Cannot call verifyTransfer on the TM directly if _isTransfer == true", async () => { + + it("Cannot call executeTransfer on the TM directly", async () => { await catchRevert( - I_ManualApprovalTransferManager.verifyTransfer( + I_ManualApprovalTransferManager.executeTransfer( account_investor4, account_investor4, web3.utils.toWei("2", "ether"), "0x0", - true, { from: token_owner } ) ); @@ -291,7 +290,6 @@ contract("ManualApprovalTransferManager", accounts => { account_investor4, web3.utils.toWei("2", "ether"), "0x0", - false, { from: token_owner } ); }); diff --git a/test/y_volume_restriction_tm.js b/test/y_volume_restriction_tm.js index 0164e2bf1..ca8ead2cc 100644 --- a/test/y_volume_restriction_tm.js +++ b/test/y_volume_restriction_tm.js @@ -687,8 +687,8 @@ contract('VolumeRestrictionTransferManager', accounts => { it("Should succesfully transact the tokens by investor 1 just after the startTime", async() => { // Check the transfer will be valid or not by calling the verifyTransfer() directly by using _isTransfer = false - let result = await I_VolumeRestrictionTM.verifyTransfer.call(account_investor1, account_investor3, new BN(web3.utils.toWei('.3', "ether")), "0x0", false); - assert.equal(result.toString(), 1); + let result = await I_VolumeRestrictionTM.verifyTransfer.call(account_investor1, account_investor3, new BN(web3.utils.toWei('.3', "ether")), "0x0"); + assert.equal(result[0].toString(), 1); // Perform the transaction console.log(` Gas estimation (Individual): ${await I_SecurityToken.transfer.estimateGas(account_investor3, new BN(web3.utils.toWei('.3', "ether")), {from: account_investor1})}`