From 61c8735317cf16f58a8cf8e476aada7d5e30edbd Mon Sep 17 00:00:00 2001 From: Leo Arias Date: Fri, 1 Jun 2018 07:39:03 +0000 Subject: [PATCH 1/2] tests: add and follow the solium rules --- .soliumignore | 1 + .soliumrc.json | 15 ++ .travis.yml | 28 ++- contracts/Kernel.sol | 46 +++- contracts/Migrations.sol | 14 +- contracts/Release.sol | 5 +- contracts/Vouching.sol | 40 +++- contracts/ZepToken.sol | 19 +- contracts/test/MockKernelV2.sol | 14 +- contracts/test/PickACard.sol | 7 +- contracts/test/stdlib/ERC721Basic.sol | 30 ++- contracts/test/stdlib/ERC721BasicToken.sol | 65 +++++- contracts/test/stdlib/ERC721Receiver.sol | 13 +- contracts/test/stdlib/ERC721Token.sol | 1 + package-lock.json | 235 +++++++++++++++++++++ package.json | 5 +- 16 files changed, 481 insertions(+), 57 deletions(-) create mode 100644 .soliumignore create mode 100644 .soliumrc.json diff --git a/.soliumignore b/.soliumignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.soliumignore @@ -0,0 +1 @@ +node_modules diff --git a/.soliumrc.json b/.soliumrc.json new file mode 100644 index 0000000..2acda55 --- /dev/null +++ b/.soliumrc.json @@ -0,0 +1,15 @@ +{ + "extends": "solium:all", + "plugins": ["security"], + "rules": { + "quotes": ["error", "double"], + "no-empty-blocks": "off", + "indentation": ["error", 2], + "max-len": ["error", 79], + "no-constant": ["error"], + "security/enforce-explicit-visibility": ["error"], + "security/no-block-members": ["warning"], + "security/no-inline-assembly": ["warning"], + "arg-overflow": ["off"] + } +} diff --git a/.travis.yml b/.travis.yml index 9f987b9..579ffe2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,32 @@ language: node_js + node_js: - '8' + cache: directories: - node_modules -env: - - - - SOLIDITY_COVERAGE=true -matrix: + +jobs: + # XXX fast_finish doesn't work with stages yet. See + # https://github.com/travis-ci/travis-ci/issues/8425 + # --elopio - 20180531 fast_finish: true allow_failures: - - env: SOLIDITY_COVERAGE=true -script: - - npm test + - env: SOLIDITY_COVERAGE=true + include: + # Run the unit test suite three times in parallel. + # The first one gets results faster and is the only one required to pass. + # The second one generates the coverage report. + - stage: unit + script: npm test + - stage: unit + script: npm run test + env: SOLIDITY_COVERAGE=true + # solidity style tests. + - stage: static + script: npm run lint:sol + notifications: slack: rooms: diff --git a/contracts/Kernel.sol b/contracts/Kernel.sol index 05be3d1..ed5191d 100644 --- a/contracts/Kernel.sol +++ b/contracts/Kernel.sol @@ -7,6 +7,7 @@ import "zeppelin-solidity/contracts/math/SafeMath.sol"; import "zos-lib/contracts/migrations/Migratable.sol"; import "zos-lib/contracts/upgradeability/UpgradeabilityProxyFactory.sol"; + /** * @title Kernel * @dev Controls the standard library releases for ZeppelinOS @@ -55,7 +56,10 @@ contract Kernel is Migratable { uint256 _developerFraction, ZepToken _token, Vouching _vouches - ) public isInitializer("Kernel", "0") { + ) + public + isInitializer("Kernel", "0") + { vouches = _vouches; token = _token; developerFraction = _developerFraction; @@ -71,7 +75,7 @@ contract Kernel is Migratable { require(release.frozen()); releases[release] = true; emit ReleaseRegistered(release); - + require(token.transferFrom(msg.sender, this, newVersionCost)); token.burn(newVersionCost); } @@ -90,7 +94,14 @@ contract Kernel is Migratable { * @param amount the amount being vouched * @param data additional information for complex vouching models */ - function vouch(Release release, uint256 amount, bytes data) public whenRegistered(release) { + function vouch( + Release release, + uint256 amount, + bytes data + ) + public + whenRegistered(release) + { require(token.transferFrom(msg.sender, this, amount)); _payoutAndVouch(msg.sender, release, amount, data); } @@ -101,7 +112,14 @@ contract Kernel is Migratable { * @param amount the amount being unvouched * @param data additional information for complex vouching models */ - function unvouch(Release release, uint256 amount, bytes data) public whenRegistered(release) { + function unvouch( + Release release, + uint256 amount, + bytes data + ) + public + whenRegistered(release) + { vouches.unvouch(msg.sender, release, amount, data); require(token.transfer(msg.sender, amount)); } @@ -113,7 +131,16 @@ contract Kernel is Migratable { * @param amount the amount of vouches being transferred * @param data additional information for complex vouching models */ - function transferVouch(Release from, Release to, uint256 amount, bytes data) public whenRegistered(from) whenRegistered(to) { + function transferVouch( + Release from, + Release to, + uint256 amount, + bytes data + ) + public + whenRegistered(from) + whenRegistered(to) + { vouches.unvouch(msg.sender, from, amount, data); _payoutAndVouch(msg.sender, to, amount, data); } @@ -125,7 +152,14 @@ contract Kernel is Migratable { * @param amount the amount being vouched * @param data additional information for complex vouching models */ - function _payoutAndVouch(address voucher, Release release, uint256 amount, bytes data) internal { + function _payoutAndVouch( + address voucher, + Release release, + uint256 amount, + bytes data + ) + internal + { uint256 developerPayout = amount.div(developerFraction); require(developerPayout > 0); diff --git a/contracts/Migrations.sol b/contracts/Migrations.sol index 27598ad..218efd6 100644 --- a/contracts/Migrations.sol +++ b/contracts/Migrations.sol @@ -1,11 +1,13 @@ pragma solidity ^0.4.21; + contract Migrations { address public owner; - uint public last_completed_migration; + uint public lastCompletedMigration; modifier restricted() { - if (msg.sender == owner) _; + if (msg.sender == owner) + _; } function Migrations() public { @@ -13,11 +15,11 @@ contract Migrations { } function setCompleted(uint completed) public restricted { - last_completed_migration = completed; + lastCompletedMigration = completed; } - function upgrade(address new_address) public restricted { - Migrations upgraded = Migrations(new_address); - upgraded.setCompleted(last_completed_migration); + function upgrade(address newAddress) public restricted { + Migrations upgraded = Migrations(newAddress); + upgraded.setCompleted(lastCompletedMigration); } } diff --git a/contracts/Release.sol b/contracts/Release.sol index 0a21218..4451ba5 100644 --- a/contracts/Release.sol +++ b/contracts/Release.sol @@ -1,7 +1,8 @@ pragma solidity ^0.4.21; - +// solium-disable-next-line max-len import "zos-lib/contracts/application/versioning/FreezableContractDirectory.sol"; + /** * @title Release * @dev This contract represents a particular stdlib version from a developer @@ -11,7 +12,7 @@ contract Release is FreezableContractDirectory { // Developer address to which staking payouts will be sent, owner of the contract directory address public developer; - + /** * @dev Constructor function that sets the developer of this release */ diff --git a/contracts/Vouching.sol b/contracts/Vouching.sol index 8ec43cf..a8419e8 100644 --- a/contracts/Vouching.sol +++ b/contracts/Vouching.sol @@ -20,7 +20,13 @@ contract Vouching is Migratable, Ownable { * @param total the new total amount vouched * @param data additional information for complex vouching models */ - event Vouched(address indexed voucher, address release, uint256 amount, uint256 total, bytes data); + event Vouched( + address indexed voucher, + address release, + uint256 amount, + uint256 total, + bytes data + ); /** * @dev Event signaling an unvouching @@ -30,7 +36,13 @@ contract Vouching is Migratable, Ownable { * @param total the new total amount vouched * @param data additional information for complex vouching models */ - event Unvouched(address indexed voucher, address release, uint256 amount, uint256 total, bytes data); + event Unvouched( + address indexed voucher, + address release, + uint256 amount, + uint256 total, + bytes data + ); // Total amount of vouched tokens uint256 private _totalVouched; @@ -72,7 +84,9 @@ contract Vouching is Migratable, Ownable { * @param release the stdlib release * @return the total vouched amount by the voucher for the given release */ - function vouchedFor(address voucher, address release) public view returns (uint256) { + function vouchedFor(address voucher, address release) + public view returns (uint256) + { return _vouches[voucher][release]; } @@ -83,7 +97,15 @@ contract Vouching is Migratable, Ownable { * @param amount the amount being vouched * @param data additional information for complex vouching models */ - function vouch(address voucher, address release, uint256 amount, bytes data) public onlyOwner { + function vouch( + address voucher, + address release, + uint256 amount, + bytes data + ) + public + onlyOwner + { _totalVouched = _totalVouched.add(amount); _releaseVouches[release] = _releaseVouches[release].add(amount); _vouches[voucher][release] = _vouches[voucher][release].add(amount); @@ -98,7 +120,15 @@ contract Vouching is Migratable, Ownable { * @param amount the amount being unvouched * @param data additional information for complex vouching models */ - function unvouch(address voucher, address release, uint256 amount, bytes data) public onlyOwner { + function unvouch( + address voucher, + address release, + uint256 amount, + bytes data + ) + public + onlyOwner + { uint256 currentVouch = _vouches[voucher][release]; require(currentVouch >= amount); diff --git a/contracts/ZepToken.sol b/contracts/ZepToken.sol index 9554253..d6fe4c1 100644 --- a/contracts/ZepToken.sol +++ b/contracts/ZepToken.sol @@ -1,19 +1,28 @@ pragma solidity ^0.4.21; -import 'zos-lib/contracts/migrations/Migratable.sol'; -import 'zeppelin-solidity/contracts/token/ERC20/PausableToken.sol'; -import 'zeppelin-solidity/contracts/token/ERC20/MintableToken.sol'; -import 'zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol'; -import 'zeppelin-solidity/contracts/token/ERC20/StandardToken.sol'; +import "zos-lib/contracts/migrations/Migratable.sol"; +import "zeppelin-solidity/contracts/token/ERC20/PausableToken.sol"; +import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol"; +import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol"; +import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; + /** * @title ZepToken * @dev ZEP token contract including mintable, pausable and burnable functionalities */ +// XXX There doesn't seem to be a way to split this line that keeps solium +// happy. See: +// https://github.com/duaraghav8/Solium/issues/205 +// --elopio - 2018-05-31 +// solium-disable-next-line max-len contract ZepToken is Migratable, StandardToken, MintableToken, PausableToken, BurnableToken { + // solium-disable-next-line uppercase string public constant name = "Zep Token"; + // solium-disable-next-line uppercase string public constant symbol = "ZEP"; + // solium-disable-next-line uppercase uint8 public constant decimals = 18; /** diff --git a/contracts/test/MockKernelV2.sol b/contracts/test/MockKernelV2.sol index 295dee5..564dfc1 100644 --- a/contracts/test/MockKernelV2.sol +++ b/contracts/test/MockKernelV2.sol @@ -2,17 +2,25 @@ pragma solidity ^0.4.18; import "../Kernel.sol"; + contract MockKernelV2 is Kernel { function testV2() public pure returns (string) { return "v2"; } - + // Duplicate developer payout, because reasons - function _payoutAndVouch(address voucher, Release release, uint256 amount, bytes data) internal { + function _payoutAndVouch( + address voucher, + Release release, + uint256 amount, + bytes data + ) + internal + { uint256 developerPayout = amount.mul(2).div(developerFraction); require(developerPayout > 0); - + uint256 vouchedAmount = amount.sub(developerPayout); vouches.vouch(voucher, release, vouchedAmount, data); require(token.transfer(release.developer(), developerPayout)); diff --git a/contracts/test/PickACard.sol b/contracts/test/PickACard.sol index ea1c2f2..6389b7a 100644 --- a/contracts/test/PickACard.sol +++ b/contracts/test/PickACard.sol @@ -3,15 +3,18 @@ pragma solidity ^0.4.21; import "./stdlib/ERC721Token.sol"; import "zos-lib/contracts/migrations/Migratable.sol"; + contract PickACard is Migratable { uint256 public constant MAX_CARD = 10; ERC721Token public erc721; - function initialize(ERC721Token _erc721) public isInitializer("PickACard", "0") { + function initialize(ERC721Token _erc721) + public isInitializer("PickACard", "0") + { erc721 = _erc721; erc721.initialize(); - for(uint256 i = 0; i <= MAX_CARD; i++) { + for (uint256 i = 0; i <= MAX_CARD; i++) { erc721.mint(this, i); } } diff --git a/contracts/test/stdlib/ERC721Basic.sol b/contracts/test/stdlib/ERC721Basic.sol index ee5b765..1bd050a 100644 --- a/contracts/test/stdlib/ERC721Basic.sol +++ b/contracts/test/stdlib/ERC721Basic.sol @@ -1,25 +1,39 @@ pragma solidity ^0.4.21; + /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic { - event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); - event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId); - event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + event Transfer( + address indexed _from, address indexed _to, uint256 _tokenId + ); + event Approval( + address indexed _owner, address indexed _approved, uint256 _tokenId + ); + event ApprovalForAll( + address indexed _owner, address indexed _operator, bool _approved + ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); function approve(address _to, uint256 _tokenId) public; - function getApproved(uint256 _tokenId) public view returns (address _operator); - + function getApproved(uint256 _tokenId) + public view returns (address _operator); + function setApprovalForAll(address _operator, bool _approved) public; - function isApprovedForAll(address _owner, address _operator) public view returns (bool); + function isApprovedForAll(address _owner, address _operator) + public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; - function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; - function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public; + function safeTransferFrom(address _from, address _to, uint256 _tokenId) + public; + + function safeTransferFrom( + address _from, address _to, uint256 _tokenId, bytes _data + ) + public; } diff --git a/contracts/test/stdlib/ERC721BasicToken.sol b/contracts/test/stdlib/ERC721BasicToken.sol index cb66dd3..45ed212 100644 --- a/contracts/test/stdlib/ERC721BasicToken.sol +++ b/contracts/test/stdlib/ERC721BasicToken.sol @@ -5,6 +5,7 @@ import "./ERC721Receiver.sol"; import "zeppelin-solidity/contracts/math/SafeMath.sol"; import "zeppelin-solidity/contracts/AddressUtils.sol"; + /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md @@ -106,7 +107,6 @@ contract ERC721BasicToken is ERC721Basic { return tokenApprovals[_tokenId]; } - /** * @dev Sets or unsets the approval of a given operator * @dev An operator is allowed to transfer all tokens of the sender on their behalf @@ -125,7 +125,9 @@ contract ERC721BasicToken is ERC721Basic { * @param _operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ - function isApprovedForAll(address _owner, address _operator) public view returns (bool) { + function isApprovedForAll(address _owner, address _operator) + public view returns (bool) + { return operatorApprovals[_owner][_operator]; } @@ -137,7 +139,14 @@ contract ERC721BasicToken is ERC721Basic { * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ - function transferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) { + function transferFrom( + address _from, + address _to, + uint256 _tokenId + ) + public + canTransfer(_tokenId) + { require(_from != address(0)); require(_to != address(0)); @@ -159,7 +168,14 @@ contract ERC721BasicToken is ERC721Basic { * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ - function safeTransferFrom(address _from, address _to, uint256 _tokenId) public canTransfer(_tokenId) { + function safeTransferFrom( + address _from, + address _to, + uint256 _tokenId + ) + public + canTransfer(_tokenId) + { safeTransferFrom(_from, _to, _tokenId, ""); } @@ -175,7 +191,15 @@ contract ERC721BasicToken is ERC721Basic { * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ - function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public canTransfer(_tokenId) { + function safeTransferFrom( + address _from, + address _to, + uint256 _tokenId, + bytes _data + ) + public + canTransfer(_tokenId) + { transferFrom(_from, _to, _tokenId); require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data)); } @@ -187,9 +211,23 @@ contract ERC721BasicToken is ERC721Basic { * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ - function isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) { + function isApprovedOrOwner( + address _spender, + uint256 _tokenId + ) + internal + view + returns (bool) + { address owner = ownerOf(_tokenId); - return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender); + // Disable solium check because of + // https://github.com/duaraghav8/Solium/issues/175 + // solium-disable-next-line operator-whitespace + return ( + _spender == owner || + getApproved(_tokenId) == _spender || + isApprovedForAll(owner, _spender) + ); } /** @@ -260,11 +298,20 @@ contract ERC721BasicToken is ERC721Basic { * @param _data bytes optional data to send along with the call * @return whether the call correctly returned the expected magic value */ - function checkAndCallSafeTransfer(address _from, address _to, uint256 _tokenId, bytes _data) internal returns (bool) { + function checkAndCallSafeTransfer( + address _from, + address _to, + uint256 _tokenId, + bytes _data + ) + internal + returns (bool) + { if (!_to.isContract()) { return true; } - bytes4 retval = ERC721Receiver(_to).onERC721Received(_from, _tokenId, _data); + bytes4 retval = ERC721Receiver(_to).onERC721Received( + _from, _tokenId, _data); return (retval == ERC721_RECEIVED); } } diff --git a/contracts/test/stdlib/ERC721Receiver.sol b/contracts/test/stdlib/ERC721Receiver.sol index 892ee7e..163ab49 100644 --- a/contracts/test/stdlib/ERC721Receiver.sol +++ b/contracts/test/stdlib/ERC721Receiver.sol @@ -1,5 +1,6 @@ pragma solidity ^0.4.21; + /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers @@ -11,7 +12,7 @@ contract ERC721Receiver { * Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ - bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba; + bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba; /** * @notice Handle the receipt of an NFT @@ -20,10 +21,16 @@ contract ERC721Receiver { * transfer. This function MUST use 50,000 gas or less. Return of other * than the magic value MUST result in the transaction being reverted. * Note: the contract address is always the message sender. - * @param _from The sending address + * @param _from The sending address * @param _tokenId The NFT identifier which is being transfered * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))` */ - function onERC721Received(address _from, uint256 _tokenId, bytes _data) public returns(bytes4); + function onERC721Received( + address _from, + uint256 _tokenId, + bytes _data + ) + public + returns(bytes4); } diff --git a/contracts/test/stdlib/ERC721Token.sol b/contracts/test/stdlib/ERC721Token.sol index d9fb8f9..2770f0b 100644 --- a/contracts/test/stdlib/ERC721Token.sol +++ b/contracts/test/stdlib/ERC721Token.sol @@ -3,6 +3,7 @@ pragma solidity ^0.4.21; import "./ERC721BasicToken.sol"; import "zeppelin-solidity/contracts/ownership/Ownable.sol"; + contract ERC721Token is ERC721BasicToken, Ownable { bool private _initialized = false; diff --git a/package-lock.json b/package-lock.json index 8ba4cd5..9b078c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4776,6 +4776,12 @@ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.5.tgz", "integrity": "sha1-uvDA6MVK1ZA0R9+Wreekobynmko=" }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "dev": true + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -7356,6 +7362,12 @@ } } }, + "sol-digger": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/sol-digger/-/sol-digger-0.0.2.tgz", + "integrity": "sha1-QGxKnTHiaef4jrHC6hATGOXgkCU=", + "dev": true + }, "sol-explore": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.2.tgz", @@ -7519,6 +7531,229 @@ } } }, + "solium": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/solium/-/solium-1.1.7.tgz", + "integrity": "sha512-yYbalsrzJCU+QJ0HZvxAT4IQIqI1e6KPW2vop0NaHwdijqhQC9fJkVioCrL18NbO2Z8rdcnx8Y0JpvYJWrIjRg==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "chokidar": "1.7.0", + "colors": "1.2.1", + "commander": "2.9.0", + "js-string-escape": "1.0.1", + "lodash": "4.17.5", + "sol-digger": "0.0.2", + "sol-explore": "1.6.1", + "solium-plugin-security": "0.1.1", + "solparse": "2.2.5", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + } + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "sol-explore": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sol-explore/-/sol-explore-1.6.1.tgz", + "integrity": "sha1-tZ8HPGn+MyVg1aEMMrqMp/KYbPs=", + "dev": true + }, + "solparse": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/solparse/-/solparse-2.2.5.tgz", + "integrity": "sha512-t7tvtR6KU6QfPYLMv1nlCh9DA8HYIu5tbjHpKu0fhGFZ1NuSp0KKDHfFHv07g6v1xgcuUY3rVqNFjZt5b9+5qA==", + "dev": true, + "requires": { + "mocha": "4.1.0", + "pegjs": "0.10.0", + "yargs": "10.1.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "solium-plugin-security": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/solium-plugin-security/-/solium-plugin-security-0.1.1.tgz", + "integrity": "sha512-kpLirBwIq4mhxk0Y/nn5cQ6qdJTI+U1LO3gpoNIcqNaW+sI058moXBe2UiHs+9wvF9IzYD49jcKhFTxcR9u9SQ==", + "dev": true + }, "sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", diff --git a/package.json b/package.json index fbee288..eccf81a 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ "test": "scripts/test.sh", "prepack": "truffle compile && babel src --out-dir lib", "deploy-local": "truffle exec scripts/deploy.js --network local", - "createapp-local": "truffle exec scripts/createapp.js --network local" + "createapp-local": "truffle exec scripts/createapp.js --network local", + "lint:sol": "solium -d .", + "lint:sol:fix": "solium -d . --fix" }, "devDependencies": { "babel-cli": "^6.26.0", @@ -36,6 +38,7 @@ "coveralls": "^3.0.0", "ethereumjs-abi": "^0.6.5", "solidity-coverage": "^0.4.15", + "solium": "^1.1.7", "truffle": "^4.1.6", "zos": "^0.3.16" }, From d0f502b92690e33b374af014f594d8504fd8d6b1 Mon Sep 17 00:00:00 2001 From: Leo Arias Date: Fri, 1 Jun 2018 07:54:37 +0000 Subject: [PATCH 2/2] tests: add and follow most of the eslint rules --- .eslintrc | 51 +++ package-lock.json | 697 +++++++++++++++++++++++++++++++++ package.json | 12 +- src/index.js | 18 +- src/kernel/KernelDeployer.js | 94 ++--- src/kernel/KernelProvider.js | 36 +- src/kernel/KernelWrapper.js | 147 +++---- src/release/ReleaseDeployer.js | 80 ++-- src/release/ReleaseWrapper.js | 32 +- src/utils/ContractsProvider.js | 14 +- 10 files changed, 970 insertions(+), 211 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..fc6b174 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,51 @@ +{ + "extends" : [ + "standard", + "plugin:promise/recommended", + ], + "plugins": [ + "promise" + ], + "env": { + "browser" : true, + "node" : true, + "mocha" : true, + "jest" : true + }, + "globals" : { + "artifacts": false, + "contract": false, + "assert": false, + "web3": false + }, + "rules": { + + // Strict mode + "strict": [2, "global"], + + // Code style + "indent": [2, 2], + "quotes": [2, "single"], + "semi": ["error", "always"], + "space-before-function-paren": ["error", "always"], + "no-use-before-define": 0, + "eqeqeq": [2, "smart"], + "dot-notation": [2, {"allowKeywords": true, "allowPattern": ""}], + "no-redeclare": [2, {"builtinGlobals": true}], + "no-trailing-spaces": [2, { "skipBlankLines": true }], + "eol-last": 1, + "comma-spacing": [2, {"before": false, "after": true}], + "camelcase": [2, {"properties": "always"}], + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "comma-dangle": [1, "always-multiline"], + "no-dupe-args": 2, + "no-dupe-keys": 2, + "no-debugger": 0, + "no-undef": 2, + "object-curly-spacing": [2, "always"], + "max-len": [2, 120, 2], + "generator-star-spacing": ["error", "before"], + "promise/avoid-new": 0, + "promise/always-return": 0 + } +} diff --git a/package-lock.json b/package-lock.json index 9b078c4..7572a01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,6 +55,23 @@ "acorn": "2.7.0" } }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, "adm-zip": { "version": "0.4.9", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.9.tgz", @@ -72,6 +89,12 @@ "json-schema-traverse": "0.3.1" } }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", @@ -1396,6 +1419,21 @@ } } }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", @@ -1528,6 +1566,12 @@ "safe-buffer": "5.1.1" } }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -1699,6 +1743,24 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -2059,6 +2121,15 @@ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", "dev": true }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", @@ -2344,12 +2415,423 @@ } } }, + "eslint": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.5.0", + "ignore": "3.3.8", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.11.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "regexpp": "1.1.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "eslint-config-standard": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0.tgz", + "integrity": "sha512-oDdENzpViEe5fwuRCWla7AXQd++/oyIp8zP+iP9jiUPG6NBj3SHgdgtl/kTn00AjeN+1HNvavTKmYbMo+xMOlw==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.7.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "2.6.8", + "pkg-dir": "1.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.12.0.tgz", + "integrity": "sha1-2tMXgSktZmSyUxf9BJ0uKy8CIF0=", + "dev": true, + "requires": { + "contains-path": "0.1.0", + "debug": "2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.2.0", + "has": "1.0.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0", + "resolve": "1.7.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz", + "integrity": "sha512-Q/Cc2sW1OAISDS+Ji6lZS2KV4b7ueA/WydVWd1BECTQwVvfQy5JAi3glhINoKzoMnfnuRgNP+ZWKrGAbp3QDxw==", + "dev": true, + "requires": { + "ignore": "3.3.8", + "minimatch": "3.0.4", + "resolve": "1.7.0", + "semver": "5.5.0" + } + }, + "eslint-plugin-promise": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", + "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", + "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "5.6.0", + "acorn-jsx": "3.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.0.tgz", + "integrity": "sha512-QatFQ4C0n+PLqemyC6zXEv04tSqRR0hRqe+uGKPEVgKe2G8kl8wJvHzRYWwz6vqqEqt6idPVMFojZ4P1zlyAzQ==", + "dev": true + } + } + }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, "estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", @@ -2904,6 +3386,16 @@ "escape-string-regexp": "1.0.5" } }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -2971,6 +3463,18 @@ "readable-stream": "2.3.6" } }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, "flow-parser": { "version": "0.69.0", "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.69.0.tgz", @@ -3605,6 +4109,18 @@ } } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "ganache-cli": { "version": "6.1.0-beta.4", "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.1.0-beta.4.tgz", @@ -3986,6 +4502,15 @@ "har-schema": "2.0.0" } }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -4239,6 +4764,12 @@ "safer-buffer": "2.1.2" } }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "dev": true + }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", @@ -4596,6 +5127,12 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", @@ -4919,6 +5456,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5754,6 +6297,12 @@ "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -6338,6 +6887,12 @@ } } }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6386,6 +6941,12 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, "promisify-node": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz", @@ -6724,6 +7285,12 @@ "is-equal-shallow": "0.1.3" } }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "regexpu-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", @@ -6893,6 +7460,24 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, "reselect": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", @@ -7933,6 +8518,12 @@ "is-hex-prefixed": "1.0.0" } }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", @@ -7955,6 +8546,97 @@ "dev": true, "optional": true }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.4.1", + "lodash": "4.17.5", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, "taffydb": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", @@ -8663,6 +9345,12 @@ "mime-types": "2.1.18" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -9297,6 +9985,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, "write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", diff --git a/package.json b/package.json index eccf81a..7ae54d9 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,11 @@ "deploy-local": "truffle exec scripts/deploy.js --network local", "createapp-local": "truffle exec scripts/createapp.js --network local", "lint:sol": "solium -d .", - "lint:sol:fix": "solium -d . --fix" + "lint:sol:fix": "solium -d . --fix", + "lint:js": "eslint src", + "lint:js:fix": "eslint src --fix", + "lint": "npm run lint:sol && npm run lint:js", + "lint:fix": "npm run lint:sol:fix && npm run lint:js:fix" }, "devDependencies": { "babel-cli": "^6.26.0", @@ -36,6 +40,12 @@ "chai-as-promised": "^7.1.1", "chai-bignumber": "^2.0.2", "coveralls": "^3.0.0", + "eslint": "^4.19.1", + "eslint-config-standard": "^11.0.0", + "eslint-plugin-import": "^2.12.0", + "eslint-plugin-node": "^6.0.1", + "eslint-plugin-promise": "^3.8.0", + "eslint-plugin-standard": "^3.1.0", "ethereumjs-abi": "^0.6.5", "solidity-coverage": "^0.4.15", "solium": "^1.1.7", diff --git a/src/index.js b/src/index.js index 4035ca5..e61ba1f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,14 +1,14 @@ -// module information -const version = 'v' + require('../package.json').version - // release -import ReleaseWrapper from './release/ReleaseWrapper' -import ReleaseDeployer from './release/ReleaseDeployer' +import ReleaseWrapper from './release/ReleaseWrapper'; +import ReleaseDeployer from './release/ReleaseDeployer'; // kernel -import KernelWrapper from './kernel/KernelWrapper' -import KernelDeployer from './kernel/KernelDeployer' -import KernelProvider from './kernel/KernelProvider' +import KernelWrapper from './kernel/KernelWrapper'; +import KernelDeployer from './kernel/KernelDeployer'; +import KernelProvider from './kernel/KernelProvider'; + +// module information +const version = 'v' + require('../package.json').version; export { version, @@ -17,4 +17,4 @@ export { KernelWrapper, KernelDeployer, KernelProvider, -} +}; diff --git a/src/kernel/KernelDeployer.js b/src/kernel/KernelDeployer.js index e713293..138a658 100644 --- a/src/kernel/KernelDeployer.js +++ b/src/kernel/KernelDeployer.js @@ -1,75 +1,75 @@ -import KernelWrapper from './KernelWrapper' -import { AppManagerDeployer, Logger } from 'zos-lib' +import KernelWrapper from './KernelWrapper'; +import { AppManagerDeployer, Logger } from 'zos-lib'; -const log = new Logger('KernelDeployer') +const log = new Logger('KernelDeployer'); export default { - async call(version, newVersionCost, developerFraction, txParams = {}) { - const appManager = await AppManagerDeployer.call(version, txParams) - return await this.callWithImplementations(appManager, newVersionCost, developerFraction, {}, txParams) + async call (version, newVersionCost, developerFraction, txParams = {}) { + const appManager = await AppManagerDeployer.call(version, txParams); + return await this.callWithImplementations(appManager, newVersionCost, developerFraction, {}, txParams); }, - async callWithAppManager(appManager, newVersionCost, developerFraction, txParams = {}) { - return await this.callWithImplementations(appManager, newVersionCost, developerFraction, {}, txParams) + async callWithAppManager (appManager, newVersionCost, developerFraction, txParams = {}) { + return await this.callWithImplementations(appManager, newVersionCost, developerFraction, {}, txParams); }, - async callWithImplementations(appManager, newVersionCost, developerFraction, impls, txParams = {}) { - this.appManager = appManager - this.txParams = txParams - await this.deployVouchingProxy(impls) - await this.deployZepTokenProxy(impls) - await this.deployKernelProxy(newVersionCost, developerFraction, impls) - return new KernelWrapper(this.kernel, this.zepToken, this.vouching, this.txParams) + async callWithImplementations (appManager, newVersionCost, developerFraction, impls, txParams = {}) { + this.appManager = appManager; + this.txParams = txParams; + await this.deployVouchingProxy(impls); + await this.deployZepTokenProxy(impls); + await this.deployKernelProxy(newVersionCost, developerFraction, impls); + return new KernelWrapper(this.kernel, this.zepToken, this.vouching, this.txParams); }, - async registerImplementations(impls = {}) { - await this.registerKernelImplementation(impls) - await this.registerVouchingImplementation(impls) - await this.registerZepTokenImplementation(impls) + async registerImplementations (impls = {}) { + await this.registerKernelImplementation(impls); + await this.registerVouchingImplementation(impls); + await this.registerZepTokenImplementation(impls); }, - async registerVouchingImplementation(impls = {}) { - const Vouching = impls.Vouching || ContractsProvider.getFromKernel('Vouching') - log.info('Registering Vouching implementation for Kernel...') - await this.appManager.setImplementation(Vouching, 'Vouching') + async registerVouchingImplementation (impls = {}) { + const Vouching = impls.Vouching || ContractsProvider.getFromKernel('Vouching'); + log.info('Registering Vouching implementation for Kernel...'); + await this.appManager.setImplementation(Vouching, 'Vouching'); return Vouching; }, - async registerZepTokenImplementation(impls = {}) { - const ZepToken = impls.ZepToken || ContractsProvider.getFromKernel('ZepToken') - log.info('Registering ZepToken implementation for Kernel...') - await this.appManager.setImplementation(ZepToken, 'ZepToken') + async registerZepTokenImplementation (impls = {}) { + const ZepToken = impls.ZepToken || ContractsProvider.getFromKernel('ZepToken'); + log.info('Registering ZepToken implementation for Kernel...'); + await this.appManager.setImplementation(ZepToken, 'ZepToken'); return ZepToken; }, - async registerKernelImplementation(impls = {}) { - const Kernel = impls.Kernel || ContractsProvider.getFromKernel('Kernel') - log.info('Registering Kernel implementation for Kernel...') - await this.appManager.setImplementation(impls.Kernel || Kernel, 'Kernel') + async registerKernelImplementation (impls = {}) { + const Kernel = impls.Kernel || ContractsProvider.getFromKernel('Kernel'); + log.info('Registering Kernel implementation for Kernel...'); + await this.appManager.setImplementation(impls.Kernel || Kernel, 'Kernel'); return Kernel; }, - async deployVouchingProxy(impls) { + async deployVouchingProxy (impls) { const Vouching = await this.registerVouchingImplementation(impls); - log.info('Deploying Vouching proxy...') - this.vouching = await this.appManager.createProxy(Vouching, 'Vouching', 'initialize', [this.txParams.from]) - log.info('Deployed Vouching proxy: ', this.vouching.address) + log.info('Deploying Vouching proxy...'); + this.vouching = await this.appManager.createProxy(Vouching, 'Vouching', 'initialize', [this.txParams.from]); + log.info('Deployed Vouching proxy: ', this.vouching.address); }, - async deployZepTokenProxy(impls) { + async deployZepTokenProxy (impls) { const ZepToken = await this.registerZepTokenImplementation(impls); - log.info('Deploying ZepToken proxy...') - this.zepToken = await this.appManager.createProxy(ZepToken, 'ZepToken', 'initialize', [this.txParams.from]) - log.info('Deployed ZepToken proxy: ', this.zepToken.address) + log.info('Deploying ZepToken proxy...'); + this.zepToken = await this.appManager.createProxy(ZepToken, 'ZepToken', 'initialize', [this.txParams.from]); + log.info('Deployed ZepToken proxy: ', this.zepToken.address); }, - async deployKernelProxy(newVersionCost, developerFraction, impls) { + async deployKernelProxy (newVersionCost, developerFraction, impls) { const Kernel = await this.registerKernelImplementation(impls); - log.info('Deploying Kernel proxy...') - const initArgs = [newVersionCost, developerFraction, this.zepToken.address, this.vouching.address] - this.kernel = await this.appManager.createProxy(Kernel, 'Kernel', 'initialize', initArgs) - log.info('Deployed Kernel proxy: ', this.kernel.address) - log.info('Transferring Vouching ownership to Kernel proxy...') - await this.vouching.transferOwnership(this.kernel.address, this.txParams) + log.info('Deploying Kernel proxy...'); + const initArgs = [newVersionCost, developerFraction, this.zepToken.address, this.vouching.address]; + this.kernel = await this.appManager.createProxy(Kernel, 'Kernel', 'initialize', initArgs); + log.info('Deployed Kernel proxy: ', this.kernel.address); + log.info('Transferring Vouching ownership to Kernel proxy...'); + await this.vouching.transferOwnership(this.kernel.address, this.txParams); }, -} +}; diff --git a/src/kernel/KernelProvider.js b/src/kernel/KernelProvider.js index dd92ebc..51a84bf 100644 --- a/src/kernel/KernelProvider.js +++ b/src/kernel/KernelProvider.js @@ -1,27 +1,27 @@ -import KernelWrapper from './KernelWrapper' +import KernelWrapper from './KernelWrapper'; export default { - async fromAddress(address, txParams = {}) { - this._fetchKernel(address) - await this._fetchZepToken() - await this._fetchVouching() - return new KernelWrapper(this.kernel, this.zepToken, this.vouching, txParams) + async fromAddress (address, txParams = {}) { + this._fetchKernel(address); + await this._fetchZepToken(); + await this._fetchVouching(); + return new KernelWrapper(this.kernel, this.zepToken, this.vouching, txParams); }, - _fetchKernel(address) { - const Kernel = ContractsProvider.getFromKernel('Kernel') - this.kernel = new Kernel(address) + _fetchKernel (address) { + const Kernel = ContractsProvider.getFromKernel('Kernel'); + this.kernel = new Kernel(address); }, - async _fetchZepToken() { - const ZepToken = ContractsProvider.getFromKernel('ZepToken') - const zepTokenAddress = await this.kernel.token() - this.zepToken = new ZepToken(zepTokenAddress) + async _fetchZepToken () { + const ZepToken = ContractsProvider.getFromKernel('ZepToken'); + const zepTokenAddress = await this.kernel.token(); + this.zepToken = new ZepToken(zepTokenAddress); }, - async _fetchVouching() { - const Vouching = ContractsProvider.getFromKernel('Vouching') - const vouchingAddress = await this.kernel.vouches() - this.vouching = new Vouching(vouchingAddress) + async _fetchVouching () { + const Vouching = ContractsProvider.getFromKernel('Vouching'); + const vouchingAddress = await this.kernel.vouches(); + this.vouching = new Vouching(vouchingAddress); }, -} +}; diff --git a/src/kernel/KernelWrapper.js b/src/kernel/KernelWrapper.js index 89f0f4a..5f9101e 100644 --- a/src/kernel/KernelWrapper.js +++ b/src/kernel/KernelWrapper.js @@ -1,112 +1,113 @@ -import { Logger } from 'zos-lib' +import { Logger } from 'zos-lib'; -const log = new Logger('Kernel') +const log = new Logger('Kernel'); export default class KernelWrapper { - constructor(kernel, zepToken, vouching, txParams = {}) { - this.kernel = kernel - this.zepToken = zepToken - this.vouching = vouching - this.txParams = txParams + constructor (kernel, zepToken, vouching, txParams = {}) { + this.kernel = kernel; + this.zepToken = zepToken; + this.vouching = vouching; + this.txParams = txParams; } - address() { - return this.kernel.address + address () { + return this.kernel.address; } - async newVersionCost() { - return this.kernel.newVersionCost() + async newVersionCost () { + return this.kernel.newVersionCost(); } - async developerFraction() { - return this.kernel.developerFraction() + async developerFraction () { + return this.kernel.developerFraction(); } - async register(release) { - const newVersionCost = await this.newVersionCost() - log.info(`Approving ${newVersionCost} ZEP tokens to zOS kernel contract...`) - await this.zepToken.approve(this.kernel.address, newVersionCost, this.txParams) - log.info(`Registering release ${release}...`) - const receipt = await this.kernel.register(release, this.txParams) - log.info(`Release registered successfully. Transaction hash: ${receipt.tx}.`) + async register (release) { + const newVersionCost = await this.newVersionCost(); + log.info(`Approving ${newVersionCost} ZEP tokens to zOS kernel contract...`); + await this.zepToken.approve(this.kernel.address, newVersionCost, this.txParams); + log.info(`Registering release ${release}...`); + const receipt = await this.kernel.register(release, this.txParams); + log.info(`Release registered successfully. Transaction hash: ${receipt.tx}.`); } - async vouch(release, amount, data = '') { - log.info(`Approving ${amount} ZEP tokens to zOS kernel contract...`) - await this.zepToken.approve(this.kernel.address, amount, this.txParams) - log.info(`Vouching ${amount} ZEP tokens for release ${release}...`) - const receipt = await this.kernel.vouch(release, amount, data, this.txParams) - log.info(`Vouch processed successfully. Transaction hash: ${receipt.tx}.`) + async vouch (release, amount, data = '') { + log.info(`Approving ${amount} ZEP tokens to zOS kernel contract...`); + await this.zepToken.approve(this.kernel.address, amount, this.txParams); + log.info(`Vouching ${amount} ZEP tokens for release ${release}...`); + const receipt = await this.kernel.vouch(release, amount, data, this.txParams); + log.info(`Vouch processed successfully. Transaction hash: ${receipt.tx}.`); } - async unvouch(release, amount, data = '') { - log.info(`Unvouching ${amount} ZEP tokens from release ${release}...`) - const receipt = await this.kernel.unvouch(release, amount, data, this.txParams) - log.info(`Unvouch processed successfully. Transaction hash: ${receipt.tx}.`) + async unvouch (release, amount, data = '') { + log.info(`Unvouching ${amount} ZEP tokens from release ${release}...`); + const receipt = await this.kernel.unvouch(release, amount, data, this.txParams); + log.info(`Unvouch processed successfully. Transaction hash: ${receipt.tx}.`); } - async mintZepTokens(to, amount) { - log.info(`Minting ZEP tokens for ${to}...`) - const mintTx = await this.zepToken.mint(to, amount, this.txParams) - log.info("Tokens minted: ", mintTx.tx) + async mintZepTokens (to, amount) { + log.info(`Minting ZEP tokens for ${to}...`); + const mintTx = await this.zepToken.mint(to, amount, this.txParams); + log.info('Tokens minted: ', mintTx.tx); } - async validateCanRegister(release) { - await this._ifRegisteredThrow(release, `Given release ${release} is already registered.`) - await this._ifFrozenThrow(release, `Given release ${release} must be frozen to be registered.`) - await this._ifNotEnoughBalanceToRegisterThrow(`You don't have enough ZEP tokens to register a new release.`) + async validateCanRegister (release) { + await this._ifRegisteredThrow(release, `Given release ${release} is already registered.`); + await this._ifFrozenThrow(release, `Given release ${release} must be frozen to be registered.`); + await this._ifNotEnoughBalanceToRegisterThrow('You don't have enough ZEP tokens to register a new release.'); } - async validateCanVouch(release, amount) { - await this._ifNotRegisteredThrow(release, `Given release ${release} is not registered yet.`) - await this._ifNotEnoughZepBalance(amount, "You don't have enough ZEP tokens to vouch given amount.") - await this._ifDoesNotReachPayout(amount, `You have to vouch ${(await this.developerFraction())} ZEP tokens at least.`) + async validateCanVouch (release, amount) { + await this._ifNotRegisteredThrow(release, `Given release ${release} is not registered yet.`); + await this._ifNotEnoughZepBalance(amount, 'You don't have enough ZEP tokens to vouch given amount.'); + await this._ifDoesNotReachPayout( + amount, `You have to vouch ${(await this.developerFraction())} ZEP tokens at least.`); } - async validateCanUnvouch(release, amount) { - await this._ifNotRegisteredThrow(release, `Given release ${release} is not registered yet.`) - await this._ifNotEnoughVouchThrow(release, amount, "You don't have enough vouched tokens to unvouch given amount.") + async validateCanUnvouch (release, amount) { + await this._ifNotRegisteredThrow(release, `Given release ${release} is not registered yet.`); + await this._ifNotEnoughVouchThrow(release, amount, 'You don't have enough vouched tokens to unvouch given amount.'); } - async _ifRegisteredThrow(release, error) { - const isRegistered = await this.kernel.isRegistered(release, this.txParams) - if(isRegistered) throw error + async _ifRegisteredThrow (release, error) { + const isRegistered = await this.kernel.isRegistered(release, this.txParams); + if (isRegistered) throw error; } - async _ifNotRegisteredThrow(release, error) { - const isRegistered = await this.kernel.isRegistered(release, this.txParams) - if(!isRegistered) throw error + async _ifNotRegisteredThrow (release, error) { + const isRegistered = await this.kernel.isRegistered(release, this.txParams); + if (!isRegistered) throw error; } - async _ifFrozenThrow(releaseAddress, error) { - const Release = ContractsProvider.getFromKernel('Release') - const release = new Release(releaseAddress) - const isFrozen = await release.frozen(this.txParams) - if(!isFrozen) throw error + async _ifFrozenThrow (releaseAddress, error) { + const Release = ContractsProvider.getFromKernel('Release'); + const release = new Release(releaseAddress); + const isFrozen = await release.frozen(this.txParams); + if (!isFrozen) throw error; } - async _ifNotEnoughBalanceToRegisterThrow(error) { - const newVersionCost = await this.newVersionCost() - const developerBalance = await this.zepToken.balanceOf(this.txParams.from) - const doesNotHaveEnoughTokens = developerBalance.lt(newVersionCost) - if(doesNotHaveEnoughTokens) throw error + async _ifNotEnoughBalanceToRegisterThrow (error) { + const newVersionCost = await this.newVersionCost(); + const developerBalance = await this.zepToken.balanceOf(this.txParams.from); + const doesNotHaveEnoughTokens = developerBalance.lt(newVersionCost); + if (doesNotHaveEnoughTokens) throw error; } - async _ifNotEnoughZepBalance(amount, error) { - const voucherBalance = await this.zepToken.balanceOf(this.txParams.from) - const doesNotHaveEnoughTokens = voucherBalance.lt(amount) - if(doesNotHaveEnoughTokens) throw error + async _ifNotEnoughZepBalance (amount, error) { + const voucherBalance = await this.zepToken.balanceOf(this.txParams.from); + const doesNotHaveEnoughTokens = voucherBalance.lt(amount); + if (doesNotHaveEnoughTokens) throw error; } - async _ifDoesNotReachPayout(amount, error) { - const developerFraction = await this.kernel.developerFraction() - const payout = amount.divToInt(developerFraction) - if(payout <= 0) throw error + async _ifDoesNotReachPayout (amount, error) { + const developerFraction = await this.kernel.developerFraction(); + const payout = amount.divToInt(developerFraction); + if (payout <= 0) throw error; } - async _ifNotEnoughVouchThrow(release, amount, error) { - const vouches = await this.vouching.vouchedFor(this.txParams.from, release) - const doesNotHaveEnoughVouches = vouches.lt(amount) - if(doesNotHaveEnoughVouches) throw error + async _ifNotEnoughVouchThrow (release, amount, error) { + const vouches = await this.vouching.vouchedFor(this.txParams.from, release); + const doesNotHaveEnoughVouches = vouches.lt(amount); + if (doesNotHaveEnoughVouches) throw error; } } diff --git a/src/release/ReleaseDeployer.js b/src/release/ReleaseDeployer.js index 84316a9..e6ab4ce 100644 --- a/src/release/ReleaseDeployer.js +++ b/src/release/ReleaseDeployer.js @@ -1,58 +1,58 @@ -import { Logger, FileSystem } from 'zos-lib' -import ReleaseWrapper from './ReleaseWrapper' +import { Logger, FileSystem } from 'zos-lib'; +import ReleaseWrapper from './ReleaseWrapper'; -const log = new Logger('ReleaseDeployer') +const log = new Logger('ReleaseDeployer'); const ReleaseDeployer = { - async call(contracts, txParams) { - this.txParams = txParams - await this.deployRelease() - await this.deployAndRegisterContracts(contracts, this._deployLocalContract) - return new ReleaseWrapper(this.release, txParams) + async call (contracts, txParams) { + this.txParams = txParams; + await this.deployRelease(); + await this.deployAndRegisterContracts(contracts, this._deployLocalContract); + return new ReleaseWrapper(this.release, txParams); }, - async callForDependency(contracts, dependencyName, txParams) { - this.txParams = txParams - this.dependencyName = dependencyName - await this.deployRelease() - await this.deployAndRegisterContracts(contracts, this._deployDependencyContract) - return new ReleaseWrapper(this.release, txParams) + async callForDependency (contracts, dependencyName, txParams) { + this.txParams = txParams; + this.dependencyName = dependencyName; + await this.deployRelease(); + await this.deployAndRegisterContracts(contracts, this._deployDependencyContract); + return new ReleaseWrapper(this.release, txParams); }, - async deployRelease() { - log.info("Deploying a new Release...") - const Release = ContractsProvider.getFromKernel('Release') - this.release = await Release.new(this.txParams) - log.info(`Deployed at ${this.release.address}`) + async deployRelease () { + log.info('Deploying a new Release...'); + const Release = ContractsProvider.getFromKernel('Release'); + this.release = await Release.new(this.txParams); + log.info(`Deployed at ${this.release.address}`); }, - async deployAndRegisterContracts(contracts, deployContract) { + async deployAndRegisterContracts (contracts, deployContract) { await Promise.all(contracts.map(async contract => { - const { alias: contractAlias, name: contractName } = contract - const implementation = await deployContract(contractName) - log.info('Registering implementation in release...') - await this.release.setImplementation(contractAlias, implementation.address, this.txParams) - })) + const { alias: contractAlias, name: contractName } = contract; + const implementation = await deployContract(contractName); + log.info('Registering implementation in release...'); + await this.release.setImplementation(contractAlias, implementation.address, this.txParams); + })); }, - async _deployLocalContract(contractName) { - const contractClass = ContractsProvider.getByName(contractName) - return await ReleaseDeployer._deployContract(contractName, contractClass) + async _deployLocalContract (contractName) { + const contractClass = ContractsProvider.getByName(contractName); + return await ReleaseDeployer._deployContract(contractName, contractClass); }, - async _deployDependencyContract(contractName) { - const path = `node_modules/${this.dependencyName}/build/contracts/${contractName}.json` - const contractSchema = FileSystem.parseJson(path) - const contractClass = ContractsProvider.getByJSONData(contractSchema) - return await ReleaseDeployer._deployContract(contractName, contractClass) + async _deployDependencyContract (contractName) { + const path = `node_modules/${this.dependencyName}/build/contracts/${contractName}.json`; + const contractSchema = FileSystem.parseJson(path); + const contractClass = ContractsProvider.getByJSONData(contractSchema); + return await ReleaseDeployer._deployContract(contractName, contractClass); }, - async _deployContract(contractName, contractClass) { - log.info(`Deploying new ${contractName}...`) - const implementation = await contractClass.new() - log.info(`Deployed ${contractName} ${implementation.address}`) - return implementation + async _deployContract (contractName, contractClass) { + log.info(`Deploying new ${contractName}...`); + const implementation = await contractClass.new(); + log.info(`Deployed ${contractName} ${implementation.address}`); + return implementation; }, -} +}; -export default ReleaseDeployer +export default ReleaseDeployer; diff --git a/src/release/ReleaseWrapper.js b/src/release/ReleaseWrapper.js index 736c045..93c8114 100644 --- a/src/release/ReleaseWrapper.js +++ b/src/release/ReleaseWrapper.js @@ -1,31 +1,31 @@ -import { Logger } from 'zos-lib' +import { Logger } from 'zos-lib'; -const log = new Logger('Release') +const log = new Logger('Release'); export default class ReleaseWrapper { - constructor(release, txParams = {}) { - this.release = release - this.txParams = txParams + constructor (release, txParams = {}) { + this.release = release; + this.txParams = txParams; } - address() { - return this.release.address + address () { + return this.release.address; } - async owner() { - return await this.release.owner(this.txParams) + async owner () { + return await this.release.owner(this.txParams); } - async freeze() { - log.info("Freezing release...") - await this.release.freeze(this.txParams) + async freeze () { + log.info('Freezing release...'); + await this.release.freeze(this.txParams); } - async isFrozen() { - return await this.release.frozen(this.txParams) + async isFrozen () { + return await this.release.frozen(this.txParams); } - async getImplementation(contractName) { - return await this.release.getImplementation(contractName, this.txParams) + async getImplementation (contractName) { + return await this.release.getImplementation(contractName, this.txParams); } } diff --git a/src/utils/ContractsProvider.js b/src/utils/ContractsProvider.js index d156c50..a1c6211 100644 --- a/src/utils/ContractsProvider.js +++ b/src/utils/ContractsProvider.js @@ -1,12 +1,12 @@ -import { ContractsProvider } from 'zos-lib' +import { ContractsProvider } from 'zos-lib'; ContractsProvider.getFromKernel = contractName => { - return ContractsProvider.getByName(contractName) -} + return ContractsProvider.getByName(contractName); +}; ContractsProvider.getFromLib = contractName => { - const data = require(`zos-lib/build/contracts/${contractName}.json`) - return ContractsProvider.getByJSONData(data) -} + const data = require(`zos-lib/build/contracts/${contractName}.json`); + return ContractsProvider.getByJSONData(data); +}; -export default ContractsProvider +export default ContractsProvider;