diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..bbb089f --- /dev/null +++ b/.eslintrc @@ -0,0 +1,52 @@ +{ + "extends" : [ + "standard", + "plugin:promise/recommended", + "plugin:react/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/deploy/deploy.js b/deploy/deploy.js index f1fac8f..ba3aad7 100644 --- a/deploy/deploy.js +++ b/deploy/deploy.js @@ -1,8 +1,8 @@ import DeployData from './deploy_data_util.js'; import Deployer from 'kernel/deploy/objects/Deployer'; -const Basil = artifacts.require("./Basil.sol"); -const BasilERC721 = artifacts.require("./BasilERC721.sol"); +const Basil = artifacts.require('./Basil.sol'); +const BasilERC721 = artifacts.require('./BasilERC721.sol'); const ProjectController = artifacts.require('ProjectController'); const PROJECT_OWNER = web3.eth.accounts[0]; @@ -16,31 +16,30 @@ let basilProxy; const FORCE_RE_DEPLOY_ON_DEVELOPMENT = true; const ZOS_ADDRESS = { development: 0x212fbf392206bca0a478b9ed3253b08559b35903, - ropsten: 0x0 + ropsten: 0x0, }; -async function deploy() { +async function deploy () { data = DeployData.read(network); await deployController(); await deployBasil(); await deployBasilERC721(); } -async function deployVersion(version, contractName, ContractKlazz) { +async function deployVersion (version, contractName, ContractKlazz) { console.log(`deploying and registering version ${version} of ${contractName}...`); const implementation = await Deployer.deployAndRegister(controller, ContractKlazz, contractName, version); console.log(`implementation deployed, version: ${version}, at: ${implementation.address}`); return implementation; } -function forceReDeploy() { - return FORCE_RE_DEPLOY_ON_DEVELOPMENT && network === "development"; +function forceReDeploy () { + return FORCE_RE_DEPLOY_ON_DEVELOPMENT && network === 'development'; } -async function deployBasil() { +async function deployBasil () { const version = '0'; - if(forceReDeploy() || !data.contracts || !data.contracts[BASIL_CONTRACT_NAME]) { - + if (forceReDeploy() || !data.contracts || !data.contracts[BASIL_CONTRACT_NAME]) { // Deploy and register implementation. const implementation = await deployVersion(version, BASIL_CONTRACT_NAME, Basil); @@ -54,25 +53,23 @@ async function deployBasil() { PROJECT_NAME, version, ['address'], - [PROJECT_OWNER] + [PROJECT_OWNER], ); console.log(`deployed proxy: ${basilProxy.address}`); // Save to disk. data = DeployData.saveContractProxy(data, BASIL_CONTRACT_NAME, basilProxy.address, network); data = DeployData.appendContractVersion(data, BASIL_CONTRACT_NAME, version, implementation.address, network); - } - else { + } else { // TODO: the fact that the version is not found in the json does not necessarily mean it is not // in the registry, which probably needs to be accounted for. console.log('found Basil version 0, no need to deploy it.'); } } -async function deployBasilERC721() { +async function deployBasilERC721 () { const version = '1'; - if(forceReDeploy() || !data.contracts.Basil.versions[version]) { - + if (forceReDeploy() || !data.contracts.Basil.versions[version]) { // Deploy and register implementation. const implementation = await deployVersion(version, BASIL_CONTRACT_NAME, BasilERC721); @@ -82,36 +79,32 @@ async function deployBasilERC721() { // Save to disk. DeployData.appendContractVersion(data, BASIL_CONTRACT_NAME, version, implementation.address, network); - } - else { + } else { console.log('found Basil version 1, no need to deploy it.'); } } -async function deployController() { - if(forceReDeploy() || !data.controllerAddress) { - +async function deployController () { + if (forceReDeploy() || !data.controllerAddress) { // Deploy a new project controller. - console.log(`did not find a project controller, deploying a new one...`); + console.log('did not find a project controller, deploying a new one...'); controller = await Deployer.projectController( PROJECT_OWNER, PROJECT_NAME, - ZOS_ADDRESS[network] + ZOS_ADDRESS[network], ); console.log(`deployed new project controller: ${controller.address}`); // Save to disk. data = DeployData.saveController(data, network, controller.address); - } - else { - + } else { // Retrieve project controller. - console.log(`found project controller, reusing it...`); + console.log('found project controller, reusing it...'); controller = await ProjectController.at(data.controllerAddress); console.log(`retrieved project controller: ${controller.address}`); } } -module.exports = function(cb) { +module.exports = function (cb) { deploy().then(cb).catch(cb); -} +}; diff --git a/deploy/deploy_data_util.js b/deploy/deploy_data_util.js index 66aa3bc..0e0520d 100644 --- a/deploy/deploy_data_util.js +++ b/deploy/deploy_data_util.js @@ -2,61 +2,60 @@ const fs = require('fs'); const DeployData = { - deployPath(network) { + deployPath (network) { return `./deploy/deploy_data.${network}.json`; }, - read(network) { + read (network) { let data; const path = this.deployPath(network); try { const raw = fs.readFileSync(path, 'utf8'); data = JSON.parse(raw); - } - catch(err) { + } catch (err) { data = { controllerAddress: undefined, - contracts: {} + contracts: {}, }; }; return data; }, - write(data, network) { + write (data, network) { const writeData = JSON.stringify(data, null, 2); const path = this.deployPath(network); fs.writeFileSync(path, writeData, 'utf8'); }, - saveController(data, network, controllerAddress) { + saveController (data, network, controllerAddress) { data.controllerAddress = controllerAddress; this.write(data, network); return data; }, - saveContractProxy(data, contractName, proxyAddress, network) { + saveContractProxy (data, contractName, proxyAddress, network) { data = this.prepareContractEntry(data, contractName); data.contracts[contractName].proxyAddress = proxyAddress; this.write(data, network); return data; }, - appendContractVersion(data, contractName, version, implementation, network) { + appendContractVersion (data, contractName, version, implementation, network) { data = this.prepareContractEntry(data, contractName); data.contracts[contractName].versions[version] = implementation; this.write(data, network); return data; }, - prepareContractEntry(data, contractName) { - if(!data.contracts) data.contracts = {}; - if(data.contracts[contractName]) return data; + prepareContractEntry (data, contractName) { + if (!data.contracts) data.contracts = {}; + if (data.contracts[contractName]) return data; data.contracts[contractName] = { proxyAddress: undefined, - versions: {} + versions: {}, }; return data; - } -} + }, +}; export default DeployData; diff --git a/migrations/1_initial_migration.js b/migrations/1_initial_migration.js index ee2135d..a4725fe 100644 --- a/migrations/1_initial_migration.js +++ b/migrations/1_initial_migration.js @@ -1,5 +1,5 @@ -const Migrations = artifacts.require("Migrations"); +var Migrations = artifacts.require('./Migrations.sol'); -module.exports = function(deployer) { +module.exports = function (deployer) { deployer.deploy(Migrations); }; diff --git a/package-lock.json b/package-lock.json index 595b75d..bd830d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,23 @@ "acorn": "4.0.13" } }, + "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 + } + } + }, "acorn-node": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.3.0.tgz", @@ -149,6 +166,12 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -245,7 +268,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, "requires": { "define-properties": "1.1.2", "es-abstract": "1.10.0" @@ -1692,6 +1714,12 @@ "ieee754": "1.1.8" } }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", @@ -1788,6 +1816,21 @@ "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", "dev": true }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -1893,6 +1936,12 @@ } } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1943,6 +1992,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 + }, "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", @@ -2055,6 +2110,21 @@ "rimraf": "2.6.2" } }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -2322,6 +2392,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "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", @@ -2728,11 +2804,16 @@ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, "requires": { "foreach": "2.0.5", "object-keys": "1.0.11" @@ -2945,6 +3026,14 @@ "buffer-indexof": "1.1.1" } }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "2.0.2" + } + }, "dom-converter": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", @@ -3162,7 +3251,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", - "dev": true, "requires": { "es-to-primitive": "1.1.1", "function-bind": "1.1.1", @@ -3175,7 +3263,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, "requires": { "is-callable": "1.1.3", "is-date-object": "1.0.1", @@ -3276,12 +3363,408 @@ "estraverse": "4.2.0" } }, + "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.0", + "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.4.0", + "ignore": "3.3.7", + "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.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "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.4", + "typedarray": "0.0.6" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "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" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz", + "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==", + "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 + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "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": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "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.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz", + "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=", + "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.1" + }, + "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" + } + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "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": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "requires": { + "ignore": "3.3.7", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz", + "integrity": "sha512-2WO+ZFh7vxUKRfR0cOIMrWgYKdR6S1AlOezw6pC52B6oYpd5WFghN+QHxvrRdZMtbo8h3dfUZ2o1rWb0UPbKtg==", + "dev": true + }, + "eslint-plugin-react": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz", + "integrity": "sha512-KC7Snr4YsWZD5flu6A5c0AcIZidzW3Exbqp7OT67OaD2AppJtlBr/GuPrW/vaQM/yfZotEvKAdrxrO+v8vwYJA==", + "requires": { + "doctrine": "2.1.0", + "has": "1.0.1", + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.0" + } + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "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.0", + "estraverse": "4.2.0" + } + }, + "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.5.3", + "acorn-jsx": "3.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + } + } + }, "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "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" + } + }, "esrecurse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", @@ -3301,8 +3784,7 @@ "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { "version": "1.8.1", @@ -3523,6 +4005,17 @@ } } }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -3556,6 +4049,12 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastparse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", @@ -3592,6 +4091,25 @@ } } }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "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" + } + }, "file-loader": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", @@ -3684,6 +4202,49 @@ "pinkie-promise": "2.0.1" } }, + "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" + }, + "dependencies": { + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + } + } + }, "flatten": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", @@ -3718,8 +4279,7 @@ "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" }, "forever-agent": { "version": "0.6.1", @@ -4719,7 +5279,12 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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 }, "gauge": { @@ -4964,7 +5529,6 @@ "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" } @@ -5500,6 +6064,96 @@ "source-map": "0.5.7" } }, + "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.0", + "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" + }, + "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.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "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 + }, + "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" + } + } + } + }, "insert-module-globals": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", @@ -5639,8 +6293,7 @@ "is-callable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=" }, "is-data-descriptor": { "version": "1.0.0", @@ -5662,8 +6315,7 @@ "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" }, "is-descriptor": { "version": "1.0.2", @@ -5839,6 +6491,12 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -5849,11 +6507,16 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, "requires": { "has": "1.0.1" } }, + "is-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-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -5871,8 +6534,7 @@ "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=" }, "is-typedarray": { "version": "1.0.0", @@ -6007,6 +6669,12 @@ "jsonify": "0.0.0" } }, + "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", @@ -6064,6 +6732,14 @@ "verror": "1.10.0" } }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "requires": { + "array-includes": "3.0.3" + } + }, "keccakjs": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.1.tgz", @@ -6075,14 +6751,14 @@ } }, "kernel": { - "version": "git://github.com/zeppelinos/kernel-registry.git#197c0e441daa5b32b0d63f678d6b391701479322", + "version": "git://github.com/zeppelinos/kernel-registry.git#eb4a3faa16076a1e1215c9ae35c16fd3a37c69be", "requires": { "zeppelin-solidity": "1.8.0", - "zos-core": "git://github.com/zeppelinos/core.git#519f4a0005113b4c0c7a6f315c30f56032239911" + "zos-core": "git://github.com/zeppelinos/upgradeability-lib.git#f2af9ea0c1608d62e20c091ac74f7581b591ed7b" }, "dependencies": { "zos-core": { - "version": "git://github.com/zeppelinos/core.git#519f4a0005113b4c0c7a6f315c30f56032239911", + "version": "git://github.com/zeppelinos/upgradeability-lib.git#f2af9ea0c1608d62e20c091ac74f7581b591ed7b", "requires": { "zeppelin-solidity": "1.8.0" } @@ -6147,6 +6823,16 @@ "invert-kv": "1.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, "lexical-scope": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", @@ -6842,6 +7528,12 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", @@ -6888,6 +7580,12 @@ } } }, + "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 + }, "ncname": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", @@ -7392,8 +8090,7 @@ "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" }, "object-path": { "version": "0.9.2", @@ -7470,6 +8167,15 @@ "wrappy": "1.0.2" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, "opn": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", @@ -7479,6 +8185,28 @@ "is-wsl": "1.1.0" } }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "original": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", @@ -7811,6 +8539,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 + }, "portfinder": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", @@ -8398,6 +9132,12 @@ "uniqs": "2.0.0" } }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -8432,6 +9172,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 + }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -8911,6 +9657,12 @@ "integrity": "sha512-VncXxOF6uFlYog5prG2j+e2UGJeam5MfNiJnB/qEgo4KTnMm2XrELCg4rNZ6IlaEUZnGlb8aB6lXowCRQtTkkA==", "dev": true }, + "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", @@ -9047,6 +9799,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 + } + } + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -9113,6 +9883,16 @@ } } }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -9177,6 +9957,15 @@ "integrity": "sha1-nbOE/0uJqPYVY9kjldhiWxjzr7A=", "dev": true }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -9186,6 +9975,21 @@ "aproba": "1.2.0" } }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -9567,6 +10371,23 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", @@ -10363,6 +11184,12 @@ "get-stdin": "4.0.1" } }, + "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 + }, "style-loader": { "version": "0.18.2", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", @@ -10436,6 +11263,94 @@ "acorn-node": "1.3.0" } }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.4.0", + "lodash": "4.17.5", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", + "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 + }, + "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" + } + } + } + }, "tapable": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", @@ -10509,6 +11424,15 @@ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -10709,9 +11633,6 @@ "web3": "0.20.5" }, "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" - }, "web3": { "version": "0.20.5", "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.5.tgz", @@ -10738,9 +11659,6 @@ "web3": "0.20.5" }, "dependencies": { - "bignumber.js": { - "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" - }, "ethjs-abi": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.1.8.tgz", @@ -10808,6 +11726,15 @@ "dev": true, "optional": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -12059,6 +12986,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" + } + }, "xhr2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", @@ -12133,12 +13069,6 @@ "dotenv": "4.0.0", "ethjs-abi": "0.2.1" } - }, - "zos-core": { - "version": "git://github.com/zeppelinos/core.git#c4c56dc5f76b158572aab01dba9c19b896937bd4", - "requires": { - "zeppelin-solidity": "1.8.0" - } } } } diff --git a/package.json b/package.json index 34ebd79..53b3e7a 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,12 @@ "deploy-ropsten": "npx truffle exec scripts/deploy.js --network development", "start": "webpack-dev-server --config webpack.dev.js --hot --history-api-fallback", "build": "webpack --config webpack.prod.js", + "lint": "eslint .", + "lint:fix": "eslint . --fix", "lint:sol": "solium -d .", - "lint:sol:fix": "solium -d . --fix" + "lint:sol:fix": "solium -d . --fix", + "lint:all": "npm run lint && npm run lint:sol", + "lint:all:fix": "npm run lint:fix && npm run lint:sol:fix" }, "repository": { "type": "git", @@ -45,6 +49,12 @@ "clean-webpack-plugin": "^0.1.16", "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.28.5", + "eslint": "^4.19.1", + "eslint-config-standard": "^10.2.1", + "eslint-plugin-import": "^2.11.0", + "eslint-plugin-node": "^5.2.1", + "eslint-plugin-promise": "^3.7.0", + "eslint-plugin-standard": "^3.0.1", "ethereumjs-abi": "^0.6.5", "file-loader": "^0.11.2", "html-webpack-plugin": "^2.30.1", @@ -65,6 +75,7 @@ "babel-runtime": "^6.26.0", "colors": "^1.2.1", "dotenv-webpack": "^1.5.4", + "eslint-plugin-react": "^7.7.0", "kernel": "git://github.com/zeppelinos/kernel-registry.git#master", "materialize-css": "^0.100.2", "react": "^15.6.1", diff --git a/src/app.js b/src/app.js index 8c92611..d61c403 100644 --- a/src/app.js +++ b/src/app.js @@ -1,15 +1,16 @@ -'use strict' -require('babel-register') -require('babel-polyfill') -require('materialize-loader') +'use strict'; -import './app.scss' -import 'materialize-css/dist/js/materialize.js' -import 'materialize-css/dist/css/materialize.css' +import './app.scss'; +import 'materialize-css/dist/js/materialize.js'; +import 'materialize-css/dist/css/materialize.css'; -import React from 'react' -import ReactDOM from 'react-dom' -import Root from './js/components/Root.react' -import Store from './js/store' +import React from 'react'; +import ReactDOM from 'react-dom'; +import Root from './js/components/Root.react'; +import Store from './js/store'; -ReactDOM.render(, document.getElementById('app')) +require('babel-register'); +require('babel-polyfill'); +require('materialize-loader'); + +ReactDOM.render(, document.getElementById('app')); diff --git a/src/js/actions/accounts.js b/src/js/actions/accounts.js index ac9e839..6f87e06 100644 --- a/src/js/actions/accounts.js +++ b/src/js/actions/accounts.js @@ -1,40 +1,39 @@ -import Network from '../network' -import AlertActions from './alerts' -import * as ActionTypes from '../actiontypes' +import Network from '../network'; +import AlertActions from './alerts'; +import * as ActionTypes from '../actiontypes'; const AccountActions = { - findAccount() { - return async function(dispatch) { + findAccount () { + return async function (dispatch) { try { - const addresses = await Network.getAccounts() - const mainAddress = addresses[0] - dispatch(AccountActions.receiveAccount(mainAddress)) - dispatch(AccountActions.getEtherBalance(mainAddress)) - - } catch(error) { - dispatch(AlertActions.showError(error)) + const addresses = await Network.getAccounts(); + const mainAddress = addresses[0]; + dispatch(AccountActions.receiveAccount(mainAddress)); + dispatch(AccountActions.getEtherBalance(mainAddress)); + } catch (error) { + dispatch(AlertActions.showError(error)); } - } + }; }, - getEtherBalance(address) { - return async function(dispatch) { + getEtherBalance (address) { + return async function (dispatch) { try { const balance = await Network.getBalance(address); - dispatch(AccountActions.receiveEtherBalance(balance)) - } catch(error) { - dispatch(AlertActions.showError(error)) + dispatch(AccountActions.receiveEtherBalance(balance)); + } catch (error) { + dispatch(AlertActions.showError(error)); } - } + }; }, - receiveAccount(address) { - return { type: ActionTypes.RECEIVE_ACCOUNT, address } + receiveAccount (address) { + return { type: ActionTypes.RECEIVE_ACCOUNT, address }; }, - receiveEtherBalance(balance) { - return { type: ActionTypes.RECEIVE_ETHER_BALANCE, balance } - } -} + receiveEtherBalance (balance) { + return { type: ActionTypes.RECEIVE_ETHER_BALANCE, balance }; + }, +}; -export default AccountActions +export default AccountActions; diff --git a/src/js/actions/alerts.js b/src/js/actions/alerts.js index 4b19ac0..2675648 100644 --- a/src/js/actions/alerts.js +++ b/src/js/actions/alerts.js @@ -1,16 +1,16 @@ -import * as ActionTypes from '../actiontypes' +import * as ActionTypes from '../actiontypes'; const AlertActions = { - showError(error, message = null) { - console.error(error) + showError (error, message = null) { + console.error(error); return dispatch => { - dispatch({ type: ActionTypes.SHOW_ERROR, message: (message || error.message) }) - } + dispatch({ type: ActionTypes.SHOW_ERROR, message: (message || error.message) }); + }; }, - reset() { - return dispatch => dispatch({ type: ActionTypes.RESET_ERROR }) - } -} + reset () { + return dispatch => dispatch({ type: ActionTypes.RESET_ERROR }); + }, +}; -export default AlertActions +export default AlertActions; diff --git a/src/js/actions/basil.js b/src/js/actions/basil.js index 681e9af..7c03392 100644 --- a/src/js/actions/basil.js +++ b/src/js/actions/basil.js @@ -1,34 +1,34 @@ -import { Basil } from '../contracts' -import AlertActions from './alerts' -import * as ActionTypes from '../actiontypes' -import { BASIL_ADDRESS } from '../constants' -import fromWei from "../helpers/fromWei"; +import { Basil } from '../contracts'; +import AlertActions from './alerts'; +import * as ActionTypes from '../actiontypes'; +import { BASIL_ADDRESS } from '../constants'; +import fromWei from '../helpers/fromWei'; const BasilActions = { - find() { - return async function(dispatch) { + find () { + return async function (dispatch) { try { - const basil = await Basil.at(BASIL_ADDRESS) - dispatch(BasilActions.receive(basil)) - } catch(error) { - dispatch(AlertActions.showError(error)) + const basil = await Basil.at(BASIL_ADDRESS); + dispatch(BasilActions.receive(basil)); + } catch (error) { + dispatch(AlertActions.showError(error)); } - } + }; }, - receive(basil) { - return async function(dispatch) { - const r = (await basil.r()).toString() - const g = (await basil.g()).toString() - const b = (await basil.b()).toString() - const highestDonation = fromWei(await basil.highestDonation()).toString() + receive (basil) { + return async function (dispatch) { + const r = (await basil.r()).toString(); + const g = (await basil.g()).toString(); + const b = (await basil.b()).toString(); + const highestDonation = fromWei(await basil.highestDonation()).toString(); dispatch({ type: ActionTypes.RECEIVE_BASIL, - basil: { r, g, b, highestDonation } - }) - } + basil: { r, g, b, highestDonation }, + }); + }; }, -} +}; -export default BasilActions +export default BasilActions; diff --git a/src/js/actions/donations.js b/src/js/actions/donations.js index 45d3473..f74dd49 100644 --- a/src/js/actions/donations.js +++ b/src/js/actions/donations.js @@ -1,51 +1,49 @@ -import { Basil } from '../contracts' -import AlertActions from './alerts' -import AccountActions from './accounts' -import FetchingActions from './fetching' -import * as ActionTypes from '../actiontypes' -import { BASIL_ADDRESS } from '../constants' -import Network from "../network"; -import toWei from "../helpers/toWei"; -import fromWei from "../helpers/fromWei"; +import { Basil } from '../contracts'; +import AlertActions from './alerts'; +import FetchingActions from './fetching'; +import * as ActionTypes from '../actiontypes'; +import { BASIL_ADDRESS } from '../constants'; +import toWei from '../helpers/toWei'; +import fromWei from '../helpers/fromWei'; const DonationsActions = { - findAll() { - return async function(dispatch) { + findAll () { + return async function (dispatch) { try { - const basil = await Basil.at(BASIL_ADDRESS) + const basil = await Basil.at(BASIL_ADDRESS); const events = basil.NewDonation({}, { fromBlock: 0, toBlock: 'latest' }); - events.watch(function(error, result) { - if(error) AlertActions.showError(error) - else dispatch(DonationsActions.add(result.args)) - }) - } catch(error) { - dispatch(AlertActions.showError(error)) + events.watch(function (error, result) { + if (error) AlertActions.showError(error); + else dispatch(DonationsActions.add(result.args)); + }); + } catch (error) { + dispatch(AlertActions.showError(error)); } - } + }; }, - donate(donor, value, r, g, b) { - return async function(dispatch) { - const message = `Donating ETH ${value} to Zeppelin's Basil! RGB(${r}, ${g}, ${b}) from ${donor}` - console.log(message) - dispatch(FetchingActions.start(message)) + donate (donor, value, r, g, b) { + return async function (dispatch) { + const message = `Donating ETH ${value} to Zeppelin's Basil! RGB(${r}, ${g}, ${b}) from ${donor}`; + console.log(message); + dispatch(FetchingActions.start(message)); try { - const basil = await Basil.at(BASIL_ADDRESS) - await basil.donate(r, g, b, { from: donor, value: toWei(value) }) - dispatch(FetchingActions.stop()) - } catch(error) { - dispatch(AlertActions.showError(error)) + const basil = await Basil.at(BASIL_ADDRESS); + await basil.donate(r, g, b, { from: donor, value: toWei(value) }); + dispatch(FetchingActions.stop()); + } catch (error) { + dispatch(AlertActions.showError(error)); } - } + }; }, - add(donation) { - return async function(dispatch) { - donation.value = fromWei(donation.value).toString() - dispatch({ type: ActionTypes.ADD_DONATION, donation }) - } + add (donation) { + return async function (dispatch) { + donation.value = fromWei(donation.value).toString(); + dispatch({ type: ActionTypes.ADD_DONATION, donation }); + }; }, -} +}; -export default DonationsActions +export default DonationsActions; diff --git a/src/js/actions/fetching.js b/src/js/actions/fetching.js index f7a2306..c61f0b9 100644 --- a/src/js/actions/fetching.js +++ b/src/js/actions/fetching.js @@ -1,13 +1,13 @@ import * as ActionTypes from '../actiontypes'; const FetchingActions = { - start(message) { - return { type: ActionTypes.START_FETCHING, message } + start (message) { + return { type: ActionTypes.START_FETCHING, message }; }, - stop() { - return { type: ActionTypes.STOP_FETCHING } + stop () { + return { type: ActionTypes.STOP_FETCHING }; }, -} +}; -export default FetchingActions +export default FetchingActions; diff --git a/src/js/actions/network.js b/src/js/actions/network.js index 57d62fb..bce12fb 100644 --- a/src/js/actions/network.js +++ b/src/js/actions/network.js @@ -1,44 +1,44 @@ -import Network from '../network' -import AlertActions from './alerts' -import * as ActionTypes from '../actiontypes' +import Network from '../network'; +import AlertActions from './alerts'; +import * as ActionTypes from '../actiontypes'; const NetworkActions = { - checkConnection() { + checkConnection () { return dispatch => { - Network.web3().isConnected() ? - dispatch(NetworkActions.connectionSucceeded()) : - dispatch(NetworkActions.connectionFailed()) - } + Network.web3().isConnected() + ? dispatch(NetworkActions.connectionSucceeded()) + : dispatch(NetworkActions.connectionFailed()); + }; }, - checkAccountAccess() { - return async function(dispatch) { + checkAccountAccess () { + return async function (dispatch) { try { - const addresses = await Network.getAccounts() - addresses[0] ? //TODO: should I use coinbase? - dispatch(NetworkActions.couldAccessAccount()) : - dispatch(NetworkActions.couldNotAccessAccount()) - } catch(error) { - dispatch(AlertActions.showError(error)) + const addresses = await Network.getAccounts(); + addresses[0] // TODO: should I use coinbase? + ? dispatch(NetworkActions.couldAccessAccount()) + : dispatch(NetworkActions.couldNotAccessAccount()); + } catch (error) { + dispatch(AlertActions.showError(error)); } - } + }; }, - connectionSucceeded() { - return { type: ActionTypes.CONNECTION_SUCCEEDED } + connectionSucceeded () { + return { type: ActionTypes.CONNECTION_SUCCEEDED }; }, - connectionFailed() { - return { type: ActionTypes.CONNECTION_FAILED } + connectionFailed () { + return { type: ActionTypes.CONNECTION_FAILED }; }, - couldAccessAccount() { - return { type: ActionTypes.COULD_ACCESS_ACCOUNT } + couldAccessAccount () { + return { type: ActionTypes.COULD_ACCESS_ACCOUNT }; }, - couldNotAccessAccount() { - return { type: ActionTypes.COULD_NOT_ACCESS_ACCOUNT } - } -} + couldNotAccessAccount () { + return { type: ActionTypes.COULD_NOT_ACCESS_ACCOUNT }; + }, +}; -export default NetworkActions +export default NetworkActions; diff --git a/src/js/actiontypes.js b/src/js/actiontypes.js index b2ae705..1232409 100644 --- a/src/js/actiontypes.js +++ b/src/js/actiontypes.js @@ -14,5 +14,5 @@ export const RECEIVE_ACCOUNT = 'RECEIVE_ACCOUNT'; export const RECEIVE_ETHER_BALANCE = 'RECEIVE_ETHER_BALANCE'; export const ADD_DONATION = 'ADD_DONATION'; -export const RESET_DONATION= 'RESET_DONATION'; +export const RESET_DONATION = 'RESET_DONATION'; export const RECEIVE_DONATION = 'RECEIVE_DONATION'; diff --git a/src/js/components/App.react.js b/src/js/components/App.react.js index 1a4d446..f1a6721 100644 --- a/src/js/components/App.react.js +++ b/src/js/components/App.react.js @@ -1,45 +1,44 @@ -import React from 'react' -import Store from '../store' -import Alert from './Alert.react' -import Modal from "./Modal.react" -import Navbar from './Navbar.react' -import { connect } from 'react-redux' -import DonateForm from './DonateForm.react' -import NetworkActions from "../actions/network"; -import DonationsList from './DonationsList.react' -import { withRouter, Switch } from 'react-router-dom' +import React from 'react'; +import Store from '../store'; +import Alert from './Alert.react'; +import Modal from './Modal.react'; +import Navbar from './Navbar.react'; +import { connect } from 'react-redux'; +import DonateForm from './DonateForm.react'; +import NetworkActions from '../actions/network'; +import DonationsList from './DonationsList.react'; +import { withRouter } from 'react-router-dom'; class App extends React.Component { - - componentWillMount() { - Store.dispatch(NetworkActions.checkConnection()) - Store.dispatch(NetworkActions.checkAccountAccess()) + componentWillMount () { + Store.dispatch(NetworkActions.checkConnection()); + Store.dispatch(NetworkActions.checkAccountAccess()); } - render() { - const network = this.props.network + render () { + const network = this.props.network; const fetching = this.props.fetching; - return (network.connected && network.couldAccessAccount) ? - (fetching ? - : -
- -
- - - -
-
- ) : -
+ return (network.connected && network.couldAccessAccount) + ? (fetching + ? + :
+ +
+ + + +
+
+ ) + :
} } -function mapStateToProps({ fetching, network }) { - return { fetching, network } +function mapStateToProps ({ fetching, network }) { + return { fetching, network }; } -export default withRouter(connect(mapStateToProps)(App)) +export default withRouter(connect(mapStateToProps)(App)); diff --git a/src/js/components/DonateForm.react.js b/src/js/components/DonateForm.react.js index 02b240b..6e79d82 100644 --- a/src/js/components/DonateForm.react.js +++ b/src/js/components/DonateForm.react.js @@ -1,16 +1,16 @@ import React from 'react'; -import Store from '../store' -import { connect } from 'react-redux' -import { HuePicker } from 'react-color' -import AccountActions from '../actions/accounts' -import DonationsActions from '../actions/donations' +import Store from '../store'; +import { connect } from 'react-redux'; +import { HuePicker } from 'react-color'; +import AccountActions from '../actions/accounts'; +import DonationsActions from '../actions/donations'; class DonateForm extends React.Component { constructor(props){ - super(props) - this.state = { value: 0, color: { rgb: { r: 0, g: 0, b: 0 } } } - this._updateValue = this._updateValue.bind(this) - this._handleSubmit = this._handleSubmit.bind(this) + super(props); + this.state = { value: 0, color: { rgb: { r: 0, g: 0, b: 0 } } }; + this._updateValue = this._updateValue.bind(this); + this._handleSubmit = this._handleSubmit.bind(this); } componentWillMount() { diff --git a/src/js/components/DonationsList.react.js b/src/js/components/DonationsList.react.js index 76479ba..61509a5 100644 --- a/src/js/components/DonationsList.react.js +++ b/src/js/components/DonationsList.react.js @@ -1,31 +1,32 @@ -import React from 'react' -import Store from '../store' -import { connect } from 'react-redux' -import DonationsActions from '../actions/donations' +import React from 'react'; +import Store from '../store'; +import { connect } from 'react-redux'; +import DonationsActions from '../actions/donations'; class DonationsList extends React.Component { - - componentWillMount() { - Store.dispatch(DonationsActions.findAll()) + componentWillMount () { + Store.dispatch(DonationsActions.findAll()); } - render() { - const donations = this.props.donations.list + render () { + const donations = this.props.donations.list; return ( -
+

Some already thought about our basil

- { donations.length === 0 ? Loading... :
    {this._buildDonationsList(donations)}
} + { donations.length === 0 + ? Loading... + :
    {this._buildDonationsList(donations)}
}
- ) + ); } - _buildDonationsList(donations) { + _buildDonationsList (donations) { return donations.map((donation, index) => { - const style = { backgroundColor: `rgb(${[donation.r, donation.g, donation.b]})` } + const style = { backgroundColor: `rgb(${[donation.r, donation.g, donation.b]})` }; return (
  • @@ -35,13 +36,13 @@ class DonationsList extends React.Component { ETH {donation.value}
  • - ) - }) + ); + }); } } -function mapStateToProps({ donations }) { - return { donations } +function mapStateToProps ({ donations }) { + return { donations }; } -export default connect(mapStateToProps)(DonationsList) +export default connect(mapStateToProps)(DonationsList); diff --git a/src/js/components/Modal.react.js b/src/js/components/Modal.react.js index 9136095..d4c4e74 100644 --- a/src/js/components/Modal.react.js +++ b/src/js/components/Modal.react.js @@ -1,18 +1,18 @@ -import React from 'react' +import React from 'react'; class Modal extends React.Component { - constructor(props){ - super(props) - this.state = { open: this.props.open, message: this.props.message, progressBar: this.props.progressBar } + constructor (props) { + super(props); + this.state = { open: this.props.open, message: this.props.message, progressBar: this.props.progressBar }; } - componentWillReceiveProps(nextProps) { - this.setState({ open: nextProps.open, message: nextProps.message }) + componentWillReceiveProps (nextProps) { + this.setState({ open: nextProps.open, message: nextProps.message }); } - render() { - let cssClass = this.state.open ? '' : 'hidden' - cssClass += this.props.dark ? ' dark' : '' + render () { + let cssClass = this.state.open ? '' : 'hidden'; + cssClass += this.props.dark ? ' dark' : ''; return (
    @@ -20,15 +20,17 @@ class Modal extends React.Component { {this._renderProgressBar()}
    - ) + ); } - _renderProgressBar() { - if(this.state.progressBar) return ( -
    -
    -
    - ) + _renderProgressBar () { + if (this.state.progressBar) { + return ( +
    +
    +
    + ); + } } } diff --git a/src/js/components/Navbar.react.js b/src/js/components/Navbar.react.js index 5d78e0e..3a5e3b4 100644 --- a/src/js/components/Navbar.react.js +++ b/src/js/components/Navbar.react.js @@ -1,17 +1,16 @@ -import React from 'react' -import Store from '../store' -import { connect } from 'react-redux' -import { Link } from 'react-router-dom' -import BasilActions from "../actions/basil"; +import React from 'react'; +import Store from '../store'; +import { connect } from 'react-redux'; +import { Link } from 'react-router-dom'; +import BasilActions from '../actions/basil'; class Navbar extends React.Component { - - componentWillMount() { - Store.dispatch(BasilActions.find()) + componentWillMount () { + Store.dispatch(BasilActions.find()); } - render() { - const basil = this.props.basil + render () { + const basil = this.props.basil; return ( - ) + ); } } -function mapStateToProps({ basil }) { - return { basil } +function mapStateToProps ({ basil }) { + return { basil }; } -export default connect(mapStateToProps)(Navbar) +export default connect(mapStateToProps)(Navbar); diff --git a/src/js/components/Root.react.js b/src/js/components/Root.react.js index 0a3eff5..46a3005 100644 --- a/src/js/components/Root.react.js +++ b/src/js/components/Root.react.js @@ -1,7 +1,7 @@ -import React from 'react' -import App from './App.react' -import { Provider } from 'react-redux' -import { HashRouter } from 'react-router-dom' +import React from 'react'; +import App from './App.react'; +import { Provider } from 'react-redux'; +import { HashRouter } from 'react-router-dom'; const Root = ({ store }) => ( @@ -9,6 +9,6 @@ const Root = ({ store }) => ( -) +); -export default Root +export default Root; diff --git a/src/js/contracts.js b/src/js/contracts.js index 63d3b94..b4aee43 100644 --- a/src/js/contracts.js +++ b/src/js/contracts.js @@ -1,5 +1,5 @@ -import Network from './network' -import contract from 'truffle-contract' +import Network from './network'; +import contract from 'truffle-contract'; const provider = Network.provider(); @@ -8,4 +8,4 @@ Basil.setProvider(provider); export { Basil, -} +}; diff --git a/src/js/helpers/fromWei.js b/src/js/helpers/fromWei.js index 27b037a..812b092 100644 --- a/src/js/helpers/fromWei.js +++ b/src/js/helpers/fromWei.js @@ -1,5 +1,5 @@ -import Network from "../network"; +import Network from '../network'; -export default function fromWei(amount) { - return Network.web3().fromWei(amount, 'ether') +export default function fromWei (amount) { + return Network.web3().fromWei(amount, 'ether'); } diff --git a/src/js/helpers/toWei.js b/src/js/helpers/toWei.js index d436c28..7cf93a4 100644 --- a/src/js/helpers/toWei.js +++ b/src/js/helpers/toWei.js @@ -1,5 +1,5 @@ -import Network from "../network"; +import Network from '../network'; -export default function toWei(amount) { - return Network.web3().toWei(amount, 'ether') +export default function toWei (amount) { + return Network.web3().toWei(amount, 'ether'); } diff --git a/src/js/network.js b/src/js/network.js index 9ab524e..032db8a 100644 --- a/src/js/network.js +++ b/src/js/network.js @@ -1,66 +1,66 @@ import Web3 from 'web3'; -import { ACTIVE_NETWORK } from 'constants' +import { ACTIVE_NETWORK } from 'constants'; const Network = { - web3() { - return new Web3(this.provider()) + web3 () { + return new Web3(this.provider()); }, - eth() { + eth () { return this.web3().eth; }, - provider() { - if (typeof web3 !== 'undefined') return web3.currentProvider + provider () { + if (typeof web3 !== 'undefined') return web3.currentProvider; const provider = `${ACTIVE_NETWORK.host}:${ACTIVE_NETWORK.port}`; return new Web3.providers.HttpProvider(provider); }, - async validateCode(address, code) { - const foundCode = await Network.getCode(address) - const cleanFoundCode = foundCode ? foundCode.replace("0x", "").replace(/0/g, "") : '' + async validateCode (address, code) { + const foundCode = await Network.getCode(address); + const cleanFoundCode = foundCode ? foundCode.replace('0x', '').replace(/0/g, '') : ''; return cleanFoundCode === code; }, - getCode(address) { + getCode (address) { return new Promise(function (resolve, reject) { - Network.eth().getCode(address, Network._web3Callback(resolve, reject)) + Network.eth().getCode(address, Network._web3Callback(resolve, reject)); }); }, - getAccounts() { + getAccounts () { return new Promise(function (resolve, reject) { - Network.eth().getAccounts(Network._web3Callback(resolve, reject)) + Network.eth().getAccounts(Network._web3Callback(resolve, reject)); }); }, - getBalance(address) { + getBalance (address) { return new Promise(function (resolve, reject) { - Network.eth().getBalance(address, Network._web3Callback(resolve, reject)) + Network.eth().getBalance(address, Network._web3Callback(resolve, reject)); }); }, - getTransaction(txHash) { + getTransaction (txHash) { return new Promise(function (resolve, reject) { - Network.eth().getTransaction(txHash, Network._web3Callback(resolve, reject)) + Network.eth().getTransaction(txHash, Network._web3Callback(resolve, reject)); }); }, - promisified(group, method, ...args) { + promisified (group, method, ...args) { return new Promise(function (resolve, reject) { let parameters = args; parameters[args.length] = callback(resolve, reject); parameters.length++; Network.web3()[group][method].apply(web3[group], parameters); - }) + }); }, - _web3Callback(resolve, reject) { + _web3Callback (resolve, reject) { return function (error, value) { if (error) reject(error); else resolve(value); - } - } -} + }; + }, +}; -export default Network +export default Network; diff --git a/src/js/reducers/accounts.js b/src/js/reducers/accounts.js index 6dc4150..be7320c 100644 --- a/src/js/reducers/accounts.js +++ b/src/js/reducers/accounts.js @@ -1,16 +1,15 @@ -import React from 'react'; -import * as ActionTypes from '../actiontypes' +import * as ActionTypes from '../actiontypes'; const initialState = { address: '', balance: 0 }; const AccountsReducer = (state = initialState, action) => { switch (action.type) { - case ActionTypes.RECEIVE_ACCOUNT: - return Object.assign({}, state, { address: action.address }); - case ActionTypes.RECEIVE_ETHER_BALANCE: - return Object.assign({}, state, { balance: action.balance.toString() }); - default: - return state + case ActionTypes.RECEIVE_ACCOUNT: + return Object.assign({}, state, { address: action.address }); + case ActionTypes.RECEIVE_ETHER_BALANCE: + return Object.assign({}, state, { balance: action.balance.toString() }); + default: + return state; } }; diff --git a/src/js/reducers/alerts.js b/src/js/reducers/alerts.js index 9535b60..86c5b7f 100644 --- a/src/js/reducers/alerts.js +++ b/src/js/reducers/alerts.js @@ -1,14 +1,13 @@ -import React from 'react'; -import * as ActionTypes from '../actiontypes' +import * as ActionTypes from '../actiontypes'; const AlertsReducer = (state = null, action) => { switch (action.type) { - case ActionTypes.SHOW_ERROR: - return { message: action.message }; - case ActionTypes.RESET_ERROR: - return null; - default: - return state + case ActionTypes.SHOW_ERROR: + return { message: action.message }; + case ActionTypes.RESET_ERROR: + return null; + default: + return state; } }; diff --git a/src/js/reducers/basil.js b/src/js/reducers/basil.js index cf61007..7d86aa7 100644 --- a/src/js/reducers/basil.js +++ b/src/js/reducers/basil.js @@ -1,12 +1,11 @@ -import React from 'react'; -import * as ActionTypes from '../actiontypes' +import * as ActionTypes from '../actiontypes'; -const BasilReducer = (state = { highestDonation: 0, r: 0, g: 0, b: 0}, action) => { +const BasilReducer = (state = { highestDonation: 0, r: 0, g: 0, b: 0 }, action) => { switch (action.type) { - case ActionTypes.RECEIVE_BASIL: - return action.basil; - default: - return state + case ActionTypes.RECEIVE_BASIL: + return action.basil; + default: + return state; } }; diff --git a/src/js/reducers/donations.js b/src/js/reducers/donations.js index e0e9274..1f15c9b 100644 --- a/src/js/reducers/donations.js +++ b/src/js/reducers/donations.js @@ -1,19 +1,18 @@ -import React from 'react'; -import * as ActionTypes from '../actiontypes' +import * as ActionTypes from '../actiontypes'; -const initialState = { list: [], donation: null } +const initialState = { list: [], donation: null }; const DonationsReducer = (state = initialState, action) => { switch (action.type) { - case ActionTypes.ADD_DONATION: - let donations = state.list; - return Object.assign({}, state, { list: [action.donation].concat(donations) }) - case ActionTypes.RESET_DONATION: - return Object.assign({}, state, { donation: null }) - case ActionTypes.RECEIVE_DONATION: - return Object.assign({}, state, { donation: action.donation }) - default: - return state + case ActionTypes.ADD_DONATION: + let donations = state.list; + return Object.assign({}, state, { list: [action.donation].concat(donations) }); + case ActionTypes.RESET_DONATION: + return Object.assign({}, state, { donation: null }); + case ActionTypes.RECEIVE_DONATION: + return Object.assign({}, state, { donation: action.donation }); + default: + return state; } }; diff --git a/src/js/reducers/fetching.js b/src/js/reducers/fetching.js index 8d7dc72..375043f 100644 --- a/src/js/reducers/fetching.js +++ b/src/js/reducers/fetching.js @@ -1,14 +1,13 @@ -import React from 'react'; -import * as ActionTypes from '../actiontypes' +import * as ActionTypes from '../actiontypes'; const FetchingReducer = (state = null, action) => { switch (action.type) { - case ActionTypes.START_FETCHING: - return action.message - case ActionTypes.STOP_FETCHING: - return null - default: - return state + case ActionTypes.START_FETCHING: + return action.message; + case ActionTypes.STOP_FETCHING: + return null; + default: + return state; } }; diff --git a/src/js/reducers/network.js b/src/js/reducers/network.js index 5ff3b79..9452e97 100644 --- a/src/js/reducers/network.js +++ b/src/js/reducers/network.js @@ -1,21 +1,20 @@ -import React from 'react'; -import * as ActionTypes from '../actiontypes' +import * as ActionTypes from '../actiontypes'; -const initialState = { connected: null, couldAccessAccount: null } +const initialState = { connected: null, couldAccessAccount: null }; const NetworkReducer = (state = initialState, action) => { switch (action.type) { - case ActionTypes.CONNECTION_FAILED: - return Object.assign({}, state, { connected: false }) - case ActionTypes.CONNECTION_SUCCEEDED: - return Object.assign({}, state, { connected: true }) - case ActionTypes.COULD_ACCESS_ACCOUNT: - return Object.assign({}, state, { couldAccessAccount: true }) - case ActionTypes.COULD_NOT_ACCESS_ACCOUNT: - return Object.assign({}, state, { couldAccessAccount: false }) - default: - return state + case ActionTypes.CONNECTION_FAILED: + return Object.assign({}, state, { connected: false }); + case ActionTypes.CONNECTION_SUCCEEDED: + return Object.assign({}, state, { connected: true }); + case ActionTypes.COULD_ACCESS_ACCOUNT: + return Object.assign({}, state, { couldAccessAccount: true }); + case ActionTypes.COULD_NOT_ACCESS_ACCOUNT: + return Object.assign({}, state, { couldAccessAccount: false }); + default: + return state; } -} +}; -export default NetworkReducer +export default NetworkReducer; diff --git a/src/js/store.js b/src/js/store.js index 0f94c30..0853a49 100644 --- a/src/js/store.js +++ b/src/js/store.js @@ -1,12 +1,11 @@ -import React from 'react' -import thunkMiddleware from 'redux-thunk' -import basil from './reducers/basil' -import alert from './reducers/alerts' -import network from './reducers/network' -import account from './reducers/accounts' -import fetching from './reducers/fetching' -import donations from './reducers/donations' -import { createStore, combineReducers, applyMiddleware } from 'redux' +import thunkMiddleware from 'redux-thunk'; +import basil from './reducers/basil'; +import alert from './reducers/alerts'; +import network from './reducers/network'; +import account from './reducers/accounts'; +import fetching from './reducers/fetching'; +import donations from './reducers/donations'; +import { createStore, combineReducers, applyMiddleware } from 'redux'; const mainReducer = combineReducers({ alert, diff --git a/test/Basil.test.js b/test/Basil.test.js index bc66473..8a0cbd4 100644 --- a/test/Basil.test.js +++ b/test/Basil.test.js @@ -5,20 +5,18 @@ import assertRevert from './helpers/assertRevert'; const Basil = artifacts.require('Basil'); contract('Basil', (accounts) => { - describe('implementation', function() { + describe('implementation', function () { shouldBehaveLikeBasil(Basil, accounts); }); }); -function shouldBehaveLikeBasil(ContractKlazz, [_, proxyOwner, owner, aWallet, someone, anotherone]) { - +function shouldBehaveLikeBasil (ContractKlazz, [_, proxyOwner, owner, aWallet, someone, anotherone]) { beforeEach(async function () { this.basil = await ContractKlazz.new(); await this.basil.initialize(owner); }); describe('donate', function () { - describe('when there are no donations', function () { const donor = someone; @@ -125,14 +123,13 @@ function shouldBehaveLikeBasil(ContractKlazz, [_, proxyOwner, owner, aWallet, so const secondDonation = 2; it('reverts', async function () { - await assertRevert(this.basil.sendTransaction({ from: anotherDonor, value: secondDonation })) + await assertRevert(this.basil.sendTransaction({ from: anotherDonor, value: secondDonation })); }); }); describe('when the new donation is greater than the previous one', function () { const secondDonation = 3; - describe('when the given R value are invalid', function () { const R = 256; const G = 5; @@ -202,7 +199,6 @@ function shouldBehaveLikeBasil(ContractKlazz, [_, proxyOwner, owner, aWallet, so }); describe('withdraw', function () { - describe('when the sender is not the owner', function () { const from = anotherone; const wallet = aWallet; @@ -260,5 +256,3 @@ function shouldBehaveLikeBasil(ContractKlazz, [_, proxyOwner, owner, aWallet, so } module.exports = shouldBehaveLikeBasil; - - diff --git a/test/BasilERC721.test.js b/test/BasilERC721.test.js index 1d0b696..0eda71f 100644 --- a/test/BasilERC721.test.js +++ b/test/BasilERC721.test.js @@ -1,26 +1,23 @@ -"use strict"; - -const ERC721Token = artifacts.require('ERC721Token'); -const BasilERC721 = artifacts.require('BasilERC721'); +'use strict'; import Deployer from 'kernel/deploy/objects/Deployer'; import shouldBehaveLikeBasil from './Basil.test'; -const ZOS_ADDRESS = "0x212fbf392206bca0a478b9ed3253b08559b35903"; +const ERC721Token = artifacts.require('ERC721Token'); +const BasilERC721 = artifacts.require('BasilERC721'); + +const ZOS_ADDRESS = '0x212fbf392206bca0a478b9ed3253b08559b35903'; const ZEPPELIN_VERSION = '1.8.0'; const ZEPPELIN_DISTRO = 'ZeppelinOS'; const ERC721_NAME = 'ERC721Token'; contract('BasilERC721', (accounts) => { - const owner = accounts[2]; - describe.only('implementation', function() { - + describe.only('implementation', function () { shouldBehaveLikeBasil(BasilERC721, accounts); beforeEach(async function () { - // Deploy BasilERC721 implementation. this.basil = await BasilERC721.new(); await this.basil.initialize(owner); @@ -40,7 +37,7 @@ contract('BasilERC721', (accounts) => { await this.basil.setToken(erc721Proxy.address); }); - it('should properly have its ERC721Token set', async function() { + it('should properly have its ERC721Token set', async function () { const token = await this.basil.token(); assert.notEqual(token, 0x0); }); diff --git a/test/ZOS.test.js b/test/ZOS.test.js index e474eb1..97dbabb 100644 --- a/test/ZOS.test.js +++ b/test/ZOS.test.js @@ -4,18 +4,15 @@ import Deployer from 'kernel/deploy/objects/Deployer'; const Basil = artifacts.require('Basil'); const BasilTestUpgrade = artifacts.require('BasilTestUpgrade.sol'); -const ProjectController = artifacts.require('zos-core/contracts/ProjectController'); -const OwnedUpgradeabilityProxy = artifacts.require("zos-core/contracts/upgradeability/OwnedUpgradeabilityProxy.sol"); +const OwnedUpgradeabilityProxy = artifacts.require('zos-core/contracts/upgradeability/OwnedUpgradeabilityProxy.sol'); const ZepCore = artifacts.require('kernel/contracts/ZepCore.sol'); -const ZOS_ADDRESS = "0x212fbf392206bca0a478b9ed3253b08559b35903"; +const ZOS_ADDRESS = '0x212fbf392206bca0a478b9ed3253b08559b35903'; const ZEPPELIN_VERSION = '1.8.0'; const ZEPPELIN_DISTRO = 'ZeppelinOS'; contract('ZOS', ([_, proxyOwner, owner, aWallet, someone, anotherone]) => { - - describe('ProjectController', function() { - + describe('ProjectController', function () { const projectName = 'TheBasilProject'; const contractName = 'Basil'; @@ -23,46 +20,43 @@ contract('ZOS', ([_, proxyOwner, owner, aWallet, someone, anotherone]) => { this.controller = await Deployer.projectController(proxyOwner, projectName, ZOS_ADDRESS); }); - describe('controller', function() { - - it('has a valid fallback provider set', async function() { + describe('controller', function () { + it('has a valid fallback provider set', async function () { const provider = await this.controller.fallbackProvider(); assert.equal(provider, ZOS_ADDRESS); }); }); - describe('ZepCore', function() { - - it('has an implementation for ERC721Token', async function() { + describe('ZepCore', function () { + it('has an implementation for ERC721Token', async function () { const core = ZepCore.at(ZOS_ADDRESS); const impl = await core.getImplementation(ZEPPELIN_DISTRO, ZEPPELIN_VERSION, 'ERC721Token'); assert.notEqual(impl, 0x0); }); }); - describe('registry', function() { - - it('can add implementation 0', async function() { + describe('registry', function () { + it('can add implementation 0', async function () { this.basilImplementation0 = await Deployer.deployAndRegister(this.controller, Basil, contractName, '0'); }); - it('can add implementation 1', async function() { - this.basilImplementation1 = await Deployer.deployAndRegister(this.controller, BasilTestUpgrade, contractName, '1'); + it('can add implementation 1', async function () { + this.basilImplementation1 = await Deployer.deployAndRegister( + this.controller, BasilTestUpgrade, contractName, '1'); }); - describe('controller with registered implementations', function() { - - it('knows of implementation 0', async function() { + describe('controller with registered implementations', function () { + it('knows of implementation 0', async function () { const controllerImplementation = await this.controller.getImplementation(projectName, '0', contractName); assert.equal(controllerImplementation, this.basilImplementation0.address); }); - it('knows of implementation 1', async function() { + it('knows of implementation 1', async function () { const controllerImplementation = await this.controller.getImplementation(projectName, '1', contractName); assert.equal(controllerImplementation, this.basilImplementation1.address); }); - it('can create a proxy for implementation 0', async function() { + it('can create a proxy for implementation 0', async function () { this.basilProxy = await Deployer.createProxyAndCall( this.controller, proxyOwner, @@ -75,15 +69,16 @@ contract('ZOS', ([_, proxyOwner, owner, aWallet, someone, anotherone]) => { ); }); - it('can upgrade the proxy to implementation 1', async function() { - await this.controller.upgradeTo(this.basilProxy.address, projectName, '1', contractName, {from: proxyOwner}); + it('can upgrade the proxy to implementation 1', async function () { + await this.controller.upgradeTo( + this.basilProxy.address, projectName, '1', contractName, { from: proxyOwner }); const proxy = OwnedUpgradeabilityProxy.at(this.basilProxy.address); assert.equal(await proxy.implementation(), this.basilImplementation1.address); - const basil_v1 = await BasilTestUpgrade.at(this.basilProxy.address); - const msg = await basil_v1.sayHi(); - assert.equal(msg, "Hi!"); + const basilV1 = await BasilTestUpgrade.at(this.basilProxy.address); + const msg = await basilV1.sayHi(); + assert.equal(msg, 'Hi!'); }); }); }); - }) -}) + }); +}); diff --git a/truffle.js b/truffle.js index 2a130c8..1fad236 100644 --- a/truffle.js +++ b/truffle.js @@ -4,16 +4,16 @@ require('babel-polyfill'); module.exports = { networks: { development: { - name: "development", + name: 'development', host: 'localhost', port: 8545, - network_id: '*', + network_id: '*', // eslint-disable-line camelcase }, ropsten: { - name: "ropsten", + name: 'ropsten', host: 'localhost', port: 8545, - network_id: 3, - } - } + network_id: 3, // eslint-disable-line camelcase + }, + }, }; diff --git a/webpack.common.js b/webpack.common.js index 740508f..1cc6a8e 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -8,43 +8,43 @@ const config = { output: { publicPath: '/', filename: '[name].[hash].js', - path: path.join(__dirname, '/dist') + path: path.join(__dirname, '/dist'), }, module: { loaders: [ { test: /\.(js|jsx)$/, exclude: /(node_modules)/, - use: 'babel-loader' + use: 'babel-loader', }, { test: /\.(scss|css)/, - use: [ 'style-loader', 'css-loader', 'sass-loader' ] + use: [ 'style-loader', 'css-loader', 'sass-loader' ], }, { test: /\.json$/, - use: 'json-loader' + use: 'json-loader', }, { test: /\.(ico|jpg|jpeg|png)$/, - loader: 'file-loader?name=images/[name].[ext]' + loader: 'file-loader?name=images/[name].[ext]', }, { test: /\.(woff|woff2|eot|ttf)$/, - loader: 'file-loader?name=fonts/[name].[ext]' + loader: 'file-loader?name=fonts/[name].[ext]', }, - ] + ], }, plugins: [ new CleanWebpackPlugin(['dist']), new HtmlWebpackPlugin({ template: './src/index.template.ejs', inject: 'body', title: 'Zeppelin Basil' }), new webpack.optimize.CommonsChunkPlugin({ name: 'bundle' }), - new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.$': 'jquery', 'window.jQuery': 'jquery',}), + new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.$': 'jquery', 'window.jQuery': 'jquery' }), ], node: { fs: 'empty', net: 'empty', - tls: 'empty' + tls: 'empty', }, }; diff --git a/webpack.dev.js b/webpack.dev.js index 26aac07..2e25bc3 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -6,21 +6,21 @@ const common = require('./webpack.common.js'); const config = merge(common, { devtool: 'inline-source-map', devServer: { - contentBase: path.join(__dirname, "/dist"), + contentBase: path.join(__dirname, '/dist'), compress: true, port: 3000, - host: "0.0.0.0", + host: '0.0.0.0', historyApiFallback: { - index: './index.html' - } + index: './index.html', + }, }, plugins: [ new Dotenv({ - path: './.env.development' - }) + path: './.env.development', + }), ], watchOptions: { - poll: 1000 + poll: 1000, }, }); diff --git a/webpack.prod.js b/webpack.prod.js index 4121b02..2e68c5c 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -8,14 +8,14 @@ const config = merge(common, { plugins: [ new UglifyJSPlugin(), new Dotenv({ - path: './.env.production' + path: './.env.production', }), new webpack.DefinePlugin({ 'process.env': { - 'NODE_ENV': JSON.stringify('production') - } - }) - ] + 'NODE_ENV': JSON.stringify('production'), + }, + }), + ], }); module.exports = config;